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

www.MyException.Cn   发布于:2012-09-15 19:09:28   浏览:164次
0

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 itmay 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 class PlayerAction extends AbstractBaseAction<Player> { private static final long serialVersionUID = -3068068486865209475L; @Override public String execute() throws Exception { return super.list(); } }
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; } @SuppressWarnings("unchecked") public AbstractBaseAction() { try { entityClass =(Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } catch (Exception e) { ExceptionHandler.logError(e, AbstractBaseAction.class,"无法获取entityClass "); } } /** * 这里相当于new了一个entity对象 ,getModel()才能返回这个对象, * 因为默认的interceptor-stack是defaultStack中prepare在modelDriven拦截器之前执行 */ @Override public void prepare() throws Exception { if (entity == null) { try { entity = entityClass.newInstance(); } catch (Exception e) { ExceptionHandler.logError(e, AbstractBaseAction.class,"创建实例失败,class=" + entityClass.getName()); } } } public void prepareSave() throws Exception { if (getId() != null) { entity = getEntityById(getId()); } } public String save() throws Exception{ return SUCCESS; } public void prepareDelete() throws Exception { if (getId() != null) { entity = getEntityById(getId()); } } public String delete() throws Exception{ return SUCCESS; } public void prepareLoad() throws Exception { if (getId() != null) { entity = getEntityById(getId()); } } public String load() throws Exception{ return SUCCESS; } public String list() throws Exception{ return SUCCESS; } protected T getEntityById(Long id) { if (id!=null) { try { return (T) HibernateUtil.getObjectById(entityClass, id); } catch (Exception e) { Struts2Utils.getRequest().setAttribute("error", "数据查询出错"); addActionMessage("数据查询出错"); ExceptionHandler.logError(e, AbstractBaseAction.class,"获取实例时出现异常,class=" + entityClass.getName() + ", id=" + getId()); } } return null; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }

© 著作权归作者所有

转载于:https://www.cnblogs.com/pangting/p/6912398.html

Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...相关推荐

  1. Struts2中Action接收参数

    Struts2中Action接收参数的方法主要有以下三种: Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数:     a.定义:在Action类中定义属 ...

  2. Struts2中Action接收参数的方法

    Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性(属性驱动)接收参数:(推荐) a.定义:在Action类中定义属性,创建get和set方法: b.接收:通过属性 ...

  3. Struts2中action接受参数方法

    Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数:    a.定义:在Action类中定义属性,创建get和set方法:    b.接收:通过属性接收参数 ...

  4. 【转载】取得系统中网卡MAC地址的三种方法

    From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...

  5. JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析

    JavaScript 循环中调用异步函数的三种方法,及为什么 forEach 无法工作的分析 业务分析 初版的问题 解决方案 传统的 for 循环 不使用 for 循环的解决方案 分析 forEach ...

  6. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  7. java 获取键盘点击_Java中获取键盘输入值的三种方法介绍

    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...

  8. Linux中创建Daemon进程的三种方法

    Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...

  9. WebAPI Post模式下传递、接收参数的几种方法

    创建实体类 前一篇博客讲了Get模式下的传递.接收参数的几种方法,现在来介绍一下Post模式下传递.接收参数的几种方法.首先还是老样子,创建一个空的ASP.NET WebAPI工程,在Models文件 ...

最新文章

  1. ipa解包打包工具_7步!教你轻松搞定ios重签ipa包
  2. 【Linux】 -bash-4.2#问题和Cannot allocate memory
  3. 我的世界修改服务器头像,我的世界单机模式更换头像的方法 各种怪物的头等来换...
  4. html向下的符合,下面HTML代码片段中,符合XHTML使用规范的是( )。
  5. 工业级光纤收发器和协议转换器有什么区别呢?
  6. LeetCode 1286. 字母组合迭代器(回溯/位运算)
  7. 2022,这些地图可视化,够你用一整年了(附可视化素材)
  8. 感谢贫穷,是贫穷限制了人们的善良
  9. 《Effective C#》读书笔记(4)
  10. 数字信号处理(DSP)实验——IIR数字滤波器设计与仿真
  11. C# 反编译-Reflector 反混淆-De4Dot 修改dll/exe代码-reflexil
  12. CI框架url模式及获得参数
  13. xp计算机共享能否指定用户,XP怎么设置局域网共享?
  14. Linux ntp时间服务器的搭建和配置
  15. 如何快速解决 Mybatis 异常:Invalid bound statement (not found)
  16. 《阿里巴巴 Java开发手册》读后感
  17. 干掉Session?这个跨域认证解决方案真的优雅
  18. PyTorch开发者福音, OpenVINO整合PyTorch实现推理加速!
  19. Flash中传统补间,补间动画,补间形状的区别
  20. 微型计算机基础理论怎么学,微型计算机原理(孟辉)

热门文章

  1. vector与结构体联合使用 在磁盘中生成.txt 文件
  2. 基于HTML5的Google水下搜索
  3. Linux13-计划任务crontab
  4. web安全简介_Web安全:HTTP简介
  5. LaZagne检测windows本地存储的密码
  6. npm安装less报错 rollbackFailedOptional: verb npm-session
  7. 1055 The World‘s Richest
  8. php http面向对象编程实例,PHP面向对象编程——PHP对象引用实例代码
  9. 如何修改可运行Jar包,如何反编译Jar包
  10. 《HTML5与CSS3实战指南》——2.5 构建The HTML5 Herald