您的位置 首页 java

IT技术交流:Java 轻量级整合开发

ervlet-Action servlet

控制器,接受用户请求和状态改变,以及发出视图选择

FilterDispatcher

Action

控制器的一部分,与模型交互,执行状态改变或状态查询,以及告诉ActionServlet 下一个选择的视图

ActionForm

状态改变的数据

vo

ActionMapping

状态改变事件

xwork.xml

ActionForward

用户指向或者视图选择

Result

三.运行流程

[p=30, 2, left]

1.提交 request →web容器(即tomcat);

2.依据web应用上下文找到web应用;如: <html: form action=”/cc. do “>

3.再依据部署描述文件web.xml找到ActionServlet

<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>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

4. ActionServlet接着大致执行顺序如下:

a.读struts-config.xml形成ActionMapping

b. 依据path找到相应的Action类定义

<action path=”/cc”

type=”cn.javass.s2test.web.action.UserAction”

name=”userForm”

scope=”request”

input=”/pages/add.jsp”>

c.依据action定义找到Form的定义

<form-bean

name=”userForm”

type=”cn.javass.s2test.vo.UserForm”>

</form-bean>

d.把页面参数填充到Form中

e. 调用execute()

f.执行execute()得到ActionFoward

g.依据ActionFoward到mapping中去下一个页面

<forward name=”toList” path=”/pages/list.jsp” />

四.怎么做

1. 创建ActionForm

package cn.javass.s2test.vo;

import java.io.Serializable;

import java.util.*;

import org.apache.struts.action.ActionForm;

public class UserForm extends ActionForm implements Serializable {

private String uuid,userId,name;

private int age;

private Collection<UserForm> ufCol = new ArrayList<UserForm>();

@Override

public String toString(){

return “uuid==”+uuid+”userId==”+userId+”name==”+name+”age==”+age+”ufCol==”+ufCol;

}

public String getUuid() {

return uuid;

}

public void setUuid(String uuid) {

this.uuid = uuid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());

return result;

}

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

final UserForm other = (UserForm) obj;

if (uuid == null) {

if (other.uuid != null)

return false;

} else if (!uuid.equals(other.uuid))

return false;

return true;

}

public String getUserId() {

return userId;

}

public void setUserId(String userId) {

this.userId = userId;

}

public Collection<UserForm> getUfCol() {

return ufCol;

}

public void setUfCol(Collection<UserForm> ufCol) {

this.ufCol = ufCol;

}

}

说明:

l ActionForm是一个 JavaBean ,需继承org.apache.struts.action.ActionForm类,它捕获通过HTTP请求传送的参数

l ActionForm针对每个HTML表单中的字段具有一个对应的属性

l ActionServlet匹配请求中的参数和ActionForm中的属性,并调用ActionForm中的setter方法,将参数传入ActionForm

l 我们的add.jsp有四个表单字段(下面将会看到),所以,我们需要定义ActionForm中相应的setter方法ActionForm中的getter/setter方法,可以通过Eclipse集成环境,自动生成

l ActionForm中的内部属性全部定义为私有的(private),并通过公共(public)的getter/setter方法来访问

2.创建Action类

package cn.javass.s2test.web.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 cn.javass.s2test.business.ebi.UserEbi;

import cn.javass.s2test.util.springhelp.SpringBF;

import cn.javass.s2test.vo.UserForm;

public class UserAction extends Action {

private UserEbi getEbi(){

return (UserEbi)SpringBF.getBF().getBean(“user-ebi”);

}

public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){

UserForm uf = (UserForm)form;

this.getEbi().create(uf);

uf.setUfCol(this.getEbi().getAll());

System.out.println(“col=============”+this.getEbi().getAll());

ActionForward af = mapping.findForward(“toList”);

return af;

}

}}

说明:

l Action是一个Java类,需继承org.apache.struts.action.Action类

l ActionServlet将会组装ActionForm,并将它传递给Action

l Action 通常负责:

Ø 输入校验

Ø 调用业务逻辑类执行业务逻辑操作

Ø 决定返回哪个ActionForward

l 我们的UserAction做了如下事情,这些是一个Action通常都会做的最典型的事情:

Ø 将输入的ActionForm强制转换为UserActionForm

Ø 从UserActionForm对象中获取数据信息

Ø 执行数据信息的逻辑判断操作

Ø 根据业务逻辑执行的结果,决定返回哪个ActionForward

