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。