Struts2中Action接收参数的方法主要有以下三种:
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
详细如下:
一 、Action接收请求参数
struts2内部提供三种请求参数封装机制
1) Action 本身作为model对象,通过成员setter封装(使用与成员少的)
- <form action="${pageContext.request.contextPath }/regist1.action" method="post">
- 用户名 <input type="text" name="username" /><br/>
- 密码<input type="password" name="password"/><br/>
- 年龄 <input type="text" name="age" /><br/>
- <input type="submit" value="注册" />
- </form>
- public class RegistAction1 extends ActionSupport {
- 提交的有什么参数就设置什么字段,并写好setter方法
- private String username;
- private String password;
- private int age;
- public void setUsername(String username) {
- this.username = username;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
注:通过以上特性就能清楚,struts2的action是多例的,每个用户有每个用户的参数,每个参数封装到一 组javabean中,也就是说每次请求都会创建 struts2的Action 对象。
2)创建独立model对象,页面通过ognl表达式封装
- <form action="${pageContext.request.contextPath }/regist2.action" method="post">
- 用户名 <input type="text" name="user.username" /><br/>
- 密码<input type="password" name="user.password"/><br/>
- 年龄 <input type="text" name="user.age" /><br/>
- <input type="submit" value="注册" />
- </form>
- * 页面中使用ognl写法 name="user.username" 底层就会执行 Action的setUser() --- > setUsername();
- 在action中的写法
- public class RegistAction2 extends ActionSupport {
- private User user;持有对象
- public void setUser(User user) {
- this.user = user;
- }
- // 必须提供get方法 ----- 如果不提供只能封装一个属性,下次再封装第二个属性的时候又是一个新的user
- public User getUser() {
- return this.user;
- }
- }
- 单独创建一个user的domain
- public class User {
- private String username;
- private String password;
- private int age;
- ...
- }
3)使用ModelDriven接口,对请求数据进行封装
页面可以直接写属性名称
- <form action="${pageContext.request.contextPath }/regist3.action" method="post">
- 用户名 <input type="text" name="username" /><br/>
- 密码<input type="password" name="password"/><br/>
- 年龄 <input type="text" name="age" /><br/>
- <input type="submit" value="注册" />
- </form>
- public class RegistAction3 extends ActionSupport implements ModelDriven<User> {
- private User user = new User(); // 必须手动new,不然就出现空指针异常
- @Override
- public User getModel() {
- return user;
- }
- }
- 单独创建一个user的domain
- public class User {
- private String username;
- private String password;
- private int age;
- }
原理:发起请求后, struts2 会调用 getModel().setUsername()、 getModel().setPassword()因此必须手动 对model进行初始化
结论:三种参数封装方式,在开发中主要使用第三种
第一种只适用于请求参数非常少的情况的封装,第二种更加灵活,支持一个表单数据封装到不同model对象,第三种封装方式,只能支持一个model对象。
二、 向集合元素属性中封装数据 (封装参数第二种写法,ognl 灵活写法)
Collection(List、Set) 、 Map
- 1、 Collection 接收
- <form>
- 第一个员工 姓名 <input type="text" name="employees[0].name" /><br/>
- 第一个员工工资 <input type="text" name="employees[0].salary" /><br/>
- 第二个员工 姓名 <input type="text" name="employees[1].name" /><br/>
- 第二个员工工资 <input type="text" name="employees[1].salary" /><br/>
- <input type="submit" value="提交" />
- </form>
- public class EmployeeAction extends ActionSupport {
- // 接收多个 Employee信息,定义集合
- private Collection<Employee> employees;
- 提供set、get方法
- public Collection<Employee> getEmployees() {
- return employees;
- }
- public void setEmployees(Collection<Employee> employees) {
- this.employees = employees;
- }
- }
- 2、 Map 接收
- <form action="${pageContext.request.contextPath }/employee2.action" method="post">
- 第一个员工 姓名 <input type="text" name="employees['first'].name" /><br/>
- 第一个员工工资 <input type="text" name="employees['first'].salary" /><br/>
- 第二个员工 姓名 <input type="text" name="employees['second'].name" /><br/>
- 第二个员工工资 <input type="text" name="employees['second'].salary" /><br/>
- <input type="submit" value="提交" />
- </form>
- public class EmployeeAction2 extends ActionSupport {
- private Map<String, Employee> employees;
- public Map<String, Employee> getEmployees() {
- return employees;
- }
- public void setEmployees(Map<String, Employee> employees) {
- this.employees = employees;
- }
- }
Struts2内建类型转换器
对于大部分常用类型,开发者根本无需创建自己的转换器,Struts2内置了常见数据类型多种转换器
• boolean 和 Boolean
• char和 Character
• int 和 Integer
• long 和 Long
• float 和 Float
• double 和 Double
• Date 可以接收 yyyy-MM-dd格式字符串
• 数组 可以将多个同名参数,转换到数组中
• 集合 支持将数据保存到 List或者 Map 集合
客户端请求过来的数据都是字符串,struts2可以判断你的model中相对于的字段是什么类型的,再帮你将字符串转换成什么类型的。但是有时我们的需求类型并不止这些,因此这时候就要自定义转换器了。
内建类型无法转换时就会抛出这样的异常:java.lang.NoSuchMethodException:
Struts2 类型转换器实际上都是基于OGNL实现的,在OGNL项目中,有一个TypeConverter接口,自定 义类型转换器必须实现ongl.TypeConverter
备注:TypeConverter接口提供convertValue方法,此方法要传入6个参数,DefaultTypeConverter实现了 TypeConverter接口,覆盖了convertValue方法,需要传入3个参数,在struts2内部提供 StrutsTypeConverter 继承DefaultTypeConverter,将 convertValue 拆分为两个方法:
convertFromString(java.util.Mapcontext, java.lang.String[] values, java.lang.Class toClass)
convertToString(java.util.Map context,java.lang.Object o)
自定义类型转换器,继承 DefaultTypeConverter ,覆盖 convertValue
在convertValue方法中有两层含义,第一种 String到目标类型,第二种目标类型到 String
- 1、 自定义类型转换器
- 例:public class DateConverter extends DefaultTypeConverter {
- @Override public Object convertValue(Map context, Object value, Class toType) {
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
- try {
- if(toType == Date.class){//当字符串向Date类型转换时
- String[] params = (String[]) value;// Request.getParameterValues()
- return dateFormat.parse(params[0]);
- }else if(toType == String.class){//当Date转换成字符串时
- Date date = (Date) value;
- return dateFormat.format(date);
- }
- } catch (ParseException e) {}
- return null;
- }
- }
2、 在struts2 框架中注册类型转换器
第一种 局部类型转换器,只针对当前Action有效
在Action类所在的包下放置ActionClassName-conversion.properties文件
属性名称=类型转换器的全类名
第二种 全局类型转换器,对所有Action都有效
在src下放置xwork-conversion.properties文件
待转换的类型=类型转换器的全类名
3、 在类型转换过程中发生异常,自动跳转到 input 结果页面
<interceptorname="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>负责当发生类型转换错误时,将转换错误信息 保存到 fielderror 中
在jsp中 通过struts2 提供标签 <s:fielderror /> 查看类型转换错误信息
在查看之前需要导入标签库<%@tagliburi="/struts-tags" prefix="s" %>
<s:fielderror/>
自定义错误信息?? 需要国际化信息文件
在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 :invalid.fieldvalue.属性名= 错误信息
Struts2中Action接收参数的方法主要有以下三种:的更多相关文章
- Struts2中Action接收参数的方法
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt112 Struts2中Action接收参数的方法主要有以下三种: 1.使用A ...
- Struts2中Action接收参数
Struts2中Action接收参数的方法主要有以下三种: Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数: a.定义:在Action类中定义属 ...
- Struts2中Action接收参数的四种形式
1.Struts2的Action接收参数的三种形式. a. 使用Action的属性接收(直接在action中利用get方法来接收参数): login.js ...
- struts2属性Struts2中属性接收参数中文问题和简单数据验证
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 一:如果表单提交数据中有中文时,尽量应用post方式. 需要在Struts. ...
- Struts2中action接收中文参数为乱码解决方法
老实说,中文乱码问题是每个程序员会经常遇到的问题,而且也是一个很头疼的问题.网上很多关于解决中文乱码的帖子,看几个之后你会发现大都是一样的.但是我们照着做,却还是无法解决乱码问题.我也是看了好多帖子, ...
- Struts2中Action自己主动接收參数
Struts2中Action接收參数的方法主要有下面三种: 1.使用Action的属性接收參数:(通过属性驱动式) a.定义:在Action类中定义属性,创建get和set方法. b. ...
- Struts2学习---基本配置,action,动态方法调用,action接收参数
首先我们先来直接配置,然后再来讲原理: 第一步:jar包的引入: 我们可以到struts2的官网上下载: http://struts.apache.org/download.cgi#struts251 ...
- struts2 Action 接收参数的三种方法
刚学Struts2 时 大家可能遇到过很多问题,这里我讲一下Action 接收参数的三种方法,我曾经在这上面摔过一回.所以要警醒一下自己..... 第一种:Action里声明属性,样例:account ...
- Struts2之Action接收请求参数和拦截器
技术分析之在Struts2框架中使用Servlet的API 1. 在Action类中也可以获取到Servlet一些常用的API * 需求:提供JSP的表单页面的数据,在Ac ...
随机推荐
- class java.awt.HeadlessException : No X11 DISPLAY variable was set, but this program performed an operation which requires it.
今天上午打印回单功能发布到测试环境,报了: class java.awt.HeadlessException : No X11 DISPLAY variable was set, but this p ...
- Java实现矩阵计算器【代码】
其实这个程序最开始是大二下学期Java的一次平时作业,当时只要求产生几个随机矩阵并对这些矩阵进行计算. 所以当时没去实现现在这么丰富而且实用的功能.不过当时倒是挺想去做的,无奈有些不知道怎么去实现. ...
- 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...
- Sql Server Configuration Manager 网络配置为空,没有实例
新用户一天内不准提问...Sql Server Configuration Manager 网络配置为空,没有实例无法设置ip和端口进行连接..
- c语言贪吃蛇详解5.GameOver功能与显示成绩
c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...
- AI时代:推荐引擎正在塑造人类
We shape our tools and afterwards our tools shape us. ------Marshall McLuhan 麦克卢汉说:"我们塑造了工具,反过来 ...
- SQL 语句优化方法
尽量避免非操作符的使用,在索引上使用 NOT,<> 等操作符,数据库管理系统是不会使用索引的,可以将查询语句转化为可以使用索引的查询. 避免对查询的列的操作,任何对列的操作都可能导致全表扫 ...
- ReSharper 全教程
Resharper系列 更多关于Resharper的介绍 参考我之前的文章: Resharper 详细教程 提升ReSharper和Visual Studio的性能 Visual Studio中使用R ...
- 七牛php-sdk使用-在线打包
如果需要将空间中的多个文件,打包成一个压缩文件,该怎么做,不需要自己本地打包好再上传,七牛已经为我们提供了这项服务. 命令:mkzip/2/url/xx/alias/xxx; 不仅可以将文件打包,还可 ...
- Generator函数语法解析
转载请注明出处: Generator函数语法解析 Generator函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同.以下会介绍一下Generator函数. 写下这篇文章的目的其实很简单 ...