当前位置: 首页 > 编程日记 > 正文

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

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

相关文章:

关于CSS的长度单位及颜色表示

长度单位 1.q 1/4mm. 2.px 计算机语言中的像素。大多数网页制作常用图片分辨率为72&#xff0c;即每英寸像素为72,1英寸等于2.54cm。那么通过换算可以得出每厘米等于28像素。 3.em 它是描述相对于应用在当前元素的字体尺寸&#xff0c;所以它也是相对长度单位。一班浏览器字体大…

2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏

目录 一、尝试 二、Writeup 附加题 鱿鱼游戏&#xff08;来自最近一部很火的韩剧&#xff09; 题目描述&#xff1a; 小王由于操作不规范&#xff0c;误将不明U盘插入到上位机中&#xff0c;导致上位机中的某些关键文件被加密&#xff0c;但攻击者在U盘中还留下了一个可执行…

视觉惯性SLAM: VI ORB-SLAM

视觉惯性SLAM: VI ORB-SLAM这篇博客视觉惯性SLAM预备知识符号说明&#xff1a;相机投影变换矩阵IMU数据更新方程IMU数据的预积分VI ORB-SLAM各环节工作方式InitializationTrackingLocalMappingLoop ClosingFull BAIMU初始化估计bgb_{g}bg​估计尺度sss和重力向量gWg_{W}gW​&am…

AEC、AGC、ANS在视音频会议中的作用?

AGC是自动增益补偿功能&#xff08;Automatic Gain Control&#xff09;&#xff0c;AGC可以自动调麦克风的收音量&#xff0c;使与会者收到一定的音量水平&#xff0c;不会因发言者与麦克风的距离改变时&#xff0c;声音有忽大忽小声的缺点。ANS是背景噪音抑制功能&#xff08…

Java中的拆箱与装箱

我们先来了解一下拆箱与装箱的概念&#xff1a; 装箱&#xff1a;将基本数据类型转换为包装类&#xff1b; 拆箱&#xff1a;将包装类转换为基本数据类型 我们来看两串代码&#xff1a; Integer b1 127;Integer b2 127;System.out.println(b1b2);//trueInteger b3 128;Inte…

WannaCry的UWP版,哈哈哈

转载于:https://www.cnblogs.com/R00R/p/6916731.html

2021年中国工业互联网安全大赛核能行业赛道writeup之数据库登录

附件题&#xff1a;数据库登录&#xff08;一道MISC、流量分析类型题目&#xff09; 题目描述&#xff1a; 具体描述已经忘记o(╯□╰)o 大概意思就是分析附件里的.pcapng包&#xff0c;找到flag。流量涉及到 MySQL 数据库了。 附件下载&#xff1a; https://download.csdn.n…

学生管理系统(用maven来导入jar包)

不废话&#xff0c;直接上 先看一下项目列表&#xff1a; 首先创建一个maven工程&#xff0c;然后导入相应的jar包&#xff0c;请参考&#xff1a;使用maven导入jar包 接着在Source Folder创建具体的项目&#xff1a; Main类&#xff08;客户端&#xff09; package com.z…

视觉惯性SLAM:VINS-Mono

视觉惯性SLAM&#xff1a;VINS-Mono这篇博客一些符号说明IV 测量数据的预处理A.视觉处理前端B.IMU预积分V. 初始化A.Vision-Only SfM in Sliding WindowB.Visual-Inertial AlignmentVI.TIGHTLY COUPLED MONOCULAR VIOA.公式介绍B.IMU误差C.视觉误差D.边缘化E.位姿优化F.以IMU采…

mysql 0x80004005 unable to connect to any of the specified mysql hosts

语言&#xff1a;c# 问题&#xff1a;偶尔会出现连不上mysql 报标题的这个错误。 解决方法&#xff1a;把server localhost 改为 127.0.0.1 或者静态IP &#xff0c;按着改暂时没出现了&#xff0c;继续观望&#xff01; 转载于:https://www.cnblogs.com/wdw31210/p/9857514…

