zoukankan      html  css  js  c++  java
  • 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="登录"/>
    </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把公共的服务为封装好了,我们只需要做很少的事,就可以获得很大的灵活性。

  • 相关阅读:
    cloud_config学习_2
    layui的tab和form冲突
    layui+beetl实现三级菜单
    postgreSQL官网教程_管理表、类型
    08、异 常&包
    07、面向对象特征之多态&内部类
    06、面向对象特征之继承
    04、面向对象
    03、数组&内存划分
    02、函数
  • 原文地址:https://www.cnblogs.com/lesleysbw/p/6251654.html
Copyright © 2011-2022 走看看