数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类 全部分类技术牛文全部分类教程最新 网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava 新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销 开发数据库服务器系统虚拟化云计算 嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

基于JSP的RSS阅读器的设计与实现方法(推荐)

日期:2016/9/11 22:08:00 来源:本网整理

web与jsp的区别问:要做课程设计,需要JSP和web还有数据库,现在不明白JSP与WEB之间的关系...答:首先,你要明确一点:javaweb是使用java语言进行web系统开发!web系统开发------Java在web开发上处于领导地位!现在主流的是MVC的三层架构,而jsp就是页面表现层的首选,因为它出现的比较早,技术相对成熟和普及。这就是最为流行的J2EE技术。...基于javaweb实现的论坛和基于JSP有多大区别?我...问:基于JSP的论坛开放文章,不知道可不可以借鉴答:JAVAWEB包括服务器端的和页面端两部分,页面端具体实现方式一般就是JSP,写论文的话,没差别关于问题补充,写论文的水平来看的话,可以直接说:是的(实际上页面还是可以采用别的页面框架技术的,比如freemarker,不过绝大部分情况——超过95%...


基于JSP的RSS阅读器的设计与实现方法(推荐)(图2)


基于JSP的RSS阅读器的设计与实现方法(推荐)(图4)


基于JSP的RSS阅读器的设计与实现方法(推荐)(图6)


基于JSP的RSS阅读器的设计与实现方法(推荐)(图8)


基于JSP的RSS阅读器的设计与实现方法(推荐)(图10)


基于JSP的RSS阅读器的设计与实现方法(推荐)(图12)

s">

基于JSP的RSS阅读器的设计与实现方法(推荐)

投稿:jingxian 字体:[增加 减小] 类型:转载 时间:2016-07-24 我要评论 下面小编就为大家带来一篇基于JSP的RSS阅读器的设计与实现方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ">

阅读器访问地址:http://easyrss.tk/,欢迎体验!

基于JSP考试系统的设计与实现用英文怎么翻译问:基于JSP考试系统的设计与实现用英文怎么翻译答:翻译:TheDesignandImplementationofExaminationSystemBase。防恶意抓取,请查看原文,,真格学网提供内容。

阅读导览

基于jsp网上在线招聘系统源代码问:谁有这个课程设计的完整源码。答:jsp在线招聘系统java网上招聘求职网站jsp毕业设计。防恶意抓取,请查看原文,,真格学网提供内容。

一、 概述

基于jsp设计的系统运用的技术有哪些答:最简单原始的方法就是使用servlet来实现;也可以使用框架,比如SSH等。防恶意抓取,请查看原文,,真格学网提供内容。

二、 设计的基本概念和原理

哪里基于jsp的旅游网站源码答:道客巴巴有:JSP旅游网站建设设计与实现(源代码及全套资料):http://www.doc88.com/p-7743769012571.html。防恶意抓取,请查看原文,,真格学网提供内容。

三、 设计方案

怎么样基于jsp实现新闻管理系统附完整源码答:ifrvisnotNoneandrsvisnotNone:#extractversion/subversionself._nmap_version_num。防恶意抓取,请查看原文,,真格学网提供内容。

四、 主要源代码

jsp设计的毕业论文,谁能提供几个期刊类的参考文献?问:要实例,模板如下,最好提供5个以上[序号]主要责任者.文献题名[J...答:你需要的内容如下,如有其它问题请追问,寻找不易,满意还望采纳[1]张。防恶意抓取,请查看原文,,真格学网提供内容。

五、 阅读器使用说明

JSP技术实现RSS订阅功能的示例></rss>用JSP技术实现RSS功能其实就是一个XML文件!在<rss></rss>之间我们可以自由配置自己要发布的RS。防恶意抓取,请查看原文,,真格学网提供内容。

概述

获得信息是在人类的生活中是必不可少的环节。如果现在的社会对获得信息不快捷,那么这个社会将不会像如今这般的发达和进步。在当今网络技术相当发达的今天,大量的信息充斥在网上。现在网络越来越发达,用户在网上既能工作也能娱乐。当用户在网上需浏览很多个网站才能获取自己多需的信息时,那就感觉很累。因为现在每个网站都有很多信息,找到自己所喜欢的并不是一件轻松的事。这时RSS阅读器的功用就体现出来了。

几则JSP入门知识总结我就像一个旱鸭子学会游泳一样,心里无比高兴,熬了几天夜,终于写成了这个纯JSP的文...;//在屏幕上输出库中的内容while(rss.next()){Stringa_name=rss.getString(1);out.p...。防恶意抓取,请查看原文,,真格学网提供内容。

RSS 是一种简单的订阅方式,它能能够起到聚合网络信息的作用。就像订报纸、杂志一样,您可以订阅任何喜欢的内容。网络用户可以在客户端借助于支持RSS的新闻聚合软件在不打开网站内容页面的情况下,将网站提供的支持RSS输出的网站内容(新闻、Blog等)聚集到RSS阅读器中,用户可以不必登录各个提供信息的网站,而通过"RSS阅读器"来阅读这些内容。

用AJAX技术聚合RSS来支持RSS0.92、RSS1.0、Atom0.3。为什么采用AJAX呢?首先,聚合别人的RSS不...这个功能我完全用JavaScript实现的,这样,不管你的blog是ASP、.Net、PHP、JSP、Pe...。防恶意抓取,请查看原文,,真格学网提供内容。

本设计要设计一个RSS阅读器,本阅读器将要实现的功能如下:

jsp页面中<inputtype="text">设定value的取值范围,文本框的...if(bytes-subBytes==1){returnstr.substrin。防恶意抓取,请查看原文,,真格学网提供内容。

随时随地阅读:

急!jsp程序出错!请人帮忙啊!')BEGIN'"+sele+"'END";ResultSetrss=stmt.executeQuery(sqq);if(rss.next。防恶意抓取,请查看原文,,真格学网提供内容。

通过注册与登录将用户信息保存到服务器,用户在任何时间、任何地方打开网页就可以阅读自己的RSS订阅。

JAVA怎么用timer定时控制我的程序读取别人的RSS方法,写你读取rss的代码,可以直接在这里写,也可调用写好的类的方法.publicclassAutoRefreshextendsTimerTas。防恶意抓取,请查看原文,,真格学网提供内容。

RSS源的分组管理与结构化显示:

百度用用什么语言编写的是jsp?用什么构架的?从客户端的网页内容来看,用rss+xml,HTML,javascript,CSS.用了CGI接口,至于是不是asp,php,从网页内容看不出。FORM标签。防恶意抓取,请查看原文,,真格学网提供内容。

简洁直观的分类显示用户的RSS订阅列表,简化操作、提高用户的阅读体验。

eclipse+tomcat开发环境java白盒测试工具哪个更合适StrutsStruts是一个基于SunJ2EE平台的MVC框架,主要是采用Servlet和JSP技术...既可以在Java的客户端程。防恶意抓取,请查看原文,,真格学网提供内容。

RSS源的添加、修改与删除:

怎么知道一个网页是那种语言编写的htmlcssjavascriptaspasp.netjspphpcgirss等等..有很多种啊.作用就很难说了....CSS是定义网页的样式asp/asp.net/j。防恶意抓取,请查看原文,,真格学网提供内容。

用户能够方便的添加、修改、删除RSS源及分组。

。防恶意抓取,请查看原文,,真格学网提供内容。

RSS源的的解析与显示:

蛇进家,民间寓意要进财,中国古代迷信说法是蛇是家神,是保护家宅的。科学研究表明,蛇之所以会出现在家里,是因为家里适合动物生存,也就是说你的家是一块风水宝地。而且你家里有蛇类所需的食物,像老鼠,昆虫等有。防恶意抓取,请查看原文,,真格学网提供内容。

阅读器可以通过用户提供的RSS源URL解析出该RSS源的标题、包含的文章列表、文章地址和文章更新时间等信息,并且能正确地以一定格式显示出来供用户阅读。

看到问题后,我觉得自己找到了组织!先说说自己的情况:25岁中性(以前是油,长痘,冬天又油又干)阳光下也不见毛孔平时有妹纸会说我的皮肤不错以前,我也是“豆皮”,从小学六年级开始长痘痘,一长就是十三四年。。防恶意抓取,请查看原文,,真格学网提供内容。

设计的基本概念和原理

河南方言文化博大精深,很多词汇都相当传神,分享一些常见的河南方言。1、醭(bú)——面醭,发霉生醭。2、大(da)——父亲或父亲的兄弟。三大。3、捣(dǎo)——欺骗,坑害。捣人。4、嬎(fàn)——。防恶意抓取,请查看原文,,真格学网提供内容。

RSS与RSS阅读器概念

因为有中超新政啊!而且还得看人家愿意不愿意来。我们先看看中超新政都有哪些内容:1、每场比赛必须首发一名本土U23球员,首发多久没定;2、外援由原来的4+1(首发3名外援+1名亚洲外援,还可以用外援换外。防恶意抓取,请查看原文,,真格学网提供内容。

RSS:

怎么从iCloud下载照片?iPhone的拍照功能一直深受苹果用户们的喜爱,相信有许多用户习惯将保存在手机中的照片备份到iCloud中,以避免手机中的照片意外丢失。不过有时候我们也需要将iCloud中。防恶意抓取,请查看原文,,真格学网提供内容。

RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用【1】。RSS搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者。发布一个RSS文件后,这个RSS Feed中包含的信息就能直接被其他站点调用,而且由于这些数据都是标准的XML格式,所以也能在其他的终端和服务中使用,是一种描述和同步网站内容的格式。 RSS可以是以下三个解释的其中一个: Really Simple Syndication;RDF (Resource Description Framework) Site Summary; Rich Site Summary【2】。但其实这三个解释都是指同一种Syndication的技术。

很多朋友在养狗之前,根本没有接触过狗狗,或许他们养狗狗只是一时兴趣,或者是别人送了一只狗狗,自己捡了一只狗狗这种情况多不胜数。在完全不了解如何养狗的时候你就开始养狗了,如果喂养不当就可能引起狗狗生病甚至死亡的,所以一定要先了解新手喂养狗狗的极大禁忌才能更好的让狗狗健康成长。一、洗澡刚开始接到狗狗肯定非常高兴,但是小狗狗刚开始因为很久没有洗澡,你肯定很想给他洗澡然后抱着他玩个够吧,但是殊不知就因为这个原因就可能让你狗狗离开你。因为小狗才到一个新环境是根本不适应的。这个时候的他们抵抗力是非常弱的。如果给他洗澡很有可能会引起狗狗着凉感冒,轻就只是感冒了,然后拉肚子呕吐这些情况。但是如果重一点的话就很。防恶意抓取,请查看原文,,真格学网提供内容。

RSS目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0。使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新。网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。

并线护航这个汽车功能还是第一次听说过,不过它跟并线辅助,侧向辅助系统实现原理应该是一样的,它们都可以理解成盲区检测系统,只不过厂家换个叫法,为了吸引消费者而已。这个功能实现原理就是在汽车A住下面,大部分车都设计在倒后镜下方,有个感应器,当你的车即将要并线的时候,如果后方来来车,倒后镜里会显示红色三角形报警标志,如果驾驶员没注意后方开车并且执意并线,报警标志持续报警闪烁,发出嘀嘀声音!。防恶意抓取,请查看原文,,真格学网提供内容。

RSS阅读器:

看一下实时票房,《战狼2》今天当之无愧1亿多票房霸榜。有观众在网上称第一时间就去看了首映,刚开始只是被剧情吸引了,在观看过程还感觉有点夸张,但当看到导弹从军舰发射的那一刻,整个人都被点燃了。而当看到吴。防恶意抓取,请查看原文,,真格学网提供内容。

RSS阅读器基本可以分为三类【3】:

首先,这个问题属于以偏概全的了,皮肤差的明星大把,发图举个栗子!你看,张馨予妆前妆后差多远!(并没有黑的意思)真正卸了妆之后皮肤还是完美无瑕的明星真的没几个。但是既然回答了这个问题,那总是要给题主学到。防恶意抓取,请查看原文,,真格学网提供内容。

第一类大多数阅读器是运行在计算机桌面上的应用程序,通过所订阅网站的新闻供应,可自动、定时地更新新闻标题。在该类阅读器中,有Awasu、FeedDemon和RSSReader这三款流行的阅读器,都提供免费试用版和付费高级版。

我是农村来的,没穿过几千块的衣服,甚至一两百的衣服,有时候对我来说也是奢侈。但是,我却很清楚几千块的衣服和一两百衣服有何不同。首先衣服这个东西最大的作用有两个,一是遮羞,二是保暖。其他的什么装饰,体现形象这些更深层次的作用,也必须在前面这两个作用的前提之上。才能发挥得出来。那么上千块的衣服和一两百甚至九块九包邮的衣服之间的区别也就显而易见了。两者都是衣服,都具备遮羞和保暖的作用,而前者在遮羞和保暖。防恶意抓取,请查看原文,,真格学网提供内容。

第二类新闻阅读器通常是内嵌于已在计算机中运行的应用程序中。例如,NewsGator内嵌在微软的Outlook中,所订阅的新闻标题位于Outlook的收件箱文件夹中。另外,Pluck内嵌在Internet Explorer浏览器中!

郝海东和孙继海当然是有真本事的人。不过要看他们的所谓“本事”在哪?作为球员郝海东和孙继海都是大连万达队中的不可或缺的人物,他们都为建立万达和实德的王朝立下了汗马功劳。在国家队层面,郝海东和孙继海也为中国男足打入2002年的韩日世界杯立下了大功。在韩日世界杯上,孙继海在首战比赛中的受伤,也给当时的米卢国家队带来了很大影响。在留洋层面,孙继海在当时的英超曼城是主力球员,是在英超进过球,做出了惊天解围的。防恶意抓取,请查看原文,,真格学网提供内容。

第三类则是在线的WEB RSS阅读器,其优势在于不需要安装任何软件就可以获得RSS阅读的便利,并且可以保存阅读状态,推荐和收藏自己感兴趣的文章。提供此服务的有两类网站,一种是专门提供RSS阅读器的网站,例如国外的feedly,国内的有道、鲜果、抓虾;另一种是提供个性化首页的网站,例如国外的netvibes、pageflakes,国内的雅蛙、阔地。

蒸是一种烹调方法,我国素有“无菜不蒸”的说法。蒸菜的特点是保持了菜肴的原形、原汁、原味,能在很大程度上保存菜的各种营养素。这种看似简单的烹制方法,让都市人在吃过花样百出的菜肴后,依然对这种原始的美味蒸菜念念不忘。夏天,清新的菜肴最讨欢心,这家蒸菜,蒸出美味,蒸出健康就是你的不二选择!?笼尚蒸养生餐厅这是一家养生餐厅,无香精、无色素、无添加剂。凭一口砂锅,几分钟的时间,就能满足你所有的味蕾!?这家店。防恶意抓取,请查看原文,,真格学网提供内容。

本阅读器即是基于JSP的WEB RSS阅读器。

湖州美食有干挑面,湖州大馄饨,张一品酱羊肉等。1、干挑面,顾名思义就是一是要“干”,没有汤,仅只是少量的油汁,够面条润滑就可以。二是要“挑”,就是将面条不断地高高挑拌,以让少量的油亮汁水匀和在面条上。。防恶意抓取,请查看原文,,真格学网提供内容。

阅读器实现原理

牛仔衬衫夏秋交替季,短袖T恤嫌太凉,针织毛衣还太早,轻薄舒适的牛仔长袖衬衫或许是防晒又耐凉的早秋最佳单品吧!也是街拍最IN单品,看欧美型人演绎百搭衬衫单品,复古or简约风格不同都能轻松穿搭出街。西装外。防恶意抓取,请查看原文,,真格学网提供内容。

本RSS阅读器使用主要使用JSP技术,根据用户请求的Url借助Rome和Jdom开源工具来解析XML文件获取相应内容,然后将获取到的内容以方便阅读的格式显示在网页上【4】。同时用数据库与JSP相应技术实现阅读器功能的扩展,如:用户阅读列表的管理,显示效果的优化等。

美洲世预赛积阿根廷后面赛程(最后一场客场对阵厄瓜多尔)这是南美世界杯预选赛目前为止最新的积分榜,现在阿根廷积22分排在第五位,最后四战分别是主场迎战委内瑞拉和秘鲁,客场面对乌拉圭和厄瓜多尔,不客观点讲,以阿根廷的实力,明显要比其他四队的实力都要高,连赢四场都有可能,排名只会越升越高,不可能会无缘世界杯的。如果客观点说,乌拉圭和厄瓜多尔是硬骨头,毕竟他们有一定的实力,而且又是阿根廷的直接竞争对手,不。防恶意抓取,请查看原文,,真格学网提供内容。

设计方案

秦古808世界70%的绿松石在中国,而中国70%的绿松石在十堰竹山。秦古808就是竹山绿松石最大出矿量的矿口!|秦古808矿口秦古松石瓷度特别高,而且“瓷釉”的松石出产率最高。绿松品质和洞子沟类似,不。防恶意抓取,请查看原文,,真格学网提供内容。

架构设计

(哭是婴儿向这个世界表达的唯一方式)每次去朋友家的时候,总会遇到这样的状况。孩子不小心磕磕碰碰,或者想吃的零食没吃到,就会如火山爆发般地哭,父母一脸尴尬地拿出浑身解数地哄:这么点小事有什么大不了的?有。防恶意抓取,请查看原文,,真格学网提供内容。

网站前台使用JSP技术实现页面与功能,后台数据库使用SQLServer作数据管理,阅读内容从RSS源获取,如下图:

壹分、两分、五分硬币2017年8月详细年份价格表随着经济水平和物价水平的提高,我国的硬分币作为最小面额的货币已经逐渐退出流通市场,而有关其身价暴增的传言则屡见不鲜。那么,哪一年的硬分币最值钱,下面就来。防恶意抓取,请查看原文,,真格学网提供内容。

数据库设计

月饼里到底藏了多少热量热量含量:1个双黄莲蓉月饼=1碟粟米肉粒饭+1碗罗宋汤+1杯冻奶茶tips:一个双黄莲蓉月饼(约190克)含有高达800卡路里热量,一般成年人每天需要摄取1800至2200卡路里。防恶意抓取,请查看原文,,真格学网提供内容。

数据库使用SQL Server 2008 R2,数据表设计如下:

谢邀,楼主这个问题使许多人非常惊讶,与一些城市的高级白领收入相当,农民工月收入真的可以达到上万吗?坤鹏论经过分析如下:一、农民工的真实收入水平首先农民工在城市中可以从事哪些方面的工作,由于农民工基本没。防恶意抓取,请查看原文,,真格学网提供内容。

为保护系统安全,数据表结构不直接给出

真是三十年河东三十年河西啊,遥想2000年奥运申办,5选一,北京两票之差输给悉尼,甚至事后还有贿选的消息传出。但看看现在,2022年冬奥会和2024夏奥会,国际奥委会面对的都是二选一的尴尬,甚至IOC。防恶意抓取,请查看原文,,真格学网提供内容。

界面设计

很多女性青睐日本车,确实是事实。近好多年身边的女性朋友买车的越来越多,买车前都咨询过我,有较深的感受,在我的耐心讲解下,无一人购买倭车,很是欣慰。总结出以下几点:1、天性:大多作为持家有道的女主人,节。防恶意抓取,请查看原文,,真格学网提供内容。

登录与注册:

这个问题是因为就算抢不到,也打出了知名度。对他们品牌的提升是有非常巨大的影响的,尤其是经过央视的宣传。可以在人们心中留下深刻的印象。而如果紧紧是在网络上宣传的话留给人们的印象永远没有,在电视上那么深。。防恶意抓取,请查看原文,,真格学网提供内容。

登录界面 login.jsp

武器有了,我就买很多食物,那种可以保质很长时间的,花5万买上四年的储备食物,水,不花钱,直接自己拿水桶接自来水然后烧开,多接点,反正爆发后10天才收电费。我再去黑市花15万搞到一些子弹和两把唐刀(唐刀。防恶意抓取,请查看原文,,真格学网提供内容。

注册界面signup.jsp:

我和老婆结婚已经三年,感情一向稳定。就在去年的时候,对面搬来一家年轻的情侣。女的长得漂亮,男的长得英俊。我和老婆之间的关系才出现了微妙的关系。昨天我下班回家以后,正在浴室洗澡,突然手机震动了下。我一看。防恶意抓取,请查看原文,,真格学网提供内容。

主页

主页index.jsp(中间的分割线可以拖动)

爸爸妈妈有很多杀伤力很强的“武器”,能把孩子打得越来越压抑,越来越自卑、越来越无心学习,甚至把孩子逼出心理问题。真心爸妈这就来盘点一下火力最强的几个:1、经常贬低孩子“你怎么这么笨!”“你怎么这么不听。防恶意抓取,请查看原文,,真格学网提供内容。

主页采用框架设计,上部为网站信息和当前用户信息;左边为RSS源列表;右边是主框架,用于显示阅读内容。左右框架大小可以拖动随意调整。

点击上方按钮【关注】,每天与您分享优质的健康科普知识想要培养“高智商宝宝”就得有一双会发现得眼睛,发现宝宝身上的“天才”信号,快来看看你家宝宝有几个信号?宝宝智商高的信号信号一:耳朵大的宝宝人的创造力。防恶意抓取,请查看原文,,真格学网提供内容。

RSS树形列表:

  土陶蒸锅,叫“汽锅”,是专门用来蒸食物的。汽锅鸡是一道云南名菜,因用汽锅蒸制而得名。汽锅鸡早在2000多年前就在滇南民间流传,相传是临安府(建水县)福德居厨师杨沥发明的吃法。汽锅鸡主要食材是鸡肉,。防恶意抓取,请查看原文,,真格学网提供内容。

dtree

医学上已经证明,适量饮酒可以对人体产生真正的健康功效,比如降低胆固醇,强化智能,激发灵感等。1、降低有害胆固醇:可以减少有害胆固醇,预防血栓,从而降低冠心病的患病率。2、预防糖尿病:医学家希望人们记住。防恶意抓取,请查看原文,,真格学网提供内容。

RSS源显示采用dtree树形列表【5】展示,能够直观展示分组与分组中的RRS源。

文章列表:

以表格形式列出选定RSS订阅中的文章列表

文章内容:

文章内容

文章内容是直接展示文章原网页,保持原文排版,并防止被屏蔽。

添加与管理:

添加与管理都采用弹窗的方式,具体如下:

添加源

添加分组

管理分组

管理源

修改界面与添加界面相似,不再贴图。

提示信息(tips.jsp):

大部分提示信息由tips页面显示,举例如下:

注册提示

未登录提示

退出提示

……

提示页面会根据获取到的参数显示提示信息

功能设计

注册:

注册时,用户名、密码以及确认密码为必填项。由于密码不可见,设置确认密码可以防止输入错误。昵称为选填项,用以更加友好的显示用户名称,若为空显示时将以用户名代替。注册后将注册信息添加到数据库。同时应注意用户名不能和数据库中已有的用户名重复。

登录:

登录时首先获取用户名,连接数据库,查询该用户是否存在,若用户名不存在,跳转提示页面显示相应提示然后返回至登录页面。如果查找到,则再确认密码是否输入正确,密码正确则将用户uid存入session以备后面使用然后跳转至该用户主页。

主页:

主页采用框架布局,主要包括三个部分:

上部:显示网站logo,当前用户信息等。用户信息根据session中的uid从数据库中查询该用户的详细信息。若该用户昵称列表不为空则显示昵称,若为空则显示用户名。

左部:主要是RSS树形列表,详细见后文介绍;

右部:主要显示区域,显示文章列表及文章具体内容,详细见后文介绍。

RSS树形列表:

RSS源显示采用开源的dtree项目进行二次开发。首先根据之前放入session中的uid获取当前用户的RSS分组数据,每获取到一个分组就根据该分组的gid获取属于该组内的的RSS源数据,然后将数据放入dtree中,依次循环直至获取到所有数据。最后由dtree根据获取到的数据按照树形样式显示出来。用户点击列表中的项目将会在右侧主框架中打开相应的文章列表。

主框架的文章列表:

主框架从左框架中发来的链接中提取feed参数中的url值,解析该url获取到相应文章列表。对url和xml文件的解析采用rss解析器(rome.jar和jdom.jar)进行解析获取相应数据。

同时,为了解决部分文章不支持在框架中打开,文章列表设计了在新窗口打开的选项。主要实现方法是:用户改变"在新窗口中打开"的选项的状态后,js立即将该选项状态写入Cookie并发送刷新请求。服务器根据Cookies值动态修改文章链接的target属性并向客户端发送新的页面。

文章内容显示:

文章内容未做任何处理直接显示原文,简单方便。但是有些文章不支持在框架中显示,这时需要勾选"在新窗口中打开"的选项,使文章在新开的浏览器窗口中显示。

RSS源的添加与管理:

添加分为添加源与添加分组,两个界面属于同一个弹窗,通过顶部tab切换,直观快捷。

添加源时需要提交:Feed地址、标题、分组。feed地址填写需要订阅的rss地址;标题可以从Feed地址中提取(具体实现方式为服务器获取到feed地址,根据feed地址解析出订阅标题,然后向客户端发送带有订阅标题的新页面);分组通过列表框选择用户已有的分组。客户端提交表单后,服务器获取到相应的信息并添加至数据库,然后返回成功信息;用户可再次添加新的源。

添加分组时只需要提交需要添加的分组名称即可。

管理界面属于新的弹窗,初始显示用户的所有分组,每个分组包含"展开"、"修改"和"删除"三个菜单。点击分组名或"展开"菜单将会跳转到该分组下的RSS源列表。RSS源列表与分组列表相识,每个分组包含"修改"与"删除"两个菜单。

修改时提交需要修改的项目,服务器根据获取到的gid、pd以及修改后的信息更新对应项目数据并返回相应提示。

删除时提交对应分组的gid或RSS源的pd,服务器根据获取到的id信息输出相应项目并返回提示。删除非空分组时将会删除该分组下所有RSS源(有提示)。

提示信息:

提示信息显示页面或根据获取到的参数显示相应的提示信息并在延迟特定时间后跳转到相应界面,参数为空时显示"未知错误"并跳转至主页。

网络安全补充

为了保护网站与用户数据安全,采取了一下辅助安全措施:

注册输入限制:

用户名只能为字母与数字的组合

密码长度太短

用户名限制为字母与数字组合,防止用户使用SQL语言中的符号进行SQL注入。密码长度限制为8~20位。太短,密码不安全;太长,用户可以通过密码框使用SQL注入攻击

使用过滤器防止SQL注入:

只通过表单的输入限制来防止SQL注入是远远不够的,用户依然可一使用URL参数的形式进行注入攻击。所以我在原项目中加入了一个过滤器来防护一些简单的SQL注入攻击。

该过滤器的原理是,截取用户的所有输入,检测是否是否包含特定关键词,有则重定向到一个错误信息页面error.jsp。没有则通过过滤器。

当然只是用过滤器是不能完全防护SQL注入攻击的,更有效的方式是项目中所有SQL语句都采用预编译语句(PreparedStatement)接口来实现【6】。

面对日益复杂的网络安全环境,以上的安全措施只是简单的做了一些防护,对于一个实际项目是远远不够的。在实际的项目还用采取更加严谨,更加有效的措施。

具体方法参考本文:JSP使用过滤器防止SQL注入

主要源代码

视图部分 /RSSreader/WebContent/rsscontent.jsp: <%@page contentType="text/html"%> <%@page pageEncoding="UTF-8" import="java.text.SimpleDateFormat"%> <html> <script language=javascript> function setCheck(){ var newWindow=document.getElementById("newWindow").value; if(newWindow==0) { document.getElementById("check").checked=true; } else { document.getElementById("check").checked=false; } } function check(){ var check=document.getElementById("check").checked; var feed=document.getElementById("feed").value; var url="rsscontent.jsp?feed="+feed; if(check) { document.cookie="newWindow=0"; } else { document.cookie="newWindow=1"; } self.location=url; } </script> <body onload="setCheck()"> <% String pageTitle=""; String urlStr = request.getParameter("feed"); String target=""; Cookie cookies[]=request.getCookies(); //读出用户硬盘上的Cookie,并将所有的Cookie放到一个cookie对象数组里面 Cookie sCookie=null; for(int i=0;i<cookies.length;i++){ //用一个循环语句遍历刚才建立的Cookie对象数组 sCookie=cookies[i]; //取出数组中的一个Cookie对象 if(sCookie!=null){ if(("newWindow").equals(sCookie.getName())){ pageContext.setAttribute("newWindow",sCookie.getValue()); System.out.println(pageContext.getAttribute("newWindow")); } } } if(pageContext.getAttribute("newWindow")!=null) { if(pageContext.getAttribute("newWindow").equals("0")){ target="_blank"; } else{ target="_self"; } } try{ /* java.util.Properties systemSettings = System.getProperties(); systemSettings.put("http.proxyHost", "mywebcache.com"); systemSettings.put("http.proxyPort", "8080"); System.setProperties(systemSettings); */ if (!urlStr.startsWith("http://")) urlStr = "http://"+request.getParameter("feed"); //String urlStr = "http://feed.cnblogs.com/blog/u/249598/rss"; System.out.println(urlStr); java.net.URLConnection feedUrl = new java.net.URL(urlStr).openConnection(); feedUrl.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); com.sun.syndication.io.SyndFeedInput input = new com.sun.syndication.io.SyndFeedInput(); com.sun.syndication.feed.synd.SyndFeed feed = input.build(new com.sun.syndication.io.XmlReader(feedUrl)); pageTitle=feed.getTitle(); %> <div align="center"> <h1><%=pageTitle%></h1> <input type="hidden" id="feed" value=<%=urlStr %>> <input type="hidden" id="newWindow" value=<%=pageContext.getAttribute("newWindow")%>> <input type=checkbox name="check" id="check" onclick="check()">在新窗口中打开(部分网页不支持在框架中显示,请尝试勾选此项)</input> <table border=1 cellpadding=3 cellspacing="0"> <tr> <th>序号</th> <th>标题</th> <th>发布时间</th> </tr> <% String date="无"; java.util.List list = feed.getEntries(); for (int i=0; i< list.size(); i++) { com.sun.syndication.feed.synd.SyndEntry entry = (com.sun.syndication.feed.synd.SyndEntry)list.get(i); SimpleDateFormat sdf = new SimpleDateFormat(); sdf.applyPattern("yyyy年MM月dd日 HH:mm"); if(entry.getPublishedDate()!=null) { date=sdf.format(entry.getPublishedDate()); } %> <tr> <td><%=i+1%></td> <td><a id="entry" href="<%=entry.getLink()%>" target=<%=target %>><%=entry.getTitle()%></a></td> <td><%=date %></td> </tr> <% } } catch (Exception e) { // TODO Auto-generated catch block response.sendRedirect("tips.jsp?type=rssContentfail"); e.printStackTrace(); } %> </table> </div> <br> </body> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title><%=pageTitle%></title> </head> </html> /RSSreader/WebContent/addGroup.jsp: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="com.JDBConnection,java.sql.ResultSet,com.dataHelper,java.util.ArrayList"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>添加分组</title> <link href="css/tab.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="js/jquery.js"></script> </head> <% String lastAdd = request.getParameter("lastAdd"); String from = request.getParameter("from"); String tip=""; String backurl=""; String backname=""; if(lastAdd!=null){ String name =new String(request.getParameter("name").getBytes("ISO8859_1"), "utf-8"); if(lastAdd.equals("ture")){ tip="成功添加分组:"+name; } if(lastAdd.equals("false")){ tip="添加分组失败"; } } %> <body onunload="javascript:;window.opener.location.reload()"> <div id="wrapper"> <div align="center"> <div><a href="addRss.jsp">添加源</a> | 添加分组</div> <form name="form_addGroup" method="post" action="dealAddGroup"> <table border="0" align="center"> <tr> <td height="30">组名:</td> <td height="30"> <input type="text" size="40" name="gname"> <input type="hidden" name="uid" value="<%=session.getAttribute("uid")%>"> </td> </tr> <tr> <td> </td> <td><%=tip %></td> </tr> <tr> <td height="30"> </td> <td height="30" align="right"><input type="submit" name="Submit" value="添加"></td> </tr> </table> </form> </div> </div> </body> </html> /RSSreader/WebContent/addRss.jsp: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="com.JDBConnection,java.sql.ResultSet,com.dataHelper,java.util.ArrayList"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>添加RSS源</title> <link href="css/tab.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="js/jquery.js"></script> </head> <% String lastAdd = request.getParameter("lastAdd"); String title =""; String url =""; String tip=""; String Sgid=""; if(request.getParameter("title")!=null) { title=new String(request.getParameter("title").getBytes("ISO8859_1"), "utf-8"); } if(request.getParameter("url")!=null) { url=request.getParameter("url"); } if(request.getParameter("group")!=null) { Sgid=request.getParameter("group"); } if(lastAdd!=null){ String name =new String(request.getParameter("name").getBytes("ISO8859_1"), "utf-8"); if(lastAdd.equals("ture")){ tip="成功添加RSS源:"+name; } if(lastAdd.equals("false")){ tip="添加RSS源失败"; } } %> <body onload="document.all.group.value = <%=Sgid%>" onunload="javascript:;window.opener.location.reload()"> <div id="wrapper"> <div align="center"> <div>添加源 | <a href="addGroup.jsp">添加分组</a></div> <form name="form_addRss" method="post" action="dealAddRss"> <input type="hidden" name="from" value="addRss"> <table border="0" align="center"> <tr> <td height="30">Feed地址:</td> <td height="30"><input type="text" size="40" name="url" value=<%=url %>></td> </tr> <tr> <td height="30">标题:</td> <td height="30"> <input type="text" name="title" value=<%=title%>> <input align="right" type=button name="getTitle" value=" 从feed中提取" onclick="form_addRss.action='getFeedTitle';form_addRss.submit()"> </td> </tr> <tr> <td>分组:</td> <td> <select name="group"> <% int gid; String gname; int uid; Object memo; int i; dataHelper dhp=new dataHelper(); ArrayList<dataHelper.Group> groupList =dhp.getGroup((Integer)session.getAttribute("uid")); for(i=0;i<groupList.size();i++) { dataHelper.Group group=groupList.get(i); %> <option value="<%=group.getGid()%>"><%=group.getGname()%></option> <% } %> </select> </td> </tr> <tr> <td> </td> <td><%=tip %></td> </tr> <tr> <td height="30"> </td> <td height="30" align="right"><input type="submit" name="Submit" value="添加" onclick="form_addRss.action='dealAddRss'"></td> </tr> </table> </form> </div> <div align="center"> </div> </div> </body> </html> /RSSreader/WebContent/delete.jsp: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="com.JDBConnection,java.sql.ResultSet"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; utf-8"> <title>editGroup</title> </head> <body> <div align="center"> <% String name=(String)session.getAttribute("name"); String nickname=""; if(name==null) { response.sendRedirect("index.jsp"); } %> <% String gid =request.getParameter("gid"); String lid =request.getParameter("lid"); String type =request.getParameter("type"); String url=""; //DELETE FROM 表名称 WHERE 列名称 = 值 String sSql=""; if(type!=null){ if(type.equals("g")){ sSql="delete from rssGroup where gid="+gid; url="manage.jsp"; } if(type.equals("r")){ sSql="delete from rssList where lid="+lid; url="rssListOfGroup.jsp?gid="+gid; } } System.out.println("rssListOfGroup.Sql:"+sSql); JDBConnection JDBC=new JDBConnection(); if(JDBC.executeUpdate(sSql)){ out.print("删除成功"); } else{ out.print("删除失败"); } %> </div> <br> <div align="center"> <a href=<%=url %>>返回</a> </div> </body> </html> JAVA部分 /RSSreader/src/com/JDBConnection.java package com; import java.sql.*; public class JDBConnection { private final String url = "jdbc:sqlserver://localhost:1433;DatabaseName=RSSreader"; private final String userName = "sa"; private final String password = "123456"; private Connection con = null; //通过构造方法加载数据库驱动 static { try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); } catch (Exception ex) { System.out.println("数据库加载失败"); } } //创建数据库连接 public boolean creatConnection() { try { con = DriverManager.getConnection(url, userName, password); con.setAutoCommit(true); } catch (SQLException e) { System.out.println(e.getMessage()); System.out.println("creatConnectionError!"); } return true; } public void close(Connection con,Statement stmt,PreparedStatement pst,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stmt!=null){ try { stmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(pst!=null){ try { pst.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void closeConnection(){ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //对数据库的增加、修改和删除的操作 public boolean executeUpdate(String sql) { if (con == null) { creatConnection(); } try { Statement stmt = con.createStatement(); int iCount = stmt.executeUpdate(sql); System.out.println("操作成功,所影响的记录数为" + String.valueOf(iCount)); this.close(con, stmt,null, null); return true; } catch (SQLException e) { System.out.println(e.getMessage()); return false; } } //对数据库的查询操作 public ResultSet executeQuery(String sql) { ResultSet rs; try { if (con == null) { creatConnection(); } Statement stmt = con.createStatement(); try { rs = stmt.executeQuery(sql); } catch (SQLException e) { System.out.println(e.getMessage()); return null; } } catch (SQLException e) { System.out.println(e.getMessage()); System.out.println("executeQueryError!"); return null; } return rs; } } /RSSreader/src/com/SqlFilter.java package com; import java.io.IOException; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //过滤sql关键字的Filter public class SqlFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; //获得所有请求参数名 Enumeration params = req.getParameterNames(); String sql = ""; while (params.hasMoreElements()) { //得到参数名 String name = params.nextElement().toString(); //System.out.println("name===========================" + name + "--"); //得到参数对应值 String[] value = req.getParameterValues(name); for (int i = 0; i < value.length; i++) { sql = sql + value[i]; } } System.out.println("被匹配字符串:"+sql); if (sqlValidate(sql)) { res.sendRedirect("error.jsp"); } else { chain.doFilter(req, res); } } //效验 protected static boolean sqlValidate(String str) { str = str.toLowerCase();//统一转为小写 //String badStr = "and|exec"; String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like"; /*String badStr = "'|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|" + "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|" + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#"; */ //过滤掉的sql关键字,可以手动添加 String[] badStrs = badStr.split("\\|"); for (int i = 0; i < badStrs.length; i++) { if (str.indexOf(badStrs[i]) !=-1) { System.out.println("匹配到:"+badStrs[i]); return true; } } return false; } public void init(FilterConfig filterConfig) throws ServletException { //throw new UnsupportedOperationException("Not supported yet."); } public void destroy() { //throw new UnsupportedOperationException("Not supported yet."); } } /RSSreader/src/dataCtrl/addGroup.java package dataCtrl; import com.JDBConnection; public class addGroup { private String gname; private String uid; public String getGname() { return gname; } public void setGname(String gname) { this.gname = gname; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public boolean doAddGroup(){ String sSql = "insert into rssGroup(gname,uid) values('"+gname+"',"+uid+")"; System.out.println(sSql); JDBConnection JDBC=new JDBConnection(); return JDBC.executeUpdate(sSql); } } /RSSreader/src/dataCtrl/addRss.java package dataCtrl; import java.sql.*; import com.JDBConnection; import javafx.beans.property.adapter.JavaBeanProperty; public class addRss { private String title; private String url; private String gid; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getGid() { return gid; } public void setGid(String gid) { this.gid = gid; } public boolean doAddRss() throws SQLException{ //INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....); String sSql = "insert into rssList(title,url,gid) values('"+title+"','"+url+"',"+gid+")"; System.out.println(sSql); JDBConnection JDBC=new JDBConnection(); return JDBC.executeUpdate(sSql); } } /RSSreader/src/dataCtrl/dealaddGroup.java package dataCtrl; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class dealaddGroup */ @WebServlet("/dealaddGroup") public class dealaddGroup extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public dealaddGroup() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String gname=request.getParameter("gname"); String sgname =new String(gname.getBytes("ISO8859_1"), "utf-8"); String uid=request.getParameter("uid"); addGroup adgp=new addGroup(); adgp.setGname(sgname); adgp.setUid(uid); if(adgp.doAddGroup()){ request.getRequestDispatcher("/addGroup.jsp?name="+gname+"&lastAdd=ture").forward(request,response); //response.sendRedirect("index.jsp"); } else{ request.getRequestDispatcher("/addGroup.jsp?name="+gname+"&lastAdd=false").forward(request,response); } doGet(request, response); } } /RSSreader/src/dataCtrl/dealAddRss.java package dataCtrl; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class dealAddRss1 */ @WebServlet("/dealAddRss1") public class dealAddRss extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public dealAddRss() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //response.setContentType("text/html;charset=utf-8"); String title=request.getParameter("title"); String stitle =new String(title.getBytes("ISO8859_1"), "utf-8"); String url =request.getParameter("url"); String gid=request.getParameter("group"); addRss adrs=new addRss(); adrs.setTitle(stitle); adrs.setUrl(url); adrs.setGid(gid); try { if(adrs.doAddRss()){ request.getRequestDispatcher("/addRss.jsp?name="+title+"&lastAdd=ture").forward(request,response); //response.sendRedirect("index.jsp"); } else{ request.getRequestDispatcher("/addRss.jsp?name="+title+"&lastAdd=false").forward(request,response); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } doGet(request, response); } } /RSSreader/src/dataCtrl/getFeedTitle.java package dataCtrl; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.sun.syndication.io.FeedException; /** * Servlet implementation class getFeedTitle */ @WebServlet("/getFeedTitle") public class getFeedTitle extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public getFeedTitle() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String urlStr =request.getParameter("url"); String title=""; String gid=request.getParameter("group"); String lid=request.getParameter("lid"); String Lastgid=request.getParameter("Lastgid"); String from=request.getParameter("from"); if (!urlStr.startsWith("http://")) urlStr = "http://"+request.getParameter("feed"); //String urlStr = "http://feed.cnblogs.com/blog/u/249598/rss"; System.out.print(urlStr); java.net.URLConnection feedUrl = new java.net.URL(urlStr).openConnection(); feedUrl.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); com.sun.syndication.io.SyndFeedInput input = new com.sun.syndication.io.SyndFeedInput(); com.sun.syndication.feed.synd.SyndFeed feed; try { feed = input.build(new com.sun.syndication.io.XmlReader(feedUrl)); title=feed.getTitle(); } catch (IllegalArgumentException | FeedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(from.equals("addRss")){ response.sendRedirect("addRss.jsp?title="+title+"&url="+urlStr+"&group="+gid+"&Lastgid="+Lastgid+"&lid="+lid); } if(from.equals("editRss")){ response.sendRedirect("editRss.jsp?title="+title+"&url="+urlStr+"&group="+gid+"&Lastgid="+Lastgid+"&lid="+lid); } doGet(request, response); } } /RSSreader/src/loginCtrl/checkUser.java package loginCtrl; import java.sql.ResultSet; import java.sql.SQLException; import com.JDBConnection; public class checkUser { private int uid=0; private String name=" "; private String pwd=" "; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public boolean check() { String sPwd=""; String sSql = "select * from users where uname='"+name+"'"; System.out.println(sSql); try { JDBConnection JDBC=new JDBConnection(); ResultSet rs =JDBC.executeQuery(sSql); System.out.println(rs.isBeforeFirst()); if(rs.next()) { System.out.println("?"); sPwd=rs.getString("upwd"); uid=rs.getInt("uid"); //System.out.println(sPwd); JDBC.closeConnection(); } } catch (SQLException e) { // TODO Auto-generated catch block System.out.println(e.getMessage()); System.out.println("ConnectError!"); } System.out.println(name+"-"+pwd+"-"+sPwd); if(pwd.equals(sPwd)) { return true; } else { return false; } } } /RSSreader/src/loginCtrl/dealsignup.java package loginCtrl; import java.io.IOException; import java.sql.Connection; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet implementation class dealsignup */ @WebServlet("/dealsignup") public class dealsignup extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public dealsignup() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.setContentType("text/html;charset=utf-8"); String name =request.getParameter("account"); String url =request.getParameter("url"); String nickname =request.getParameter("nickname"); if (nickname==null||nickname=="") nickname=null; else nickname=new String(request.getParameter("nickname").getBytes("ISO8859_1"), "utf-8"); String pwd= request.getParameter("password"); String enpwd= request.getParameter("ensurepassword"); signup snp=new loginCtrl.signup(); System.out.println("dealsingnup:"+name+"-"+nickname+"-"+pwd+"-"+enpwd); if(!pwd.equals(enpwd)) { response.sendRedirect("tips.jsp?type=signupwithwrongpwd"); System.out.println("两次密码不一致"); } else { snp.setName(name); snp.setNickname(nickname); snp.setPwd(pwd); Connection conn=snp.connect(); if(snp.signupcheck(conn)) { if(snp.dosignup(conn)) { response.sendRedirect("tips.jsp?type=signupsuccess&str="+name); System.out.println("注册成功"); } else { response.sendRedirect("tips.jsp?type=sinupfail"); System.out.println("未知错误"); } } else { response.sendRedirect("tips.jsp?type=usernamevalid"); System.out.println("用户名已被注册"); } snp.closeConnection(conn); } doGet(request, response); } } /RSSreader/src/loginCtrl/loginCheck.java package loginCtrl; import java.io.IOException; import java.sql.ResultSet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.JDBConnection; /** * Servlet implementation class loginCheck */ @WebServlet("/loginCheck") public class loginCheck extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public loginCheck() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String name =request.getParameter("account"); String pwd= request.getParameter("password"); checkUser uc=new loginCtrl.checkUser(); System.out.println(name+"-"+pwd); uc.setName(name); uc.setPwd(pwd); if(uc.check()) { HttpSession session=request.getSession(); session.setAttribute("name", name); session.setAttribute("uid", uc.getUid()); response.sendRedirect("index.jsp"); } else { response.sendRedirect("tips.jsp?type=logfail"); } doGet(request, response); } } /RSSreader/src/loginCtrl/signup.java package loginCtrl; import java.sql.*; public class signup { private String name=" "; private String nickname=""; private String pwd=" "; private Connection conn; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public Connection connect() { try { String JDriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";//SQL数据库引擎 String connectDB= "jdbc:sqlserver://localhost:1433;DatabaseName=RSSreader";//数据源 try { Class.forName(JDriver);//加载数据库引擎,返回给定字符串名的类 }catch(ClassNotFoundException e) { //e.printStackTrace(); System.out.println("加载数据库引擎失败:"+e); System.exit(0); } System.out.println("数据库驱动成功"); String user="sa"; String password="123456"; conn=DriverManager.getConnection(connectDB,user,password);//连接数据库对象 System.out.println("连接数据库成功"); } catch(Exception e) { System.out.println("链接数据库失败:"+e); } return conn; } public boolean signupcheck(Connection conn) { try{ Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery("select * from users where uname='"+name+"'"); if(!rs.next()) return true; } catch(Exception e) { System.out.println("查询失败"+e); return false; } return false; } public boolean dosignup(Connection conn) { try { PreparedStatement ps = conn.prepareStatement("insert into users (uname,nickname,upwd) values(?,?,?)"); ps.setString(1, name); ps.setString(2, nickname); ps.setString(3, pwd); int num =ps.executeUpdate(); System.out.println(num); if (num==0) return false; ps.close(); } catch(Exception e) { System.out.println("添加失败"+e); return false; } return true; } public boolean closeConnection(Connection conn) { try { System.out.println("关闭链接成功"); conn.close(); } catch(Exception e) { System.out.println("关闭链接失败"+e); return false; } return true; } } 阅读器使用说明

注册与登录

使用阅读器之前需要注册用户并登录,服务器会保存用户的RSS列表数据。未登录之前阅读器会推荐阅读阅读列表,并指导用户寻找RSS源,如下图:

注册时输入为空或输入错误会有相应提示

注册成功后会提示用户记住用户名,然后跳转登录页面:

登录后来到主页,同样阅读器会引导新用户寻找RSS源,点击"寻找RSS源"会跳转到下面这样一个神奇的页面:

然后就是添加自己需要订阅的RSS源了。

添加与管理RSS源

注册登录后,就可以添加自己喜爱的RSS源了。点击添加,弹出添加对话框,这是我们需要先添加分组再添加RSS源。我们先添加两个测试分组,如下图:

添加成功会有提示:

添加好分组后再来添加RSS源,我们测试添加一个"知乎每日精选"的订阅:www.zhihu.com/rss 直接在浏览器中打开是这样的:

这个当然看不懂,我们将url粘贴到阅读器中,标题可以不用自己填,点击"从Feed中获取",阅读器会根据url从RSS源中解析出RSS源的标题。选择"测试分组1",保存。

第一个源已经添加成功了,接下来再添加几个源用作测试。

添加完成后,关闭对话框,左边列表会自动刷新,点击展开显示已添加的RSS源:

这样我们就完成了RSS源的添加。如果有些源名字、分组有错或者源失效了、自己不想再订阅了,我们可以对其进行编辑或者直接删除。点击"管理",弹出管理对话框:

此时我们可以修改分组名或者将其删除:

注意:删除分组会删除该组内的所有RSS源。修改之后:

点击展开,可以显示该分组下的所有RSS源:

同样我们可以修改RSS源或者将其删除,方法与对组的操作类似,修改后:

修改完成后,关闭对话框,同样左边列表会自动刷新:

阅读文章

点击其中一个RSS源,会在右边显示出该订阅的文章列表:

然后点击文章的标题就会显示文章的具体内容:

如果勾选了"在新窗口中打开",文章将会在新的浏览器窗口中打开。

好了基于JSP的RSS阅读器的介绍就到这里,阅读器访问地址:http://easyrss.tk/

以上这篇基于JSP的RSS阅读器的设计与实现方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持突袭网。

有基于JSP的建站系统吗答:JEECMS国内优秀的JAVA(JSP)网站内容管理系统。Jspxcms灵活的、易扩展的、企业级开源网站内容管理系统(javacms,jspcms),支持多组织、多站点、独立管理的网站群,支持Oracle、SQLServer、MySQL等数据库。JAVAPMS一款基于J2EE技术核心架构,安...关于基于JSP的网站问:那如果网页设计部分用html实现,然后在跟后台连接的部分用JSP的话算是基...答:JSPPHP都是页面脚本语言哪里来的后台你说的后台是指数据库么反正只要你访问的页面是.jsp或.php后缀名那他们就是什么网站只能说是你有没有用过该语言而已基于JSP考试系统的设计与实现用英文怎么翻译问:基于JSP考试系统的设计与实现用英文怎么翻译答:翻译:TheDesignandImplementationofExaminationSystemBasedonJSP【详释】TheDesignandImplementationof...,“......的设计与实现”是短语的中心词;BasedonJSP,“基于JSP”,分词短语作后置定语,修饰说明前面的名词;Examina...

  • 本文相关:
  • JSP使用过滤器防止SQL注入的简单实现
  • 解决cannot be cast to javax.servlet.Filter 报错的问题
  • JSP+MySQL实现网站的登录与注册小案例
  • 请求转发jsp页面乱码问题的快速解决方法
  • jsp获得本地及serverIP的简单方法
  • jsp播放视频文件的方法总结
  • JSP监听器用法分析
  • jsp获取url路径的方法分析
  • jsp页面常用的查询及显示方法分析
  • jsp编程常用技巧小结
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved