RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty

在这篇文章中,我将展示一些创建Spring Web应用程序的准则,使用Jetty以及使用名为ROME的外部库运行RSS来运行它。

一般

我最近创建了一个示例Web应用程序,充当RSS阅读器。 我想检查ROME以阅读RSS。 我还想使用Spring容器和MVC创建最简单的视图的应用程序。 为了快速开发,我将Jetty用作服务器,并为其使用了一个简单的java类。
所有代码都可以在GitHub,eyalgo / rss-reader上找到 。

内容

  1. Maven依赖
  2. 码头服务器
  3. Spring依赖
  4. SpringMVC
  5. 罗马

Maven依赖

起初,我无法使用正确的Jetty版本。 有一个带有group-id mortby,另一个带有eclipse。 经过一番仔细的检查和反复试验,我拿下了日食的图书馆。 春天只是标准。 我在GutHub下找到了最新版本的ROME。 它仍然是快照。

这是依赖项列表:

  • 弹簧
  • 码头
  • 罗马和罗马取球器
  • 登录和slf4j
  • 用于检测
    • 朱尼特
  • 该项目的pom文件可以在以下位置找到: https : //github.com/eyalgo/rss-reader/blob/master/pom.xml

码头服务器

几年前,我一直在使用Wicket框架,并且了解Jetty及其易于使用的服务器创建方法。 我决定朝这个方向前进,并跳过运行WAR部署的标准Web服务器。

有几种创建Jetty服务器的方法。 我决定使用Web应用程序上下文创建服务器。

首先,创建上下文:

private WebAppContext createContext() {WebAppContext webAppContext = new WebAppContext();webAppContext.setContextPath("/");webAppContext.setWar(WEB_APP_ROOT);return webAppContext;
}

然后,创建服务器并将上下文添加为处理程序:

Server server = new Server(port);server.setHandler(webAppContext);

最后,启动服务器:

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项目结构

RSS阅读器项目结构

RSS阅读器项目结构

Spring依赖

在web.xml中,我声明了application-context.xml和web-context.xml。 在web-context.xml中,我告诉Spring要扫描组件: <context:component-scan base-package="com.eyalgo.rssreader"/>
我在application-context.xml中添加了一个bean,它是一个外部类,因此无法对其进行扫描(使用注释):
<bean id="fetcher" class="org.rometools.fetcher.impl.HttpURLFeedFetcher"/>

除了扫描之外,我还在正确的类中添加了正确的注释。
@Repository
@Service
@Autowired

SpringMVC

为了对RSS提要(和原子)有一些基本的了解,我使用了一个简单的MVC和JSP页面。 要创建控制器,我需要为该类添加@Controller 。 我添加了@RequestMapping("/rss")因此所有请求都应以rss为前缀。 每个方法都有一个@RequestMapping声明。 我认为一切都是GET

向请求添加参数

只需在方法的参数之前添加@RequestParam("feedUrl")

重定向请求

添加RSS位置后,我想重定向答案以显示所有当前RSS项目。 因此,添加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中,当方法返回String时,框架将查找具有该名称的JSP页面。 如果没有,那么我们会得到一个错误。 (如果只想返回String,则可以在方法中添加@ResponseBody 。)

为了使用ModelAndView ,您需要创建一个名称为: ModelAndView modelAndView = new ModelAndView("rssItems");
该名称将告诉Spring MVC引用哪个JSP。 在此示例中,它将查找rssItems.jsp

然后,您可以添加到ModelAndView“对象”:

List<FeedItem> items = itemsRetriever.get();ModelAndView modelAndView = new ModelAndView("rssItems");modelAndView.addObject("items", items);

在JSP页面中,您需要引用添加的对象的名称。 然后,您可以访问它们的属性。 因此,在此示例中,我们在rssItems.jsp中具有以下内容

<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名称的后缀添加,因为我在web-context.xml中声明了它。 在类的Bean中: org.springframework.web.servlet.view.InternalResourceViewResolver 。 通过设置前缀,这个bean也告诉Spring要寻找jsp页面。 敬请期待:

  • 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

错误处理

Spring MVC中有几种处理错误的方法。 我选择了一种通用方式,对于任何错误,都会显示一个通用错误页面。 首先,将@ControllerAdvice添加到要处理错误的类。 其次,针对要捕获的异常类型创建一个方法。 您需要使用@ExceptionHandler注释该方法。 参数告诉此方法将处理哪个异常。 您可以为IllegalArgumentException提供一个方法,为不同的异常提供另一个方法,依此类推。 返回值可以是任何值,它将用作常规控制器。 这意味着,例如,使用一个带有该方法返回的对象名称的jsp。 在此示例中,该方法捕获所有异常并激活error.jsp ,将消息添加到页面。

