2012-09-05 2 views

Antwort

25

Ich verlasse mich auf JAXB, um die sitemap.xml für mich zu generieren.

Mein Controller sieht so etwas wie die unten, und ich habe einige Datenbanktabellen den Überblick über die Links zu halten, die ich in der Sitemap angezeigt werden soll: -

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; 
    } 
} 

Für die robots.txt, sieht es so etwas wie die unten, und natürlich, Sie müssen es so konfigurieren, basierend auf Ihren Vorlieben: -

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

Dank für die nette Antwort werde ich wenig warten mit einer Frage zu schließen, wenn mehr Menschen beitragen zu sehen ... –

+6

Sie werden diese Controller-Methoden sicher sind stark im Cache vornehmen müssen. Normalerweise sollten diese Anfragen nicht einmal den App-Server treffen, sondern als statischer Inhalt von Apache gedient werden. – Solubris

+0

@Lithium Auch gute Idee, Sie können es als Antwort statt Chat platzieren. Anyway ich brauche meine sitemap.xml dynamisch erstellt aber für Roboter die mehr als nötig sein sollten. –