首页 > 代码库 > Struts框架——(二)Struts原理with登录实例
Struts框架——(二)Struts原理with登录实例
二. Struts基本工作流程
假设现在有以下情景:
用户正在浏览一个用STRUTS的技术构建的网站主页,主页上有个登陆表单,用户填好登陆名和密码,单击“登陆”按钮,就激活了以下一系列过程:
(1)用户的请求以HTTP方式传输到服务器上,接受请求的是ActionServlet.
(2)ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操作。如果没有,则返回一个用户请求无效的出错信息。
(3)当ActionServlet请求找到用户请求的Action后,首先将用户输入的表单参数打包成一个ActionFrom对象,这个ActionFrom对象其实也就是一个JavaBean,里面包含两个字段,分别是用户名和密码。接着ActionServlet再根据struts-config.xml中的配置信息决定是否要执行ActionFrom对象中的Validate方法。若Validate方法执行有错,则返回。否则,继续下一步。
(4)系统生成一个用户所请求的Action的实例对象,将前面的ActionFrom对象传递给它,运行它的Execute()方法。这一步其实就是用户登陆的控制器,在执行exectue()方法时,可以调用后台模型验证登陆名和密码是否正确等信息。
(5)execute()执行结束前会生成一个ActionForward类型的对象并将之返回给ActionServlet,该对象的作用是告诉ActionFroward就代表跳转到一个登陆成功的页面。ActionServlet将对之进行分析,其实就相当于接收到一个新的请求,重复(2)~(5)的过程,直到将某个界面返回给用户为止!
以上就是STRUTS的基本工作流程,解释得比较粗,用活动图描述如下:
使用时序图来描述一下登录功能的处理流程:
与JSP + Servlet 比较:封装了ActionServlet,通过ActionForm来封装Request的参数。以登录为例:
1. View层:JSP:
<form action="login.do" method="post"> <input type="text" name="name" /> <br /> <input type="password" name="password" /> <input type="submit" value="http://www.mamicode.com/登录"/> </form>
LoginSuccess.jsp:
<body>
登录成功
</body>
LoginFail.jsp:
<body>
登录失败
</body>
2. Controller层:
原来的结构:
1)controller.java(ActionServlet):负责截取URL,创建新的action, 分派转发新的URL
2)loginAction.java; modifyAction.java:调用业务逻辑层的方法
现在:LoginAction.java, userActionForm.java
LoginAction.java:
1 package com.jialin; 2 import javax.servlet.http.HttpServletRequest; 3 import javax.servlet.http.HttpServletResponse; 4 5 import org.apache.struts.action.Action; 6 import org.apache.struts.action.ActionForm; 7 import org.apache.struts.action.ActionForward; 8 import org.apache.struts.action.ActionMapping; 9 10 public class LoginAction { 11 @override 12 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 13 throws Exception{ 14 // 通过ActionForm获取Request资源 15 UserActionForm userForm = (UserActionForm)form; 16 String userName = userForm.getName(); 17 String password = userForm.getPassword(); 18 19 //调用业务逻辑层处理 20 UserManage userManage = new UserManage(); 21 User user = new user; 22 user.setName(userName); 23 user.setPassword(password); 24 25 // 验证信息——后面可以放在JSP中处理 26 // 转发到指定JSP页面 27 try{ 28 userManage.ValidateUser(user); 29 return mapping.findForward("success"); 30 }catch (UserNotFoundException e){ 31 e.printStackTrace(); 32 request.setAttribute("message", e.getMessage); 33 }catch (PasswordErrorException e){ 34 e.printStackTrace(); 35 request.setAttribute("message", e.getMessage()); 36 } 37 return mapping.findForward("fail"); 38 } 39 }
userActionForm:
1 package com.jialin; 2 3 import org.apache.struts.action.ActionForm; 4 5 /** 6 * 用户ActionForm ,负责收集表单数据 7 * @author jialin 8 *注:get和set后的字符串首字母变小写后,必须和表单中属性的名字一致 9 */ 10 public class UserActionForm extends ActionForm { 11 private String name; 12 private int password; 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 public int getPassword() { 20 return password; 21 } 22 public void setPassword(int password) { 23 this.password = password; 24 } 25 26 }
3. Model业务逻辑层
UserManage.java
1 package com.jialin; 2 3 /** 4 * MODEL层业务逻辑 5 * @author jialin 6 *判断用户是否合法 7 */ 8 public class UserManage { 9 10 public void ValidateUser(User user) { 11 // 判断用户名密码是否正确 12 if (!"jialin".equals(user.getName())) { 13 throw new UserNotFoundException("用户不存在!用户名为:" + user.getName()); 14 } else if (user.getPassword() != 123456) { 15 throw new PasswordErrorException("密码错误"); 16 } 17 }
4. 配置Struts:
1)拷贝struts相关的jar到WEB-INF/lib下
2) 在web.xml文件中配置ActionServlet
1 <servlet> 2 <servlet-name>action</servlet-name> 3 <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 4 <init-param> 5 <param-name>config</param-name> 6 <param-value>/WEB-INF/struts-config.xml</param-value> 7 </init-param> 8 <init-param> 9 <param-name>debug</param-name> 10 <param-value>2</param-value> 11 </init-param> 12 <init-param> 13 <param-name>detail</param-name> 14 <param-value>2</param-value> 15 </init-param> 16 <load-on-startup>2</load-on-startup> 17 </servlet> 18 19 20 <!-- Standard Action Servlet Mapping --> 21 <servlet-mapping> 22 <servlet-name>action</servlet-name> 23 <url-pattern>*.do</url-pattern> 24 </servlet-mapping>
3) 提供struts-config.xml文件,需要放到WEB-INF下
1 <?xml version="1.0" encoding="ISO-8859-1" ?> 2 3 <!DOCTYPE struts-config PUBLIC 4 "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" 5 "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> 6 7 <struts-config> 8 <!-- set ActionForm info--> 9 <form-beans> 10 <form-bean name="userForm" type="com.jialin.UserActionForm" /> 11 </form-beans> 12 13 <action-mappings> 14 <!-- Set path,action,actionform,scope,forward info --> 15 <action path="/login" type="com.jialin.LoginAction" name="userForm" 16 scope="request"> 17 <forward name="success" path="/LoginSuccess.jsp" /> 18 <forward name="fail" path="/LoginFail.jsp" /> 19 </action> 20 </action-mappings> 21 22 </struts-config>
上述实现过程,其中ActionServlet的功能,被Struts封装了,所以我们的代码部分,并没有涉及到ActionServlet的部分。
分析代码可知道,Action不再需要我们手动创建,读取配置文件等基础服务已被Struts封装了,表单中数据类型也不需要我们手动转换了,页面转向可以进行配置,也不需要我们手动去配置文件中取了。
可以说,Struts把公共的服务为封装好了,我们只需要做很少的事,就可以获得很大的灵活性。
Struts框架——(二)Struts原理with登录实例