@ExceptionHandler(Exception.class)public ModelAndView handleAllException(Exception e) {ModelAndView model = new ModelAndView("error");model.addObject("message", e.getMessage());return model;}

罗马

ROME是一个易于使用的库,用于处理RSS feed: https : //github.com/rometools/rome 。
rome-fetcher是一个附加库,可帮助从外部资源(例如HTTP或URL)获取(获取)RSS feed: https : //github.com/rometools/rome-fetcher

截至目前,最新版本是2.0.0-SNAPSHOT。

有关如何读取输入的RSS XML文件的示例,可以在以下网址找到: https : //github.com/eyalgo/rss-reader/blob/master/src/test/java/com/eyalgo/rssreader/runners/MetadataFeedRunner。Java

为了让生活更轻松,我使用了罗马提取器。 它使您能够提供URL(RSS提要)并排除所有SyndFeed 。 如果需要,您可以添加缓存,这样它就不会下载缓存的项目(已下载的项目)。 您所需要做的就是在构造函数中使用FeedFetcherCache参数创建访存器。

用法:

@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

注意

如果收到警告消息(看起来像System.out),提示fetcher.properties丢失,只需在资源下(或类路径的根目录下)添加一个空文件。

摘要

这篇文章涵盖了几个主题。 您还可以查看许多代码的测试方式。 检查匹配器和模拟。 如果您有任何意见,请留言。

翻译自: https://www.javacodegeeks.com/2014/06/rss-reader-using-rome-spring-mvc-embedded-jetty.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HZOJ string

正解炸了…… 考试的时候想到了正解&#xff0c;非常高兴的打出来了线段树&#xff0c;又调了好长时间&#xff0c;对拍了一下发现除了非常大的点跑的有点慢外其他还行。因为复杂度算着有点高…… 最后正解死于常数太大……旁边的lyl用同样的算法拿了90分我却拿了个暴力的分40……

Unity3D入门其实很简单

在上次发布拙作后&#xff0c;有不少童鞋询问本人如何学习Unity3D。本人自知作为一名刚入门的菜鸟&#xff0c;实在没有资格谈论这么高大上的话题&#xff0c;生怕误导了各位。不过思来想去&#xff0c;决定还是写一些自己的经验&#xff0c;如果能给想要入门U3D的您一些启发&a…

4. HTML表单标签

表单是网页中最常见的元素&#xff0c;也是用户和我们交互的重要手段&#xff0c;在网站中的登录、注册、信息更新这些功能都是依赖表单实现的。在HTML中对于表单提供了一系列的标签&#xff0c;即输入框、下拉框、按钮、文本域&#xff0c;如下是一个最常见的表单结构内容&…

Java 8默认方法可能会破坏您的(用户)代码

乍一看&#xff0c; 默认方法为Java虚拟机的指令集带来了一个很棒的新功能。 最后&#xff0c;库开发人员能够开发已建立的API&#xff0c;而不会对其用户代码造成不兼容性。 使用默认方法&#xff0c;当将新方法引入该接口时&#xff0c;任何实现库接口的用户类都会自动采用默…

ADO.NET之使用DataSet类更新数据库

1.首先从数据库获得数据填充到DataSet类&#xff0c;该类中的表和数据库中的表相互映射。 2.对DataSet类中的表进行修改&#xff08;插入&#xff0c;更新&#xff0c;删除等&#xff09; 3.同步到数据库中&#xff1a;使用SqlDataAdapter实例名.Update(DataSet实例名&#xff…

CSS完美兼容IE6/IE7/FF的通用方法

