基于01-struts的登录,把业务逻辑判断代码独立放在一个业务处理类中,以此把Action和业务处理分开。
遵循的原则:不在Action中进行业务逻辑的处理,应交给专门的Model层去处理。
(1)创建一个运行时异常 UserNotFoundException.java文件
package edu.yy.struts;
public class UserNotFoundException extends RuntimeException {
}
(2)使用单例模式创建业务处理类 UserManager.java文件
package edu.yy.struts;
public class UserManager {
//使用单例模式
private static UserManager instance=new UserManager();
private UserManager(){}
public static UserManager getInstance(){
return instance;
}
public void check(String username){
if(!username.equals("struts")){
throw new UserNotFoundException();
}
}
}
(3)LoginAction中的代码修改如下:
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//把ActionForm强转为LoginActionForm
LoginActionForm laf=(LoginActionForm)form;
//从LoginActionForm中获取用户名
String username=laf.getUsername();
/*//用户名的逻辑判断,并决定返回哪个ActionForward
if(username.equals("struts")){
//把用户名放入request中
request.setAttribute("username", username);
//跳转到成功页面
return mapping.findForward("success");
}else{
return mapping.findForward("error");
}*/
//定义一个错误信息
String errorInfo="";
try{
UserManager.getInstance().check(username);
request.setAttribute("username", username);
return mapping.findForward("success");
}catch(UserNotFoundException unfe){
unfe.printStackTrace();
errorInfo="用户名错误,用户名=【"+username+"】";
}
//把错误信息放在request中,以便在登录失败页面中看到错误信息
request.setAttribute("errorInfo", errorInfo);
return mapping.findForward("error");
}
}
(4)登录失败页面 failure.jsp
<body>
登录失败,<%=request.getAttribute("errorInfo") %>
</body>
(5)登录成功页面
<body>
<%=request.getAttribute("username")%>,登录成功<br/>
<%
LoginActionForm laf=(LoginActionForm)request.getAttribute("form");
%>
<%=laf.getUsername() %>,登录成功
</body>
可以看出这里有两种方式取出登录的用户名:
第一种:在LoginAction中把登录成功的用户名存入request中。
第二种:在struts-config.xml文件中的
<action-mappings>
<action path="/login"
type="edu.yy.struts.LoginAction"
name="form"
scope="request"
>
其中action的nane属性对应的LoginActionForm中存放着登录的用户名,对应的scope是request,所以可以取到。