一.简单介绍
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>
资源文件配置:
在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。