1、struts1工作原理

 

 a> 初始化: struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象.

 b> 发送请求: 用户提交表单或通过URL向WEB服务器提供请求,请求的数据用HTTP协议传给WEB服务器.

 c> form填充: Struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中

d>派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给Action的excute()方法

 e>处理业务: Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象.服务器通过ActionForward对象进行转发工作

 f> 返回响应: Action将业务处理的不同结果返回一个目标相应对象给总控制器

 g> 查找响应: 总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面

 h> 响应用户: 目标响应对象将结果传递给资源对象,将结果展现给用户

 

struts1原理图:

 

 

2、基础入门

1> 下载struts的安装文件struts-1.3.10-all.zip

2> 创建一个 web project,并将上步中解压的lib文件下的jar包引进去

 

 

 

     3> 配置web.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee ;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

        id="WebApp_ID" version="2.5">

        <welcome-file-list>

                <welcome-file>index.html</welcome-file>

                <welcome-file>index.jsp</welcome-file>

        </welcome-file-list>

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

        <servlet-mapping>

                <servlet-name>action</servlet-name>

                <url-pattern>*.do</url-pattern>

        </servlet-mapping>

</web-app>

 

4> 新建struts-config.xml文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts-config PUBLIC

          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"

          "http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">

 

<struts-config>

 

        <!-- ActionForm -->

        <form-beans>

        <!-- name:名称 type:类路径 -->

                <form-bean name="loginForm" type="com.wgy.struts1.LoginForm"></form-bean>

 

        </form-beans>

 

        <!-- 设置全局URL,必须写在Action前面,这样任何Action都可以使用 

        <global-forwards> 

                <forward name="result" path="/result.jsp" />

        </global-forwards> -->

 

        <!-- 注册Action -->

        <action-mappings>

                <!-- name:Form名称 type:类路径 path:客户端(JSP)提交到服务器端时指定的路径(Form表单                       中的action=”/login.do") -->

                <action path="/login" type="com.wgy.struts1.LoginAction" 

        name="loginForm" scope="request">

                        <!-- 局部URL,只有这个action可以使用 -->

                        <forward name="success" path="/success.jsp"></forward>

                </action>

        </action-mappings>

 

</struts-config>

 

5> 新建LoginForm类:

package com.wgy.struts1;

 

import org.apache.struts.action.ActionForm;

 

public class LoginForm extends ActionForm {

 

        private static final long serialVersionUID = 1L;

 

        private String username;

 

        public String getUsername() {

                return username;

        }

 

        public void setUsername(String username) {

                this.username = username;

        }

 

}

 

6> 新建LoginAction类:

 

package com.wgy.struts1;

 

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;

 

public class LoginAction extends Action {

 

        @Override

        public ActionForward execute(ActionMapping mapping, ActionForm form,

                HttpServletRequest request, HttpServletResponse response) throws Exception {

 

 

                LoginForm loginForm = (LoginForm) form;

                if ("wgy".equals(loginForm.getUsername())) {

                        return mapping.findForward("success");

                }

                return null; 

        }

 

}

 

7> 新建index.jsp页面:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" import="java.util.*"%>

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>

<!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=UTF-8">

        <title>首页</title>

</head>

<body>

        <html:form action="/login.do">

                username:<html:text property="username"></html:text> <br /> 

                <html:submit>登录</html:submit>

        </html:form>

</body>

</html>

 

注:以上仅描述大致流程,未作详细处理。

 

 

struts1中action是线程不安全的,因为每个action只被初始化一次,所有请求共享一个action实例

要实现这种安全性,必须:

1> 不要用实例变量或类变量共享只是针对某个请求的数据

2> 注意资源操作的同步性

其属性attribute用来存取form的关键字,缺省值与name属性值一样;

validate属性用于是否校验表单(校验开关),缺省值为true(校验);

如果表单校验失败,则跳转到input属性所代表的目标模块(必须当validate=true时,才起作用)

 

ActionForward:

当其属性redirect值为true时,会调用HttpServletResponse的sendRedirect方法,跳转路径写绝对路径;当值为false时,调用RequestDispactcher.forward方法,跳转路径为相对当前应用,默认为false。