- 浏览: 229901 次
- 性别:
- 来自: 武汉
最新评论
-
spp_1987:
org.springframework.beans.facto ...
Hibernate4之多对多双向关联 -
spp_1987:
后台保存订单下面 有很多订单 调了 对应什么方法 实现的?
Hibernate4之多对多双向关联 -
spp_1987:
订单 和 商品之间 有中间表存在吗???
Hibernate4之多对多双向关联 -
spp_1987:
跟 官方 hibernate4.2.5提供 的 manytom ...
Hibernate4之JPA规范配置详解 -
zhuguopei_java:
谢谢。楼主你这是解释源码吗
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活用法
- 博客分类:
- Struts2
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:
JSP for creating a Gangster:
在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:
Struts2默认的拦截器栈:
下面这段代码可以充分体现ModelDriven和Preparable接口结合JAVA反射机制的灵活用法,大大方便节省了开发code时间,注意这里用的是paramsPrepareParamsStack拦截器栈,所以params拦截器会在Preparable接口的方法之前执行。
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; } }
发表评论
-
Struts2远程执行漏洞
2013-01-25 22:44 2071Struts2转码有个bug,可以导致应用挂掉(也可以执行类似 ... -
Struts2整合之动态图表OpenFlashChart
2012-07-06 15:56 2826Java开源项目中制作图表 ... -
Struts2整合之CKeditor和CKfinder
2012-07-11 17:29 3297先从官网上下载好最新的CKeditor和CKfinder包之后 ... -
Struts2之上传下载和页面渲染图片功能
2012-07-06 15:18 1793Struts2的上传下载是整合了commons-fileupl ... -
Struts2常用的数据标签
2012-06-30 16:24 1438<s:property /> <s:pr ... -
Struts2常用的集合控制标签
2012-06-30 15:56 2001<s:iterator/>迭代器标签 迭代器标签被 ... -
Struts2标签之token防止表单重复提交
2012-06-29 16:57 2085Struts2的token标签防止表单重复提交的思路是这样的: ... -
Struts2常用的UI标签
2012-06-29 17:03 1760<s:textfield />标签的label属性 ... -
Struts2中OGNL、ActionContext和值栈及线程安全浅析
2012-06-27 17:35 3142值栈(ValueStack) Struts2将OGNL ... -
Struts2之OGNL表达式中#,$,%的用法区别
2012-06-25 22:57 2563struts2 井号,星号,百分号 “#”主要有三种用途: 1 ... -
Struts2精萃之interceptor
2012-06-25 01:00 1908下面这段话能完美诠释拦截器的含义: 拦截器是AOP中的概念, ... -
Struts2的服务器端的四种输入校验方式
2012-06-24 16:34 2668Struts2的服务器端验证框架有四种方式校验,一种是利用do ... -
Struts2的客户端校验方式及自带的13种校验器
2012-06-24 16:22 2608如果要使用Struts2的验证框架,首先要开启这个拦截器。在 ... -
Struts2之国际化i18N配置
2012-06-23 19:19 3274在struts2中需要做国际化的有: jsp页面的国际化,a ... -
Struts2之Web应用中文乱码问题的6种解决方法
2012-06-23 17:29 1560在web应用中通常用下面几种方法解决中文问题: 1.HTM ... -
Struts2配置精要之struts.xml( global和default的配置)
2012-06-23 16:48 5046下面这个struts.xml囊括了所有可能用到的标签用法,例如 ... -
Struts2配置精要之常量constant配置详解(包括零配置Convention 的常量)
2012-06-18 02:30 4179这是目前为止收集的stru ... -
Struts2配置精要之Result Types(Struts2.3.4)
2012-06-17 19:36 10407struts2.3.4的Predefined Result ... -
Struts2配置精要之defaultStack与paramsPrepareParamsStack
2012-06-17 17:56 4252在Struts2.3.4的struts-default.xml ... -
Struts2原理浅析
2012-06-16 16:12 2135JavaEE把MVC设计模式引入 ...
相关推荐
在不使用ModelDriven和Preparable拦截器技术时,Action类需要包含JavaBean中的业务属性,例如目标Action的实例对象会被压入值栈栈顶,params拦截器会将表单域中的值注入到目标Action对应的属性中。这样会导致Action...
在Struts2框架中,为了提高代码的可维护性和可读性,开发人员经常使用到`ModelDriven`和`Preparable`这两种拦截器。本文档旨在通过分析这两种拦截器的原理及其实际应用来帮助开发者更好地理解和掌握它们。 #### 二...
- **Preparable接口**:通过实现`Preparable`接口,可以在Action执行前进行预处理,例如加载数据库中的数据。 - **类型转换和验证**:Struts2支持自定义类型转换器,可以将用户输入的数据转换为所需的类型;同时还...
Struts2是一个强大的Java EE应用程序框架,主要用于构建MVC(模型-视图-控制器)架构的Web应用。它是在Struts1的基础上发展起来的,旨在解决其前身在灵活性和可扩展性上的不足。Struts2提供了更加优雅的API,更加...
Struts2的`ValueStack`会将请求参数自动绑定到Action的属性上,这被称为“模型驱动”(ModelDriven)。同时,`Preparable`接口的`prepare()`方法可以在此阶段被调用,进行预处理。 5. **拦截器(Interceptor)**:...
在Struts2中,`ModelDriven`接口用于实现MVC模式中的Model层。当一个Action类实现了`ModelDriven`接口后,它必须提供一个`getModel()`方法,该方法返回一个业务对象,这个对象将作为视图的数据模型。 例如: ```...
8. **视图渲染**:在Flex中,使用组件和数据绑定来展示从Struts2接收的数据。理解如何使用MXML和ActionScript来构建界面和响应用户交互。 9. **错误处理和验证**:学习如何在Struts2中实现表单验证,以及在Flex中...
Struts2框架中的拦截器机制是其核心特性之一,它极大地扩展了框架的功能性和灵活性。通过理解和合理配置这些内置拦截器,开发者可以轻松地实现诸如验证、事务管理、日志记录等多种业务需求,从而提高应用程序的质量...
Action类需要继承自`org.apache.struts2.interceptor.FileUploadInterceptor`支持的接口,例如`Preparable`和`ModelDriven`。然后,定义一个或多个属性,它们将作为上传文件的载体。这些属性需要使用`@ultipartFile`...
Struts2是一个强大的MVC框架,它简化了Java Web应用的开发。其核心工作流程涉及多个组件协同工作,包括过滤器、ActionMapper、ActionProxy、ActionInvocation、Interceptor以及Dispatcher等。下面将详细解释这些概念...
Struts 1.1 API 是一个关键的开发者资源,它为使用Apache Struts框架进行Java Web应用程序开发提供了详细的文档和接口定义。Struts是一个开源的MVC(模型-视图-控制器)框架,用于构建可维护性和可扩展性高的企业级...
如果Action实现了`Preparable`接口,则该接口的`prepare()`方法会在Action执行前调用。这可以用来做一些初始化工作,如从数据库中获取数据等。 ##### 2.4 Checkbox 该拦截器主要用于处理表单中checkbox的值。默认...
Struts2 框架是Java Web开发中广泛使用的MVC框架之一,它极大地简化了企业级应用的开发。在Struts2中,拦截器(Interceptor)是一个至关重要的概念,它扮演着处理请求、增强功能和控制流程的角色。拦截器是在Action...
Struts 2 框架中的拦截器是其核心组件之一,主要负责在Action执行前后进行额外的操作,如参数绑定、验证、权限控制等。在`struts-default`配置中,许多默认的拦截器组合成预设的拦截器栈,为开发者提供了便捷的功能...
另一种方式是让Spring创建Action并注入到Struts2,Action类需要实现Spring的`ModelDriven`或`Preparable`接口。 SSH框架的整合是一个系统性的工作,涉及各个层次的配置和交互。理解并掌握这一过程对于开发高效、可...
Java拦截器是面向切面编程(AOP)的一种实现方式,主要用于在方法执行前后插入额外的操作,例如日志记录、权限验证、性能监控等。在Web应用框架如Struts 2中,拦截器扮演着重要角色,它们可以动态地拦截Action调用,...
这份文档将涵盖以下几个关键知识点:Maven依赖配置、Struts2配置、Spring集成以及具体的Action类实现和测试方法。 ### Maven依赖配置 为了进行SSH2框架内的单元测试,我们需要在项目的`pom.xml`文件中添加必要的...
这通常通过实现Spring提供的`ModelDriven`或`Preparable`接口,或者使用`struts-plugin.xml`配置文件中的`<spring:bean>`标签来实现。 3. **配置Hibernate**:在Spring配置文件中,我们需定义SessionFactory和数据...
- **Prepare Interceptor**:如果Action实现了Preparable接口,调用prepare方法。 - **Scope Interceptor**:将Action状态保存到session或application范围。 3. **拦截器的配置** 在Struts 2中,拦截器的配置...
SSH(Struts2、Spring、Hibernate)是Java开发中常见的三大开源框架,它们分别负责MVC模式中的表现层、业务层和数据访问层。整合这三个框架可以使项目的架构更加清晰,提高开发效率。下面我们将深入探讨SSH整合的...