iOS开发-自己定义重用机制给ScrollerView加入子视图

iOS开发-自己定义重用机制给ScrollerView加入子视图 事实上这个问题我非常早就想过&#xff0c;仅仅是没有通过去写程序实现&#xff0c;昨天有人提起&#xff0c;我就巧了一下 不知道大家打印郭tableview&#xff1a;cellforrow中cell初始的次数&#xff0c;也就是重用池中的c…

2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码

附件题&#xff1a;Webshell密码 题目描述&#xff1a; 某次攻防演练中&#xff0c;抓到了一个webshell的流量&#xff0c;请分析出密码&#xff0c;flag形式&#xff1a;flag{密码} 附件下载&#xff1a; https://download.csdn.net/download/qpeity/33675356https://downlo…

关于python3与python2同时存在情况下导入pyqt失败解决记录

最近感觉tkinter功能还是比较不适合新手做出高大上的界面&#xff0c;故开始使用pyqt&#xff0c;通过pip安装好了之后&#xff0c;利用qt设计师设计好界面之后&#xff0c;cmd运行之&#xff0c;报错提示没有找到pyqt5模块&#xff0c;IDE运行能正常加载 查找资料后发现&#…

ORBSLAM-Altas:多地图SLAM

ORBSLAM-Atlas&#xff1a;多地图SLAM这篇博客ORBSLAM-Altas这个系统系统方法两类子地图新地图的构建相机位姿的可观测性子地图融合系统线程结尾这篇博客 最近ORB-SLAM3横空出世&#xff0c;马上跑去GitHub膜拜。然后在项目的相关工作中看到了ORB-SLAM3使用了一个多地图方法。这…

Android驱动学习-内部机制_回顾binder框架关键点

内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie client使用服务前要先getService&#xff1a;会在驱动程序里对该服务构造一个binder_ref, binder_ref含有desc, node成员…

数据库--事务

我们知道数据库中的SQL语句分为DDL(数据定义语言)、DQL(数据查询语言)、DML(数据操纵语言)、DCL(数据控制语言)&#xff0c;详情请看SQL语句 当数据库的表中数据执行完添加、删除、和修改等数据操纵语言&#xff08;DML&#xff09;后&#xff0c;需要执行commit(提交)数据控制…

2021年中国工业互联网安全大赛核能行业赛道writeup之传统流量取证

附件题&#xff1a;传统流量取证 题目描述&#xff1a; 在某次攻防演练中&#xff0c;小王发现流量探针平台突然告警&#xff0c;小王第一时间下载了告警流量包&#xff0c;并进行分析&#xff1a;发现攻击队攻击在攻入内网后&#xff0c;利用了一个内网OA的一个漏洞&#xff…

ORB-SLAM3 论文笔记

ORB-SLAM3 论文笔记这篇博客ORB-SLAM3系统相机模型的抽象(Camera Model)重定位的问题图片矫正的问题视觉惯性SLAM的工作原理相关公式IMU初始化跟踪和建图系统对跟踪丢失的应对多地图的闭环检测和地图融合位置识别视觉地图融合方法视觉惯性地图的融合方法单个地图中的闭环融合结…

为什么需要 外键 呢?

生活现象&#xff1a; 不知你们是否遇到过这样的现象&#xff0c;就是你辛辛苦苦花了几十块钱注册一个会员&#xff0c;结果家里的七大姑&#xff0c;八大姨都要拿去用&#xff0c;而且完全可以用。还有就是一个淘宝账号里却可以添加好多个收获地址(里面包括收货人的姓名&#…

JavaScript闭包函数箭头函数调用与执行

一、标准的闭包函数 //一、标准的闭包函数 function A() {var i0;i;console.log(i : i);return function b() {return function c() {return i}} }var a A(); // 初始化A&#xff0c;执行A内的非function语句 ‘ i0; i‘&#xff0c;输出 I : 1 console.log(a()); // 执行fu…

