1、第11章用户、管理员及图书管理模块的实现第11章用户、管理员及图书管理模块的实现11.1 用户、管理员登录及注销模块用户、管理员登录及注销模块11.2 用户管理模块用户管理模块 11.3 管理员管理模块管理员管理模块11.4 设置权限栏截器设置权限栏截器11.5“清风书苑清风书苑”项目总线项目总线第11章用户、管理员及图书管理模块的实现 11.1 用户、管理员登录及注销模块用户、管理员登录及注销模块11.1.1 登录功能的实现登录功能的实现在本项目的登录模块中,使用Action配置元素result的属性type=redirectAction动态结果,完成不同权限用户页面的分发。result属性
2、的定义具体可查看5.2.6节。第11章用户、管理员及图书管理模块的实现1.定义Web页面本项目的权限定义在com.bean.user.Limited.java文件中,包括普通用户(USER)和管理员(MANAGER)权限。因此登录模块包含三个Web页面,分别如下:login.jsp:登录页面,从Head.jsp的“登录”超链接进入;user.jsp:普通用户登录成功页面;manager.jsp:管理员登录成功页面。下面对每个页面的实现进行讲解。第11章用户、管理员及图书管理模块的实现1)login.jsp登录页面如图11-1所示。图11-1 登录页面第11章用户、管理员及图书管理模块的实现其主
3、要代码如下:用户名:密码:第11章用户、管理员及图书管理模块的实现2)user.jsp普通用户登录成功页面如图11-2所示,包含普通用户可以进行操作的业务逻辑超链接,如查看订单、修改密码和退出登录功能,详见11.2节。图11-2 普通用户页面第11章用户、管理员及图书管理模块的实现其主要代码如下:欢迎$session.user.userName!查看订单 修改密码 退出登录第11章用户、管理员及图书管理模块的实现3)manager.jsp管理员登录成功页面如图11-3所示,包含管理员可以进行操作的业务逻辑超链接,如查询及管理图书、增加图书和退出登录功能,详见11.3节。图11-3 管理员页面第
4、11章用户、管理员及图书管理模块的实现其主要代码如下:管理员$session.user.userName登录 查询及管理图书 增加图书 退出登录第11章用户、管理员及图书管理模块的实现2.完成的Action业务逻辑登录功能的Action类为com.action.user.LoginAction.java,具体代码为:package com.action.user;/省略导入包Controllerpublic class LoginAction extends ActionSupport private String userName;private String password;第11章用户
5、、管理员及图书管理模块的实现 private String newpass;private String renewpass;/用于保存请求重定向到的action名字 private String nextAction;Resource private UserInfoService userInfoService;/省略get/set方法第11章用户、管理员及图书管理模块的实现 public String login()throws Exception ActionContext ct=ActionContext.getContext();HttpServletRequest request
6、=(HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);try if(userInfoService.login(userName,password)!=null)UserInfo userInfo=userInfoService.login(userName,password);第11章用户、管理员及图书管理模块的实现 request.getSession().setAttribute(user,userInfo);/判断是否管理者 if(userInfo.getLimited().equals(Limited.MANAG
7、ER)nextAction=manager;else nextAction=user;return SUCCESS;else return INPUT;第11章用户、管理员及图书管理模块的实现 catch(Exception e)return INPUT;public void validateLogin()/省略userName和password验证空值和长度 第11章用户、管理员及图书管理模块的实现在login()方法中,首先通过业务逻辑UserInfoServiceBean.java中实现的login(userName,password)方法(详见9.5.2节)获得登录用户的数据库记录u
8、serInfo,并把它赋给session范围的变量user;然后通过userInfo的limited字段判断用户权限,若是管理员,则把nextAction属性赋值为manager,否则赋值为user。而nextAction就是loginAction中动态结果的返回值。第11章用户、管理员及图书管理模块的实现3.配置struts.xml依据以上定义的Web页面和Action类,登录模块在struts.xml中的配置如下:/login.jsp$nextAction第11章用户、管理员及图书管理模块的实现 /manager.jsp /user.jsp第11章用户、管理员及图书管理模块的实现以上代码在
9、result元素中定义的返回类型为redirectAction,其值为动态结果$nextAction,那么当业务逻辑返回nextAction为“manager时,登录成功跳转到名为manager的Action配置路径manager.jsp页面;返回nextAction为user时,登录成功跳转到名为user的Action配置路径user.jsp页面。第11章用户、管理员及图书管理模块的实现4.运行结果重启服务器,从主页中的登录超链接进入login.jsp页面,若使用普通用户登录,则成功转入如图11-2所示的user.jsp页面;若使用管理员登录,则成功转入如图11-3所示的manager页面,
10、说明登录模块编码成功。第11章用户、管理员及图书管理模块的实现11.1.2 注销模块的实现注销模块的实现1.定义Web页面注销功能的入口定义为,除了在user.jsp和manager.jsp中具有该功能之外,在头页面Head.jsp中也提供了此功能,相关代码如下:第11章用户、管理员及图书管理模块的实现您好:$session.user.userName注销注销请登录注册欢迎光临 清风书苑而头页面的注销链接是主要使用注销功能的入口,如图11-4所示。第11章用户、管理员及图书管理模块的实现图11-4 注销链接页面2.完成Action业务逻辑实现注销功能时,必须在com.action.user.L
11、oginAction.java中增加注销逻辑方法loginOut(),代码如下:第11章用户、管理员及图书管理模块的实现public String loginOut()throws Exception ActionContext ct=ActionContext.getContext();HttpServletRequest request=(HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);request.getSession().invalidate();return SUCCESS;invalidate()方法是把项
12、目运行中的所有Session都注销。第11章用户、管理员及图书管理模块的实现3.配置struts.xmlloginOutAction在struts.xml中的配置如下:/bookListAction.action第11章用户、管理员及图书管理模块的实现4.运行结果重启服务器,登录任何用户成功后,在如图11-4所示的头页面中点击“注销”超链接,则返回第10章中图10-4所示的主页,说明注销模块编码成功。第11章用户、管理员及图书管理模块的实现 11.2 用户管理模块用户管理模块11.2.1 密码更改模块的实现密码更改模块的实现1.定义Web页面 1)updatePass.jspupdatePas
13、s.jsp除了要输入正确的原始密码之外,还要对新密码进行二次验证,主要代码如下:第11章用户、管理员及图书管理模块的实现 原始密码:新密码:密码验证:第11章用户、管理员及图书管理模块的实现运行界面如图11-5所示。图11-5 修改密码表单页面第11章用户、管理员及图书管理模块的实现2)updatePassok.jspupdatePassok.jsp仅提示“密码修改成功!”字样,运行界面如图11-6所示。图11-6 修改密码成功页面 第11章用户、管理员及图书管理模块的实现2.完成Action业务逻辑在com.action.user.LoginAction.java中增加注销逻辑方法updat
14、ePass()的代码如下:public String updatePass()throws Exception ActionContext ct=ActionContext.getContext();HttpServletRequest request=(HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);try Integer id=(UserInfo)request.getSession().getAttribute(user).getId();第11章用户、管理员及图书管理模块的实现 if(userInfoServic
15、e.updatePassword(id,password,newpass)!=0)return SUCCESS;else return INPUT;catch(Exception e)return INPUT;public void validateUpdatePass()/省略password、newpass和renewpass验证空值和长度,及是否相同第11章用户、管理员及图书管理模块的实现3.配置struts.xmlupdatePassAction在struts.xml中的配置如下:/updatePass.jsp /updatePassok.jsp第11章用户、管理员及图书管理模块的实现
16、4.运行结果重启服务器,登录任何用户成功后,点击“修改密码”超链接,则返回如图11-5所示的界面,输入原密码、新密码提交成功,说明密码更改模块编码成功。11.2.2 订单列表查看模块的实现订单列表查看模块的实现订单列表查看子模块在10.3.4节已详细讲解,这里不做重复讲述。第11章用户、管理员及图书管理模块的实现 11.3 管理员管理模块管理员管理模块11.3.1 图书管理的配置文件图书管理的配置文件和图书管理功能模块相关的Action在struts.xml中的配置代码如下:第11章用户、管理员及图书管理模块的实现 /bookAdd.jsp /bookAdd_ok.jsp /bookManag
17、e.jsp第11章用户、管理员及图书管理模块的实现/bookUpdate.jsp /bookUpdate.jsp /bookUpdate_ok.jsp /bookDelete.jsp第11章用户、管理员及图书管理模块的实现以上五个Action配置代表四个子功能模块:addBook:添加图书信息子功能;bookManagerAction:图书列表的管理子功能;updateBook和updateOKBook:更新图书信息子功能;bookDelete:删除图书信息子功能。本模块采用Spring注解来完成依赖注入,所以不需更改beans.xml文件。第11章用户、管理员及图书管理模块的实现11.3.2
18、 图书添加模块的实现图书添加模块的实现1.定义Web页面图书添加功能涉及的页面为bookAdd.jsp和bookAdd_ok.jsp。1)bookAdd.jspbookAdd.jsp定义了所有BookInfo实体属性的输入表单,主要代码如下(省略样式定义):第11章用户、管理员及图书管理模块的实现请添加图书信息,其中*为必填 *书名:*作者:第11章用户、管理员及图书管理模块的实现*定价:¥*是否在售:上架时间:(日期格式:MM/DD/YY)所属分类:第11章用户、管理员及图书管理模块的实现 *I S B N:*出版社:*书城价:¥第11章用户、管理员及图书管理模块的实现 是否推荐:出版时间:
19、(日期格式:MM/DD/YY)图片路径:第11章用户、管理员及图书管理模块的实现 内容简介:第11章用户、管理员及图书管理模块的实现以上表单提交触发Action为addBook,其中通过下拉列表来选择图书类型bookType字段值,通过单选按钮来输入visible和commend字段值。bookType下拉列表的list属性值为教材,计算机,外语,小说,动漫,那么列表中的每一项都将作为HTML列表框的一个选项,而且每个选项的值也相同。在客户端浏览器中的输出如下:第11章用户、管理员及图书管理模块的实现 教材 计算机 外语 小说 动漫第11章用户、管理员及图书管理模块的实现visible和com
20、mend单选按钮的list属性值直接使用OGNL表达式来创建单选按钮组,列表中的每一项都将作为HTML单选按钮的一个选项。如commend在客户端浏览器中的输出如下:是否Struts2标签的s:radio表单标签除了我们常用的name、label等属性外,还有表11-1中的一些属性。第11章用户、管理员及图书管理模块的实现第11章用户、管理员及图书管理模块的实现radio标签的工作方式与select标签类似,它的三个属性和select标签的同名属性用法也一致。运行后,输入新增图书信息的页面如图11-7所示。第11章用户、管理员及图书管理模块的实现图11-7 添加图书表单页面第11章用户、管理员
21、及图书管理模块的实现2)bookAdd_ok.jspbookAdd_ok.jsp仅提示“图书添加成功!”字样,运行界面如图11-8所示。图11-8 图书添加成功页面第11章用户、管理员及图书管理模块的实现2.完成Action业务逻辑由于图11-7中“添加”按钮触发的Action为addBook,那么根据struts.xml的配置,为了实现添加图书信息功能,新建com.action.shopping.BookManageAction.java完成add()逻辑方法,代码如下:第11章用户、管理员及图书管理模块的实现package com.action.book;/省略导入包Controllerp
22、ublic class BookManageAction extends ActionSupport implements ModelDriven Resource private BookInfoService bookInfoService;private BookInfoFormBean bookInfoFormBean=new BookInfoFormBean();第11章用户、管理员及图书管理模块的实现 public void setBookInfoService(BookInfoService bookInfoService)this.bookInfoService=bookInf
23、oService;public String add()BookInfo bookInfo=new BookInfo(bookInfoFormBean.getISBN(),bookInfoFormBean.getAuthor(),bookInfoFormBean.getBookName(),bookInfoFormBean.getCommend(),bookInfoFormBean.getMarketPrice(),bookInfoFormBean.getPublisher(),bookInfoFormBean.getSellPrice(),bookInfoFormBean.getVisibl
24、e();第11章用户、管理员及图书管理模块的实现 if(bookInfoFormBean.getBookPic()!=null)bookInfo.setBookPic(bookInfoFormBean.getBookPic();if(bookInfoFormBean.getBookType()!=null)bookInfo.setBookType(bookInfoFormBean.getBookType();if(bookInfoFormBean.getDescription()!=null)bookInfo.setDescription(bookInfoFormBean.getDescrip
25、tion();if(bookInfoFormBean.getCreateDate()!=null)bookInfo.setCreateDate(bookInfoFormBean.getCreateDate();第11章用户、管理员及图书管理模块的实现 if(bookInfoFormBean.getPublishDate()!=null)bookInfo.setPublishDate(bookInfoFormBean.getPublishDate();bookInfoService.save(bookInfo);return SUCCESS;public BookInfoFormBean get
26、Model()/TODO Auto-generated method stub return bookInfoFormBean;第11章用户、管理员及图书管理模块的实现BookManageAction.java类通过实现ModelDriven接口(详见10.1.1节)来实现表单数据的获取。add()方法中首先通过实体BookInfo中定义的构造函数,实例化图书实体bookInfo,设置好bookInfo数据表的必填字段;其次对非必填字段对应表单值一一做判空验证,对于不为空值的表单项,把数据设置到实体bookInfo中;最后使用BookInfoServiceBean.java中的save()方法
27、实现实体在数据库中的保持。第11章用户、管理员及图书管理模块的实现3.运行结果重启服务器,按图11-7所示添加新增图书信息,若提交页面如图11-8所示,则说明添加图书信息模块编码成功。第11章用户、管理员及图书管理模块的实现11.3.3 图书管理模块的实现图书管理模块的实现1.定义Web页面在struts.xml的配置中,bookManagerAction跳转的页面为管理员管理图书列表页面bookManager.jsp。运行界面如图11-9所示。第11章用户、管理员及图书管理模块的实现图11-9 图书管理列表页面第11章用户、管理员及图书管理模块的实现从图11-9中读者可以发现,排序方式和搜索
28、方式选择的页面与10.1.1节中的排序和搜索页面相同,因此不难猜出,这两个模块的代码也与order.jsp和search.jsp代码基本相同,不同的是,两个表单的返回Action不一样。bookManager.jsp页面使用s:include标签主要包含下面代码、页面和图书信息列表,而代码是分页处理代码(详见9.4.2节):第11章用户、管理员及图书管理模块的实现 第11章用户、管理员及图书管理模块的实现 产品IDISBN书名所属类别 市场价我店销售价在售推荐 修改删除$id 第11章用户、管理员及图书管理模块的实现$ISBN$bookName$bookType$marketPrice$sel
29、lPrice 在售停售 推荐-第11章用户、管理员及图书管理模块的实现 第11章用户、管理员及图书管理模块的实现 首页 a href=bookManagerAction.action?page=第11章用户、管理员及图书管理模块的实现尾页|当前第$pageview.currentpage页|共$pageview.totalpage页 第11章用户、管理员及图书管理模块的实现以上代码可以分为两部分:(1)查询、排序页面和分页。查询和排序页面只要在search.jsp和order.jsp页面代码的基础上,修改form表单的action值即可。分页代码详见9.4.2节。第11章用户、管理员及图书管理
30、模块的实现(2)图书列表部分。如图11-5所示,图书列表是对所有符合查询条件和排序条件的图书记录的显示,采用s:iterator标签来完成,并在每条图书记录中包含该图书更新和删除操作的入口。第11章用户、管理员及图书管理模块的实现2.完成Action业务逻辑由于显示符合排序和查询条件的图书类别业务逻辑与主页中显示图书类别的逻辑相同,因此我们只需使用BookAction的bookList()方法即可,代码详见10.1.1节,在11.3.1节的struts.xml配置中也是这样的。第11章用户、管理员及图书管理模块的实现3.运行结果重启服务器,管理员登录后进入图书管理列表,可以任意选择排序方式对图
31、书列表进行排序,也可以选择查询字段并输入查询关键字筛选符合条件的图书列表,还可以通过每条列表中的产品ID来查看单本图书的具体信息。第11章用户、管理员及图书管理模块的实现11.3.4 图书更新模块的实现图书更新模块的实现图书更新的入口在图书管理列表页面中,对于每条图书记录都有对应“更新”字样的图标,如图11-9所示,其访问地址为。1.定义Web页面1)bookUpdate.jsp页面在struts.xml的配置中,图书更新功能Action跳转的页面为bookUpdate.jsp,进入后选择id=4的图书的“更新”超链接,显示的页面如图11-10所示。第11章用户、管理员及图书管理模块的实现图1
32、1-10 id为4的图书的信息页面第11章用户、管理员及图书管理模块的实现细心的读者会发现,图11-10与图11-7基本一致,区别在于图11-7是图书信息添加页面,图中的每个表单值是管理员输入的,而图11-10是图书更新页面,图中的表单值是id为4的图书信息,图中数据是通过Action业务逻辑返回的值。因此,bookUpdate.jsp的Web页面代码与bookAdd.jsp(见11.3.2节)的代码唯一不同的就是对各个表单进行赋值。第11章用户、管理员及图书管理模块的实现对bookUpdate.jsp表单的赋值主要分成三种情况,分别为:(1)单行和多行文本赋值。bookUpdate.jsp表
33、单大部分都是单行文本(s:textfield)和多行文本(s:textarea),其赋值方式相同,都是定义组件的value属性值,参考代码如下:其它如作者、出版社、价格等的赋值方式与此相同。第11章用户、管理员及图书管理模块的实现(2)下拉框组件赋值。bookUpdate.jsp表单中的图书分类使用下拉框组件,赋值参考代码如下:其中,headerValue属性显示页面中header选项的内容,headerKey属性设置当用户选择了header选项时提交的值,具体见表10-1的解释。第11章用户、管理员及图书管理模块的实现(3)单选按钮赋值。bookUpdate.jsp表单中有两处使用单选按钮组
34、件,赋值参考代码如下:*是否在售:第11章用户、管理员及图书管理模块的实现以上为visible字段值的显示,当返回值为true时,“在售”处于被选择状态,反之“停售”处于被选择状态。*是否推荐:第11章用户、管理员及图书管理模块的实现以上为commend字段值的显示,当返回值为true时,“是”处于被选择状态,反之“否”处于被选择状态。bookUpdate.jsp页面中表单的action值为:在struts.xml的配置中,updateOKBook.action跳转的页面为bookUpdate_ok.jsp。第11章用户、管理员及图书管理模块的实现2)bookUpdate_ok.jsp页面在图
35、11-10所示页面的bookUpdate.jsp中修改如下内容:在售;推荐;类别改为“教材”。点击“更新”按钮,将显示如图11-11所示的页面,其内容仅显示“图书修改成功”字样。第11章用户、管理员及图书管理模块的实现图11-11 图书修改成功页面要查看修改是否成功,需进入“查询及管理图书”超链接,id为4的图书列表显示如图11-12所示,说明修改成功。图11-12 id为4的图书更改后的列表页面第11章用户、管理员及图书管理模块的实现2.完成Action业务逻辑显示图书信息修改页面的地址为,根据struts.xml的配置,为了实现进入图书信息修改功能页面,在com.action.shoppi
36、ng.Book ManageAction.java中添加update()逻辑方法,代码如下:第11章用户、管理员及图书管理模块的实现 public String update()ActionContext ct=ActionContext.getContext();HttpServletRequest request=(HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);BookInfo bookInfo=bookInfoService.find(BookInfo.class,bookInfoFormBean.getId()
37、;request.setAttribute(book,bookInfo);return SUCCESS;第11章用户、管理员及图书管理模块的实现update()逻辑方法通过BookInfoServiceBean中实现的find()方法来返回要修改的图书记录值bookInfo,并把此值赋予book变量返回Web页面。而修改后进行数据库更新的操作为updateOKBook.action,因此根据struts.xml的配置,在com.action.shopping.BookManageAction.java中添加updateOK()逻辑方法,代码如下:第11章用户、管理员及图书管理模块的实现 pub
38、lic String updateOK()BookInfo bookInfo=bookInfoService.find(BookInfo.class,bookInfoFormBean.getId();bookInfo.setBookName(bookInfoFormBean.getBookName();bookInfo.setISBN(bookInfoFormBean.getISBN();bookInfo.setAuthor(bookInfoFormBean.getAuthor();bookInfo.setCommend(bookInfoFormBean.getCommend();bookIn
39、fo.setMarketPrice(bookInfoFormBean.getMarketPrice();bookInfo.setPublisher(bookInfoFormBean.getPublisher();第11章用户、管理员及图书管理模块的实现 bookInfo.setSellPrice(bookInfoFormBean.getSellPrice();bookInfo.setVisible(bookInfoFormBean.getVisible();if(bookInfoFormBean.getBookPic()!=null)bookInfo.setBookPic(bookInfoFo
40、rmBean.getBookPic();if(bookInfoFormBean.getBookType()!=null)bookInfo.setBookType(bookInfoFormBean.getBookType();if(bookInfoFormBean.getDescription()!=null)bookInfo.setDescription(bookInfoFormBean.getDescription();第11章用户、管理员及图书管理模块的实现 if(bookInfoFormBean.getCreateDate()!=null)bookInfo.setCreateDate(b
41、ookInfoFormBean.getCreateDate();if(bookInfoFormBean.getPublishDate()!=null)bookInfo.setPublishDate(bookInfoFormBean.getPublishDate();if(bookInfoFormBean.getClickCount()!=null)bookInfo.setClickCount(bookInfoFormBean.getClickCount();if(bookInfoFormBean.getSellCount()!=null)bookInfo.setSellCount(bookIn
42、foFormBean.getSellCount();bookInfoService.update(bookInfo);return SUCCESS;第11章用户、管理员及图书管理模块的实现updateOK()逻辑方法通过BookInfoServiceBean中实现的find()方法获取到要修改图书的当前记录,然后使用BookInfo实体的各属性setter方法将Web表单读入数据赋值,最后使用BookInfoServiceBean中实现的通用逻辑方法update()更新数据库。3.运行结果重启服务器,运行图书更改信息流程即可。第11章用户、管理员及图书管理模块的实现11.3.5 图书删除模块的
43、实现图书删除模块的实现在图书管理列表中有图书删除的入口,对于每条图书记录都有对应的“删除”字样的图标,如图11-9所示,其访问地址为。1.定义Web页面点击“删除”按钮,将显示如图11-13所示的页面,其内容仅显示“图书1删除成功!”字样。第11章用户、管理员及图书管理模块的实现图11-13 图书删除成功页面第11章用户、管理员及图书管理模块的实现2.完成Action业务逻辑显示图书信息删除页面的地址为,根据struts.xml的配置,为了实现图书删除功能,在com.action.shopping.BookManageAction.java中添加delete()逻辑方法,代码如下:第11章用户
44、、管理员及图书管理模块的实现public String delete()ActionContext ct=ActionContext.getContext();HttpServletRequest request=(HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);BookInfo bookInfo=bookInfoService.find(BookInfo.class,bookInfoFormBean.getId();bookInfoService.delete(BookInfo.class,bookInfoFormBe
45、an.getId();return SUCCESS;第11章用户、管理员及图书管理模块的实现delete()逻辑方法通过BookInfoServiceBean中实现的find()方法获取到要删除图书的当前记录,然后使用BookInfoServiceBean中通用逻辑方法的delete()实现数据在数据库中的同步删除。3.运行结果重启服务器,运行图书删除流程即可。第11章用户、管理员及图书管理模块的实现11.4 设置权限拦截器设置权限拦截器1.编写拦截器类新建拦截器类com.interceptor.AuthInterceptor.java,具体代码如下:第11章用户、管理员及图书管理模块的实现p
46、ackage com.interceptor;/省略导入包public class AuthInterceptor extends AbstractInterceptor public String intercept(ActionInvocation invocation)throws Exception Map map=invocation.getInvocationContext().getSession();if(map.get(user)=null)return Action.LOGIN;else 第11章用户、管理员及图书管理模块的实现 long start=System.curr
47、entTimeMillis();String result=invocation.invoke();long executeTime=System.currentTimeMillis()-start;System.out.println(Action的执行花费的毫秒数是:+executeTime);return result;第11章用户、管理员及图书管理模块的实现2.配置struts.xml文件以上的拦截器类AuthInterceptor.java要在struts.xml中进行配置,然后定义在要拦截的Action配置中;另外,拦截器类定义了一个返回结果码Action.LOGIN,也需要配置。
48、下面是修改的struts.xml代码:第11章用户、管理员及图书管理模块的实现 /login.jsp第11章用户、管理员及图书管理模块的实现完成以上的配置后,只要把拦截器栈配置到要拦截的Action定义中即可,参考以下代码:/cart.jsp 第11章用户、管理员及图书管理模块的实现3.运行项目重启服务器,如果没有登录而直接访问以上设置authstack拦截器栈的任何一个Action,页面都会自动跳转到结果码Action.LOGIN定义的login.jsp页面,要求用户先登录,说明权限拦截器设置成功。第11章用户、管理员及图书管理模块的实现11.5 “清风书苑清风书苑”项目总结项目总结本项目还
49、需改进和增加的内容包括:项目主页中关于图书的各类排行(新书上架、历史浏览、购买量等),网站公告和新闻等模块;管理员管理模块中对用户的管理、对订单状态的管理等;用户管理模块中订单状态的查看,以及积分等的管理;第11章用户、管理员及图书管理模块的实现 权限拦截器对于更小范围权限的拦截;订单模块中对于送货方式、送货地址和付款方式数据的选择处理;通过增加会员积分和优惠券等功能,维护用户的忠诚度。以上提到的功能还只是一部分,读者可以参考目前国内运营较成功的B2C网站,如当当网、卓越网和凡客诚品等,分析电子商务网站的通用功能。第11章用户、管理员及图书管理模块的实现从框架技术来说,本项目对数据类型转换、表单数据验证和国际化这些内容没有涉及,但在本书第5章、第6章和第7章都对此做了详细介绍,请读者自行添加完成。对于电子商务网站来说,界面制作是非常重要的。本项目采用页面嵌套和table的方式来布置页面,建议读者使用div层来制作界面,并通过学习Ajax、JQuery等优秀框架来增加界面的美感。