自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的.

比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区)

这里涉及到的知识点即是将String转换为任意的JavaBean类型.

一.实现代码

程序配置入口:struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!--<include file="config/upload.xml"></include> -->
<!-- 加载其他配置文件 -->
<!-- <include file="config/upload-interceptor.xml"></include> -->
<!-- 加载属性文件-国际化 -->
<!-- <constant name="struts.custom.i18n.resources" value="message"></constant> --> <!-- 结果集 -->
<!-- <include file="config/result_struts.xml"></include> -->
<!-- 类型转换 -->
<include file="config/type_struts.xml"></include>
<!-- 文件下载 -->
<!-- <include file="config/download_struts.xml"></include> -->
</struts>

注:struts.xml是在项目运行的过程中被加载进入内存的,是项目配置的总入口,这里使用<include>属性加载外部的type_struts.xml

type_struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- <package name="type" extends="struts-default">
<action name="TypeAction" class="type.TypeAction" method="execute">
<result name="success" type="dispatcher">
/WEB-INF/type_success.jsp
</result>
<result name="input" type="dispatcher">
type.jsp
</result>
</action>
</package> -->
<package name="type" extends="struts-default">
<action name="TypeSelfAction" class="type.TypeSelfAction" method="execute">
<result name="success" type="dispatcher">
/WEB-INF/type_self_success.jsp
</result>
<result name="input" type="dispatcher">
/type_self.jsp
</result>
</action>
</package>
</struts>

注:type_struts.xml是具体负责类型转换时的配置,这里配置了对应的type.TypeSelfAction,以及成功后的跳转页面type_self_success.jsp和程序出错时

的跳转页面type_self.jsp,并将消息回显.

type_self.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:form action="TypeSelfAction" type="POST">
<s:textfield label="用户名" name="username" />
<s:password label="密码" name="password" />
<s:textfield label="薪水" name="salary" />
<s:textfield label="生日" name="birthday"/>
<s:textfield label="地址" name="address"/>
<s:submit value="提交" name="submit"/>
<s:reset value="重置"/>
</s:form>
</body>
</html>

注:type_self.jsp 是用户访问项目的入口,效果图如下所示:

其中使用POST请求方式是为了避免中文乱码等问题,使用struts自带的标签,如s:password,s:textfield等是为了简化开发,并且使错误消息方便回显.

TypeSelfAction.java

package type;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

/**
* @ClassName: TypeSelfAction
* @Description: TODO
* @author: amosli
* @email:amosli@infomorrow.com
* @date Feb 13, 2014 11:24:40 PM
*/
public class TypeSelfAction extends ActionSupport {
private static final long serialVersionUID = -4007160582981636173L;
private String username;// 用户名
private String password;// 密码
private Double salary;// 薪水
private Date birthday;// 生日
private Address address;// 地址 public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Double getSalary() {
return salary;
} public void setSalary(Double salary) {
this.salary = salary;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Address getAddress() {
return address;
} public void setAddress(Address address) {
System.out.println("setaddress:"+address.toString());
this.address = address;
} public String execute() throws Exception {
return SUCCESS;
} }

注:TypeSelfAction是一个与配置文件type_struts.xml相对应的JavaBean文件.

Address.java

package type;

/**
* @ClassName: Address
* @Description: 定义一个address model
* @author: amosli
* @email:amosli@infomorrow.com
* @date Jan 26, 2014 1:53:33 AM
*/
public class Address {
private String province;// 省份
private String city;// 城市
private String area;// 区域 public Address(){ }
public Address(String province, String city, String area) {
super();
this.province = province;
this.city = city;
this.area = area;
} public String getProvince() {
return province;
} public void setProvince(String province) {
this.province = province;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} public String getArea() {
return area;
} public void setArea(String area) {
this.area = area;
} public String toString() {
return this.province+"省 "+this.city+"市 "+this.area+"(镇/区)";
}
}

注:Address是关于地址的JavaBean,其分为省份,市,区域三级.

为了实现自定义类型转换还必须实现StrutsTypeConverter的扩展,这里要手动写两个方法将JavaBean转为String和将String转为JavaBean.

TypeAddressConverter.java

package type;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* @ClassName: TypeAddressConverter
* @Description: 自定义类型转换器,继承自StrutsTypeConverter,可以将String转换成任意javaBean对象
* @author: amosli
* @email:amosli@infomorrow.com
* @date Feb 13, 2014 11:42:42 PM
*/
public class TypeAddressConverter extends StrutsTypeConverter {
public TypeAddressConverter() {
System.out.println("constructor!");
}
//将String转为对象返回
public Object convertFromString(Map context, String[] values, Class toClass) {
System.out.println("convertFromString");
// System.out.println("context:"+context);
// System.out.println("class:"+toClass);
// System.out.println("values:"+Arrays.toString(values));
if (Address.class == toClass) {// 判断类型是否为将要转成的JavaBean
String[] split = values[0].toString().split("-");//页面中的字符串,下标为0表示第一个字符串,这里如果有多个可以依此类推.
String province = split[0];// 省份
String city = split[1];// 市
String area = split[2];// 区
Address address = new Address(province, city, area);
return address;
}
return null;
}
//将对象转为String返回
public String convertToString(Map context, Object o) {
System.out.println("convertToString");
if (o instanceof Address) {// 判断对象类型是否为Adress
Address adr = (Address) o;
return adr.toString();
}
return null;
} }

