学习记录及代码:
需求
1)请求1:打开登录页URL-->filter(struts.xml)-->Action-->JSP
--Action
Action仅仅是将请求转给JSP,本身没有任何的业务逻辑,所以可以不写。
--struts.xml
在配置这个Action时,不必指定class属性,此时Struts2会调用默认的Action,即
ActionSupport,该默认Action中有默认方法execute,该方法直接返回"success"。
--JSP
2)请求2:点击登录
Submit-->filter(struts.xml)-->Action -->DAO-->DBUtil,Entity -->index.jsp/login.jsp
--Entity
--DAO
--Action
--struts.xml
--JSP
3)
让Action实现接口SessionAware,该接口需要实现一个 void setSession(Map<String,Object> map),该方法的目的是将session传入给Action。 即,当Action被实例化以后,Struts2会自动判断其是否实现了SessionAware接口,如果是则自动调用其setSession方法。
代码:
DAO:
public class LoginDAOImpl implements ILoginDAO{
public Admin findByCode(String adminCode) throws DAOException {
if(adminCode.length()==0 || adminCode==null){
return null;
}
String sql = "select * from admin_info where admin_Code=?";
Connection con = DBUtil.getConnection();
try {
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, adminCode);
ResultSet rs = ps.executeQuery();
if(rs.next()){
Admin a = createAdmin(rs);
return a;
}
} catch (SQLException e) {
e.printStackTrace();
throw new DAOException("查询管理员信息失败",e);
}finally{
DBUtil.close(con);
}
return null;
}
private Admin createAdmin(ResultSet rs) throws SQLException {
Admin admin = new Admin();
admin.setId(rs.getInt("id"));
admin.setAdminCode(rs.getString("admin_code"));
admin.setPassword(rs.getString("password"));
admin.setName(rs.getString("name"));
admin.setTelephone(rs.getString("telephone"));
admin.setEmail(rs.getString("email"));
admin.setEnrollDate(rs.getDate("enrolldate"));
return admin;
}
}
Action:
public class LoginAction extends BaseAction{
public String execute() throws DAOException {
ILoginDAO dao = DAOFactory.getLoginDAO();
Admin a = null;
try {
a = dao.findByCode(adminCode);
//判断账号是否正确
if(a == null){
message = "账号有误";
return "fail";
}else{
//如果账号对了判断密码是否正确
if(!a.getPassword().equals(password)){
message = "密码有误";
return "fail";
}
}
} catch (DAOException e) {
e.printStackTrace();
return "error";
}
session.put("admin", a);
return "success";
}
// input
private String adminCode;
private String password;
// output
private String message;
public String getAdminCode() {
return adminCode;
}
public void setAdminCode(String adminCode) {
this.adminCode = adminCode;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
struts.xml
<!-- 登陆模块的配置 -->
<package name="login" namespace="/login" extends="struts-default">
<!-- 跳转到登陆页Action -->
<action name="toLogin">
<result name="success">
/WEB-INF/main/login.jsp
</result>
</action>
<!-- 登陆验证Action -->
<action name="login" class="netctoss.action.LoginAction">
<result name="success">
/WEB-INF/main/index.jsp
</result>
<result name="fail">
/WEB-INF/main/login.jsp
</result>
<result name="error">
/WEB-INF/main/error.jsp
</result>
</action>
</package>
Jsp:
<form action="login" method="post">
<table>
<tr>
<td class="login_info">账号:</td>
<td colspan="2"><input name="adminCode" type="text" class="width150" /></td>
<td class="login_error_info"><span class="required">30长度的字母、数字和下划线</span></td>
</tr>
<tr>
<td class="login_info">密码:</td>
<td colspan="2"><input name="password" type="password" class="width150" /></td>
<td><span class="required">30长度的字母、数字和下划线</span></td>
</tr>
<tr>
<td class="login_info">验证码:</td>
<td class="width70"><input name="" type="text" class="width70" /></td>
<td><img src="../images/valicode.jpg" alt="验证码" title="点击更换" /></td>
<td><span class="required"></span></td>
</tr>
<tr>
<td></td>
<td class="login_button" colspan="2">
<a href="javascript:document.forms[0].submit();"><img src="../images/login_btn.png" /></a>
</td>
<td><span class="required"><s:property value="message"/></span></td>
</tr>
</table>
</form>
BaseAction和ILoginDAO
public interface ILoginDAO {
Admin findByCode(String adminCode) throws DAOException;
}
public class BaseAction implements SessionAware{
protected Map<String, Object> session;
public void setSession(Map<String, Object> arg0) {
session = arg0;
}
}