`
一日一博
  • 浏览: 230410 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法

阅读更多
Struts2中Action接收参数的方法主要有以下三种:

1.使用Action的属性接收参数(最原始的方式):
    a.定义:在Action类中定义属性,创建get和set方法;
    b.接收:通过属性接收参数,如:userName;
    c.发送:使用属性名传递参数,如:user1!add?userName=jim;
2.使用DomainModel接收参数:
    a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法;
    b.接收:通过对象的属性接收参数,如:user.getUserName();
    c.发送:使用对象的属性传递参数,如:user2!add?user.userName=mike;
3.使用ModelDriven接收参数(现在用的比较多的方式):
    a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),通过getModel方法返回该对象;
    b.接收:通过对象的属性接收参数,如:user.getUserName();
    c.发送:直接使用属性名传递参数,如:user2!add?userName=tom


在Struts2.3.4的文档里面有这样说明:
To use ModelDriven actions, make sure that the Model Driven Interceptor is applied to your action. This interceptor is part of the default interceptor stack defaultStack so it is applied to all actions by default.

Action class:
public class ModelDrivenAction implements ModelDriven { 
    public String execute() throws Exception {
        return SUCCESS;
    }

    public Object getModel() {
        return new Gangster();
    }
}

JSP for creating a Gangster:
<s:form action="modelDrivenResult" method="POST" namespace="/modelDriven">   
    <s:textfield label="Gangster Name" name="name" />
    <s:textfield label="Gangster Age"  name="age" />
    <s:checkbox  label="Gangster Busted Before" name="bustedBefore" />
    <s:textarea  cols="30" rows="5" label="Gangster Description" name="description" />           
    <s:submit />
</s:form>


在Model Driven Interceptor里面这样说道
To create a Model Driven action, implement the ModelDriven interface by adding a model property, or at least the accessor.

public Object getModel() ...

In the implementation of getModel, acquire an instance of a business object and return it.

On the page, you can address any JavaBean properties on the business object as if they were coded directly on the Action class. (The framework pushes the Model object onto the ValueStack.)

Many developers use Spring to acquire the business object. With the addition of a setModel method, the business logic can be injected automatically.

所以如果实现 ModelDriven 接口,那么必须至少构造一个getModel方法,并return一个实体对象。而且在struts.xml文件中需要配置名为modelDriven的拦截器Interceptor,如果没有指定拦截器栈,那么使用默认的defaultStack,这个拦截器栈里面已经引用了modelDriven的拦截器,所以默认下你的package包extends了struts-default那么就不用配置。
struts.xml:
<action name="someAction" class="com.examples.SomeAction">
    <interceptor-ref name="modelDriven"/>
    <interceptor-ref name="basicStack"/>
    <result name="success">good_result.ftl</result>
</action>


Struts2默认的拦截器栈:
            <!-- A complete stack with all the common interceptors in place.
                 Generally, this stack should be the one you use, though it
                 may do more than you need. Also, the ordering can be
                 switched around (ex: if you wish to have your servlet-related
                 objects applied before prepare() is called, you'd need to move
                 servletConfig interceptor up.

                 This stack also excludes from the normal validation and workflow
                 the method names input, back, and cancel. These typically are
                 associated with requests that should not be validated.
            -->
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                         <param name="excludeParams">dojo\..*,
                         ^struts \..*,^session\..*,^request\..*,^application\..*,
                         ^servlet(Request|Response)\..*,parameters\...*
                         </param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="debugging"/>
            </interceptor-stack>
......
        <default-interceptor-ref name="defaultStack"/>

        <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />



下面这段代码可以充分体现ModelDriven和Preparable接口结合JAVA反射机制的灵活用法,大大方便节省了开发code时间,注意这里用的是paramsPrepareParamsStack拦截器栈,所以params拦截器会在Preparable接口的方法之前执行。

public abstract class AbstractBaseAction<T> extends ActionSupport implements ModelDriven<T>,Preparable{

	private static final long serialVersionUID = -1487318639557604204L;
	
	private T entity;
	
	private Class<T> entityClass;
	
	private Long id;
	
	public T getModel() {
        return entity;
    }
	
	public void setModel(T entity) {
        this.entity = entity;
    }
	
	@SuppressWarnings("unchecked")
	public AbstractBaseAction() {
		try {
            entityClass =(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            if (entity == null) {
    	        try {
    	            entity = entityClass.newInstance();
    	        } catch (Exception e) {
    	            ExceptionHandler.logError(e, AbstractBaseAction.class,"创建实例失败,class=" + entityClass.getName());
    	        }
    	    }
        } catch (Exception e) {
            ExceptionHandler.logError(e, AbstractBaseAction.class,"无法获取entityClass ");
        }
	}
	
	@Override
	public void prepare() throws Exception {
		
	}
	
	public void prepareSave() throws Exception {
	}
	
	public String save() throws Exception{
		return SUCCESS;
	}
	
	public void prepareDelete() throws Exception {
	}
	
	public String delete() throws Exception{
		return SUCCESS;
	}
	
	public void prepareLoad() throws Exception {
	}
	
	public String load() throws Exception{
		return SUCCESS;
	}
	
	public String list() throws Exception{
		return SUCCESS;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

}


分享到:
评论
1 楼 zhuguopei_java 2013-07-30  
谢谢。楼主你这是解释源码吗

相关推荐

    Java详解ModelDriven和Preparable拦截器.doc

    在不使用ModelDriven和Preparable拦截器技术时,Action类需要包含JavaBean中的业务属性,例如目标Action的实例对象会被压入值栈栈顶,params拦截器会将表单域中的值注入到目标Action对应的属性中。这样会导致Action...

    [尚硅谷]_封捷_ModelDriven和Preparable拦截器.pdf

    在Struts2框架中,为了提高代码的可维护性和可读性,开发人员经常使用到`ModelDriven`和`Preparable`这两种拦截器。本文档旨在通过分析这两种拦截器的原理及其实际应用来帮助开发者更好地理解和掌握它们。 #### 二...

    Struts2视频教程

    - **Preparable接口**:通过实现`Preparable`接口,可以在Action执行前进行预处理,例如加载数据库中的数据。 - **类型转换和验证**:Struts2支持自定义类型转换器,可以将用户输入的数据转换为所需的类型;同时还...

    struts2解析文件

    Struts2是一个强大的Java EE应用程序框架,主要用于构建MVC(模型-视图-控制器)架构的Web应用。它是在Struts1的基础上发展起来的,旨在解决其前身在灵活性和可扩展性上的不足。Struts2提供了更加优雅的API,更加...

    struts2工作流程

    Struts2的`ValueStack`会将请求参数自动绑定到Action的属性上,这被称为“模型驱动”(ModelDriven)。同时,`Preparable`接口的`prepare()`方法可以在此阶段被调用,进行预处理。 5. **拦截器(Interceptor)**:...

    struts2高级.txt

    在Struts2中,`ModelDriven`接口用于实现MVC模式中的Model层。当一个Action类实现了`ModelDriven`接口后,它必须提供一个`getModel()`方法,该方法返回一个业务对象,这个对象将作为视图的数据模型。 例如: ```...

    flex+Struts实例

    8. **视图渲染**:在Flex中,使用组件和数据绑定来展示从Struts2接收的数据。理解如何使用MXML和ActionScript来构建界面和响应用户交互。 9. **错误处理和验证**:学习如何在Struts2中实现表单验证,以及在Flex中...

    struts2拦截器详述ppt

    Struts2框架中的拦截器机制是其核心特性之一,它极大地扩展了框架的功能性和灵活性。通过理解和合理配置这些内置拦截器,开发者可以轻松地实现诸如验证、事务管理、日志记录等多种业务需求,从而提高应用程序的质量...

    使用struts2实现的文件上传功能

    Action类需要继承自`org.apache.struts2.interceptor.FileUploadInterceptor`支持的接口,例如`Preparable`和`ModelDriven`。然后,定义一个或多个属性,它们将作为上传文件的载体。这些属性需要使用`@ultipartFile`...

    struts2_工作流程

    Struts2是一个强大的MVC框架,它简化了Java Web应用的开发。其核心工作流程涉及多个组件协同工作,包括过滤器、ActionMapper、ActionProxy、ActionInvocation、Interceptor以及Dispatcher等。下面将详细解释这些概念...

    struts1.1api

    Struts 1.1 API 是一个关键的开发者资源,它为使用Apache Struts框架进行Java Web应用程序开发提供了详细的文档和接口定义。Struts是一个开源的MVC(模型-视图-控制器)框架,用于构建可维护性和可扩展性高的企业级...

    struts2内置拦截器简介

    如果Action实现了`Preparable`接口,则该接口的`prepare()`方法会在Action执行前调用。这可以用来做一些初始化工作,如从数据库中获取数据等。 ##### 2.4 Checkbox 该拦截器主要用于处理表单中checkbox的值。默认...

    struts拦截器介绍

    Struts2 框架是Java Web开发中广泛使用的MVC框架之一,它极大地简化了企业级应用的开发。在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它扮演着处理请求、增强功能和控制流程的角色。拦截器是在Action...

    struts-default中拦截器介绍.pdf

    Struts 2 框架中的拦截器是其核心组件之一,主要负责在Action执行前后进行额外的操作,如参数绑定、验证、权限控制等。在`struts-default`配置中,许多默认的拦截器组合成预设的拦截器栈,为开发者提供了便捷的功能...

    ssh框架整合详细文档 含注释 解释等 史上最详细

    另一种方式是让Spring创建Action并注入到Struts2,Action类需要实现Spring的`ModelDriven`或`Preparable`接口。 SSH框架的整合是一个系统性的工作,涉及各个层次的配置和交互。理解并掌握这一过程对于开发高效、可...

    Java拦截器.pdf

    Java拦截器是面向切面编程(AOP)的一种实现方式,主要用于在方法执行前后插入额外的操作,例如日志记录、权限验证、性能监控等。在Web应用框架如Struts 2中,拦截器扮演着重要角色,它们可以动态地拦截Action调用,...

    ssh2单元测试action的例子

    这份文档将涵盖以下几个关键知识点:Maven依赖配置、Struts2配置、Spring集成以及具体的Action类实现和测试方法。 ### Maven依赖配置 为了进行SSH2框架内的单元测试,我们需要在项目的`pom.xml`文件中添加必要的...

    SSH框架整合

    这通常通过实现Spring提供的`ModelDriven`或`Preparable`接口,或者使用`struts-plugin.xml`配置文件中的`&lt;spring:bean&gt;`标签来实现。 3. **配置Hibernate**:在Spring配置文件中,我们需定义SessionFactory和数据...

    理解拦截器用于在某个方法或字段被访

    - **Prepare Interceptor**:如果Action实现了Preparable接口,调用prepare方法。 - **Scope Interceptor**:将Action状态保存到session或application范围。 3. **拦截器的配置** 在Struts 2中,拦截器的配置...

    struct+spring+Hibernate框架整合文档

    SSH(Struts2、Spring、Hibernate)是Java开发中常见的三大开源框架,它们分别负责MVC模式中的表现层、业务层和数据访问层。整合这三个框架可以使项目的架构更加清晰,提高开发效率。下面我们将深入探讨SSH整合的...

Global site tag (gtag.js) - Google Analytics