博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
阅读量:4634 次
发布时间:2019-06-09

本文共 4979 字,大约阅读时间需要 16 分钟。

 

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:  
在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:  
good_result.ftl
Struts2默认的拦截器栈:
dojo\..*, ^struts \..*,^session\..*,^request\..*,^application\..*, ^servlet(Request|Response)\..*,parameters\...*
input,back,cancel,browse
input,back,cancel,browse
......
下面这段代码可以充分体现ModelDriven和Preparable接口结合JAVA反射机制的灵活用法,大大方便节省了开发code时间,注意这里用的是paramsPrepareParamsStack拦截器栈,所以params拦截器会在Preparable接口的方法之前执行。 
public class PlayerAction extends AbstractBaseAction
{ private static final long serialVersionUID = -3068068486865209475L; @Override public String execute() throws Exception { return super.list(); } }
public abstract class AbstractBaseAction
extends ActionSupport implements ModelDriven
,Preparable{ private static final long serialVersionUID = -1487318639557604204L; private T entity; private Class
entityClass; private Long id; public T getModel() { return entity; } @SuppressWarnings("unchecked") public AbstractBaseAction() { try { entityClass =(Class
)((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

你可能感兴趣的文章
CSS3——对齐 组合选择符 伪类 伪元素 导航栏 下拉菜单
查看>>
NOIP2005普及组第4题 循环
查看>>
xbmc-12.0稳定版代码初探 (2) —— XBMC_HOME
查看>>
Java GC 日志详解
查看>>
MySQL主主配置说明
查看>>
[建议] GCC 新手入门【转】
查看>>
AC日记——[Hnoi2017]影魔 bzoj 4826
查看>>
Python:通过一个小案例深入理解IO多路复用
查看>>
自定义View圆
查看>>
min stack
查看>>
Golang的接口
查看>>
《Java虚拟机规范》阅读(三):Class文件格式
查看>>
django中间件
查看>>
Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)
查看>>
27-THREE.JS 平面
查看>>
以太网基础(转)
查看>>
tp5+linux+apache php7.1.30环境下,上传图片报错:mkdir():permission denied
查看>>
单片AT89C2051 + SD卡 + 3310LCD = 音乐播放器
查看>>
dp cf 20190615
查看>>
1 线性空间
查看>>