18.8 用戶管理模塊
18.8.1 用戶管理模塊總體架構(gòu)
1.模塊功能介紹
用戶管理模塊主要包括以下功能。
● 用戶登錄:用于登錄系統(tǒng)。
● 添加用戶:用于添加用戶信息。
● 查看用戶列表:用于查詢并顯示系統(tǒng)中的除超級(jí)用戶mr之外的用戶及其權(quán)限信息。
● 修改用戶權(quán)限:用于修改或設(shè)置用戶權(quán)限。
● 刪除用戶:用于刪除系統(tǒng)中的用戶及權(quán)限信息。
● 修改密碼:用于用戶登錄后修改自己的密碼。
2.文件架構(gòu)
用戶管理模塊文件架構(gòu)如圖18.9所示。
圖18.9 用戶管理模塊文件架構(gòu)
18.8.2 創(chuàng)建用戶管理模塊的持久化類及映射文件
1.創(chuàng)建持久化類
用戶管理模塊只涉及到用戶信息表tb_user,因此只需要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)的持久化類,將其命名為UserForm,關(guān)鍵代碼如下。
例程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()方法
}
注意:由于本系統(tǒng)中采用了Struts框架,所以在創(chuàng)建持久化類時(shí),需要讓該類繼承Struts的ActionForm類,這樣可以減少冗余代碼。
2.創(chuàng)建映射文件
創(chuàng)建一個(gè)名為UserForm.hbm.xml的文件,用于把UserForm類映射到tb_user表,這個(gè)文件應(yīng)該與UserForm.class文件存放在同一個(gè)目錄下,具體代碼如下。
例程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配置文件
在創(chuàng)建持久化類和映射文件后,還需要在Hibernate配置文件hibernate.cfg.xml中指定持久化類映射文件,關(guān)鍵代碼如下:
<mapping resource="com/actionForm/UserForm.hbm.xml"/>
18.8.3 創(chuàng)建用戶管理的Action實(shí)現(xiàn)類
Struts的核心在于它的Action,一般在Action里面做對(duì)頁面的邏輯跳轉(zhuǎn)工作。用戶管理模塊的Action實(shí)現(xiàn)類繼承了Action類,在該類中首先需要在構(gòu)造方法中實(shí)例化用戶管理模塊的UserDAO類(該類用于實(shí)現(xiàn)業(yè)務(wù)邏輯操作),然后通過Action實(shí)現(xiàn)類的主要方法execute()執(zhí)行相應(yīng)的業(yè)務(wù)邏輯操作。Action實(shí)現(xiàn)類的execute()方法會(huì)被自動(dòng)執(zhí)行,這個(gè)方法本身沒有具體的事務(wù),它是根據(jù)通過HttpServletRequest的getParameter()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的。
說明:Struts 1.1(包括1.1)以上版本的Action實(shí)現(xiàn)類的主要方法是execute(),Struts 1.1以下版本的Action實(shí)現(xiàn)類的主要方法是perform()。
用戶管理模塊的Action實(shí)現(xiàn)類的關(guān)鍵代碼如下。
例程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參數(shù)值
if(action.equals("userQuery")){//當(dāng)action值為userQuery時(shí),調(diào)用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")){ //驗(yàn)證用戶身份
return login(mapping,form,request,response);
}else{
request.setAttribute("err","您的操作有誤!");
return mapping.findForward("error"); //轉(zhuǎn)到錯(cuò)誤提示頁
}
}
…… //此處省略了該類中其他方法,這些方法將在后面的具體過程中給出
}
18.8.4 系統(tǒng)登錄設(shè)計(jì)
系統(tǒng)登錄模塊是物資管理系統(tǒng)中最先使用的功能,是進(jìn)入系統(tǒng)的入口。在系統(tǒng)登錄頁面中,用戶可以通過輸入正確的用戶名稱和密碼進(jìn)入到系統(tǒng),當(dāng)用戶名稱或密碼為空時(shí),系統(tǒng)會(huì)通過JavaScript進(jìn)行判斷,并給予提示信息。系統(tǒng)登錄模塊的運(yùn)行結(jié)果如圖18.10所示。
圖18.10 系統(tǒng)登錄模塊的運(yùn)行結(jié)果
1.設(shè)計(jì)系統(tǒng)登錄頁面
系統(tǒng)登錄頁面主要用于收集用戶的輸入信息及通過自定義的JavaScript函數(shù)驗(yàn)證輸入信息是否為空,該頁面中所涉及到的表單元素如表18.12所示。
表18.12 系統(tǒng)登錄頁面所涉及的表單元素
名 稱 |
元 素 類 型 |
重 要 屬 性 |
含 義 |
form1 |
form |
method="post" action="user.do?action= login" |
用戶登錄表單 |
name |
text |
size="25" |
用戶名稱 |
pwd |
password |
size="25" |
用戶密碼 |
Submit |
submit |
value="確定" onclick="return check (form1)" |
“確認(rèn)”按鈕 |
續(xù)表
名 稱 |
元 素 類 型 |
重 要 屬 性 |
含 義 |
Submit3 |
reset |
Value="重置" |
“重置”按鈕 |
Submit2 |
button |
value="關(guān)閉" onClick="window.close();" |
“關(guān)閉”按鈕 |
編寫自定義的JavaScript函數(shù),用于判斷用戶名稱和密碼是否為空,代碼如下。
例程18-14:光盤\mr\18\MaterialManage\defaultroot\login.jsp
<script language="javascript">
function check(form){
if (form.name.value==""){
alert("請(qǐng)輸入用戶名稱!");form.name.focus();return false;
}
if (form.pwd.value==""){
alert("請(qǐng)輸入密碼!");form.pwd.focus();return false;
}
}
</script>
2.修改用戶管理的Action實(shí)現(xiàn)類
在用戶登錄頁面的用戶名稱和用戶密碼文本框中輸入正確的用戶名稱和密碼后,單擊“確定”按鈕,網(wǎng)頁會(huì)訪問一個(gè)URL,這個(gè)URL是“user.do?action=login”。從該URL地址中可以知道系統(tǒng)登錄模塊涉及到的action的參數(shù)值為“login”,也就是當(dāng)action=login時(shí),會(huì)調(diào)用驗(yàn)證用戶身份的方法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);
}
在驗(yàn)證用戶身份的方法login()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成Action Form類型,并用獲得指定屬性的getXXX方法重新設(shè)置該屬性的setXXX方法,然后調(diào)用UserDAO類中的login()方法驗(yàn)證登錄用戶信息是否正確,如果正確,將頁面重定向到系統(tǒng)主界面,否則將返回的錯(cuò)誤提示信息保存到HttpServletRequest的對(duì)象error中,并重定向頁面至錯(cuò)誤提示頁,驗(yàn)證用戶身份的方法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; //將接收到表單信息強(qiáng)制轉(zhuǎn)換成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.編寫系統(tǒng)登錄的UserDAO類的方法
從User.java文件中可以知道系統(tǒng)登錄頁使用的UserDAO類的方法是login()。在login()方法中首先調(diào)用UserDAO的query()方法從數(shù)據(jù)表tb_user中查詢輸入的用戶名稱是否存在。如果存在,再判斷查詢到的密碼是否與輸入的密碼相等,如果相等,將標(biāo)志變量設(shè)置為ok,并將用戶名稱保存到session中,否則設(shè)置為“您輸入的密碼錯(cuò)誤!”;如果用戶名不存在,則將標(biāo)志變量設(shè)置為“您輸入的用戶名稱錯(cuò)誤!”。驗(yàn)證用戶身份的方法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); //調(diào)用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="您輸入的密碼錯(cuò)誤!";
System.out.println("密碼錯(cuò)誤!");
}
}else{
rtn="您輸入的用戶名稱錯(cuò)誤!";
System.out.println("您輸入的用戶名稱錯(cuò)誤!");
}
return rtn;
}
說明:在驗(yàn)證用戶身份時(shí)先判斷用戶名,再判斷密碼,可以防止用戶輸入恒等式后直接登錄系統(tǒng)。
4.struts-config.xml文件配置
在struts-config.xml文件中配置系統(tǒng)登錄模塊所涉及的<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>元素,該元素用于完成對(duì)頁面的邏輯跳轉(zhuǎn)工作,具體代碼如下。
例程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>
根據(jù)name="userForm"可以找到與之相對(duì)應(yīng)的ActionForm的實(shí)現(xiàn)類“com.actionForm. UserForm”。
根據(jù)type="com.action.User"可以找到處理用戶數(shù)據(jù)的Action類。
根據(jù)<forward name="loginok" path="/main.jsp" />和<forward name="error" path="/error.jsp"/>可以了解,當(dāng)Action返回loginok時(shí),頁面會(huì)被轉(zhuǎn)到main.jsp文件,也就是系統(tǒng)主界面,當(dāng)Action返回error時(shí),頁面會(huì)被轉(zhuǎn)到error.jsp文件,顯示錯(cuò)誤提示信息。
5.防止非法用戶登錄系統(tǒng)
從網(wǎng)站安全的角度考慮,僅僅上面介紹的系統(tǒng)登錄頁面并不能有效的保存系統(tǒng)的安全,一旦系統(tǒng)主界面的地址被他人獲得,就可以通過在地址欄中輸入系統(tǒng)的主界面地址而直接進(jìn)入到系統(tǒng)中。由于系統(tǒng)的導(dǎo)航頁面top.jsp幾乎包含于整個(gè)系統(tǒng)的每個(gè)頁面,所以筆者將驗(yàn)證用戶是否將登錄的代碼放置在該頁中,驗(yàn)證用戶是否登錄的具體代碼如下。
例程18-20:光盤\mr\18\MaterialManage\defaultroot\top.jsp
<%
if(session.getAttribute("username")= =null || session.getAttribute("username")= =""){
response.sendRedirect("login.jsp");
}
%>
在頁面中包含導(dǎo)航頁面top.jsp的代碼如下:
<%@include file="top.jsp"%>
這樣,當(dāng)系統(tǒng)調(diào)用每個(gè)頁面時(shí),都會(huì)判斷session變量username是否存在,如果不存在,將頁面重定向到系統(tǒng)登錄頁面。
18.8.5 查看用戶列表設(shè)計(jì)
用戶登錄后,選擇“系統(tǒng)管理”→“用戶管理”命令,進(jìn)入到查看用戶列表頁面,在該頁面中將列出系統(tǒng)中的除超級(jí)用戶mr之外的用戶及其權(quán)限信息,同時(shí)提供添加用戶信息、刪除用戶信息、修改用戶權(quán)限的超級(jí)鏈接。查看用戶列表頁面的運(yùn)行結(jié)果如圖18.11所示。
技巧:將頁面中所涉及的JavaScript代碼保存在一個(gè)單獨(dú)的JS文件中,然后通過<script></script>將其引用到需要的頁面,可以規(guī)范頁面代碼。在系統(tǒng)導(dǎo)航頁面中引用menu.JS文件的代碼如下:
<script src="JS/menu.JS"></script>
在實(shí)現(xiàn)系統(tǒng)導(dǎo)航菜單時(shí),引用了JavaScript文件menu.JS,該文件實(shí)現(xiàn)了半透明背景菜單的全部JavaScript代碼。打開該JS文件,可以找到如下所示的“用戶管理”菜單項(xiàng)的超級(jí)鏈接代碼。
<a href=user.do?action=userQuery>用戶管理</a>
圖18.11 查看用戶列表頁面運(yùn)行結(jié)果
從上面的URL地址中可以知道查看用戶列表模塊涉及到的action的參數(shù)值為“userQuery”,當(dāng)action=userQuery時(shí),會(huì)調(diào)用查看用戶列表的方法userQuery(),具體代碼如下。
例程18-21:光盤\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userQuery")){
return userQuery(mapping,form,request,response);
}
在查看用戶列表的方法userQuery()中,首先調(diào)用UserDAO類中的query()方法查詢?nèi)坑脩粜畔ⅲ賹⒎祷氐牟樵兘Y(jié)果保存到HttpServltRequest的對(duì)象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(),該方法只有一個(gè)String型參數(shù)strif(用于指定查詢條件字符串)。在query()方法中首先判斷參數(shù)strif的值是否為空并且是否為“all”,當(dāng)strif不為空并且不為“all”時(shí),將通過Hibernate的HQL根據(jù)指定的條件查詢用戶信息,否則將通過Hibernate的HQL查詢?nèi)坑脩粜畔ⅰH缓髮⒉樵兘Y(jié)果保存到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 { //查詢?nèi)繑?shù)據(jù)
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); //關(guān)閉Session
}
return list;
}
在struts-config.xml文件中配置查看用戶列表所涉及的<forward>元素,代碼如下:
<forward name="userQuery" path="/userList.jsp" />
接下來的工作是將Action實(shí)現(xiàn)類中userQuery()方法返回的查詢結(jié)果顯示在查看用戶列表頁userList.jsp文件中。在userList.jsp文件中首先通過request.getAttribute()方法獲取查詢結(jié)果并將其保存在List集合中,再通過循環(huán)將用戶信息以列表形式顯示在頁面中,關(guān)鍵代碼如下。
例程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">查詢統(tǒng)計(jì)</td>
<td width="10%" align="center" bgcolor="#D7F6FB">基礎(chǔ)信息</td>
<td width="10%" align="center" bgcolor="#D7F6FB">系統(tǒng)管理</td>
<td width="6%" align="center" bgcolor="#D7F6FB">修改</td>
<td width="6%" align="center" bgcolor="#D7F6FB">刪除</td>
</tr>
<%
Iterator it=list.iterator(); //通過迭代方式顯示數(shù)據(jù)
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>
…… //此處省略了顯示其他權(quán)限值的代碼
<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 添加用戶信息設(shè)計(jì)
用戶登錄后,選擇“系統(tǒng)管理”→“用戶管理”命令,進(jìn)入到查看用戶列表頁面,在該頁面中單擊“添加用戶”超級(jí)鏈接即可進(jìn)入添加用戶頁面。添加用戶頁面的運(yùn)行結(jié)果如圖18.12所示。
圖18.12 添加用戶頁面的運(yùn)行結(jié)果
1.設(shè)計(jì)添加用戶頁面
添加用戶頁面主要用于收集輸入的用戶信息及通過自定義的JavaScript函數(shù)驗(yàn)證輸入信息是否合法,該頁面中所涉及到的表單元素如表18.13所示。
表18.13 添加用戶頁面所涉及的表單元素
名 稱 |
元 素 類 型 |
重 要 屬 性 |
含 義 |
form1 |
form |
method="post" action="user.do?action=useradd" |
表單 |
name |
text |
用戶名稱 |
|
pwd |
password |
用戶密碼 |
|
pwd1 |
password |
確認(rèn)密碼 |
|
Submit |
submit |
value="保存" onClick="check(form1)" |
【保存】按鈕 |
Submit2 |
reset |
value="重置" |
【重置】按鈕 |
Submit3 |
button |
value="返回" onClick="window.location.href='user.do?action=userQuery'" |
【返回】按鈕 |
編寫自定義的JavaScript函數(shù),用于判斷用戶名稱、用戶密碼、確認(rèn)密碼文本框是否為空及兩次輸入的密碼是否一致,代碼如下。
例程18-25:光盤\mr\18\MaterialManage\defaultroot\userAdd.jsp
<script language="javascript">
function check(form){
if(form.name.value= =""){
alert("請(qǐng)輸入用戶名稱!");form.name.focus();return false;
}
if(form.pwd.value= =""){
alert("請(qǐng)輸入用戶密碼!");form.pwd.focus();return false;
}
if(form.pwd1.value= =""){
alert("請(qǐng)確認(rèn)用戶密碼!");form.pwd1.focus();return false;
}
if(form.pwd.value!=form.pwd.value){
alert("您兩次輸入的用戶密碼不一致,請(qǐng)重新輸入!");form.pwd.focus();return false;
}
form.submit();
}
</script>
2.修改用戶管理的Action實(shí)現(xiàn)類
在添加用戶信息頁面中輸入合法的用戶名稱及密碼后,單擊“保存”按鈕,網(wǎng)頁會(huì)訪問一個(gè)URL,這個(gè)URL是“user.do?action=useradd”。從該URL地址中可以知道添加用戶模塊涉及到的action的參數(shù)值為“useradd”,也就是當(dāng)action=useradd時(shí),會(huì)調(diào)用添加用戶的方法userAdd(),具體代碼如下。
例程18-26:光盤\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("useradd")){
return userAdd(mapping, form, request, response);
}
在添加用戶的方法userAdd()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,然后調(diào)用UserDAO類中的insert()方法將添加的用戶信息保存到數(shù)據(jù)表中,并將返回值保存到變量rtn中,如果返回值為1,表示信息添加成功,將頁面重定向到添加信息成功頁面;如果返回值為2,表示該用戶已經(jīng)添加,將錯(cuò)誤提示信息“該用戶信息已經(jīng)存在!”保存到HttpServletRequest的對(duì)象error中,然后將頁面重定向到錯(cuò)誤提示信息頁面;否則將錯(cuò)誤提示信息“添加用戶信息失敗!”保存到HttpServletRequest的對(duì)象error中,并將頁面重定向到錯(cuò)誤提示頁,添加用戶信息的方法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","該用戶信息已經(jīng)存在!");
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()方法中首先調(diào)用UserDAO的query()方法從數(shù)據(jù)表tb_user中查詢輸入的用戶名稱是否存在,如果存在,將標(biāo)志變量設(shè)置為2,否則將輸入的信息保存到用戶信息表中,如果在插入時(shí)拋出異常,將回滾事務(wù)并將標(biāo)志變量設(shè)置0,否則將標(biāo)志變量設(shè)置為1,最后返回標(biāo)志變量,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(); //提交事務(wù)
ret = 1;
} catch (Exception e) {
if (tx != null) {
tx.rollback(); //回滾事務(wù)
}
e.printStackTrace();
return ret = 0;
} finally {
MySession.closeSession(session); //關(guān)閉Session
}
}
return ret;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置添加用戶所涉及的<forward>元素,代碼如下:
<forward name="useraddok" path="/user_ok.jsp?para=1" />
5.制作操作成功頁面
筆者將添加用戶、修改用戶權(quán)限、刪除用戶和修改密碼4個(gè)模塊的操作成功頁面用一個(gè)JSP文件實(shí)現(xiàn),只是通過傳遞的參數(shù)para的值進(jìn)行區(qū)分,關(guān)鍵代碼如下。
例程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("用戶權(quán)限設(shè)置成功!");
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 修改用戶權(quán)限設(shè)計(jì)
用戶登錄后,選擇“系統(tǒng)管理”→“用戶管理”命令,進(jìn)入到查看用戶列表頁面,在該頁面中單擊想要設(shè)置權(quán)限的用戶信息后面的“修改”超級(jí)鏈接即可進(jìn)入到“修改用戶權(quán)限”頁面設(shè)置該用戶的權(quán)限。修改用戶權(quán)限頁面的運(yùn)行結(jié)果如圖18.13所示。
圖18.13 修改用戶權(quán)限頁面的運(yùn)行結(jié)果
1.設(shè)計(jì)修改用戶權(quán)限頁面
在“查看用戶列表”頁面中可以找到打開“修改用戶權(quán)限”頁面的超級(jí)鏈接代碼,代碼如下所示。
例程18-30:光盤\mr\18\MaterialManage\defaultroot\userList.jsp
<a href="user.do?action=userMQuery&id=<%=id%>">修改</a>
從上面的URL地址中可以知道修改用戶權(quán)限頁面所涉及到的action的參數(shù)值為“userMQuery”,當(dāng)action=userMQuery時(shí),會(huì)調(diào)用查詢指定用戶權(quán)限信息的方法userQModify(),具體代碼如下。
例程18-31:光盤\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userMQuery")){
return userQModify(mapping, form, request, response);
}
在查詢指定用戶權(quán)限信息的方法userQModify()中,首先需要獲取從頁面中傳遞的參數(shù)id的值并賦值給int型變量id,然后調(diào)用UserDAO類中的query()方法,并將變量id作為該方法的參數(shù),查詢出指定用戶權(quán)限信息,再將返回的查詢結(jié)果保存到HttpServlet Request的對(duì)象userList中,查詢指定用戶權(quán)限信息的方法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");
}
從上面的代碼中可以知道查詢指定用戶權(quán)限信息使用的UserDAO類的方法是query(),該方法只有一個(gè)int型參數(shù)id(用于指定用戶id)。在query()方法中將利用Session的get()方法查詢出指定用戶,然后將查詢結(jié)果保存到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); //關(guān)閉Session
}
return userForm;
}
說明:在18.8.5節(jié)已經(jīng)介紹過一個(gè)UserDAO類的query()方法(參數(shù)為String strif),本節(jié)又介紹一個(gè)UserDAO類的query()方法(參數(shù)為int id),這個(gè)兩個(gè)方法的方法名相同,但參數(shù)類型不同,這實(shí)質(zhì)上采用的是Java提供的方法重載機(jī)制,采用方法重載可以免除某些不合理的情況,即使用完全不同的方法來完成實(shí)質(zhì)上相同的一個(gè)件事。
在struts-config.xml文件中配置查詢指定用戶權(quán)限信息所涉及的<forward>元素,代碼如下:
<forward name="userQModify" path="/userModify.jsp" />
接下來的工作是將userQModify()方法返回的查詢結(jié)果顯示在修改用戶權(quán)限頁userModify.jsp中。在userModify.jsp中首先通過request.getAttribute()方法獲取查詢結(jié)果并將其顯示在相應(yīng)的表單元素中。修改用戶權(quán)限頁面中所涉及到的重要表單元素如表18.14所示。
表18.14 設(shè)置用戶權(quán)限頁面所涉及的重要表單元素
名 稱 |
元 素 類 型 |
重 要 屬 性 |
含 義 |
form1 |
form |
method="post" action="user.do?action=userModify" |
表單 |
id |
hidden |
value="<%=id%>" |
用戶編號(hào) |
name |
text |
readonly="yes" value="<%=name%>" |
用戶名稱 |
setInstorage |
checkbox |
value="1" <%if(setInstorage.equals(new Byte("1"))){out.println ("checked");}%> |
物資入庫 |
續(xù)表
名 稱 |
元 素 類 型 |
重 要 屬 性 |
含 義 |
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");}%> |
查詢統(tǒng)計(jì) |
setBasic |
checkbox |
value="1" <%if(setBasic.equals(new Byte("1"))){out.println ("checked");}%> |
基礎(chǔ)信息 |
setSys |
checkbox |
value="1" <%if(setSys.equals(new Byte("1"))){out.println ("checked");}%> |
系統(tǒng)管理 |
Submit |
submit |
value="保存" |
【保存】按鈕 |
2.修改用戶管理的Action實(shí)現(xiàn)類
在修改用戶權(quán)限頁面中設(shè)置權(quán)限后,單擊“保存”按鈕,網(wǎng)頁會(huì)訪問一個(gè)URL,這個(gè)URL是“user.do?action=userModify”。從該URL地址中可以知道保存修改用戶權(quán)限信息涉及到的action的參數(shù)值為“userModify”,也就是當(dāng)action= userModify時(shí),會(huì)調(diào)用保存修改用戶權(quán)限信息的方法managerModify(),具體代碼如下。
例程18-34:光盤\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userModify")){
return userModify(mapping, form, request, response);
}
在保存修改用戶權(quán)限信息的方法userModify()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,然后調(diào)用UserDAO類中的Modify()方法將修改的用戶權(quán)限信息保存到用戶信息表tb_user,并將返回值保存到變量rtn中,如果返回值為1,表示信息設(shè)置成功,將頁面重定向到設(shè)置信息成功頁面,否則將錯(cuò)誤提示信息“修改用戶權(quán)限信息失敗!”保存到HttpServletRequest的對(duì)象error中,然后將頁面重定向到錯(cuò)誤提示信息頁面,保存修改用戶權(quán)限信息的方法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時(shí)修改權(quán)限
int rtn=userDAO.Modify(userForm,flag);
if(rtn==1){
return mapping.findForward("usermodiok");
}else{
request.setAttribute("error","修改用戶權(quán)限信息失敗!");
return mapping.findForward("error");
}
}
3.編寫保存修改權(quán)限信息的UserDAO類的方法
從上面的代碼中可以知道修改用戶權(quán)限時(shí)使用的UserDAO類的方法是Modify(),并且參數(shù)flag的值為2。Modify()方法可以完成修改用戶權(quán)限或修改個(gè)人密碼的功能,這根據(jù)參數(shù)flag的值決定,當(dāng)flag的值為1時(shí),表示執(zhí)行修改個(gè)人密碼操作,否則執(zhí)行修改用戶權(quán)限操作。由于參數(shù)flag的值為2,所以本節(jié)執(zhí)行的是保存修改用戶權(quán)限的操作,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{ //修改權(quán)限信息
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); //關(guān)閉Session
}
return ret;
}
4.struts-config.xml文件配置
在struts-config.xml文件中配置修改用戶權(quán)限所涉及的<forward>元素,代碼如下:
<forward name="usermodiok" path="/user_ok.jsp?para=2" />
提示:設(shè)置用戶權(quán)限成功頁面請(qǐng)參照18.8.6節(jié)中的“制作操作成功頁面”部分。
18.8.8 刪除用戶設(shè)計(jì)
用戶登錄后,選擇“系統(tǒng)管理”→“用戶管理”命令,進(jìn)入到查看用戶列表頁面,在該頁面中單擊想要?jiǎng)h除的用戶信息后面的“刪除”超級(jí)鏈接即可將該用戶刪除。
在“查看用戶列表”頁面中可以找到刪除用戶信息的超級(jí)鏈接代碼,代碼如下所示。
例程18-37:光盤\mr\18\MaterialManage\defaultroot\userList.jsp
<a href="user.do?action=userdel&id=<%=id%>&val=1">刪除</a>
從上面的URL地址中可以知道刪除用戶頁所涉及到的action的參數(shù)值為“userdel”,當(dāng)action= userdel時(shí),會(huì)調(diào)用刪除用戶的方法userdel(),具體代碼如下。
例程18-38:光盤\mr\18\MaterialManage\src\com\action\User.java
if(action.equals("userdel")){
return userDel(mapping, form, request, response);
}
在刪除用戶的方法userDel()中,首先需要獲取從頁面中傳遞的參數(shù)id的值并賦給int型變量id,賦值后將該變量作為UserDAO類中del()方法的參數(shù),然后調(diào)用該del()方法刪除指定的用戶,并根據(jù)執(zhí)行結(jié)果轉(zhuǎn)到相應(yīng)的頁面,刪除用戶的方法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()方法查詢到要?jiǎng)h除的用戶信息,并保存到UserForm中,然后再使用Session的delete()方法刪除該用戶信息,最后返回執(zhí)行結(jié)果,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); //關(guān)閉Session
}
return ret;
}
在struts-config.xml文件中配置刪除用戶所涉及的<forward>元素,代碼如下:
<forward name="managerDel" path="/manager_ok.jsp?para=3" />
提示:設(shè)置用戶權(quán)限成功頁面請(qǐng)參照18.8.6節(jié)中的“制作操作成功頁面”部分。