struts中的请求数据自动封装

  Struts 2框架会将表单的参数以同名的方式设置给对应Action的属性中。该工作主要是由Parameters拦截器做的。而该拦截器中已经自动的实现了String到基本数据类型之间的转换工作。在struts中,默认使用拦截器

<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

进行请求数据自动封装,它会JSP中提交的数据(基本数据类型、String、和日期)进行自动转换。

  有时候, 需要将表单字段映射到多个对象的不同属性上,form 标签可以被映射到Action中一个属性的属性。Struts 2首先通过反射技术调用address的默认构造器创建address对象,然后再通过反射技术调用address中与请求参数同名的属性的setter方法来获取请求参数值。

1.两种请求数据

  如果Action中属性只是基本数据类型,需要给出set()方法,get()方法可以不给。表单的数据名需要和Action类中的属性名一致,struts会完成相应的自动转换,Date对象的默认格式为yyyy-MM-dd。

  如果Action中属性为对象类型,必须要给出get()和set()方法,表单的数据名为对象.属性的方式。

<form action="${pageContext.request.contextPath}/user_register.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="text" name="user.birth"><br>
    <input type="submit" value="提交"><br>
</form>

2.struts中自定义转换器

  如果现有的转换器不能满足需要,可以自定义转换器。struts中的转换器有两种类型:局部类型转换器、全局类型转换器。自定义转换器的过程为:

  • 继承StrutsTypeConverter,重写Convert中的抽象方法;
public class MyConverter extends StrutsTypeConverter{
    //需要支持的格式为:yyyy-mm-dd、yyyymmdd、yyyy年mm月dd日
    //预定义三种格式
    SimpleDateFormat[] formats = {
            new SimpleDateFormat("yyyy-mm-dd"),
            new SimpleDateFormat("yyyymmdd"),
            new SimpleDateFormat("yyyy年mm月dd日")

    };
    /**
     *把string转换为指定的类型
     * @param map 当前上下文环境
     * @param strings jsp宝典提交的字符串的值
     * @param aClass 要转换为的目标类型
     */
    @Override
    public Object convertFromString(Map map, String[] strings, Class aClass) {
        System.out.println("into conversion");
            //内容不能为空
            if(strings == null || strings.length == 0)
                return null;
            //类型必须为Date
            if(Date.class != aClass)
                return null;

        for(int i =0;i<formats.length;i++){
            try {
                return formats[i].parse(strings[0]);
            } catch (ParseException e) {
//                throw new RuntimeException("第i次转换失败",e);
                continue;
            }
        }
        return null;
    }

    @Override
    public String convertToString(Map map, Object o) {
        return null;
    }
}
  • 通知struts使用该转换器;

  如果作为局部类型转换器,在与需要转换的Action类目录中新建ActionClassName-conversion.properties文件,文件中写:需要转换的字段名=自定义转换器类的全限定名,例如:

birthday=cn.itcast.convertor.DateTypeConvertor

  如果作为全局类型转换器,需要在项目src目录下新建xwork-conversion.properties文件,在文件中写:

需要转换的类类型=转换器的全限定名,例如:

java.util.Date= cn.itcast.converter.DateConverter
时间: 2024-07-31 02:02:54

struts中的请求数据自动封装的相关文章

Struts2请求数据自动封装和数据类型转换

方式1:jsp表单数据填充到action中的属性: 方式2:jsp表单数据填充到action的对象的属性: 方式1: 第一步:引包,省去 第二步:配置struts2的过滤器 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmln

Struts2学习(二)——数据自动封装和自动传递

第一点:method属性学习 可以在一个action(MethodAction)里,定义多个方法method1().method2()(类比execute方法)返回String字符串. 再在package中写入与method对应的action请求url,在每个action标签里的result标签里name对应为返回的字符串作为接收, type属性默认为dispatcher,再返回JSP页面. 第二点:数据自动封装和自动传递 表单提交的属性值(name值)要与action里定义的属性(privat

jQuery 中 ajax 请求数据应用的一个小demo

举一个jquery中ajax的应用小 demo 便于以后的更多项目拓展 ,这里要注意的是保存的文件名和文件图片路径问题 ... ajax01.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title> ajax小例子 </title> </head> <body> <!--

接口测试中读取excel中的请求数据含有中文问题,UnicodeEncodeError: &#39;latin-1&#39; codec can&#39;t encode character &#39;\u5c0f&#39; in position

错误信息:UnicodeEncodeError: 'latin-1' codec can't encode character '\u5c0f' in position 31: Body ('小') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8的错误 原因:从excel中读取你的接口请求数据时带有中文时在发送求情时会出现上述错误.只需要将请求数据转化为bytes类型即可

android中网络请求数据,解析并添加到Listview中

今天我实现了网络请求数据,解析并将数据添加到Listview中.上个星期我有提到说要实现点击Listview中item实现不同的功能,还是没头绪.如有幸被阅读,希望指教一下.我用的是hTTPClient的post方法请求的数据.在实现请求之前,还有一个主activity跳转.代码如下: 请求activity代码: public class MachineInterface extends Activity { private ListView machineType; private Array

python web开发-flask中访问请求数据request

Request对象在web应用的开发中是一个非常重要的对象,主要用来获取用户发来的请求数据. 常用属性参考:http://docs.jinkan.org/docs/flask/api.html#flask.request 下面我们以一个表单提交的例子来说明一些常用request属性的使用. 1. 创建一个表单的template 在templates文件夹下面创建form.html模板文件,输入下面的代码 {% extends "base.html" %} {% import "

Java中导出Excel数据,封装Bean

在Java中封装导出Excel数据的总体思路为: 1.导出,根据查询得到的数据(一般我们页面上用的是查询条件带分页的),我们需要把查询条件带到后台重新查询,并且是查询全部数据,不带分页 2.不能用ajax异步提交.应该用location.href=""的方式,把处理的流交给浏览器来处理,JS无法处理流计算. 3.封装统一的Bean实体,主要输入导出的列名,excel名,数据集即可导出. 用到的Maven地址: <!-- poi --> <dependency>

thinkphp在app接口开发过程中的通讯数据的封装

在为app开发接口过程中,我们必不可少的要为app前端工程师们提供返回的数据,如何灵活快速又易懂的返回他们需要的数据是非常关键的. 其实thinkphp已经把很多我们要用到的都写出来了,我们只需要稍作修改即可灵活的返回我们需要的数据. 首先,修改Thinkphp/Library/Controller.class.php  在其中增加一个函数 apiReturn(); /** * [apiReturn 用于给app提供接口使用 带有请求结果状态表示,和结果提示,默认返回json] * @param

Python接口测试-以&amp;连接拼接字典数据(get中url请求数据)

get请求的utl数据是这样的,例如:/banner/findBanner?bannerType=1&_=1556107073181 ''' 1-banner图-banner/findBanner ''' str1=parse.urlencode(data1) url1='{0}/banner/findBanner?bannerType=1&_=1556107073181'.format(yuming) headers ={'Content-Type':'application/json;