您好,欢迎来到榕意旅游网。
搜索
您的当前位置:首页Java web开发教程部分 (30)

Java web开发教程部分 (30)

来源:榕意旅游网
5个DAO均继承了泛型DAO,只需要给泛型DAO传递一个返回对象的类型<xxx>即可,通过Spring的ProxyFactoryBean就可以通过配置完成DAO的实现代理,进而不需要编写每一个DAO的实现类。

配置方法代码如下:

首先将genericDAO配置为抽象Bean,由于GenericDAOImpl继承了JpaDaoSupport,所以这里要注入一个EntityManageFactory对象,然后配置一个ProxyFactoryBean,该Bean也为抽象Bean,配置每个域模型对应DAO的时候只需要给相应的DAO配置为proxyFactoryBean的子Bean即可,proxyInterfaces属性配置需要代理的接口,target属性用来配置将要代理的对象,这里是将DAO代理为GenericDAOImpl的实现,target属性使用了一个内部Bean完成了配置,其实就是配置了一个GenericDAOImpl, GenericDAOImpl中构造查询语句需要使用相应对象的名称,所以在配置GenericDAOImpl时候需要注入一个实体类,通过这些配置就可以使用INewsDAO来进行持久化操作了,由于篇幅关系这里只列出了INewsDAO的配置,其他几个DAO的配置与INewsDAO相同,具体可以参考光盘News项目中源代码。

9.4 系统控制器设计

系统控制可以使用Spring的SimpleFormController及MultiActionController或者其他Controller来实现,关于Controller的使用具体可以参考第5章的控制器介绍,本实例中均使用MultiActionController来完成控制器的设计。

9.4.1 分页引擎的设计

分页引擎是每个系统中必不可少的一个引擎,分页引擎的设计也多种多样,其复杂性和易用性也随着系统的不同而有所不同,本例中针对中小型的系统来设计一个较简单的分页引擎,结合velocity标签使用。

分页设计中主要有3种方法,一个显示第一页的方法list(),下一页next(),上一页previous(),同时分页引擎是针对任意对象需要给分页引擎传递一个泛对象T,代码如下:

3种方法均接受HttpServletRequest request、List<T>objs、int total、String page和int count 5个参数,第1个是HttpServletRequest对象,第2个为查询结果的数组对象,第3个为返回对象的记录总数,第4个为返回的页面对象,第5个为分页引擎每页的记录数。

List(HttpServletRequest request, List<T>objs, inttotal, String page, int count)方法中查询了从第一条到第count条记录数,并将记录及页面信息封装到HashMap中,在页面中就可以使用一致的标签来调用页面引擎,页面velocity代码如下:

pages是总页数,使用(double)total/(double)count>total/count)?total/count+1:total/count计算得出,不够一页的按一页计算,在其他控制器中调用PageList的3种方法即完成了分页设计。

9.4.2 新闻控制器NewsAction

NewsAction继承MultiActionController,所有的新闻设计均在该控制器中,由于方法比较多,这里按方法讲解。

1.首页控制方法index()

Index(HttpServletRequest request, HttpServletResponseresponse)方法返回首页,首页中只显示最新通过审核的6条新闻,代码如下:

