当前位置: 代码迷 >> Web前端 >> 透过简单示例来了解Struts流程
  详细解决方案

透过简单示例来了解Struts流程

热度:409   发布时间:2012-10-24 14:15:58.0
通过简单示例来了解Struts流程

              通过初识SSH我们已经从宏观的角度对SSH有一个了解,接下来将会逐步的对立面的内容进行深入学习.首先是需要学习的是Struts框架.

       在上篇文章中我们提到:Struts就是一个MVC的架构,在控制器,视图和模型方面都有其特定的组件,更多的是利用了Controller这个组件。

       接下来将通过一个简单的登录例子来学习Struts框架,并了解它这个框架的主要流程.由于是第一个例子会详细的将里面的一些内容都描述出来.

     

       
    1. 配置struts环境(只能应用于WEB项目)

    下载struts资源包

    struts-1.2.9

    拷贝struts相关的jar包拷贝到项目中的WEB-INF/lib目录下

     

    配置ActionServlet在web.xml文件中.因为这次初次配置,所以很多的配置信息需要参考struts资源包中的例子struts-1.2.9-bin\webapps\struts-examples.war.

    参照例子项目,<<struts-examples.war>>

     

    将以后的xml中的关于servlet的配置拷贝到自己的项目中具体内容如下代码:

     

    <?xml version="1.0" encoding="UTF-8"?>
     
    <web-app version="2.5" 
    
        xmlns="http://java.sun.com/xml/ns/javaee" 
    
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     
        <!-- Standard Action Servlet Configuration (with debugging) -->
     
        <servlet>
     
            <servlet-name>action</servlet-name>
     
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
     
            <init-param>
     
                <param-name>config</param-name>
     
                <param-value>/WEB-INF/struts-config.xml</param-value>
     
            </init-param>
     
          
     
            <init-param>
     
                <param-name>debug</param-name>
     
                <param-value>2</param-value>
     
            </init-param>
     
            <init-param>
     
                <param-name>detail</param-name>
     
                <param-value>2</param-value>
     
            </init-param>
     
            <load-on-startup>2</load-on-startup>
     
        </servlet>
     
        <!-- Standard Action Servlet Mapping -->
     
        <servlet-mapping>
     
            <servlet-name>action</servlet-name>
     
            <url-pattern>*.do</url-pattern>
     
        </servlet-mapping>
     
        
     
        <welcome-file-list>
     
            <welcome-file>index.jsp</welcome-file>
     
        </welcome-file-list>
     
    </web-app>
    


     

    配置struts-config.xml,将例子中的此文件拷贝到WEB-INF文件目录下

     

    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE struts-config PUBLIC
    			 "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
    			 "http://struts.apache.org/dtds/struts-config_1_2.dtd">
    			
    <struts-config>
    </struts-config>
    


     

     

       
    1. 创建登录页面 
          
      1. 创建一个登录(login.jsp) 

     

    <%@ page language="java" contentType="text/html; charset=GB18030"
     
            pageEncoding="GB18030"%>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     
    <html>
     
    <head>
     
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
     
    <title>Insert title here</title>
     
    </head>
     
    <body>
     
        <from action="" method="post">
     
            用户名:<input type="text" name="username"><br/>
     
            密码: <input type="text" name="password"/>
     
            <input type ="submit" name="login"/>
     
        </from>
     
    </body>
     
    </html>
       
    


     

      b.一个登录成功页面(login_success.jsp) 
    1. 一个登录失败页面(login_failure.jsp)
       
    1. 创立LoginActionForm,处理登录页面(需要继承struts      的ActionForm),注意set中的后面的名字要跟表单的名称一摸一样.

     

    package com.bjpowernode.struts;
     
     
     
    import org.apache.struts.action.ActionForm;
     
    /**
     
    * 登录ActionFrom ,负责表单数据的搜集
     
    * @author jnqqls
     
    * @group TGB
     
    * @version 1.0
     
    * @comments
     
    */
     
    @SuppressWarnings("serial")
     
    public class LoginActionForm extends ActionForm {
     
        private String username;
     
        private String password;
     
        public String getUsername() {
     
            return username;
     
        }
     
        public void setUsername(String username) {
     
            this.username = username;
     
        }
     
        public String getPassword() {
     
            return password;
     
        }
     
        public void setPassword(String password) {
     
            this.password = password;
     
        }
     
        
     
     
     
    }
     
     
     


     

    1.  
       
    1. 创建LoginAction(需要继承struts1的Action) 
          
      1. 需要覆盖exectute方法 
    package com.bjpowernode.struts;
     
     
     
    import javax.servlet.http.HttpServletRequest;
     
    import javax.servlet.http.HttpServletResponse;
     
     
     
    import org.apache.struts.action.Action;
     
    import org.apache.struts.action.ActionForm;
     
    import org.apache.struts.action.ActionForward;
     
    import org.apache.struts.action.ActionMapping;
     
    /**
     
    * 登录Action
     
    * 负责获取表单数据,调用业务逻辑,返回转向信息
     
    * @author jnqqls
     
    * @group TGB
     
    * @version 1.0
     
    * @comments
     
    */
     
    public class LoginAction extends Action {
     
     
     
        @Override
     
        public ActionForward execute(ActionMapping mapping, ActionForm form,
     
                HttpServletRequest request, HttpServletResponse response)
     
                throws Exception {
     
            //转换为LoginActionForm类型
     
            LoginActionForm laf=(LoginActionForm)form;
     
     
     
            //获取form中的数据
     
            String username=laf.getUsername();
     
            String password=laf.getPassword();
     
     
     
            //这里仅仅是测试,不进行数据库判断.
     
            if("admin".equals(username) && "admin".equals(password)){
     
                //登录成功
     
                //mapping 代表配置信息
     
                return mapping.findForward("success");
     
                
     
            }else{
     
                //登录失败
     
                return mapping.findForward("failure");
     
            }
     
            
     
        }
     


     

    1. 配置到struts-config配置文件中
    <?xml version="1.0" encoding="iso-8859-1"?>
     
    <!DOCTYPE struts-config PUBLIC
     
                        "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
     
                        "http://struts.apache.org/dtds/struts-config_1_2.dtd">
     
     
     
    <struts-config>
     
        <form-beans>
     
            <form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
     
        </form-beans>
     
        
     
            <action-mappings>
     
                <action path="/login"
     
                        type="com.bjpowernode.struts.LoginAction"
     
                        name="loginForm"        
     
                        scope="request"
     
                        >
     
                    <forward name="success" path="/login_success.jsp"/>
     
                    <forward name="failure" path="/login_failure.jsp"></forward>
     
                </action>
     
            </action-mappings>
     
    </struts-config>
     
    


     

     

     

     

            至此整个Struts登录的例子完成,可以进行相关的页面测试.接下来将对整个流程做一个解释,而在Struts中,流程的理解是非常重要的一个部分,需要深入的去学习.真个例子的流程如下.

       
    1. Web客户端请求Tomcat通过request(username,password);/login.do
       
    1. 从Tomcat中找到ActionServlet,此Servlet在Tomcat启动的时候已经实例化完成. 
    2. 调用ActionServlet的doGet/doPost方法.
       
    1. ActionServlet调用RequestProcesser(核心类) 
    2. RequestProcesser调用processPath方法,用于截取URL. 
    3. RequestProcesser调用processMapping,作用是根据截取的URL取得ActionMapping.
       
    1. RequestProcesser调用processActionForm
          
      1. 根据ActionMapping中的name查找ActionForm  
      2. 如果配置了ActionFrom,那么就到request或者session查找  
      3. 如果在request或者session中 存在已经创建的ActionForm,那么将会返回.  
      4. 如果不存在那么根据ActionFrom完整路径采用反射进行创建.   
      5. 再将创建好的ActionFrom放到request或者session中. 
    1. RequestProcesser调用processPopulate方法
          
      1. 首先执行ActionForm中的reset方法进行重置.  
      2. 随后得到表单中所有输入域的name名称.  
      3. 之后在调用request.getParameterValues(),根据name名称得到相应的值.  
      4. 最后把表单中的数据全部放到一个map中.    
      5. map的key为表单输入域的名称,map的value为表单的输入域的值(字符串数组).    
      6. 接下来调用一个第三方组件,BeanUtils,将Map中的值根据ActionForm中类型先转换好再设置到ActionFrom上.再调用ActionFrom中的setter方法设置到ActionFrom上.
       
    1. processActionCreate

        先根据Action的完整类名称到Map中查找,如果存在就返回Action对象,否则根据Action类的完整名称采用反射机制去创建,再将创建好的Action放入Map中,所以Struts1的Action是单实例的,存在线程安全问题.

       
    1. processActionForm

        执行用户自定义Action中的execute方法,将ActionMapping,ActionFrom,request,response传递过去,将ActionForward传递过去.

       
    1. processForwardConfig

        根据返回的ActionForward完成转向或转发. 

      

        通过整个流程我们发现,在Struts中RequestProcesser是一个比较核心的方法.同时也涉及到很多的对象,例如ActionFrom,ActionMapping.等等

              

       小结:通过以上的流程,希望读者能够对Struts流程有一个基本的了解.它是一个基于Sun J2EE平台的MVC框架,从代码中可以看出它主要是采用Servlet和JSP技术来实现的。Struts能充分满足应用开发的需求,简单易用,敏捷迅速,把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,我们利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。它的官方地址是http://struts.apache.org  "闲来无事"可以多浏览一下.

1楼smszhuang1683小时前
好,又复习了一遍
  相关解决方案