这篇博文为大家简单的介绍一下OA权限模块中的登录和注销功能。功能很简单,但是几乎每个系统都离不开。
一、编写UserAction和UserService
UserAction类:
package cn.tgb.oa.struts2.action;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import cn.tgb.oa.base.BaseAction;
import cn.tgb.oa.domain.Role;
import cn.tgb.oa.domain.User;
@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User>{
/**
* 列表
*/
public String list(){
//1.从数据库中查询所有User
List<User> users = new ArrayList<User>();
users = userService.findAll();
//2.将users实体放到actionContext中
ActionContext.getContext().put("userList", users);
return "list";
}
/** 登录页面 */
public String loginUI() throws Exception {
return "loginUI";
}
/** 登录 */
public String login() throws Exception {
User user = userService.findByLoginNameAndPassword(model.getLoginName(), model.getPassword());
if (user == null) {
addFieldError("login", "用户名或密码不正确!");
return "loginUI";
} else {
// 登录用户
ActionContext.getContext().getSession().put("user", user);
return "toIndex";
}
}
/** 注销 */
public String logout() throws Exception {
ActionContext.getContext().getSession().remove("user");
return "logout";
}
}
UserService类:
package cn.tgb.oa.service.impl;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.itcast.oa.base.DaoSupportImpl;
import cn.itcast.oa.domain.User;
import cn.itcast.oa.service.UserService;
@Service
@Transactional
public class UserServiceImpl extends DaoSupportImpl<User> implements UserService {
public User findByLoginNameAndPassword(String loginName, String password) {
// 使用密码的MD5摘要进行对比
String md5Digest = DigestUtils.md5Hex(password);
return (User) getSession().createQuery(//
"FROM User u WHERE u.loginName=? AND u.password=?")//
.setParameter(0, loginName)//
.setParameter(1, md5Digest)//
.uniqueResult();
}
}
二、配置Struts.xml文件
<!-- 4.4用户管理 -->
<action name="user_*" class="userAction" method="{1}">
<result name="list">/WEB-INF/jsp/userAction/list.jsp</result>
<result name="saveUI">/WEB-INF/jsp/userAction/saveUI.jsp</result>
<result name="toList" type="redirectAction">department_list</result>
<result name="loginUI">/WEB-INF/jsp/userAction/loginUI.jsp</result>
<result name="logout">/WEB-INF/jsp/userAction/logout.jsp</result>
<result name="toIndex" type="redirect">/index.jsp</result>
</action>
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<head>
<title>Itcast OA</title>
<%@ include file="/WEB-INF/jsp/public/commons.jspf"%>
<link href="${pageContext.request.contextPath}/style/blue/login.css"
type=text/css rel=stylesheet>
<script type="text/javascript">
$(function(){
document.forms[0].loginName.focus();
});
// 在被嵌套时就刷新上级窗口
if(window.parent != window){
window.parent.location.reload(true);
}
</script>
</head>
<body leftmargin=0 topmargin=0 marginwidth=0 marginheight=0
class=PageBody>
<!-- 显示表单 -->
<s:form action="user_login" focusElement="loginNameInput">
<div id="CenterAreaBg">
<div id="CenterArea">
<div id="LogoImg">
<img border="0"
src="${pageContext.request.contextPath}/style/blue/images/logo.png" />
</div>
<div id="LoginInfo">
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 width=100%>
<tr>
<td colspan="3">
<!-- 显示错误 --> <font color="red"><s:fielderror /></font>
</td>
</tr>
<tr>
<td width=45 class="Subject"><img border="0"
src="${pageContext.request.contextPath}/style/blue/images/login/userId.gif" /></td>
<td><s:textfield name="loginName" size="20" tabindex="1"
cssClass="TextField required" id="loginNameInput" /></td>
<td rowspan="2" style="padding-left:10px;"><input
type="image" tabindex="3"
src="${pageContext.request.contextPath}/style/blue/images/login/userLogin_button.gif" />
</td>
</tr>
<tr>
<td class="Subject"><img border="0"
src="${pageContext.request.contextPath}/style/blue/images/login/password.gif" /></td>
<td><s:password name="password" id="aa" size="20"
tabindex="2" showPassword="false" cssClass="TextField required" /></td>
</tr>
</table>
</div>
<div id="CopyRight">
<a href="javascript:void(0)">© 2010 版权所有 </a>
</div>
</div>
</div>
</s:form>
</body>
</html>
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<head>
<title>您已退出Itcast OA系统</title>
<%@ include file="/WEB-INF/jsp/public/commons.jspf" %>
<link href="${pageContext.request.contextPath}/style/blue/logout.css" rel="stylesheet" type="text/css">
</head>
<body>
<table border=0 cellspacing=0 cellpadding=0 width=100% height=100%>
<tr>
<td align=center>
<div id=Logout>
<div id=AwokeMsg>
<img id=LogoutImg src="${pageContext.request.contextPath}/style/blue/images/logout/logout.gif" border=0>
<img id=LogoutTitle src="${pageContext.request.contextPath}/style/blue/images/logout/logout1.gif" border=0>
</div>
<div id=LogoutOperate>
<img src="${pageContext.request.contextPath}/style/blue/images/logout/logout2.gif" border=0>
<a href="${pageContext.request.contextPath}/user_loginUI.action">重新进入系统</a>
<img src="${pageContext.request.contextPath}/style/blue/images/logout/logout3.gif" border=0>
<a href="javascript: window.open('','_self');window.close();">关闭当前窗口</a>
</div>
</div>
</td>
</tr>
</table>
</body>
</html>
总结:
这两块主要学习到两个新的知识点,一个是如何把数据库中经过MD5加密的密码解析和用户传过来的密码进行对比来判断密码的对错;第二个就是学习了SSH中使用<s:fielderror>字段对错误消息进行提示。