index()方法使用了INewsDAO, INewsDAO通过Spring IOC注入到控制器中,INewsDAO是通过ProxyFactoryBean代理后的对象,首先使用INewsDAO对象查询前6条通过审核的新闻记录,然后查询出status为1的Page对象作为页面风格,然后将新闻记录和风格对象封装到HashMap中,在页面中就可以使用map.get(\"newes\")来获取新闻记录

并显示,这里返回的页面为indexPage, indexPage通过IOC注入到NewsAction中,下面是对应的页面部分代码。

页面头部代码如下:

在头部文件中调用了风格对象用来显示系统的名称及CSS。

页面中需要加一些图片修饰,这里只列出velocity标签的代码。

使用velocity的#foreach标签来显示数组,并且在每条新闻的标题增加一个链接,通过该链接来打开新闻具体内容页面,使用news.html?method=show&id=$!news.id来调用NewsAction中的show()方法并传递新闻id给show()方法。

2.显示新闻方法show()show()方法代码如下:

show()方法中根据传递的id来查询对应的新闻,并将新闻对象封装到news标签中显示到页面中。

3.显示新闻列表方法list()

list()方法中使用INewsDAO查询count数目的新闻记录数及新闻总数(count使用IOC给NewsAction注入),然后调用分页引擎PageList的list()方法显示第一页。

4.新闻分页方法

在next()方法中与list()方法相同,首先计算当前页的新闻记录数及新闻总数,然后调用分页引擎的next()方法。

对应的页面直接使用分页引擎中的velocity标签代码如下:

在调用相应的方法中需要传递一个参数“begin”,也就是下一页记录开始的位置。

后台登录:

login()方法直接导向了一个页面loginPage, loginPage也是通过IOC注入。

添加新闻代码如下:

add()方法首先通过session判断用户是否登录,如果用户没有登录或者用户登录已经超时,则return newPage(this.getLoginPage())导向登录页面,如果用户已经登录并未超时,则导向添加新闻的页面newsPage。

保存新闻代码如下:

保存新闻的时候使用newString(request.getParameter(\"title\").getBytes(\"ISO-8859-1\"),\"UTF-8\"))进行转码避免中文乱码,使用INewsDAO保存新闻到数据库然后返回到保存成功的页面,在保存新闻的时候需要将status值设置为0,这样新闻就不会在页面中显示出来,需要等审核后才能显示。

删除新闻代码如下:

remove()方法直接根据传递的id来删除对应的新闻并重新调用newsManage()方法,其中newsManage()方法是后台管理的新闻列表展示方法,方法体与list()方法相同,不过显示的页面不同而已,具体可以参考光盘中的源代码。

新闻审核与取消审核代码如下:

check()方法为审核新闻的方法,审核新闻只需要调用INewsDAO的update(Long id)方法来更新新闻的status值为“1”。

uncheck()方法与check()对应,取消审核是将新闻的status值设置为“0”,这样新闻就不会在页面中显示出来。

5.增加订阅方法

scribe()方法使用ISubscribeDAO保存用户提交的数据到数据库,ISubscribeDAO与INewsDAO相同,同时IOC注入到NewsAction中。

9.4.3 用户控制器UserAction

用户控制器UserAction同样继承MultiActionController,所有用户操作的方法均在该控制器中,下面针对每个方法逐个讲解。

用户注册代码如下:

reg()方法直接导向一个新的页面regPage, regPage使用IOC注入到UserAction中。

保存用户:

add()方法使用HttpServletRequest对象获取各个参数并转码赋给User对象,默认注册用户level值均为“0”,表示普通用户。激活码使用用户名的hashcode及注册时间组成,保存用户的时候进行了简单的判断,不允许用户重复注册,用户名及密码的规则验证可以在客户端使用js验证,用户注册后将导向激活页面:return new ModelAndView(this.getActivePage(),\"map\",map);

激活用户代码如下:

active()方法通过传递的激活码及用户名来对照数据库中的值,如果用户名和激活码均相同,则设置用户active值为true,然后导向登录页面AndView(this.getLoginPage())。

用户登录代码如下:

return

new

Model

sign()方法获取表单中的用户名和密码,通过比较数据库中的用户名及密码是否相同来决定导向的页面,如果登录成功,则将用户保存到HttpSession中,然后导向managePage页面,在sign()方法中如果登录成功,则new Model AndView(this.getManagePage(),\"main\",\"\");将空白页封装到main标签中,框架页中右侧页调用的就是main标签,这样就会打开一个空白页面。

用户管理分页:

userManage()方法打开用户管理的第一个页面,显示用户第一条到第count条的记录,在用户载入之前需要判断用户是否登录。

userManage_next()和userManage_previous()方法分别为用户分页中的“下一页”和“上一页”,两种方法均调用PageList方法中的next()和previous()方法。

用户等级管理:

admin()方法为提升普通用户为管理员用户,unAdmin()方法为降低管理员用户为普通用户的方法,管理员和普通用户的区别就是管理员level值为“1”,普通用户level值为“0”,这里只是一个简单的权限设计,如果需要设计强大的权限系统,可以参考acegi权限设计。

用户退出:

logout()方法移除当前session保存的用户对象然后导向登录页面。

9.4.4 收藏控制器CollectAction

收藏控制器CollectAction也是继承MultiActionController,所有的收藏操作均放在该控制器中,具体每个方法代码如下。

添加收藏:

add()方法将记录用户当前的URL并导向记录页面,在记录页面中可以任意输入收藏的名称然后保存,可以在后台“收藏管理”中看到自己的收藏记录,在添加收藏之前需要进行用户登录验证,如果用户没有登录或者用户登录已经超时,则导向用户登录页面。

保存收藏:

save()方法通过HttpServletRequest获取Collect对象的相关属性值,使用Icollect DAO保存到数据库中,在保存收藏之前也需要进行用户的登录验证。

收藏管理:

list()方法直接使用ICollectDAO查询出当前登录用户的所有收藏,这里的查询为“this.getCollectDAO().query(\"obj.user=?\"”。

这里的User为当前session中保存的对象也就是登录用户。删除收藏:

remove()方法根据传递的id使用ICollectDAO删除对应的Collect对象。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- nryq.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务