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封装(使用与成员少的)

  1. <form action="${pageContext.request.contextPath }/regist1.action" method="post">
  2. 用户名 <input type="text" name="username" /><br/>
  3. 密码<input type="password" name="password"/><br/>
  4. 年龄 <input type="text" name="age" /><br/>
  5. <input type="submit" value="注册" />
  6. </form>
  7. public class RegistAction1 extends ActionSupport {
  8. 提交的有什么参数就设置什么字段,并写好setter方法
  9. private String username;
  10. private String password;
  11. private int age;
  12. public void setUsername(String username) {
  13. this.username = username;
  14. }
  15. public void setPassword(String password) {
  16. this.password = password;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. }

注:通过以上特性就能清楚,struts2的action是多例的,每个用户有每个用户的参数,每个参数封装到一        组javabean中,也就是说每次请求都会创建 struts2的Action 对象。

         2)创建独立model对象,页面通过ognl表达式封装

  1. <form action="${pageContext.request.contextPath }/regist2.action" method="post">
  2. 用户名 <input type="text" name="user.username" /><br/>
  3. 密码<input type="password" name="user.password"/><br/>
  4. 年龄 <input type="text" name="user.age" /><br/>
  5. <input type="submit" value="注册" />
  6. </form>
  7. * 页面中使用ognl写法 name="user.username"  底层就会执行 Action的setUser() --- > setUsername();
  8. 在action中的写法
  9. public class RegistAction2 extends ActionSupport {
  10. private User user;持有对象
  11. public void setUser(User user) {
  12. this.user = user;
  13. }
  14. // 必须提供get方法 ----- 如果不提供只能封装一个属性,下次再封装第二个属性的时候又是一个新的user
  15. public User getUser() {
  16. return this.user;
  17. }
  18. }
  19. 单独创建一个user的domain
  20. public class User {
  21. private String username;
  22. private String password;
  23. private int age;
  24. ...
  25. }

         3)使用ModelDriven接口,对请求数据进行封装

页面可以直接写属性名称

  1. <form action="${pageContext.request.contextPath }/regist3.action" method="post">
  2. 用户名 <input type="text" name="username" /><br/>
  3. 密码<input type="password" name="password"/><br/>
  4. 年龄 <input type="text" name="age" /><br/>
  5. <input type="submit" value="注册" />
  6. </form>
  7. public class RegistAction3 extends ActionSupport  implements ModelDriven<User> {
  8. private User user = new User(); // 必须手动new,不然就出现空指针异常
  9. @Override
  10. public User getModel() {
  11. return user;
  12. }
  13. }
  14. 单独创建一个user的domain
  15. public class User {
  16. private String username;
  17. private String password;
  18. private int age;
  19. }

原理:发起请求后, struts2 会调用 getModel().setUsername()、 getModel().setPassword()因此必须手动 对model进行初始化

结论:三种参数封装方式,在开发中主要使用第三种

第一种只适用于请求参数非常少的情况的封装,第二种更加灵活,支持一个表单数据封装到不同model对象,第三种封装方式,只能支持一个model对象。

二、 向集合元素属性中封装数据 (封装参数第二种写法,ognl 灵活写法)

