一.简单介绍
Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的
研究,改进和提高JavaServer Pages 、Servlet、标签库以及面向对象的技术水准。Struts
这个名字来源于在建筑和旧式飞机中使用的支持金属架。这个框架之所以叫"Struts",是为了提醒
我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。即使过了这么久,出了
很多MVC模式的框架,但是Struts 1 还是作为它们的领军,站在时代的教学角度。Struts 1 有
很大的缺点(ActionForm繁多),所有才出了Struts 2很大程度上优化了Struts 1的缺点。所
以Strut 1的很多功能是无力的,比如动态ActionForm、验证框架,没有从实质角度解决ActionForm
繁多的问题。
这里,我只是站在教学的角度叙述一个时代的经典。
MVC相当于一个接口(定义标准),Struts只是实现了此接口(具体实现)。
二.配置环境
lib配置:
然后全部Build Path即可。
struts-config.xml配置:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
</form-beans>
<global-exceptions>
</global-exceptions>
<global-forwards>
</global-forwards>
<action-mappings>
</action-mappings>
<message-resources parameter="resource.MessageResources" />
</struts-config>
然后放入WebRoot目录下。
资源文件配置:
在src下建立如上。
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:jsp="http://java.sun.com/xml/ns/javaee/jsp" 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" version="2.5">
<display-name></display-name>
<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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
三.简单Struts 1程序
si.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean"
prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html"
prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic"
prefix="logic"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>s1.jsp</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<html:messages id="info" message="true">
<h2><font color="red">${info }</font></h2>
</html:messages>
<logic:present name="msg" scope="request">
<h2>${msg }</h2>
</logic:present>
<html:form action="/jsp/hello.do" method="post">
<html:text property="message"></html:text>
<html:submit value="显示"></html:submit>
</html:form>
</body>
</html>
这里,涉及到了Struts 1的标签导入。bean、logic、和html标签。
HelloForm.java:
package com.zyy.struts.form;
import org.apache.struts.action.ActionForm;
public class HelloForm extends ActionForm {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
注意:ActionFom的设计尽量保证是POJO类型。
HelloAction.java:
package com.zyy.struts.action;
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;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.MessageResources;
import com.zyy.struts.form.HelloForm;
public class HelloAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
HelloForm helloForm = (HelloForm) form;
String message = helloForm.getMessage();
if (message == null || "".equals(message)) {
// 创建ActionMessages
ActionMessages errors = new ActionMessages();
// 添加错误
errors.add("info", new ActionMessage("error.info"));
// System.out.println("errors:"+errors);
// 保存错误
super.saveMessages(request, errors);
// 跳转到Input指定页面
return mapping.getInputForward();
} else {
request.setAttribute("msg", message);
}
return mapping.findForward("show");
}
}
资源文件:
资源文件的编辑,设计到国际化转码的问题,我们可以用MyEclipse编辑:
切换为Source显示:
修改struts-config.xml文件:
<struts-config>
<form-beans>
<form-bean name="helloForm" type="com.zyy.struts.form.HelloForm"></form-bean>
</form-beans>
<global-exceptions>
</global-exceptions>
<global-forwards>
</global-forwards>
<action-mappings>
<action attribute="helloForm" input="/jsp/s1.jsp" name="helloForm"
path="/jsp/hello" type="com.zyy.struts.action.HelloAction" scope="request">
<forward name="show" path="/jsp/s1.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="resource.MessageResources" />
</struts-config>
总结:
1.由于表单s1.jsp的位置在WebRoot目录下的jsp文件夹中,所以提交路径为/jsp/hello.do。
2.ActionForm的属性对应着表单提交过来各个数据的property。
3.配置文件中,path属性与提交路径为/jsp/hello.do对应一致,配置文件中,可以省略.do
这是由于前面配置web.xml文件的时候设置了,*.do的的配置,可以往前看看web.xml。
4.input属性配置的是验证错误(ActionErrors不为空)时跳转的路径,但是由于ActionForm
要保证是POJO类型,所以舍弃了ActionError类保存错误,一般在Action中创建ActionMessages
类保存。
5.scope属性只能设置:request和response。
6.type属性:包.类名。
7.HelloAction中的return mapping.findForward("show")意思只找到配置内容Action子
节点中name为"show"的forward,并取得其path。
8.return mapping.getInputForward():跳转到Input指定页面
四.工作原理
1.在web.xml文件中为ActionServlet配置一个映射文件,一般都为*.do。
2.JSP页面提交或跳转时,如果是HTML标签定义的表单,则会根据action指定的路径与
struts-conf.xml文件中的路径相匹配,如果匹配失败,程序报错。
3.运行JSP之前,会调用指定的ActionForm中的reset()方法,进行表单元素的初始化。
4.提交表单时会将所有的操作提交到ActionServlet(*.do指定)中,之后ActionServlet
根据struts-config.xml文件中的配置内容调用指定的ActionForm和 Action。
5.一般ActionForm中验证无失败后,会调用指定的Action。但是ActionForm保持POJO类型后
只有属性、getter和setter方法,没有多余的操作,所以不需要验证。
6.Action负责完整具体的业务操作,兵根据操作的结果通过ActionMapping进行跳转
ActionMapping的findForwadr()方法返回一个ActionForward对象完成跳转。
五.Struts 1的问题
由原理可以看出,每个Action对应着每一个ActionForm,肯定让程序出现更多的ActionFom。
不管有没有数据提交或者跳转,都需要ActionForm。