2012-09-05 75 views

回答

25

我依靠JAXB爲我生成sitemap.xml。

我的控制器看起來像下面,和我有一些數據庫表來跟蹤我希望出現在網站地圖的鏈接: -

SitemapController.java

@Controller 
public class SitemapController { 

    @RequestMapping(value = "/sitemap.xml", method = RequestMethod.GET) 
    @ResponseBody 
    public XmlUrlSet main() { 
     XmlUrlSet xmlUrlSet = new XmlUrlSet(); 
     create(xmlUrlSet, "", XmlUrl.Priority.HIGH); 
     create(xmlUrlSet, "/link-1", XmlUrl.Priority.HIGH); 
     create(xmlUrlSet, "/link-2", XmlUrl.Priority.MEDIUM); 

     // for loop to generate all the links by querying against database 
     ... 

     return xmlUrlSet; 
    } 

    private void create(XmlUrlSet xmlUrlSet, String link, XmlUrl.Priority priority) { 
     xmlUrlSet.addUrl(new XmlUrl("http://www.mysite.com" + link, priority)); 
    } 

} 

XmlUrl.java

@XmlAccessorType(value = XmlAccessType.NONE) 
@XmlRootElement(name = "url") 
public class XmlUrl { 
    public enum Priority { 
     HIGH("1.0"), MEDIUM("0.5"); 

     private String value; 

     Priority(String value) { 
      this.value = value; 
     } 

     public String getValue() { 
      return value; 
     } 
    } 

    @XmlElement 
    private String loc; 

    @XmlElement 
    private String lastmod = new DateTime().toString(DateTimeFormat.forPattern("yyyy-MM-dd")); 

    @XmlElement 
    private String changefreq = "daily"; 

    @XmlElement 
    private String priority; 

    public XmlUrl() { 
    } 

    public XmlUrl(String loc, Priority priority) { 
     this.loc = loc; 
     this.priority = priority.getValue(); 
    } 

    public String getLoc() { 
     return loc; 
    } 

    public String getPriority() { 
     return priority; 
    } 

    public String getChangefreq() { 
     return changefreq; 
    } 

    public String getLastmod() { 
     return lastmod; 
    } 
} 

XmlUrlSet.java

@XmlAccessorType(value = XmlAccessType.NONE) 
@XmlRootElement(name = "urlset", namespace = "http://www.sitemaps.org/schemas/sitemap/0.9") 
public class XmlUrlSet { 

    @XmlElements({@XmlElement(name = "url", type = XmlUrl.class)}) 
    private Collection<XmlUrl> xmlUrls = new ArrayList<XmlUrl>(); 

    public void addUrl(XmlUrl xmlUrl) { 
     xmlUrls.add(xmlUrl); 
    } 

    public Collection<XmlUrl> getXmlUrls() { 
     return xmlUrls; 
    } 
} 

對於robots.txt的,它看起來像下面的,很顯然,你需要根據你的喜好進行配置: -

RobotsController.java

@Controller 
public class RobotsController { 

    @RequestMapping(value = "/robots.txt", method = RequestMethod.GET) 
    public String getRobots(HttpServletRequest request) { 
     return (Arrays.asList("mysite.com", "www.mysite.com").contains(request.getServerName())) ? 
       "robotsAllowed" : "robotsDisallowed"; 
    } 
} 
+0

感謝漂亮的答案,我會等待點點與關閉的問題,看看是否會有更多的人貢獻... –

+6

您將需要確保這些控制方法是大量緩存。通常這些請求不應該擊中應用程序服務器,而是作爲apache的靜態內容。 – Solubris

+0

@Lithium也是一個好主意,你可以把它作爲答案而不是聊天。無論如何,我需要動態創建我的sitemap.xml,但對於機器人來說,這應該超過必要的。 –

相關問題