Collection(List、Set) 、 Map

  1. 1、 Collection 接收
  2. <form>
  3. 第一个员工 姓名 <input type="text" name="employees[0].name" /><br/>
  4. 第一个员工工资 <input type="text" name="employees[0].salary" /><br/>
  5. 第二个员工 姓名 <input type="text" name="employees[1].name" /><br/>
  6. 第二个员工工资 <input type="text" name="employees[1].salary" /><br/>
  7. <input type="submit" value="提交" />
  8. </form>
  9. public class EmployeeAction extends ActionSupport {
  10. // 接收多个 Employee信息,定义集合
  11. private Collection<Employee> employees;
  12. 提供set、get方法
  13. public Collection<Employee> getEmployees() {
  14. return employees;
  15. }
  16. public void setEmployees(Collection<Employee> employees) {
  17. this.employees = employees;
  18. }
  19. }
  20. 2、 Map 接收
  21. <form action="${pageContext.request.contextPath }/employee2.action" method="post">
  22. 第一个员工 姓名 <input type="text" name="employees['first'].name" /><br/>
  23. 第一个员工工资 <input type="text" name="employees['first'].salary" /><br/>
  24. 第二个员工 姓名 <input type="text" name="employees['second'].name" /><br/>
  25. 第二个员工工资 <input type="text" name="employees['second'].salary" /><br/>
  26. <input type="submit" value="提交" />
  27. </form>
  28. public class EmployeeAction2 extends ActionSupport {
  29. private Map<String, Employee> employees;
  30. public Map<String, Employee> getEmployees() {
  31. return employees;
  32. }
  33. public void setEmployees(Map<String, Employee> employees) {
  34. this.employees = employees;
  35. }
  36. }

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. 1、 自定义类型转换器
  2. 例:public class DateConverter extends DefaultTypeConverter {
  3. @Override  public Object convertValue(Map context, Object value, Class toType) {
  4. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
  5. try {
  6. if(toType == Date.class){//当字符串向Date类型转换时
  7. String[] params = (String[]) value;// Request.getParameterValues()
  8. return dateFormat.parse(params[0]);
  9. }else if(toType == String.class){//当Date转换成字符串时
  10. Date date = (Date) value;
  11. return dateFormat.format(date);
  12. }
  13. } catch (ParseException e) {}
  14. return null;
  15. }
  16. }

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接收参数的方法主要有以下三种:的更多相关文章

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

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt112 Struts2中Action接收参数的方法主要有以下三种: 1.使用A ...

  2. Struts2中Action接收参数

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

  3. Struts2中Action接收参数的四种形式

    1.Struts2的Action接收参数的三种形式.      a. 使用Action的属性接收(直接在action中利用get方法来接收参数):                   login.js ...

  4. struts2属性Struts2中属性接收参数中文问题和简单数据验证

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 一:如果表单提交数据中有中文时,尽量应用post方式. 需要在Struts. ...

  5. Struts2中action接收中文参数为乱码解决方法

    老实说,中文乱码问题是每个程序员会经常遇到的问题,而且也是一个很头疼的问题.网上很多关于解决中文乱码的帖子,看几个之后你会发现大都是一样的.但是我们照着做,却还是无法解决乱码问题.我也是看了好多帖子, ...

  6. Struts2中Action自己主动接收參数

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

  7. Struts2学习---基本配置,action,动态方法调用,action接收参数

    首先我们先来直接配置,然后再来讲原理: 第一步:jar包的引入: 我们可以到struts2的官网上下载: http://struts.apache.org/download.cgi#struts251 ...

  8. struts2 Action 接收参数的三种方法

    刚学Struts2 时 大家可能遇到过很多问题,这里我讲一下Action 接收参数的三种方法,我曾经在这上面摔过一回.所以要警醒一下自己..... 第一种:Action里声明属性,样例:account ...

  9. Struts2之Action接收请求参数和拦截器

    技术分析之在Struts2框架中使用Servlet的API        1. 在Action类中也可以获取到Servlet一些常用的API        * 需求:提供JSP的表单页面的数据,在Ac ...

随机推荐

  1. Python+selenium+eclipse+pydev自动化测试环境搭建

    一.        安装python 1.下载安装python 可访问python的官方网站:http://www.Python.prg找到下载页面下载需要的版本,可下载python2.x或者pyth ...

  2. Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例

    1.实验目的 1.学习在PC机系统中扩展简单I/O接口的方法. 2.进一步学习编制数据输出程序的设计方法. 3.学习蓝牙模块的接线方法及其工作原理. 4.学习L298N电机驱动板模块的接线方法. 5. ...

  3. MyEclipse过期后怎么破解

    方法一:写一个程序生成Subscriptioncode import java.io.*; public class MyEclipseGen { private static final Strin ...

  4. webapi框架搭建-创建项目(一)

    本文只是一些基本的vs操作,供初学者参考,有基础的请查看 创建项目(二) 创建项目(三) 前言 为了从头了解webapi的技术,创建一个为空的项目 步骤 我用的是vs2017,从文件-->新建- ...

  5. 用Vue自己造个组件轮子,以及实践背后带来的思考

    前言 首先,向大家说声抱歉.由于之前的井底之蛙,误认为Vue.js还远没有覆盖到二三线城市的互联网小厂里.现在我错了,从我司的前端技术选型之路便可见端倪.以太原为例,已经有不少公司陆续开始采用Vue. ...

  6. 【转】npm使用过程中的一些错误解决办法及npm常用命令

    原文 node,npm在前端开发流程中提供了非常完善的自动化工具链,但是同样由于其复杂性导致有很多奇奇怪怪的问题.本文将记录使用过程中出现的一些问题及其解决方法备案. 国内由于gfw问题,导致很多国外 ...

  7. 【矩阵快速幂】bzoj1297 [SCOI2009]迷路

    1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1407  Solved: 1007[Submit][Status ...

  8. Android之Bmob移动后端云服务器

    源码下载:http://download.csdn.net/download/jjhahage/10034519 PS:一般情况下,我们在写android程序的时候,想要实现登录注册功能,可以选择自己 ...

  9. CSS属性:定位属性(图文详解)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. CSS的定位属性有三种,分别是绝对定位.相对定位.固定定位. posit ...

  10. takes 3 positional arguments but 4 were given错误

    之前写程序经常会碰到此类问题,确认发现并没有少参数.后来恍然大悟:函数为类下函数,定义时需要添加self参数. 但是!但是!为何Python给self赋值而你不必给self赋值? 创建了一个类MyCl ...