18.8 用户管理模块
18.8.1 用户管理模块总体架构
1.模块功能介绍
用户管理模块主要包括以下功能。
● 用户登录:用于登录系统。
● 添加用户:用于添加用户信息。
● 查看用户列表:用于查询并显示系统中的除超级用户mr之外的用户及其权限信息。
● 修改用户权限:用于修改或设置用户权限。
● 删除用户:用于删除系统中的用户及权限信息。
● 修改密码:用于用户登录后修改自己的密码。
2.文件架构
用户管理模块文件架构如图18.9所示。
图18.9 用户管理模块文件架构
18.8.2 创建用户管理模块的持久化类及映射文件
1.创建持久化类
用户管理模块只涉及到用户信息表tb_user,因此只需要创建一个对应的持久化类,将其命名为UserForm,关键代码如下。
例程18-11:光盘\mr\18\MaterialManage\src\com\actionForm\UserForm.java
package com.actionForm;
import org.apache.struts.action.*;
public class UserForm extends ActionForm {
private int id;
private String name;
private String pwd;
private Byte setInstorage = new Byte("0");
private Byte setOutstorage= new Byte("0");
private Byte setDeal= new Byte("0");
private Byte setQuery= new Byte("0");
private Byte setBasic= new Byte("0");
private Byte setSys= new Byte("0");
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
…… //此处省略了其他属性的getXXX()和setXXX()方法
}
注意:由于本系统中采用了Struts框架,所以在创建持久化类时,需要让该类继承Struts的ActionForm类,这样可以减少冗余代码。
2.创建映射文件
创建一个名为UserForm.hbm.xml的文件,用于把UserForm类映射到tb_user表,这个文件应该与UserForm.class文件存放在同一个目录下,具体代码如下。
例程18-12:光盘\mr\18\MaterialManage\src\com\actionForm\UserForm.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.actionForm.UserForm" table="tb_user">
<id name="id" column="id" type="int">
<generator class="increment"/>
</id>
<property name="name" column="name" type="string" not-null="true"/>
<property name="pwd" column="pwd" type="string" not-null="true"/>
<property name="setInstorage" column="setInstorage" type="byte"/>
<property name="setOutstorage" column="setOutstorage" type="byte"/>
<property name="setDeal" column="setDeal" type="byte"/>
<property name="setQuery" column="setQuery" type="byte"/>
<property name="setBasic" column="setBasic" type="byte"/>
<property name="setSys" column="setSys" type="byte"/>
</class>
</hibernate-mapping>
3.修改Hibernate配置文件
在创建持久化类和映射文件后,还需要在Hibernate配置文件hibernate.cfg.xml中指定持久化类映射文件,关键代码如下:
<mapping resource="com/actionForm/UserForm.hbm.xml"/>
18.8.3 创建用户管理的Action实现类
Struts的核心在于它的Action,一般在Action里面做对页面的逻辑跳转工作。用户管理模块的Action实现类继承了Action类,在该类中首先需要在构造方法中实例化用户管理模块的UserDAO类(该类用于实现业务逻辑操作),然后通过Action实现类的主要方法execute()执行相应的业务逻辑操作。Action实现类的execute()方法会被自动执行,这个方法本身没有具体的事务,它是根据通过HttpServletRequest的getParameter()方法获取的action参数值执行相应方法的。
说明:Struts 1.1(包括1.1)以上版本的Action实现类的主要方法是execute(),Struts 1.1以下版本的Action实现类的主要方法是perform()。
用户管理模块的Action实现类的关键代码如下。
例程18-13:光盘\mr\18\MaterialManage\src\com\action\User.java
package com.action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import com.actionForm.UserForm;
import org.apache.struts.action.Action;
import com.dao.UserDAO;
public class User extends Action {
private UserDAO userDAO=null;
public User(){
userDAO=new UserDAO();
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request,HttpServletResponse response) {
String action = request.getParameter("action"); //获取action参数值
if(action.equals("userQuery")){//当action值为userQuery时,调用userQuery()方法查询用户信息
return userQuery(mapping,form,request,response);
}else if(action.equals("userdel")){ //删除用户信息
return userDel(mapping, form, request, response);
}else if(action.equals("useradd")){ //添加用户信息
return userAdd(mapping, form, request, response);
}else if(action.equals("userMQuery")){ //查询单条用户信息
return userQModify(mapping, form, request, response);
}else if(action.equals("userModify")){ //修改用户信息
return userModify(mapping, form, request, response);
}else if(action.equals("pwsModify")){ //修改用户密码
return pwsModify(mapping,form,request,response);
}else if(action.equals("login")){ //验证用户身份
return login(mapping,form,request,response);
}else{
request.setAttribute("err","您的操作有误!");
return mapping.findForward("error"); //转到错误提示页
}
}
…… //此处省略了该类中其他方法,这些方法将在后面的具体过程中给出
}
18.8.4 系统登录设计
系统登录模块是物资管理系统中最先使用的功能,是进入系统的入口。在系统登录页面中,用户可以通过输入正确的用户名称和密码进入到系统,当用户名称或密码为空时,系统会通过JavaScript进行判断,并给予提示信息。系统登录模块的运行结果如图18.10所示。
图18.10 系统登录模块的运行结果
1.设计系统登录页面
系统登录页面主要用于收集用户的输入信息及通过自定义的JavaScript函数验证输入信息是否为空,该页面中所涉及到的表单元素如表18.12所示。
表18.12 系统登录页面所涉及的表单元素
名 称
|
元 素 类 型
|
重 要 属 性
|
含 义
|
form1
|
form
|
method="post" action="user.do?action= login"
|
用户登录表单
|
name
|
text
|
size="25"
|
用户名称
|
pwd
|
password
|
size="25"
|
用户密码
|
Submit
|
submit
|
value="确定" onclick="return check (form1)"
|
“确认”按钮
|
续表
名 称
|
元 素 类 型
|
重 要 属 性
|
含 义
|
Submit3
|
reset
|
Value="重置"
|
“重置”按钮
|
Submit2
|
button
|
value="关闭" onClick="window.close();"
|
“关闭”按钮
|
编写自定义的JavaScript函数,用于判断用户名称和密码是否为空,代码如下。
例程18-14:光盘\mr\18\MaterialManage\defaultroot\login.jsp
<script language="javascript">
function check(form){
if (form.name.value==""){
alert("请输入用户名称!");form.name.focus();return false;
}
if (form.pwd.value==""){
alert("请输入密码!");form.pwd.focus();return false;
}
}
</script>
2.修改用户管理的Action实现类
在用户登录页面的用户名称和用户密码文本框中输入正确的用户名称和密码后,单击“确定”按钮,网页会访问一个URL,这个URL是“user.do?action=login”。从该URL地址中可以知道系统登录模块涉及到的action的参数值为“login”,也就是当action=login时,会调用验证用户身份的方法login(),具体代码如下。
例程18-15:光盘\mr\18\MaterialManage\src\com\action\User.java
String action = request.getParameter("action");
if(action.equals("login")){
return login(mapping,form,request,response);
}
在验证用户身份的方法login()中,首先需要将接收到的表单信息强制转换成Action Form类型,并用获得指定属性的getXXX方法重新设置该属性的setXXX方法,然后调用UserDAO类中的login()方法验证登录用户信息是否正确,如果正确,将页面重定向到系统主界面,否则将返回的错误提示信息保存到HttpServletRequest的对象error中,并重定向页面至错误提示页,验证用户身份的方法login()的具体代码如下。
例程18-16:光盘\mr\18\MaterialManage\src\com\action\User.java
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
UserForm userForm = (UserForm) form; //将接收到表单信息强制转换成ActionForm类型
String rtn=userDAO.login(userForm,request);
if(rtn.equals("ok")){
return mapping.findForward("loginok");
}else{
request.setAttribute("error",rtn);
return mapping.findForward("error");
}
}
3.编写系统登录的UserDAO类的方法
从User.java文件中可以知道系统登录页使用的UserDAO类的方法是login()。在login()方法中首先调用UserDAO的query()方法从数据表tb_user中查询输入的用户名称是否存在。如果存在,再判断查询到的密码是否与输入的密码相等,如果相等,将标志变量设置为ok,并将用户名称保存到session中,否则设置为“您输入的密码错误!”;如果用户名不存在,则将标志变量设置为“您输入的用户名称错误!”。验证用户身份的方法login()的具体代码如下。
例程18-17:光盘\mr\18\MaterialManage\src\com\dao\UserDAO.java
public String login(UserForm userForm,HttpServletRequest request){
String rtn="";
String name=userForm.getName();
String pwd=userForm.getPwd();
String str="name='"+name+"'";
List list = query(str); //调用query()方法以输入的用户为条件查询用户信息
if(list.size()==1){
UserForm m=(UserForm)list.get(0);
String username=m.getName();
if(pwd.equals(m.getPwd())){
rtn="ok";
HttpSession httpsession=request.getSession();
httpsession.setAttribute("username",username);
System.out.println("登录成功!");
}else{
rtn="您输入的密码错误!";
System.out.println("密码错误!");
}
}else{
rtn="您输入的用户名称错误!";
System.out.println("您输入的用户名称错误!");
}
return rtn;
}
说明:在验证用户身份时先判断用户名,再判断密码,可以防止用户输入恒等式后直接登录系统。
4.struts-config.xml文件配置
在struts-config.xml文件中配置系统登录模块所涉及的<form-bean >元素,该元素用于指定用户登录模块所使用的ActionForm,具体代码如下。
例程18-18:光盘\mr\18\MaterialManage\defaultroot\WEB-INF\struts-config.xml
<form-bean name="userForm" type="com.actionForm.UserForm" />
在struts-config.xml文件中配置用户登录模块所涉及的<action>元素,该元素用于完成对页面的逻辑跳转工作,具体代码如下。
例程18-19:光盘\mr\18\MaterialManage\defaultroot\WEB-INF\struts-config.xml
<action name="userForm" path="/user" scope="request" type="com.action.User" validate="true">
<forward name="error" path="/error.jsp" />
<forward name="loginok" path="/main.jsp" />
</action>
根据name="userForm"可以找到与之相对应的ActionForm的实现类“com.actionForm. UserForm”。
根据type="com.action.User"可以找到处理用户数据的Action类。
根据<forward name="loginok" path="/main.jsp" />和<forward name="error" path="/error.jsp"/>可以了解,当Action返回loginok时,页面会被转到main.jsp文件,也就是系统主界面,当Action返回error时,页面会被转到error.jsp文件,显示错误提示信息。
5.防止非法用户登录系统
从网站安全的角度考虑,仅仅上面介绍的系统登录页面并不能有效的保存系统的安全,一旦系统主界面的地址被他人获得,就可以通过在地址栏中输入系统的主界面地址而直接进入到系统中。由于系统的导航页面top.jsp几乎包含于整个系统的每个页面,所以笔者将验证用户是否将登录的代码放置在该页中,验证用户是否登录的具体代码如下。
例程18-20:光盘\mr\18\MaterialManage\defaultroot\top.jsp
<%
if(session.getAttribute("username")= =null || session.getAttribute("username")= =""){
response.sendRedirect("login.jsp");
}
%>
在页面中包含导航页面top.jsp的代码如下:
<%@include file="top.jsp"%>
这样,当系统调用每个页面时,都会判断session变量username是否存在,如果不存在,将页面重定向到系统登录页面。
18.8.5 查看用户列表设计
用户登录后,选择“系统管理”→“用户管理”命令,进入到查看用户列表页面,在该页面中将列出系统中的除超级用户mr之外的用户及其权限信息,同时提供添加用户信息、删除用户信息、修改用户权限的超级链接。查看用户列表页面的运行结果如图18.11所示。
技巧:将页面中所涉及的JavaScript代码保存在一个单独的JS文件中,然后通过<script></script>将其引用到需要的页面,可以规范页面代码。在系统导航页面中引用menu.JS文件的代码如下:
<script src="JS/menu.JS"></script>
在实现系统导航菜单时,引用了JavaScript文件menu.JS,该文件实现了半透明背景菜单的全部JavaScript代码。打开该JS文件,可以找到如下所示的“用户管理”菜单项的超级链接代码。
<a href=user.do?action=userQuery>用户管理</a>
图18.11 查看用户列表页面运行结果
从上面的URL地址中可以知道查看用户列表模块涉及到的action的参数值为“userQuery”,当action=userQuery时,会调用查看用户列表的方法userQuery(),具体代码如下。
例程18-21:光盘\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userQuery")){
return userQuery(mapping,form,request,response);
}
在查看用户列表的方法userQuery()中,首先调用UserDAO类中的query()方法查询全部用户信息,再将返回的查询结果保存到HttpServltRequest的对象userList中,查看用户列表的方法userQuery()的具体代码如下。
例程18-22:光盘\mr\18\MaterialManage\src\com\action\User.java
public ActionForward userQuery(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
String str = "";
request.setAttribute("userList", userDAO.query(str));
return mapping.findForward("userQuery");
}
从上面的代码中可以知道查看用户列表使用的UserDAO类的方法是query(),该方法只有一个String型参数strif(用于指定查询条件字符串)。在query()方法中首先判断参数strif的值是否为空并且是否为“all”,当strif不为空并且不为“all”时,将通过Hibernate的HQL根据指定的条件查询用户信息,否则将通过Hibernate的HQL查询全部用户信息。然后将查询结果保存到List集合中并返回该List,query()方法的具体代码如下。
例程18-23:光盘\mr\18\MaterialManage\src\com\dao\UserDAO.java
public List query(String strif) {
session=MySession.openSession(); //打开Session
String hql = "";
if (strif != "all" && strif != null && strif != "") { //条件查询
hql = "FROM UserForm user WHERE " + strif +"";
} else { //查询全部数据
hql = "FROM UserForm user";
}
List list=null;
try{
Query query = session.createQuery(hql);
list = query.list();
}catch(Exception e){
e.printStackTrace();
}finally{
MySession.closeSession(session); //关闭Session
}
return list;
}
在struts-config.xml文件中配置查看用户列表所涉及的<forward>元素,代码如下:
<forward name="userQuery" path="/userList.jsp" />
接下来的工作是将Action实现类中userQuery()方法返回的查询结果显示在查看用户列表页userList.jsp文件中。在userList.jsp文件中首先通过request.getAttribute()方法获取查询结果并将其保存在List集合中,再通过循环将用户信息以列表形式显示在页面中,关键代码如下。
例程18-24:光盘\mr\18\MaterialManage\defaultroot\userList.jsp
<%@ page import="com.actionForm.UserForm" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Iterator"%>
<%
List list=(List)request.getAttribute("userList");
if(list.size()<=0){%>
<table width="96%" border="0" cellspacing="0" cellpadding="0">
<tr><td height="40" align="center" >暂无用户信息!</td> </tr> </table>
<%}else{%>
<table width="96%" border="1" cellspacing="0" cellpadding="0" bordercolor="#FFFFFF" bordercolordark= "#FFFFFF" bordercolorlight="#DDDDDA">
<tr>
<td align="center" bgcolor="#D7F6FB">用户名称</td>
<td width="10%" align="center" bgcolor="#D7F6FB">入库管理</td>
<td width="10%" align="center" bgcolor="#D7F6FB">出库管理</td>
<td width="10%" align="center" bgcolor="#D7F6FB">物资处理</td>
<td width="10%" align="center" bgcolor="#D7F6FB">查询统计</td>
<td width="10%" align="center" bgcolor="#D7F6FB">基础信息</td>
<td width="10%" align="center" bgcolor="#D7F6FB">系统管理</td>
<td width="6%" align="center" bgcolor="#D7F6FB">修改</td>
<td width="6%" align="center" bgcolor="#D7F6FB">删除</td>
</tr>
<%
Iterator it=list.iterator(); //通过迭代方式显示数据
int id=-1;
String name="";
Byte setInstorage=new Byte("0");
…… //此处省略了定义其他变量的代码
Byte setSys=new Byte("0");
while(it.hasNext()){
UserForm userForm=(UserForm)it.next();
id=userForm.getId();
name=userForm.getName();
setInstorage=userForm.getSetInstorage();
…… //此处省略了为其他变量赋值的代码
setSys=userForm.getSetSys();
if(!name.equals("mr")){%>
<tr>
<td> <%=name %></td>
<td align="center">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled"
<%if(setInstorage.equals(new Byte("1"))){out.println("checked");}%>></td>
…… //此处省略了显示其他权限值的代码
<td align="center">
<input name="checkbox" type="checkbox" class="noborder" value="checkbox" disabled="disabled"
<%if(setSys.equals(new Byte("1"))){out.println("checked");}%>></td>
<td> <a href="user.do?action=userMQuery&id=<%=id%>">修改</a></td>
<td align="center">
<a href="user.do?action=userdel&id=<%=id%>&val=1">删除</a> </td></tr>
<%}
}%>
</table>
<%}%>
18.8.6 添加用户信息设计
用户登录后,选择“系统管理”→“用户管理”命令,进入到查看用户列表页面,在该页面中单击“添加用户”超级链接即可进入添加用户页面。添加用户页面的运行结果如图18.12所示。
图18.12 添加用户页面的运行结果
1.设计添加用户页面
添加用户页面主要用于收集输入的用户信息及通过自定义的JavaScript函数验证输入信息是否合法,该页面中所涉及到的表单元素如表18.13所示。
表18.13 添加用户页面所涉及的表单元素
名 称
|
元 素 类 型
|
重 要 属 性
|
含 义
|
form1
|
form
|
method="post" action="user.do?action=useradd"
|
表单
|
name
|
text
|
|
用户名称
|
pwd
|
password
|
|
用户密码
|
pwd1
|
password
|
|
确认密码
|
Submit
|
submit
|
value="保存" onClick="check(form1)"
|
【保存】按钮
|
Submit2
|
reset
|
value="重置"
|
【重置】按钮
|
Submit3
|
button
|
value="返回"
onClick="window.location.href='user.do?action=userQuery'"
|
【返回】按钮
|
编写自定义的JavaScript函数,用于判断用户名称、用户密码、确认密码文本框是否为空及两次输入的密码是否一致,代码如下。
例程18-25:光盘\mr\18\MaterialManage\defaultroot\userAdd.jsp
<script language="javascript">
function check(form){
if(form.name.value= =""){
alert("请输入用户名称!");form.name.focus();return false;
}
if(form.pwd.value= =""){
alert("请输入用户密码!");form.pwd.focus();return false;
}
if(form.pwd1.value= =""){
alert("请确认用户密码!");form.pwd1.focus();return false;
}
if(form.pwd.value!=form.pwd.value){
alert("您两次输入的用户密码不一致,请重新输入!");form.pwd.focus();return false;
}
form.submit();
}
</script>
2.修改用户管理的Action实现类
在添加用户信息页面中输入合法的用户名称及密码后,单击“保存”按钮,网页会访问一个URL,这个URL是“user.do?action=useradd”。从该URL地址中可以知道添加用户模块涉及到的action的参数值为“useradd”,也就是当action=useradd时,会调用添加用户的方法userAdd(),具体代码如下。
例程18-26:光盘\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("useradd")){
return userAdd(mapping, form, request, response);
}
在添加用户的方法userAdd()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用UserDAO类中的insert()方法将添加的用户信息保存到数据表中,并将返回值保存到变量rtn中,如果返回值为1,表示信息添加成功,将页面重定向到添加信息成功页面;如果返回值为2,表示该用户已经添加,将错误提示信息“该用户信息已经存在!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面;否则将错误提示信息“添加用户信息失败!”保存到HttpServletRequest的对象error中,并将页面重定向到错误提示页,添加用户信息的方法userAdd()的具体代码如下。
例程18-27:光盘\mr\18\MaterialManage\src\com\action\User.java
public ActionForward userAdd(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
UserForm userForm = (UserForm) form;
int rtn=userDAO.insert(userForm);
if(rtn= =2){
request.setAttribute("error","该用户信息已经存在!");
return mapping.findForward("error");
}else if(rtn= =1){
return mapping.findForward("useraddok");
}else{
request.setAttribute("error","用户信息添加失败!");
return mapping.findForward("error");
}
}
3.编写添加用户的UserDAO类的方法
从上面的代码中可以知道添加用户使用的UserDAO类的方法是insert()。在insert()方法中首先调用UserDAO的query()方法从数据表tb_user中查询输入的用户名称是否存在,如果存在,将标志变量设置为2,否则将输入的信息保存到用户信息表中,如果在插入时抛出异常,将回滚事务并将标志变量设置0,否则将标志变量设置为1,最后返回标志变量,insert()方法的具体代码如下。
例程18-28:光盘\mr\18\MaterialManage\src\com\dao\UserDAO.java
public int insert(UserForm userForm) {
int ret = 0;
Transaction tx = null;
String str="name='" + userForm.getName() + "'";
List list = query(str);
if (list.size()> 0) { //存在该用户信息
ret = 2;
} else {
session=MySession.openSession(); //打开Session
try {
tx = session.beginTransaction();
session.save(userForm);
tx.commit(); //提交事务
ret = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback(); //回滚事务
}
e.printStackTrace();
return ret = 0;
} finally {
MySession.closeSession(session); //关闭Session
}
}
return ret;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置添加用户所涉及的<forward>元素,代码如下:
<forward name="useraddok" path="/user_ok.jsp?para=1" />
5.制作操作成功页面
笔者将添加用户、修改用户权限、删除用户和修改密码4个模块的操作成功页面用一个JSP文件实现,只是通过传递的参数para的值进行区分,关键代码如下。
例程18-29:光盘\mr\18\MaterialManage\defaultroot\user_ok.jsp
<%int para=Integer.parseInt(request.getParameter("para"));
switch(para){
case 1:
%>
<script language="javascript">
alert("用户信息添加成功!");
window.location.href="user.do?action=userQuery";
</script>
<% break;
case 2:
%>
<script language="javascript">
alert("用户权限设置成功!");
window.location.href="user.do?action=userQuery";
</script>
<% break;
case 3:
%>
<script language="javascript">
alert("用户信息删除成功!");
window.location.href="user.do?action=userQuery";
</script>
<% break;
case 4:
%>
<script language="javascript">
alert("用户密码修改成功!");
window.location.href="main.jsp";
</script>
<%
}%>
18.8.7 修改用户权限设计
用户登录后,选择“系统管理”→“用户管理”命令,进入到查看用户列表页面,在该页面中单击想要设置权限的用户信息后面的“修改”超级链接即可进入到“修改用户权限”页面设置该用户的权限。修改用户权限页面的运行结果如图18.13所示。
图18.13 修改用户权限页面的运行结果
1.设计修改用户权限页面
在“查看用户列表”页面中可以找到打开“修改用户权限”页面的超级链接代码,代码如下所示。
例程18-30:光盘\mr\18\MaterialManage\defaultroot\userList.jsp
<a href="user.do?action=userMQuery&id=<%=id%>">修改</a>
从上面的URL地址中可以知道修改用户权限页面所涉及到的action的参数值为“userMQuery”,当action=userMQuery时,会调用查询指定用户权限信息的方法userQModify(),具体代码如下。
例程18-31:光盘\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userMQuery")){
return userQModify(mapping, form, request, response);
}
在查询指定用户权限信息的方法userQModify()中,首先需要获取从页面中传递的参数id的值并赋值给int型变量id,然后调用UserDAO类中的query()方法,并将变量id作为该方法的参数,查询出指定用户权限信息,再将返回的查询结果保存到HttpServlet Request的对象userList中,查询指定用户权限信息的方法userQModify()的具体代码如下。
例程18-32:光盘\mr\18\MaterialManage\src\com\action\User.java
public ActionForward userQModify(ActionMapping mapping,ActionForm form,HttpServletRequest request,
HttpServletResponse response){
int id=Integer.parseInt(request.getParameter("id"));
request.setAttribute("userList",userDAO.query(id));
return mapping.findForward("userQModify");
}
从上面的代码中可以知道查询指定用户权限信息使用的UserDAO类的方法是query(),该方法只有一个int型参数id(用于指定用户id)。在query()方法中将利用Session的get()方法查询出指定用户,然后将查询结果保存到UserForm中,并返回UserForm,query()方法的具体代码如下。
例程18-33:光盘\mr\18\MaterialManage\src\com\dao\UserDAO.java
public UserForm query(int id) {
session = MySession.openSession(); //打开Session
UserForm userForm =null;
try{
userForm = (UserForm) session.get(UserForm.class, id);
}catch(Exception e){
e.printStackTrace();
}finally{
MySession.closeSession(session); //关闭Session
}
return userForm;
}
说明:在18.8.5节已经介绍过一个UserDAO类的query()方法(参数为String strif),本节又介绍一个UserDAO类的query()方法(参数为int id),这个两个方法的方法名相同,但参数类型不同,这实质上采用的是Java提供的方法重载机制,采用方法重载可以免除某些不合理的情况,即使用完全不同的方法来完成实质上相同的一个件事。
在struts-config.xml文件中配置查询指定用户权限信息所涉及的<forward>元素,代码如下:
<forward name="userQModify" path="/userModify.jsp" />
接下来的工作是将userQModify()方法返回的查询结果显示在修改用户权限页userModify.jsp中。在userModify.jsp中首先通过request.getAttribute()方法获取查询结果并将其显示在相应的表单元素中。修改用户权限页面中所涉及到的重要表单元素如表18.14所示。
表18.14 设置用户权限页面所涉及的重要表单元素
名 称
|
元 素 类 型
|
重 要 属 性
|
含 义
|
form1
|
form
|
method="post" action="user.do?action=userModify"
|
表单
|
id
|
hidden
|
value="<%=id%>"
|
用户编号
|
name
|
text
|
readonly="yes" value="<%=name%>"
|
用户名称
|
setInstorage
|
checkbox
|
value="1" <%if(setInstorage.equals(new Byte("1"))){out.println ("checked");}%>
|
物资入库
|
续表
名 称
|
元 素 类 型
|
重 要 属 性
|
含 义
|
setOutstorage
|
checkbox
|
value="1" <%if(setOutstorage.equals(new Byte("1"))){out. println("checked");}%>
|
物资出库
|
setDeal
|
checkbox
|
value="1" <%if(setDeal.equals(new Byte("1"))){out.println ("checked");}%>
|
物资处理
|
setQuery
|
checkbox
|
value="1" <%if(setQuery.equals(new Byte("1"))){out.println ("checked");}%>
|
查询统计
|
setBasic
|
checkbox
|
value="1" <%if(setBasic.equals(new Byte("1"))){out.println ("checked");}%>
|
基础信息
|
setSys
|
checkbox
|
value="1" <%if(setSys.equals(new Byte("1"))){out.println ("checked");}%>
|
系统管理
|
Submit
|
submit
|
value="保存"
|
【保存】按钮
|
2.修改用户管理的Action实现类
在修改用户权限页面中设置权限后,单击“保存”按钮,网页会访问一个URL,这个URL是“user.do?action=userModify”。从该URL地址中可以知道保存修改用户权限信息涉及到的action的参数值为“userModify”,也就是当action= userModify时,会调用保存修改用户权限信息的方法managerModify(),具体代码如下。
例程18-34:光盘\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userModify")){
return userModify(mapping, form, request, response);
}
在保存修改用户权限信息的方法userModify()中,首先需要将接收到的表单信息强制转换成ActionForm类型,然后调用UserDAO类中的Modify()方法将修改的用户权限信息保存到用户信息表tb_user,并将返回值保存到变量rtn中,如果返回值为1,表示信息设置成功,将页面重定向到设置信息成功页面,否则将错误提示信息“修改用户权限信息失败!”保存到HttpServletRequest的对象error中,然后将页面重定向到错误提示信息页面,保存修改用户权限信息的方法userModify()的具体代码如下。
例程18-35:光盘\mr\18\MaterialManage\src\com\action\User.java
public ActionForward userModify(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
UserForm userForm = (UserForm) form;
int flag=2; // 值为2时修改权限
int rtn=userDAO.Modify(userForm,flag);
if(rtn==1){
return mapping.findForward("usermodiok");
}else{
request.setAttribute("error","修改用户权限信息失败!");
return mapping.findForward("error");
}
}
3.编写保存修改权限信息的UserDAO类的方法
从上面的代码中可以知道修改用户权限时使用的UserDAO类的方法是Modify(),并且参数flag的值为2。Modify()方法可以完成修改用户权限或修改个人密码的功能,这根据参数flag的值决定,当flag的值为1时,表示执行修改个人密码操作,否则执行修改用户权限操作。由于参数flag的值为2,所以本节执行的是保存修改用户权限的操作,Modify()方法的具体代码如下。
例程18-36:光盘\mr\18\MaterialManage\src\com\dao\UserDAO.java
public int Modify(UserForm userForm,int flag) {
session=MySession.openSession(); //打开Session
int id = userForm.getId();
int ret = 0;
Transaction tx = null;
try {
tx = session.beginTransaction();
UserForm userF=(UserForm)session.get(UserForm.class,id);
if(flag==1){
userF.setPwd(userForm.getPwd());
}else{ //修改权限信息
userF.setSetInstorage(userForm.getSetInstorage());
userF.setSetOutstorage(userForm.getSetOutstorage());
userF.setSetDeal(userForm.getSetDeal());
userF.setSetQuery(userForm.getSetQuery());
userF.setSetBasic(userForm.getSetBasic());
userF.setSetSys(userForm.getSetSys());
}
session.update(userF);
tx.commit();
ret = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
return ret = 0;
} finally {
MySession.closeSession(session); //关闭Session
}
return ret;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置修改用户权限所涉及的<forward>元素,代码如下:
<forward name="usermodiok" path="/user_ok.jsp?para=2" />
提示:设置用户权限成功页面请参照18.8.6节中的“制作操作成功页面”部分。
18.8.8 删除用户设计
用户登录后,选择“系统管理”→“用户管理”命令,进入到查看用户列表页面,在该页面中单击想要删除的用户信息后面的“删除”超级链接即可将该用户删除。
在“查看用户列表”页面中可以找到删除用户信息的超级链接代码,代码如下所示。
例程18-37:光盘\mr\18\MaterialManage\defaultroot\userList.jsp
<a href="user.do?action=userdel&id=<%=id%>&val=1">删除</a>
从上面的URL地址中可以知道删除用户页所涉及到的action的参数值为“userdel”,当action= userdel时,会调用删除用户的方法userdel(),具体代码如下。
例程18-38:光盘\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userdel")){
return userDel(mapping, form, request, response);
}
在删除用户的方法userDel()中,首先需要获取从页面中传递的参数id的值并赋给int型变量id,赋值后将该变量作为UserDAO类中del()方法的参数,然后调用该del()方法删除指定的用户,并根据执行结果转到相应的页面,删除用户的方法userDel()的具体代码如下。
例程18-39:光盘\mr\18\MaterialManage\src\com\action\User.java
public ActionForward userDel(ActionMapping mapping, ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
int id=Integer.parseInt(request.getParameter("id"));
int rtn=userDAO.del(id);
if(rtn==0){
request.setAttribute("error","该用户信息不能删除!");
return mapping.findForward("error");
}else{
return mapping.findForward("userdelok");
}
}
从上面代码中可以知道删除用户使用的UserDAO类的方法是del()。在del()方法中首先通过Session的get()方法查询到要删除的用户信息,并保存到UserForm中,然后再使用Session的delete()方法删除该用户信息,最后返回执行结果,del()方法的具体代码如下。
例程18-40:光盘\mr\18\MaterialManage\src\com\dao\UserDAO.java
public int del(int id) {
session=MySession.openSession(); //打开Session
int ret = 0;
Transaction tx = null;
try {
tx = session.beginTransaction();
UserForm userForm = (UserForm) session.get(UserForm.class, id);
session.delete(userForm);
tx.commit();
ret = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
return ret = 0;
} finally {
MySession.closeSession(session); //关闭Session
}
return ret;
}
在struts-config.xml文件中配置删除用户所涉及的<forward>元素,代码如下:
<forward name="managerDel" path="/manager_ok.jsp?para=3" />
提示:设置用户权限成功页面请参照18.8.6节中的“制作操作成功页面”部分。