黑马程序员——struts2学习笔记四(类型转换)
2015-08-06 22:10
555 查看
[b]-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
[/b]
(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日笔记-----------------------------------------------------------------------
[/b]
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日笔记-----------------------------------------------------------------------
相关文章推荐
- 关于Java单例
- Puzzler: Nested computeIfAbsent -Java 8
- JAVA技术交流群
- Struts2知多少(2) Struts2 是什么
- Java机试题目_怎样截取字符串
- 关于eclipse生成web工程的时候没有web.xml文件的解决方案
- Java汉字转换为拼音
- Spring的Ioc(控制反转)和DI(依赖注入)
- 理解Java的IO流 2015年8月6日 21:30:38
- Java实现算法之--二分查找法
- Win7环境下用MyEclipse搭建Hbase开发环境
- Java实现算法之--求子数组和的最大值
- 用dom4j解析xml 报java.lang.NoClassDefFoundError:org/jaxen/JaxenException
- 【Java】Java处理double相加的结果异常
- JDK动态代理机制
- Spring注解详解
- myeclipse 提示No Default Proposals 或 no completions available 的解决方法
- 解决Opentaps/OFBiz在Eclipse启动时"Could not load VFS configuration"的问题
- 解决ofbiz在myeclipse中调试运行时报错:Can't find bundle for base name cache
- java设计模式(9) - 适配器模式