关于CSS对各个浏览器兼容已经是老生常谈的问题了, 网络上的教程遍地都是.以下内容没有太多新颖, 希望能对初学者有一定的帮助.一、CSS HACK 以下两种方法几乎能解决现今所有HACK. 1, !important 随着IE7对!important的支持, !important 方法现在只针对IE6的HACK.(注意写法.记得…

学习进度

这一周学习了第四章登录&#xff0c;第五章系统业务逻辑没有完成上周规定的四五六章&#xff0c;因为发现有些以前看的东西现在没印象了&#xff0c;又看了一些之前的。 在代码上完成了老师布置的代码&#xff0c;第一个是判断AB和C的关系 &#xff0c;第二个是成绩排名&#x…

为Lucene选择快速唯一标识符(UUID)

大多数使用Apache Lucene的搜索应用程序都会为每个索引文档分配唯一的ID&#xff08;即主键&#xff09;。 尽管Lucene本身不需要这样做&#xff08;它可能不太在乎&#xff01;&#xff09;&#xff0c;但应用程序通常需要它以后通过其外部ID替换&#xff0c;删除或检索该文档…

ubuntu16.04设置静态ip

最近在课堂上&#xff0c;有很多同学反映在搭建环境的时候&#xff0c;虚拟机ip经常变&#xff0c;那么我们配置好的web服务可能就不能用了。下面讲一下如何在ubuntu上面设置静态ip 1&#xff1a;首先我们确认一下ubuntu的版本 cat /etc/issue 或者sudo lsb_release -a或者unam…

css布局:块级元素的居中

一.定宽&#xff1a; 1.定位居中(absolute) 方法一&#xff1a; html:<div class"main"></main>css:.main{width:400px;height:200px;background:#eee;position:absolute;left:50%;top:50%;margin-left:-200px;margin-top:-100px;} 方法二&#xff1a;…

精准客户数据服务

详情请点击&#xff1a;http://www.rulingtech.com 客户数据&#xff08;名录&#xff09;是市场营销活动不可或缺的重要资料。目前企业采用的客户名录数据主要通过订购黄页、购买第三方名录、自行搜集等途径。这些方式面临的问题是&#xff1a;数据重复度高、有效性差、准确率…

Maven常用的构建命令

Maven常用命令&#xff1a; Maven库&#xff1a; http://repo2.maven.org/maven2/ Maven依赖查询&#xff1a; http://mvnrepository.com/ 一&#xff0c;Maven常用命令&#xff1a; 1. 创建Maven的普通Java项目&#xff1a; mvn archetype:create-DgroupIdpackageName-Dartifa…

JPA 2.1实体图–第1部分:命名实体图

延迟加载通常是JPA 2.0的问题。 如果要使用FetchType.LAZY&#xff08;默认&#xff09;或FetchType.EAGER来加载关系&#xff0c;则必须在实体上进行定义&#xff0c;并且始终使用此模式。 仅当我们要始终加载关系时才使用FetchType.EAGER。 FetchType.LAZY几乎在所有情况下都…

课时85.层叠性(掌握)

1.什么是层叠性&#xff1f; 层叠性就是CSS处理冲突的一种能力。 这个字体最终会变为红色 注意点&#xff1a; 层叠性只有在多个选择器选中“同一个标签”,然后又设置了“相同的属性”&#xff0c;才会发生层叠性。 CSS全称&#xff1a;Cascading StyleSheet 层叠样式表&am…

ABZ职业规划

关于职业规划&#xff0c;LinkedIn&#xff08;领英&#xff09;创始人里德霍夫曼&#xff08;Reid Hoffman&#xff09;提出著名的“ABZ理论”&#xff0c;教我们应对变化莫测的职场人生。 德霍父曼建议每个职场人应有A计划&#xff0c;B计划&#xff0c;C计划。 A计划&#x…

SetProcessWorkingSetSize减少内存占用

系统启动起来以后&#xff0c;内存占用越来越大&#xff0c;使用析构函数、GC.Collect什么的也不见效果&#xff0c;后来查了好久&#xff0c;找到了个办法&#xff0c;就是使用 SetProcessWorkingSetSize函数。这个函数是Windows API 函数。下面是使用的方法&#xff1a;[Syst…

Spring Boot 与消息 (JMS、AMQP、RabbitMQ)

RabbitMQ教程 - 鸟哥的专栏 - CSDN博客 一、概述 大多应用中&#xff0c;可通过消息服务中间件来提升系统异步通信、扩展解耦能力消息服务中两个重要概念&#xff1a;消息代理&#xff08;message broker)和目的地&#xff08;destination) 当消息发送者发送消息以后&#xff0…

使用Apache Camel通过soap添加WS-Security

WS-Security&#xff08;Web服务安全性&#xff09;是一种协议&#xff0c;可让您保护自己的soap Web服务。 发出Soap请求的客户端必须在Soap标头中提供登录名和密码。 服务器接收到肥皂请求&#xff0c;检查凭据并验证请求是否正确。 使用Apache Camel&#xff0c;可以很容易…

课时3.浏览器访问网页原理(理解)

浏览器访问网页原理&#xff08;理解&#xff09; 第一次打开IE6&#xff0c;发现系统自动生成了一个文件夹&#xff0c;所以我们可以得出这个文件夹必然和IE6有一定的关系先删除Internet Cache下的所有文件夹&#xff0c;然后通过IE6打开百度的首页&#xff0c;打开百度首页以…

matlab 图像平移操作

目标&#xff1a;对原图I进行[80,50]的偏移操作得到图B。 首先读入图像&#xff0c;以matlab自带的pout.tif为例. strel是创建形态学结构元素的. translate函数在原结构上进行[80,50]的偏移. I imread(cameraman.tif); se translate(strel(1),[80,50]); B imdilate(I,se);转…