javascript
rome rss_RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty
rome rss
在這篇文章中,我將展示一些創(chuàng)建Spring Web應(yīng)用程序的指南,這些應(yīng)用程序使用Jetty并使用名為ROME的外部庫(kù)運(yùn)行RSS來(lái)運(yùn)行它。
一般
我最近創(chuàng)建了一個(gè)示例Web應(yīng)用程序,充當(dāng)RSS閱讀器。 我想檢查ROME以閱讀RSS。 我還想使用Spring容器和MVC創(chuàng)建最簡(jiǎn)單的視圖的應(yīng)用程序。 為了快速開(kāi)發(fā),我將Jetty用作服務(wù)器,并為其使用了一個(gè)簡(jiǎn)單的java類。
所有代碼都可以在GitHub,eyalgo / rss-reader上找到 。
內(nèi)容
Maven依賴
起初,我無(wú)法使用正確的Jetty版本。 有一個(gè)帶有g(shù)roup-id mortby,另一個(gè)帶有eclipse。 經(jīng)過(guò)一番仔細(xì)的檢查和反復(fù)試驗(yàn)后,我拿起了Eclipse庫(kù)。 春天只是標(biāo)準(zhǔn)。 我在GutHub下找到了最新版本的ROME。 它仍然是快照。
這是依賴項(xiàng)列表:
- 彈簧
- 碼頭
- 羅馬和羅馬取球器
- 登錄和slf4j
- 用于檢測(cè)
- 朱尼特
- 該項(xiàng)目的pom文件可以在以下位置找到: https : //github.com/eyalgo/rss-reader/blob/master/pom.xml
碼頭服務(wù)器
幾年前,我一直在使用Wicket框架,并且了解Jetty及其易于使用的服務(wù)器創(chuàng)建方法。 我決定朝這個(gè)方向前進(jìn),并跳過(guò)運(yùn)行WAR部署的標(biāo)準(zhǔn)Web服務(wù)器。
有幾種創(chuàng)建Jetty服務(wù)器的方法。 我決定使用Web應(yīng)用程序上下文創(chuàng)建服務(wù)器。
首先,創(chuàng)建上下文:
private WebAppContext createContext() {WebAppContext webAppContext = new WebAppContext();webAppContext.setContextPath("/");webAppContext.setWar(WEB_APP_ROOT);return webAppContext; }然后,創(chuàng)建服務(wù)器并將上下文添加為處理程序:
Server server = new Server(port);server.setHandler(webAppContext);最后,啟動(dòng)服務(wù)器:
try {server.start();} catch (Exception e) {LOGGER.error("Failed to start server", e);throw new RuntimeException();}一切都在https://github.com/eyalgo/rss-reader/tree/master/src/test/java/com/eyalgo/rssreader/server下。
Spring項(xiàng)目結(jié)構(gòu)
RSS閱讀器項(xiàng)目結(jié)構(gòu)
Spring依賴
在web.xml中,我聲明了application-context.xml和web-context.xml。 在web-context.xml中,我告訴Spring要掃描組件: <context:component-scan base-package="com.eyalgo.rssreader"/> 。
我在application-context.xml中添加了一個(gè)bean,它是一個(gè)外部類,因此無(wú)法對(duì)其進(jìn)行掃描(使用注釋):
<bean id="fetcher" class="org.rometools.fetcher.impl.HttpURLFeedFetcher"/> 。
除了掃描之外,我還在正確的類中添加了正確的注釋。
@Repository
@Service
@Controller
SpringMVC
為了對(duì)RSS提要(和原子)有一些基本的了解,我使用了一個(gè)簡(jiǎn)單的MVC和JSP頁(yè)面。 要?jiǎng)?chuàng)建控制器,我需要為該類添加@Controller 。 我添加了@RequestMapping("/rss")因此所有請(qǐng)求都應(yīng)以rss為前綴。 每個(gè)方法都有一個(gè)@RequestMapping聲明。 我決定一切都是GET 。
向請(qǐng)求添加參數(shù)
只需在方法的參數(shù)之前添加@RequestParam("feedUrl") 。
重定向請(qǐng)求
添加RSS位置后,我想重定向答案以顯示所有當(dāng)前RSS項(xiàng)目。 因此,添加RSS feed的方法需要返回String。 返回值是: “ redirect:all” 。
@RequestMapping(value = "feed", method = RequestMethod.GET)public String addFeed(@RequestParam("feedUrl") String feedUrl) {feedReciever.addFeed(feedUrl);return "redirect:all";}返回ModelAndView類
在Spring MVC中,當(dāng)方法返回String時(shí),框架將查找具有該名稱的JSP頁(yè)面。 如果沒(méi)有,那么我們會(huì)得到一個(gè)錯(cuò)誤。 (如果只想返回String,則可以將@ResponseBody添加到方法中。)
為了使用ModelAndView ,您需要?jiǎng)?chuàng)建一個(gè)名稱為: ModelAndView modelAndView = new ModelAndView("rssItems");
該名稱將告訴Spring MVC引用哪個(gè)JSP。 在此示例中,它將查找rssItems.jsp 。
然后,您可以添加到ModelAndView“對(duì)象”:
List<FeedItem> items = itemsRetriever.get();ModelAndView modelAndView = new ModelAndView("rssItems");modelAndView.addObject("items", items);在JSP頁(yè)面中,您需要引用添加的對(duì)象的名稱。 然后,您可以訪問(wèn)它們的屬性。 因此,在此示例中,我們?cè)趓ssItems.jsp中具有以下內(nèi)容 :
<c:forEach items="${items}" var="item"><div><a href="${item.link}" target="_blank">${item.title}</a><br>${item.publishedDate}</div></c:forEach>注意
Spring“知道”將jsp作為ModelAndView名稱的后綴添加,因?yàn)槲以趙eb-context.xml中聲明了它。 在類的Bean中: org.springframework.web.servlet.view.InternalResourceViewResolver 。 通過(guò)設(shè)置前綴,這個(gè)bean也告訴Spring要尋找jsp頁(yè)面。 敬請(qǐng)期待:
- https://github.com/eyalgo/rss-reader/blob/master/src/main/java/com/eyalgo/rssreader/web/RssController.java
- https://github.com/eyalgo/rss-reader/blob/master/src/main/webapp/WEB-INF/views/rssItems.jsp
錯(cuò)誤處理
Spring MVC中有幾種處理錯(cuò)誤的方法。 我選擇了一種通用方式,對(duì)于任何錯(cuò)誤,都會(huì)顯示一個(gè)通用錯(cuò)誤頁(yè)面。 首先,將@ControllerAdvice添加到要處理錯(cuò)誤的類。 其次,針對(duì)要捕獲的異常類型創(chuàng)建一個(gè)方法。 您需要使用@ExceptionHandler注釋該方法。 參數(shù)告訴此方法將處理哪個(gè)異常。 您可以為IllegalArgumentException提供一個(gè)方法,為不同的異常提供另一個(gè)方法,依此類推。 返回值可以是任何值,它將用作常規(guī)控制器。 這意味著,例如,使用一個(gè)帶有該方法返回的對(duì)象名稱的jsp。 在此示例中,該方法捕獲所有異常并激活error.jsp ,將消息添加到頁(yè)面。
@ExceptionHandler(Exception.class)public ModelAndView handleAllException(Exception e) {ModelAndView model = new ModelAndView("error");model.addObject("message", e.getMessage());return model;}羅馬
ROME是一個(gè)易于使用的庫(kù),用于處理RSS提要: https : //github.com/rometools/rome 。
rome-fetcher是一個(gè)附加的庫(kù),可幫助從外部資源(例如HTTP或URL)獲取(獲取)RSS提要: https : //github.com/rometools/rome-fetcher
截至目前,最新版本是2.0.0-SNAPSHOT。
有關(guān)如何讀取輸入的RSS XML文件的示例,可以在以下位置找到: https : //github.com/eyalgo/rss-reader/blob/master/src/test/java/com/eyalgo/rssreader/runners/MetadataFeedRunner。Java
為了使生活更輕松,我使用了羅馬提取器。 它使您能夠提供URL(RSS提要)并排除所有SyndFeed 。 如果需要,您可以添加緩存,這樣它就不會(huì)下載緩存的項(xiàng)目(已經(jīng)下載的項(xiàng)目)。 您所需要做的就是在構(gòu)造函數(shù)中使用FeedFetcherCache參數(shù)創(chuàng)建訪存器。
用法:
@Overridepublic List<FeedItem> extractItems(String feedUrl) {try {List<FeedItem> result = Lists.newLinkedList();URL url = new URL(feedUrl);SyndFeed feed = fetcher.retrieveFeed(url);List<SyndEntry> entries = feed.getEntries();for (SyndEntry entry : entries) {result.add(new FeedItem(entry.getTitle(), entry.getLink(), entry.getPublishedDate()));}return result;} catch (IllegalArgumentException | IOException | FeedException | FetcherException e) {throw new RuntimeException("Error getting feed from " + feedUrl, e);} }- https://github.com/eyalgo/rss-reader/blob/master/src/main/java/com/eyalgo/rssreader/service/rome/RomeItemsExtractor.java
注意
如果收到警告消息(看起來(lái)像System.out),提示fetcher.properties丟失,則只需在資源下(或類路徑的根目錄下)添加一個(gè)空文件。
摘要
這篇文章涵蓋了幾個(gè)主題。 您還可以查看許多代碼的測(cè)試方式。 檢查匹配器和模擬。 如果您有任何意見(jiàn),請(qǐng)留言。
翻譯自: https://www.javacodegeeks.com/2014/06/rss-reader-using-rome-spring-mvc-embedded-jetty.html
rome rss
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的rome rss_RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JDK 14:记录,文本块等
- 下一篇: Spring MVC – HTTP消息转