18.JavaWeb基础 Struts 1





一.简单介绍

  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配置:

18.JavaWeb基础 Struts 1_第1张图片



然后全部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>


18.JavaWeb基础 Struts 1_第2张图片



18.JavaWeb基础 Struts 1_第3张图片




总结:


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。









你可能感兴趣的:(18.JavaWeb基础 Struts 1)