-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
struts2中类型转换
1.struts2获取前端表单数据的方式
(1)要求请求处理的action类中要声明与前端表单信息一致的属性,并且给出set/get方法;
(2)当请求到达action时,struts2(有一个处理此操作的拦截器)会通过反射的机制将前台提交过来的表单信息与action类相应的属性进行封装;
(3)由于前台提交上来的信息都是String类型的,struts2可以根据action类中声明的类型的将String进行相应的转换,但不能转换所有类型,就这要求开发人员自定义类型转器,用于处理相应的类型转化;
2.自定义类型转化器
(1)实现TyeConverter接口,或继承此接口的实现类,
(2)在实际开发中一般通过继承DefaultTypeConverter,重写相应的方法convertValue(Object object,Class class1)自定义转化的过程来实现类型转换的,
参数Object:其实是前台传过来的字符串(要转换的值);
参数class1:是需要转换得到的类型(与action中定义的属性一致);
(3)自定义好的转换器需要注册,配置后再能使用,框架提供两种方式:
注册方式一(基于字段|局部的):
在action的同级目录下新建一个配置文件xxxAction-conversion.properties(名称为规范名:action类名+conversion.properties)
文件内配置:action属性=转换器全类名
注册方式二(基于类|全局的):
在src目录下创建xwork-conversion.properties(固定写法,底层已经写死),文件中配置:action属性=转换器全类名
需要注意:自定义的类型转换器中,如果不手动抛出异常,框架只捕获异常,不抛出异常,所以框架就会认为类型转换成功。因此此处的异常处理需要需要手动抛出(throws new ……)
(4)类型转换异常处理:
当转换器抛出异常时,后台可以打印出异常的信息,但前台需要加上一个标签才能显示相应的异常信息<s:fielderrorfieldName="【此处写可能出现错误的属性名】"/>(使用此标签需要先导入标签:<%@ tagliburi="/struts-tags" prefix="s"%>);
(4.1)按以上操作得到的异常提示信息英文的,是来自框架底层提供的一个配置文件(xwork-messages.properties)的配置(如下),开发人员可以根据需要自定义资源文件(xxx.properties),将其复盖,达到显示中文提示的效果;
***************************************************************
xwork.error.action.execution=Errorduring Action invocation
xwork.exception.missing-action=Thereis no Action mapped for action name {0}.
xwork.exception.missing-package-action=Thereis no Action mapped for namespace {0} and action name {1}.
xwork.default.invalid.fieldvalue=Invalidfield value for field "{0}".
***************************************************************
(4.2)自定义资源文件方式为:在与action同级目录下新建一个资源文件,名称自定义,将xwork.default.invalid.fieldvalue=Invalidfield value for field "{0}".
=号后面的信息改为中文提示,但自定义的资源文件框架是不能自动识别的,需要在struts-xml中将引入(通过常量的形式配置),具体如下:
***************************************************************
<constant name="struts.custom.i18n.resources" value="【资源文件所在目录:格式如:xx.yy.xx(注意文件后缀名不用带上)】"></constant>
***************************************************************
(4.3)以上错误信息配置不能根据错误字段提示(即根据属性提示),要达到这个效果需要在异常提示中的配置改为:invalid.fieldvalue.字段(action中的属性)=提示信息。
3.action类中含javabean封装页面数据的方法:
在action类增加一个javabean字段(如:User user),要有set/get方法;
页面表单中的name值应按”javabean.属性名” 写,如user.name;框架中相应的拦截器会将数据自动封闭到javabean中,后台通过javabean的实例可以得到封装的数据;
4.类型转换品与集合配合使用
在action类增加一个Collection字段(如:Collection<Edu>edus),页面表单中的name属性值应按”字段[?].属性名”写,如edus[0].name;框架中相应的拦截器会将数据自动封闭到Collection中,后台通过Collection的实例可以得到封装的数据;
5.ServletActionContext工具类
ServletActionContext作为Servlet与Action的桥梁,它对原生Servlet相关的类进行了封装(Session需要通过这种式得到:ServletActionContext.getContext().getSession();),可以通过这个类的方法得到Servlet相关的类。
获取原生Servlet相关的类方法二:让Action类实现ServletRequestAware,ServletResponseAware, ServletContextAware, SessionAware四个接口(需要声明Servlet相关的局部变量),重写四个接口对应的四个方法即可。
-----------------------------------------------------------2015年8月6日笔记-----------------------------------------------------------------------