18.JavaWeb基础 Struts 1

来源:互联网 发布:阿里云服务器分区视频 编辑:程序博客网 时间:2024/04/29 11:08





一.简单介绍

  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)) {// 创建ActionMessagesActionMessages 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。









0 0