jlink api sdk c# 离线数获取 标定

jlink 如何 离开 keil、IAR 监控变量呢&#xff1f; 目前 jlink的 api 可以做到&#xff0c;自己可以用C# 做一个 上位机&#xff0c;监控RAM里面的变量。而不用打开keil 调试。还可以 刷写 flash&#xff0c;可以用在产品量产的刷写上。SEGGER 的 jlink sdk并不是免费的&…

2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析

目录 一、USB协议 二、键盘流量 三、鼠标流量 四、writeup 附件题&#xff1a;usb流量分析 题目描述&#xff1a; 具体描述忘记了o(╯□╰)o 大概意思是有个U盘插到电脑上&#xff0c;然后经过一些操作导致该电脑重启了。找到这个过程中的flag。 附件下载&#xff1a; 20…

BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)

BOS项目 第2天 今天内容安排&#xff1a; 1、根据提供的pdm文件生成sql 2、持久层和表现层设计---BaseDao、BaseAction 3、实现用户登录功能 4、jQuery EasyUI 消息提示控件 5、jQuery EasyUI menubutton菜单按钮 6、自定义struts2拦截器&#xff0c;实现用户未登录自动跳转到…

服务器 主动 推送 客户端浏览器 消息***

前言 通常情况下&#xff0c;无论是web浏览器还是移动app&#xff0c;我们与服务器之间的交互都是主动的&#xff0c;客户端向服务器端发出请求&#xff0c;然后服务器端返回数据给客户端&#xff0c;客户端浏览器再将信息呈现&#xff0c;客户端与服务端对应的模式是: 客户端请…

数据库表(字段类型、约束、截断表、修改表字段、重命名表)

字段类型&#xff1a; 在这里只列举一些常用的字段类型&#xff1a; 整数类型:int(Integer):普通大小的整数 小数类型&#xff1a; float(m,d)&#xff1a;单精度浮点数&#xff0c;m表示数字长度&#xff0c;d表示小数位数&#xff0c;例如float(5,2)最大值999.99double(m,d…

(转载)动态SLAM系统:VDO-SLAM!

动态SLAM系统&#xff1a;VDO-SLAM&#xff01;这篇博客是转载 计算机视觉life 公众号中的文章。这篇文章是对VDO-SLAM论文的全文翻译&#xff0c;是 &#xff01;&#xff01;真人工翻译&#xff01;&#xff01;不是机器翻译&#xff0c;我看了之后觉得挺好&#xff0c;所以分…

2021年中国工业互联网安全大赛核能行业赛道writeup之入门的黑客

附件题&#xff1a;入门的黑客 题目描述&#xff1a; 在某次工控攻防演练中&#xff0c;防守方使用蜜罐捕捉到了某黑客在入侵时留下的恶意程序样本&#xff0c;现在要对该黑客进行画像&#xff0c;需要从该恶意程序中分析出反连时的IP和端口信息&#xff0c;看看聪明的你能否能…

一种视觉惯性+激光传感器的SLAM系统

一种视觉惯性激光传感器的SLAM系统这篇博客论文摘要一些假设和标注系统总览VI 里程计扫描匹配&#xff08;scan matching&#xff09;优化提高系统鲁棒性的措施闭环检测和临近检测全局位姿图优化总结这篇博客 这篇论文“Robust High Accuracy Visual-Inertial-Laser SLAM Syste…

抽象类和接口的联系与区别

抽象类和接口联系与区别 关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制&#xff0c;正是由于这两种机制的存在&#xff0c;才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具…

P1132 数字生成游戏

题目描述 小明完成了这样一个数字生成游戏&#xff0c;对于一个不包含00的数字ss来说&#xff0c;有以下33种生成新的数的规则&#xff1a; 将ss的任意两位对换生成新的数字&#xff0c;例如143143可以生成314,413,134314,413,134&#xff1b;将ss的任意一位删除生成新的数字&a…