您的位置:首页 > 编程语言 > Java开发

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

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

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

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




配置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>







创建登录页面


创建一个登录(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)

一个登录失败页面(login_failure.jsp)


创立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;
 
    }
 
    
 
 
 
}







创建LoginAction(需要继承struts1的Action)


需要覆盖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");
 
        }
 
        
 
    }




配置到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中,流程的理解是非常重要的一个部分,需要深入的去学习.真个例子的流程如下.


Web客户端请求Tomcat通过request(username,password);/login.do


从Tomcat中找到ActionServlet,此Servlet在Tomcat启动的时候已经实例化完成.

调用ActionServlet的doGet/doPost方法.


ActionServlet调用RequestProcesser(核心类)

RequestProcesser调用processPath方法,用于截取URL.

RequestProcesser调用processMapping,作用是根据截取的URL取得ActionMapping.


RequestProcesser调用processActionForm


根据ActionMapping中的name查找ActionForm

如果配置了ActionFrom,那么就到request或者session查找

如果在request或者session中 存在已经创建的ActionForm,那么将会返回.

如果不存在那么根据ActionFrom完整路径采用反射进行创建.

再将创建好的ActionFrom放到request或者session中.

RequestProcesser调用processPopulate方法


首先执行ActionForm中的reset方法进行重置.

随后得到表单中所有输入域的name名称.

之后在调用request.getParameterValues(),根据name名称得到相应的值.

最后把表单中的数据全部放到一个map中.

map的key为表单输入域的名称,map的value为表单的输入域的值(字符串数组).

接下来调用一个第三方组件,BeanUtils,将Map中的值根据ActionForm中类型先转换好再设置到ActionFrom上.再调用ActionFrom中的setter方法设置到ActionFrom上.


processActionCreate

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


processActionForm

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


processForwardConfig

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


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



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