[原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.类型转换概述
1)从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串.
2)HTTP 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组. 在服务器端, 必须把 String 转换为特定的数据类型
3)在 struts2 中, 把请求参数映射到 action 属性的工作由 Parameters 拦截器负责, 它是默认的 defaultStack 拦截器中的一员. Parameters 拦截器可以自动完成字符串和基本数据类型之间转换.
2.类型转换错误
如果类型转换失败:
- 若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生一样.
- 若 Action 类实现 ValidationAware 接口:Struts 在遇到类型转换错误时将不会继续调用其 Action 方法: Struts 将检查相关 action 元素的声明是否包含着一个 name=input 的 result. 如果有, Struts 将把控制权转交给那个 result 元素; 若没有 input 结果, Struts 将抛出一个异常。
3.自定义错误覆盖
问题1:如何覆盖默认的错误消息?
1)在对应的 Action 类所在的包中新建 ActionClassName.properties 文件, ClassName 即为包含着输入字段的 Action 类的类名
2)在属性文件中添加如下键值对: invalid.fieldvalue.fieldName= 自定义内容 >> invalid.fieldvalue.age=\u9519\u8BEF\u7684\u5E74\u9F84\u683C\u5F0F
<s:form action="testConversion" >
Age<s:textfield name="age" label="Age"></s:textfield>
<s:submit></s:submit>
</s:form>
问题2: 如果是simple 主题,还会自动显示错误消息么?如果不会显示,那怎么办?
1)通过debug 标签,可知若转化出错,则在值栈的Action(实现了 ValidationAware 接口)的对象中有一个fieldErrors 属性。该属性的类型为
Map<String,List<String>> 的键值对。键 字段(属性名),值:错误消息做成的List。所以可以使用 el 或者 ognl 的方式来显示错误消息
例如: ${filedErrors.age[0]}
<s:form action="testConversion" theme="simple">
Age<s:textfield name="age" label="Age"></s:textfield>
<br><br>
${fieldErrors.age[0] }
<s:fielderror fieldName="age"></s:fielderror>
<s:submit></s:submit>
</s:form>
2)还可以使用 s:fielderror 标签来显示。可以通过fieldName 属性显示指定的字段的错误.z则消息在一个ul,li,span中。
在template.simple 下面的filederror.ftl 定义了simple主题下,s:fielderror 标签显示错误消息的格式。所以修改该配置文件即可。
在src 下新建template.simple 包,新建fielderror.ftl文件,
把原生的fielderror.ftl 中的内容复制到新建的fielderror.ftl 中。然后删除ul,li,span
4.如何自定义类型转换器
在大多数类型转换器里, 需要提供从 String 类型到非 String 类型和与此相反的转换功能。在 StrutsTypeConverter 中有两个抽象方法:
1)因为struts2不能自动的完成 字符串 到 引用类型 的转换
2)如何定义类型转换器
> 开发类型转换器:扩展StrutsTypeConverter 类
package com.jason.strut2.conversion; import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import javax.xml.crypto.Data; import org.apache.struts2.util.StrutsTypeConverter; import com.sun.jndi.url.dns.dnsURLContext; public class DateConverter extends StrutsTypeConverter { private DateFormat dateFormat; public DateConverter(){ System.out.println("DateConverter's constructor ... ");
dateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); } @Override
public Object convertFromString(Map context, String[] values, Class toClass) { System.out.println("convertFromString ... ");
if(toClass == Data.class){
if(values != null && values.length > 0){
String value = values[0];
try {
return dateFormat.parseObject(value);
} catch (ParseException e) { e.printStackTrace();
}
}
}
//若没有转换成功,则返回values
return values;
} @Override
public String convertToString(Map context, Object o) {
System.out.println("convertToString ...");
if( o instanceof Date){
Date date = (Date) o;
return dateFormat.format(date);
}
//若转换失败,则返回null
return null;
} }
DateConverter extends StrutsTypeConverter
> 配置类型转换器:
① 基于字段配置:第一次使用该转换器时创建实例
>> 字段所在的Model(Action,可能是一个javabean) 的包下,新建一个ModelClassName-conversion.properties文件
>> 在文件中输入键值对:fieldName = 类型转换器的全类名
birth=com.jason.strut2.conversion.DateConverter
② 基于类型配置: 在当前web应用被加载的时候创建实例
>> 在src 下新建xwork-conversion.properties
>> 键入:待转换的类型=类型转换器的全类名
java.util.Date=com.jason.strut2.conversion.DateConverter
web.xml 中配置的初始化参数
<context-param>
<param-name>datePattern</param-name>
<param-value>yyyy-MM-dd hh:mm:ss</param-value>
</context-param>
DateConverter.java
package com.jason.strut2.conversion; import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import javax.servlet.ServletContext;
import javax.xml.crypto.Data; import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.StrutsTypeConverter; import com.opensymphony.xwork2.ActionContext;
import com.sun.jndi.url.dns.dnsURLContext; public class DateConverter extends StrutsTypeConverter { private DateFormat dateFormat; public void setDateFormat(DateFormat dateFormat) {
//获取当前web应用下的初始化参数 ServletContext servletContext = ServletActionContext.getServletContext();
String pattern = servletContext.getInitParameter("datePattern");
dateFormat = new SimpleDateFormat(pattern); } public DateFormat getDateFormat() {
return dateFormat;
} @Override
public Object convertFromString(Map context, String[] values, Class toClass) { System.out.println("convertFromString ... ");
if(toClass == Data.class){
if(values != null && values.length > 0){
String value = values[0];
try {
return getDateFormat().parseObject(value);
} catch (ParseException e) { e.printStackTrace();
}
}
}
//若没有转换成功,则返回values
return values;
} @Override
public String convertToString(Map context, Object o) {
System.out.println("convertToString ...");
if( o instanceof Date){
Date date = (Date) o;
return getDateFormat().format(date);
}
//若转换失败,则返回null
return null;
} }
[原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器的更多相关文章
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Java后台处理框架之struts2学习总结
Java后台处理框架之struts2学习总结 最近我在网上了解到,在实际的开发项目中struts2的使用率在不断降低,取而代之的是springMVC.可能有很多的朋友看到这里就会说,那还不如不学str ...
- 201871010111-刘佳华《面向对象程序设计(java)》第6-7周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第6-7周学习总结 实验六 继承定义与使用 实验时间 2019-9-29 第一部分:理论部分. 1.继承:已有类来构建新类的 ...
- 201871010101- 陈来弟《面向对象程序设计(java)》第6-7周学习总结
201871010101- 陈来弟<面向对象程序设计(java)>第6-7周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh ...
- 曹玉中-201871010105《面向对象程序设计(java)》第6-7周学习总结
曹玉中-201871010105<面向对象程序设计(java)>第6-7周学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.c ...
- 201871010107-公海瑜《面向对象程序设计(java)》第6-7周学习总结
201871010107-公海瑜<面向对象程序设计(java)>第6-7周学习总结 项目 内容 ...
- 201871010135 张玉晶《面向对象程序设计(java)》第6-7周学习总结
201871010135 张玉晶<面向对象程序设计(java)>第6-7周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
随机推荐
- log4j常用配置以及日志文件保存位置
log4j.rootLogger=INFO,CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender ...
- svn截图
一.合并一个范围的版本 此类型应用最为广泛,主要是把分支中的修改合并到主干上来.在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本.合并的源URL填写的是要合并的分支的URL,待合 ...
- C、VDD、VSS、 VEE 和VPP的区别
http://www.cnblogs.com/crazybingo/archive/2010/05/14/1735802.html C.VDD.VSS. VEE 和VPP的区别 在电子电路中,常可以看 ...
- java类加载过程
类(型)的生命周期--装载.连接.初始化.卸载 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用. 1. 装载 装载阶段包括三个基本动作: ...
- easy UI简单使用介绍
http://www.cnblogs.com/yokoboy/archive/2012/12/06/2806132.html
- WPF自定义RoutedEvent事件示例代码
************************* 引用网友,便于查找所用..... 创建自定义路由事件和应用分为6个步骤: (1)自定义路由事件参数对象 (2)声明并注册路由事件 (3)为路由事件添 ...
- Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接)
我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web 服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠s ...
- 搭建PHP环境LAMP(Linux+Apache+MySQL+PHP)
1.安装Apache yum -y install httpd 用/etc/init.d/httpd start 启动apache apache默认的程序目录是/var/www/html 2.安装M ...
- 关于带透明度的灰度层的show、hide
原理图如下:[需要注意的是,灰度View与中间的小View是并列的关系,否则,带透明度的灰度图就会影响小View的透明度] - (void)show{ UIWindow *win = [[UIAppl ...
- 将Excel导入SQL Server 只能导入数字,其他数据变为NULL怎么解决?
先新建一个TXT文件,把数据粘贴进去 再新建一个Excel文件,在菜单栏中选Data再选From Text 找到txt文件,点import 一定要选Text 点Finish,点OK. 接下来在往数据库 ...