3.创建Struts配置文件struts-config.xml

<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

<!DOCTYPE struts-config PUBLIC

“-//Apache Software Foundation//DTD Struts Configuration 1.3//EN”

“”>

<struts-config>

<form-beans>

<form-bean

name=”userForm”

type=”cn.javass.s2test.vo.UserForm”>

</form-bean>

</form-beans>

<action-mappings>

<action path=”/cc” type=”cn.javass.s2test.web.action.UserAction”

name=”userForm”

scope=”request”

input=”/pages/add.jsp”>

<forward name=”toList” path=”/pages/list.jsp”>

</forward>

<forward name=”toUpdate” path=”/pages/update.jsp”>

</forward>

</action>

</action-mappings>

<message-resources parameter=”MessageResources” />

</struts-config>

说明:

l struts-config.xml文件,是由ActionServlet读取的配置文件,它定义了所有关于Action、ActionForm、ActionForward等的详细信息

l <form-beans>标签内部可以包含多个<form-bean>标签

l <form-bean>标签必须指定name和type属性

925]Ø name属性是给此ActionForm一个标识名称

925]Ø type属性指定了此ActionForm是哪个类,必须是全路径的类名

05]l <action>标签可以配置的重要属性包括:

95]Ø path-从页面上通过一个什么样的URL路径来访问Action(不包含.do)

95]Ø type – 访问这个URL的时候,调用哪个Action类,这是Action的全路径类名

95]Ø name – 这个属性用来标识哪个ActionForm将被创建,并将提交的表单组件给它

95]Ø scope – FormBean的作用域范围,可以取值为session和request,一般取值都是request

创建add.jsp

<%@ page language=”java” contentType=”text/html; charset=gb2312″

pageEncoding=”gb2312″%>

<%@ taglib uri=”” prefix=”bean” %>

<%@ taglib uri=”” prefix=”html” %>

<%@ taglib uri=”” prefix=”logic” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “”>

<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>

<title>新增页面</title>

</head>

<body>

<html:form action=”/cc.do”>

业务编号:<html:text property=”uuid”></html:text><br>

用户编号:<html:text property=”userId”></html:text><br>

用户姓名:<html:text property=”name”></html:text><br>

用户年龄:<html:text property=”age”></html:text><br>

<html:submit value=”提交”></html:submit>

</html:form>

</body>

</html>

说明:

l 添加一个表单,action为cc.do,这个cc.do的意思,将会告诉struts的ActionServlet,它将需要调用哪个Action来处理这个表单的请求

l 添加输入域name,这个name的表单字段,必须跟UserActionForm中的属性一致

运行流程:

l 当你从浏览器输入地址:,Tomcat将按通常情况来处理这个JSP并返回浏览器

l 当你提交表单,实际上是提交到了这样一个URL地址:,Tomcat将会根据web.xml的配置,将这个请求发送给相应的Servlet,在我们的应用中,Tomcat将会把这个请求发送给org.apache.struts.action.ActionServlet这个类(请参看web.xml的配置)

l 然后ActionServlet根据struts-config.xml的配置信息,调用UserAction对象去处理这个请求,在此之前,它会将页面表单的请求数据封装到UserForm对象中,并传递给LoginAction

l UserAction返回一个ActionForward对象,包含了将要转向的路径信息

l ActionServlet根据这个ActionForward对象所包含的路径信息,调用相应的页面去执行响应

Struts1 Struts2 的区别和对比:

u Action 类:

Ø Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。

Ø Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

u 线程模式:

Ø Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。

Ø Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

u Servlet 依赖:

Ø Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。

Ø Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

u 可测性:

Ø 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。

Ø Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

u 捕获输入:

Ø Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经 常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。

Ø Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

u 表达式语言:

Ø Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

Ø Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--”Object Graph Notation Language” (OGNL).

u 绑定值到页面(view):

Ø Struts 1使用标准JSP机制把对象绑定到页面中来访问。

Ø Struts 2 使用 “ValueStack”技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。

u 类型转换:

Ø Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。

Ø Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

u 校验:

Ø Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。

Ø Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性

u Action执行的控制:

Ø Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

Ø Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

u MyEclipse支持struts1,不支持struts2。

文章来源:智云一二三科技

文章标题:IT技术交流:Java 轻量级整合开发

文章地址:https://www.zhihuclub.com/199803.shtml

关于作者: 智云科技

热门文章

网站地图