注:这里是自定义类型转换的核心代码,即如何将一个JavaBean转为String和将String转为JavaBean.

为了调用上面的方法还必须加一个配置.

xwork-conversion.properties

#JavaBean=self defined typeconverter
type.Address=type.TypeAddressConverter

注:一般情况下应将xwork-conversion.properties存放在src目录下,我这里用的是Maven管理的,xwork-conversion.properties是放在resources目录下的,如下图所示:

自此所有配置结束.

二.效果图

1.点击提交按钮:

2.点击重置按钮:

本文源码: struts2 自定义类型转换器   https://github.com/amosli/strut2_learn

java struts2入门学习---自定义类型转换的更多相关文章

  1. java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器

    实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpS ...

  2. java struts2入门学习---异常处理和类型转换

    一.struts2对异常的处理 1.自定义局部异常: <action> <exception-mapping result="sonException" exce ...

  3. java struts2入门学习--基于xml文件的声明式验证

    一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...

  4. java struts2入门学习--OGNL语言基本用法

    一.知识点学习 1.struts2中包含以下6种对象,requestMap,sessionMap,applicationMap,paramtersMap,attr,valueStack; 1)requ ...

  5. java struts2入门学习---拦截器学习

    一.拦截器,拦截器栈 1.拦截器的作用 拦截器本质上和servlet的过滤器是一样的.在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦 ...

  6. java struts2入门学习实例--使用struts2快速实现上传

    一.文件上传快速入门 1).关于上传表单三要素 >>尽量以POST请求方式上传,因为GET支持文件大小是有限制的. >>必须要加上enctype="multipart ...

  7. java struts2入门学习--OGNL语言常用符号和常用标签学习

    一.OGNL常用符号(接上一篇文章): 1.#号 1)<s:property value="#request.username"/> 作用于struts2的域对象,而不 ...

  8. java struts2入门学习---文件下载的二种方式

    一.关于文件下载: 文件下载的核心思想即是将文件从一个地方拷贝到另一个地方. 1.传统方式: 在Action中加入大量servlet api 操作.优点是好理解,缺点是耦合度高. 2.stream方式 ...

  9. java struts2入门学习--防止表单重复提交.OGNL语言学习

    一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...

随机推荐

  1. js遍历Object所有属性

    在js中经常需要知道Object中的所有属性及值,然而若是直接弹出Object,则是直接显示一个对象,它的属性和值没有显示出来, 不是我们想要的结果,从而需要遍历Object的所有属性. var ob ...

  2. Mysql 高可用方案

    1 mysql分布式数据库,如 mycat https://www.cnblogs.com/zzsdream/articles/6650690.html 2 读写分离,mysql主从复制+mysql ...

  3. 不能从const char *转换为LPCWSTR --VS经常碰到

    不能从const char *转换为LPCWSTR 在VC 6.0中编译成功的项目在VS2005 vs2005.vs2008.vs2010中常会出现类型错误. 经常出现的错误是:不能从const ch ...

  4. mysql 字符串按照数字类型排序

    一个varchar,char的字段 存放 1+,12- ,11等字符串将字段*1或者+0可以将MySQL字符串字段按数值排序 order by 字段名称+0 desc/asc的形式进行排序 order ...

  5. laravel 5.5 整合 jwt 报错Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist解决

    今天介绍一个在laravel5.5新版本整合jwt  执行 php artisan jwt:generate 再生成密钥时报的一个错误 Method Tymon\JWTAuth\Commands\JW ...

  6. 技能|三次简化一张图:一招理解LSTM/GRU门控机制

    作者 | 张皓 引言 RNN是深度学习中用于处理时序数据的关键技术, 目前已在自然语言处理, 语音识别, 视频识别等领域取得重要突破, 然而梯度消失现象制约着RNN的实际应用.LSTM和GRU是两种目 ...

  7. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(五)针对hadoop2.9.0启动之后发现slave上正常启动了DataNode,DataManager,但是过了几秒后发现DataNode被关闭

    启动之后发现slave上正常启动了DataNode,DataManager,但是过了几秒后发现DataNode被关闭 以slave1上错误日期为例查看错误信息: /logs/hadoop-spark- ...

  8. [Canvas]新版箴言钟表

    动态效果点此下载用浏览器打开观看. 本作Github地址:https://github.com/horn19782016/12MaximClock 图例: 代码: <!DOCTYPE html& ...

  9. 使用FractionSlider生成的视差幻灯效果原型

    在线演示 本地下载 非常棒的jQuery插件,帮助你创建超酷的视差效果幻灯!

  10. Transaction And Lock--READ COMMITTED隔离级别下的"脏读"

    在READ UNCOMMITTED事务隔离级别下或使用WITH(NOLOCK)来查询数据时,会出现脏读情况,因此对于一些比较"关键"的业务,会要求不能使用WITH(NOLOCK)或 ...