宁波专业做网站公司,国内做视频课程的网站有哪些,无锡建设教育协会网站,wordpress编辑文章更新失败如何仅使用两个类就将提要#xff08;Atom#xff09;添加到Web应用程序#xff1f; Spring MVC呢#xff1f; 这是我的假设#xff1a; 您正在使用Spring框架 您有一些要发布在供稿中的实体#xff0c;例如“新闻” 您的“新闻”实体具有creationDate#xff0c;tit… 如何仅使用两个类就将提要Atom添加到Web应用程序 Spring MVC呢 这是我的假设 您正在使用Spring框架 您有一些要发布在供稿中的实体例如“新闻” 您的“新闻”实体具有creationDatetitle和shortDescription 您有一些存储库/仓库例如“ NewsRepository”它将从数据库中返回新闻 你想写得尽可能少 您不想手动格式化Atomxml 实际上您实际上不需要在应用程序中使用Spring MVC。 如果这样做请跳至步骤3。 步骤1将Spring MVC依赖项添加到您的应用程序 使用Maven将是 dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion3.1.0.RELEASE/version
/dependency 步骤2添加Spring MVC DispatcherServlet 使用web.xml将是 servletservlet-namedispatcher/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-paramload-on-startup1/load-on-startup
/servlet
servlet-mappingservlet-namedispatcher/servlet-nameurl-pattern/feed/url-pattern
/servlet-mapping 注意我将url-pattern设置为“ / feed”这意味着我不希望Spring MVC处理我的应用程序中的任何其他URL我在其余的应用程序中使用了不同的Web框架。 我还给它提供了一个全新的contextConfigLocation其中仅保留了mvc配置。 请记住将DispatcherServlet添加到已经具有Spring的应用程序时例如从ContextLoaderListener继承您的上下文是从全局实例继承的因此您不应创建在该全局实例中再次存在的bean也不应该包含定义它们的xml。 注意两次Spring上下文并查阅spring或servlet文档以了解发生了什么。 步骤3.添加ROME –处理Atom格式的库 与Maven是 dependencygroupIdnet.java.dev.rome/groupIdartifactIdrome/artifactIdversion1.0.0/version
/dependency 步骤4.编写非常简单的控制器 Controller
public class FeedController {static final String LAST_UPDATE_VIEW_KEY lastUpdate;static final String NEWS_VIEW_KEY news;private NewsRepository newsRepository;private String viewName;protected FeedController() {} //required by cglibpublic FeedController(NewsRepository newsRepository, String viewName) {notNull(newsRepository); hasText(viewName);this.newsRepository newsRepository;this.viewName viewName;}RequestMapping(value /feed, method RequestMethod.GET) Transactionalpublic ModelAndView feed() {ModelAndView modelAndView new ModelAndView();modelAndView.setViewName(viewName);ListNews news newsRepository.fetchPublished();modelAndView.addObject(NEWS_VIEW_KEY, news);modelAndView.addObject(LAST_UPDATE_VIEW_KEY, getCreationDateOfTheLast(news));return modelAndView;}private Date getCreationDateOfTheLast(ListNews news) {if(news.size() 0) {return news.get(0).getCreationDate();}return new Date(0);}
} 如果您想复制并粘贴谁不想要这里有一个测试 RunWith(MockitoJUnitRunner.class)
public class FeedControllerShould {Mock private NewsRepository newsRepository;private Date FORMER_ENTRY_CREATION_DATE new Date(1);private Date LATTER_ENTRY_CREATION_DATE new Date(2);private ArrayListNews newsList;private FeedController feedController;Beforepublic void prepareNewsList() {News news1 new News().title(title1).creationDate(FORMER_ENTRY_CREATION_DATE);News news2 new News().title(title2).creationDate(LATTER_ENTRY_CREATION_DATE);newsList newArrayList(news2, news1);}Beforepublic void prepareFeedController() {feedController new FeedController(newsRepository, viewName);}Testpublic void returnViewWithNews() {//givengiven(newsRepository.fetchPublished()).willReturn(newsList);//whenModelAndView modelAndView feedController.feed();//thenassertThat(modelAndView.getModel()).includes(entry(FeedController.NEWS_VIEW_KEY, newsList));}Testpublic void returnViewWithLastUpdateTime() {//givengiven(newsRepository.fetchPublished()).willReturn(newsList);//whenModelAndView modelAndView feedController.feed();//thenassertThat(modelAndView.getModel()).includes(entry(FeedController.LAST_UPDATE_VIEW_KEY, LATTER_ENTRY_CREATION_DATE));}Testpublic void returnTheBeginningOfTimeAsLastUpdateInViewWhenListIsEmpty() {//givengiven(newsRepository.fetchPublished()).willReturn(new ArrayListNews());//whenModelAndView modelAndView feedController.feed();//thenassertThat(modelAndView.getModel()).includes(entry(FeedController.LAST_UPDATE_VIEW_KEY, new Date(0)));}
} 注意在这里我正在使用fest-assert和mockito。 依赖项是 dependencygroupIdorg.easytesting/groupIdartifactIdfest-assert/artifactIdversion1.4/versionscopetest/scope
/dependency
dependencygroupIdorg.mockito/groupIdartifactIdmockito-all/artifactIdversion1.8.5/versionscopetest/scope
/dependency 步骤5.编写非常简单的视图 这是所有魔术格式化发生的地方。 一定要看一看Entry类的所有方法因为您可能想使用/填充很多东西。 import org.springframework.web.servlet.view.feed.AbstractAtomFeedView;
[...]public class AtomFeedView extends AbstractAtomFeedView {private String feedId tag:yourFantastiSiteName;private String title yourFantastiSiteName: news;private String newsAbsoluteUrl http://yourfanstasticsiteUrl.com/news/; Overrideprotected void buildFeedMetadata(MapString, Object model, Feed feed, HttpServletRequest request) {feed.setId(feedId);feed.setTitle(title);setUpdatedIfNeeded(model, feed);}private void setUpdatedIfNeeded(MapString, Object model, Feed feed) {SuppressWarnings(unchecked)Date lastUpdate (Date)model.get(FeedController.LAST_UPDATE_VIEW_KEY);if (feed.getUpdated() null || lastUpdate ! null || lastUpdate.compareTo(feed.getUpdated()) 0) {feed.setUpdated(lastUpdate);}}Overrideprotected ListEntry buildFeedEntries(MapString, Object model, HttpServletRequest request, HttpServletResponse response) throws Exception {SuppressWarnings(unchecked)ListNews newsList (ListNews)model.get(FeedController.NEWS_VIEW_KEY);ListEntry entries new ArrayListEntry();for (News news : newsList) {addEntry(entries, news);}return entries;}private void addEntry(ListEntry entries, News news) {Entry entry new Entry();entry.setId(feedId , news.getId());entry.setTitle(news.getTitle());entry.setUpdated(news.getCreationDate());entry setSummary(news, entry);entry setLink(news, entry);entries.add(entry);}private Entry setSummary(News news, Entry entry) {Content summary new Content();summary.setValue(news.getShortDescription());entry.setSummary(summary);return entry;}private Entry setLink(News news, Entry entry) {Link link new Link();link.setType(text/html);link.setHref(newsAbsoluteUrl news.getId()); //because I have a different controller to show news at http://yourfanstasticsiteUrl.com/news/IDentry.setAlternateLinks(newArrayList(link));return entry;}} 步骤6.将类添加到Spring上下文 我正在使用xml方法。 因为我老了我喜欢xml。 不很认真我使用xml是因为我可能想用不同的视图RSS 1.0RSS 2.0等声明FeedController几次。 这就是前面提到的spring-mvc.xml ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean classorg.springframework.web.servlet.view.ContentNegotiatingViewResolverproperty namemediaTypesmapentry keyatom valueapplication/atomxml/entry keyhtml valuetext/html//map/propertyproperty nameviewResolverslistbean classorg.springframework.web.servlet.view.BeanNameViewResolver//list/property/beanbean classeu.margiel.pages.confitura.feed.FeedControllerconstructor-arg index0 refnewsRepository/constructor-arg index1 valueatomFeedView//beanbean idatomFeedView classeu.margiel.pages.confitura.feed.AtomFeedView/
/beans 您完成了。 之前曾有人要求我将所有工作代码放入某个公共存储库中所以这又是另一回事了。 我已经描述了我已经发布的内容您可以从bitbucket中获取提交。 参考 Solid Craft博客上来自我们JCG合作伙伴 Jakub Nabrdalik的Atom Feeds与Spring MVC 。 翻译自: https://www.javacodegeeks.com/2012/10/spring-mvc-for-atom-feeds.html