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

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

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

基于jsp的图书借阅管理系统源码,求jsp+mysql做的...问:实现对图书和用户的管理及借阅的管理,用户还可留言、建议等,最好是JS...答:下载文件:图书管理系统java.rar基于javaweb实现的论坛和基于JSP有多大区别?我...问:基于JSP的论坛开放文章,不知道可不可以借鉴答:JAVAWEB包括服务器端的和页面端两部分,页面端具体实现方式一般就是JSP,写论文的话,没差别关于问题补充,写论文的水平来看的话,可以直接说:是的(实际上页面还是可以采用别的页面框架技术的,比如freemarker,不过绝大部分情况——超过95%...关于基于JSP的网站问:那如果网页设计部分用html实现,然后在跟后台连接的部分用JSP的话算是基...答:JSPPHP都是页面脚本语言哪里来的后台你说的后台是指数据库么反正只要你访问的页面是.jsp或.php后缀名那他们就是什么网站只能说是你有没有用过该语言而已


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


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


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


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


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


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

s">

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

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

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

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

阅读导览

有基于JSP的建站系统吗答:JEECMS国内优秀的JAVA(JSP)网站内容管理系统。Jspxcms灵活的、易扩展的、企业级开源网站内容管理系统(javacms,jspcms),支持多组织、多站点、独。防恶意抓取,请查看原文,,真格学网提供内容。

一、 概述

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

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

基于JSP的网络购物系统可行性分析问:希望用自己的话给写点,论文查重这一段都是重复的,实在没法该啦,跪求...答:建议可以直接到百度文库里面搜索,里面有很多以前的大学毕业设计的论文。相对来说这个分析也。防恶意抓取,请查看原文,,真格学网提供内容。

三、 设计方案

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

四、 主要源代码

求基于JSP的公告系统的代码(包括数据库),感激不...答:这个毕业设计很简单,可以指导,关键还是看自己~。防恶意抓取,请查看原文,,真格学网提供内容。

五、 阅读器使用说明

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

概述

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

jsp里怎么调用rss呢?在baidu上搜索一下把应该有。防恶意抓取,请查看原文,,真格学网提供内容。

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

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

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

用AJAX技术聚合RSS聚合别人的RSS不能影响自己网站的速度,所以需要异步执行,其次,RSS本身就是一个很...这个功能我完全用JavaScript实现的,这样,不管你的blog是ASP、.Net、。防恶意抓取,请查看原文,,真格学网提供内容。

随时随地阅读:

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

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

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

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

请问如何做个RSS订阅网站系统不过是按照规定的格式就可以啦asp,php,jsp,.net都可以做的手写也可以所有的东西都是需要有基础的,如果你会就很简单这个思路就是用程序把咱的数据按照rss订阅的.。防恶意抓取,请查看原文,,真格学网提供内容。

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

台湾YST的rss地址多少?http://blog.udn.com/rss.jsp?uid=YST2000。防恶意抓取,请查看原文,,真格学网提供内容。

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

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

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

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

RSS源的的解析与显示:

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

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

在一个百无聊赖的午后,一辆开着汽油车的车主将爱车停在了和它同级别的柴油车旁边,哪知,一场关于柴油车和汽油车的口舌之战就这样开始了!到底谁会胜出呢?咱们赶快跟着评委去瞅瞅吧!!!舌战第一回合:谁更省油柴。防恶意抓取,请查看原文,,真格学网提供内容。

设计的基本概念和原理

10万块钱,家具家电远远不够。先不考虑家具家电,水电和地砖是最基层的,一定要做好,不然你以后只能翘掉重做。买地砖质量稍微好点的都要上万,还不包括工人的费用。其次就是门,一般普通木门1200一个,要是门。防恶意抓取,请查看原文,,真格学网提供内容。

RSS与RSS阅读器概念

聊文玩,找空空,关注文玩讲堂头条号,学习文玩知识!对文玩收藏稍有了解的人应该都明白一个道理,年份越久的文玩钱币,收藏价值越高,所以我们判断光绪元宝值不值钱,首先需要了解这种货币。什么是光绪元宝?光绪元。防恶意抓取,请查看原文,,真格学网提供内容。

RSS:

小小的杏鲍菇看起来摆在花花绿绿的超市里面不起眼其营养价值非常丰富,富含蛋白质、碳水化合物、维生素及钙、镁、铜、锌等矿物质,可以提高人体免疫功能,对人体具有抗癌、降血脂、润肠胃以及美容等作用。杏鲍菇有一。防恶意抓取,请查看原文,,真格学网提供内容。

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输出的网站内容。

双满贯意味着什么?意味着在长达8年的两个奥运周期,一直处于世界领先的地位。难度之大,可见一斑。在技术发展迅速的乒乓球男线中,还没有人能完成这一壮举。张继科喜欢挑战,但是他也坦言,“我自己嘴上总说要拿第二轮,真正行动起来,打起比赛的时候,总会自我原谅”。  双满贯的难度有多大?难度在于竞技水平的保持,更在于心理上的自我突破。当第二次去冲击已经加冕在身的冠军时,不会再像之前没有拿过的时候那么奋不顾身、。防恶意抓取,请查看原文,,真格学网提供内容。

RSS阅读器:

谢谢邀请!家里的一分硬币值多少钱。家里一分硬币可说每家每户都有,以前这是给小孩子的零花钱,而小孩子把节省下来一分钱放到储蓄罐里面,时间一长,家家户户小孩子,拿出储蓄罐出来比看看谁存钱多。从而储蓄罐越变。防恶意抓取,请查看原文,,真格学网提供内容。

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

加拿大小天王贾斯汀·比伯(JustinBieber)14岁时已经出道,2009年发行了第一张个人专辑《MyWorld》,2010年更是以一首《Baby》迅速红遍全球。外表帅气的比伯从出道以来,他的一言。防恶意抓取,请查看原文,,真格学网提供内容。

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

合资车推荐迈腾,4866*1832**1464的长宽高家用商用非常实在。全新平台打造的迈腾质量无需担忧。ea888发动机搭配dsg7档双离合变速箱推背感超车毫无压力。要记得当年大众推出1.4tea211小功率发动机搭配dsg变速箱爆发出来的马力惊人。虽然后期爆出dsg变速箱异响以及死亡闪烁,但是现在已经解决,偶尔在低俗一档切二档会有顿挫感不仔细感觉不到,车无完车人无完人。烧机油是大众通病…第三代e。防恶意抓取,请查看原文,,真格学网提供内容。

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

昨日,孙俪的新剧《那年花开月正圆》开播了,收视也是相当不错的。而此前也有传言说孙俪为了拍摄《那年花开月正圆》甚至还辞演了《我的前半生》,个人认为可能是娘娘个人更偏爱《那年花开月正圆》这部剧吧。感谢题主,这个问题我将从以下方面回答。现代剧PK年代剧《我的前半生》是一部现代剧,它讲述的是生活优越安逸的全职太太罗子君与丈夫陈俊生离婚后一切归零,在闺蜜唐晶及其男友贺涵的帮助下打破困境,进入职场,在自我成长。防恶意抓取,请查看原文,,真格学网提供内容。

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

作为已婚人士,我来答一发送礼物:婚前送的很勤快,各种二十四节气,都能过成情人节和交配节。婚后么,给孩子省奶粉钱,能省一点是一点啪啪啪:婚前恨不得一日一月,婚后么,巴不得一月一日。不是不想,实在是太累了,没精神也没体力穿着:婚前穿的还算讲究,耐克阿迪牛逼什么的才愿意穿。婚后么,安踏361李宁统统没所谓家庭关系:婚前是2个人,爱咋地咋地。婚后是两个家庭结合了,爸爸妈妈、岳父岳母、公公婆婆,说不清的恩怨。防恶意抓取,请查看原文,,真格学网提供内容。

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

首先现在电视机整个行业的确不行,但是主要是低端电视机在国内不受欢迎,高端机仍受到青睐。如大屏、4K和量子点电视、互联网电视在上半年销量都是逆势增长的。例如去年创维4K智能电视机于国内市场的销售量同比增。防恶意抓取,请查看原文,,真格学网提供内容。

阅读器实现原理

我们常用的聊天记录软件就是QQ,QQ聊天或许已经很少了,基本转战微信上,不过QQ聊天的人还是占大多数的,毕竟用户还是很多的,要是QQ聊天记录删除了我们该怎么恢复呢?QQ聊天记录删除了怎么恢复:1、将删。防恶意抓取,请查看原文,,真格学网提供内容。

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

先说说原25集成功的原因吧。那是一个电视观众还很少能看到神话电视剧的时代,人们只是平时听说孙悟空猪八戒,但只是在动画片上见过,在真实镜头的电视上还没有看到过。所以当真人扮演的神话人物上天入地,妖魔鬼鬼群魔乱舞,感到无比的新奇。尽管当时的特效现在看来都算五毛钱特效,但由于人们是第一次在电视上看到这样的情景,即使如此也已经非常满足。而且正是由于在特技方面没有先进的设备和技术作为手段,当时剧组的人们发挥。防恶意抓取,请查看原文,,真格学网提供内容。

设计方案

《失孤》海报《失孤》海报《失孤》一部讲述“打拐”题材的电影。影片根据真实事件改编,讲述一个两岁大的孩子失踪后,刘德华饰演的父亲雷泽宽,骑着摩托车踏上寻子之路,这一找就是整整15年,途中饱经风霜,老雷也。防恶意抓取,请查看原文,,真格学网提供内容。

架构设计

这个价格是相当有诚意的,因为对东风雪铁龙而言,现在一个月才卖6000多台,到了生死存亡的关头,天逸再卖不好公司就没戏了,所以必须有一个震撼力的价格。法系车产品并不错,但由于各方面原因在中国市场表现并不。防恶意抓取,请查看原文,,真格学网提供内容。

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

△Tiffany&Co.蒂芙尼Bridal珠宝首先明确亮点,订婚戒指(EngagementRing)和结婚戒指(WeddingRing)是两码事。订婚钻戒通常选择单颗较大的钻石作为订婚信物,求。防恶意抓取,请查看原文,,真格学网提供内容。

数据库设计

不是说老外婚礼之前就不拍照片了。婚礼之前拍的照片都是不穿婚纱的,很多时候就是两人穿着日常着装,去大街树林海边、或者平时两人常常去逛的地方玩着逛着,然后摄影师记录这次两人出去玩的过程。当然摄影师会在拍摄。防恶意抓取,请查看原文,,真格学网提供内容。

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

对于消费者来说,装修是一件极其费心费力的事情,不论采取怎样的装修方式,选择一个靠谱的装修公司才能真正的省心、放心。就像平时在某宝上看买家秀、在某饿上面看订单评论一样,选择装修公司时,用户最先想到的也就。防恶意抓取,请查看原文,,真格学网提供内容。

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

男人味儿十足,尤其在红高粱里和周迅搭戏,男性荷尔蒙简直都要穿透屏幕了。大尺度的拍摄将他的霸道展现的淋漓尽致其实之前对于朱亚文了解不多,只是看过他演的闯关东和远去的飞鹰,印象就是一个走正剧路线的演技还不。防恶意抓取,请查看原文,,真格学网提供内容。

界面设计

俗话说:“女儿是母亲的小棉袄,是父亲的酒坛子”。也就是说女儿贴己、贴心,女孩子心境细腻、感情丰富,从小对父母的依赖性强,也善于在父母那撒娇。所以,女儿长大成人以及嫁人成家后,对父母都会恋恋不舍,经常会。防恶意抓取,请查看原文,,真格学网提供内容。

登录与注册:

十六万的预算,对于自主车来说,已经是很不错的价位了。我们这里大部分都只是十万左右,甚至也只有七八就开回来了,所以你这十六万的预算完全可以买一款“高大上”的车了。我建议你可以考虑一下荣威6,别克君威,起。防恶意抓取,请查看原文,,真格学网提供内容。

登录界面 login.jsp

笔者首先想要说的是,在当今国际足坛,梅西和C罗是当之无愧的绝代双骄,这是不争的事实。在近几个赛季,巴塞罗那队随着伊涅斯塔的老去,和哈维的离开,球队无疑在走下坡路。虽然苏亚雷斯和内马尔的加盟,让巴塞罗那。防恶意抓取,请查看原文,,真格学网提供内容。

注册界面signup.jsp:

谢谢朋友的邀请老王觉得呢,上网本身并没有错,错的是不合理的上网时间,减少虚拟社交是一个非常棒的方法。当然如果是从事互联网工作的朋友我就没有办法了。有以下几种方法来帮助你①如果你是习惯用微信来打发空余时。防恶意抓取,请查看原文,,真格学网提供内容。

主页

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

排第六的是袁心玥,1996年12月21日出生于中国重庆,2009年,袁心玥被选入八一队,开始了排球运动员的生涯。2016年8月21日,袁心玥所在的中国女排获得里约奥运会冠军。目前,身高1.99m的袁心。防恶意抓取,请查看原文,,真格学网提供内容。

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

当孩子到了一定的年龄,孩子迟早是要离开父母过他自己的生活的,其实,睡觉的方式足以反应人与人之间的关系和距离。孩子小的时候,这是因为母爱,因为孩子成长的需要,父母应该陪伴孩子,给他安全感,但是孩子慢慢长。防恶意抓取,请查看原文,,真格学网提供内容。

RSS树形列表:

为了让我们的泰迪犬保持的健康和美丽,日常照料小泰迪犬是不可或缺的事情。每天不仅要给小泰迪犬梳理毛发、眼、耳朵、齿和爪都需要仔细小心地清洁保养。可是有些是泰迪犬非常讨厌这些措施的,为了防止泰迪犬拒绝,要。防恶意抓取,请查看原文,,真格学网提供内容。

dtree

钻石恒久远,一颗永流传。婚戒是爱的见证,是幸福的标志,对于每一个新娘来说,一颗心仪的婚戒,这是一生最大的夙愿!明星也一样,他们也是人呀!虽然他们一生可能会不停的换婚戒,和不同的人牵很多次手。刘诗诗婚戒。防恶意抓取,请查看原文,,真格学网提供内容。

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考试系统的设计与实现用英文怎么翻译问:基于JSP考试系统的设计与实现用英文怎么翻译答:翻译:TheDesignandImplementationofExaminationSystemBasedonJSP【详释】TheDesignandImplementationof...,“......的设计与实现”是短语的中心词;BasedonJSP,“基于JSP”,分词短语作后置定语,修饰说明前面的名词;Examina...基于jsp网上在线招聘系统源代码问:谁有这个课程设计的完整源码。答:jsp在线招聘系统java网上招聘求职网站jsp毕业设计有基于JSP的建站系统吗答:JEECMS国内优秀的JAVA(JSP)网站内容管理系统。Jspxcms灵活的、易扩展的、企业级开源网站内容管理系统(javacms,jspcms),支持多组织、多站点、独立管理的网站群,支持Oracle、SQLServer、MySQL等数据库。JAVAPMS一款基于J2EE技术核心架构,安...

  • 本文相关:
  • 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