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節中的“制作操作成功頁面”部分。