在Struts2.0框架中内置了类型转换器,可以很方便的实现在八大数据类型、Date类型之间的自动转换;此外也可以根据自己的需求自定义数据转换类。如下:

首先看一下项目工程中的目录

1.在新建的web project项目的web Root中新建input.jsp,用来输入用户名和密码

 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'input.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<body > <h1>使用分号隔开用户名与密码信息</h1> <form action="userAction.action"> user info 1: <input type="text" name="user"><br><!--这里name的属性值名称和UserAction中的Get/Set方法名称对应-->
<input type="submit" value="submit"> </form>
</body>
</html>

2.继续在web Root中新建output.jsp页面,用来显示服务端传来的类型转换值(自定义类型--------->String类型)

 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<!-- 通过taglib导入Struts2中自带的标签库 -->
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>显示结果页面</title> <meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<!-- 获得转到jsp页面之前的user属性 这里的user要和对应action中的user对应-->
<s:property value="user" />
</body>
</html>

3.在新建的web project项目的src中新建com.converter包,并在包中新建一个转换器类,如下图:

并在该UserConverter类中重写public Object convertValue(Map context, Object value, Class toType)函数,如下:

//类型转换方向有页面字符串转换为自定义类型对象,或自定义类型对象转换为字符串

//toType参数代表你需要转换的目标类型

//value参数是具体的需要转换的对象,如果value是页面往自定义类型转,则value应为String[]类型

 package com.converter;
import java.util.Map;
import java.util.StringTokenizer;
import ognl.DefaultTypeConverter;
import com.bean.User;
public class UserConverter extends DefaultTypeConverter { @Override
public Object convertValue(Map context, Object value, Class toType) {
if(User.class == toType) //从页面向后台对象转换
{
String[] str = (String[])value; //将获取到的value值转换为字符串数组 String firstValue = str[0]; StringTokenizer st = new StringTokenizer(firstValue, ";");
/*---------分隔字符串也可以使用一下split方法,效果和上面的方法效果一样
String[] str1=firstValue.split(";");
String username = str1[0];
String password = str1[1];
*/
String username = st.nextToken();
String password = st.nextToken();
//创建User,并将转换后的username和password通过setXXX()方法放入到User对象中
User user = new User(); user.setUsername(username);
user.setPassword(password); return user;
}else if(toType == String.class){ //从服务器转到前端
//将value类型从object强制转换成User对象
User user = (User)value;
String username = user.getUsername();
String password = user.getPassword();
String userInfo = "username = " + username + ", password = " + password;
return userInfo;
}
return null;
} }

4.在src中创建com.LHB.bean包并在包中创建User.java的bean

 package com.LHB.bean;
public class User { private String username;
private String password;
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;
}
}

5.创建com.action包,在包建UserAction.java

 package com.action;

 import com.bean.User;
import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private User user; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} @Override
public String execute() throws Exception {
System.out.println("username = " + user.getUsername());
System.out.println("password = " + user.getPassword());
return SUCCESS;
} }

6.配置struts.xml文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置Struts运行模式为开发者模式,如果value为false则关闭开发者模式 -->
<constant name="struts2.devMode" value="true"></constant>
<package name="default" namespace="/" extends="struts-default"> <action name="userAction" class="com.action.UserAction">
<!-- <result name="input">/upload.jsp</result> -->
<result name="success">/output.jsp</result>
</action>
</package>
</struts>

7.在com.action包下新建UserAction-conversion.properties属性文件配置User的转换信息找到对应的转换器类

注意:这里的属性文件名称命名是有规则的,XXXAction-conversion.properties中的XXX必须是对应action的文件名

user:表示需要转换的属性名,要执行的转换服务的转换器路径

8.结果:

用户信息输入

从页面String类型转换到服务器端自定义User类型在控制台中显示的结果信息

从服务器端的User类型转换为页面的String类型,结果显示在output.jsp页面中。如下:

struts2.0自定义类型转换的更多相关文章

  1. [Struts2学习笔记] -- 自定义类型转换

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  2. Struts2自定义类型转换,和处理类型转换错误

    Struts2自定义类型转换: 从前台接受到的类型全部是字符串,Struts2自带的一些基本类型转换有时不能满足我们的特别需要,如:日期字符串输入格式,还有一些自定义的类,直接传到后台,我们需要一些自 ...

  3. java struts2入门学习---自定义类型转换

    自定义类型转换器的作用就是将struts无法识别的类型转换成自己所需要的. 比如输入:广东-东莞-虎门,对应的输出时能输出:广东省 东莞市 虎门(镇/区) 这里涉及到的知识点即是将String转换为任 ...

  4. struts2异常处理及类型转换

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

  5. struts2学习笔记(3)——struts2的局部类型转换

    今天又学到了一个新的东西,就是struts2的类型转换. 为什么要类型转换? 今天我就要传一个点的坐标给你,保存时用一个自定义的Point类来保存. 因为在表单里面传过去的是字符串,如“12,23”, ...

  6. (转)struts2.0配置文件、常量配置详解

    一.配置: 在struts2中配置常量的方式有三种: 在struts.xml文件中配置 在web.xml文件中配置 在sturts.propreties文件中配置 1.之所以使用struts.prop ...

  7. Struts2中的类型转换

    1.     Struts2中的类型转换 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概 ...

  8. struts2.0中struts.xml配置文件详解

    先来展示一个配置文件 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration ...

  9. C#构造函数、操作符重载以及自定义类型转换

    构造器 构造器(构造函数)是将类型的实例初始化的特殊方法.构造器可分为实例构造器和类型构造器,本节将详细介绍有关内容. 实例构造器 顾名思义,实例构造器的作用就是对类型的实例进行初始化.如果类没有显示 ...

随机推荐

  1. 内联扩展 inline expansion

    让编译器直接将完整的函数体插入到每一个调用该函数的地方,从而提高函数调用的运行速度. 优秀的JIT编译器会通过侦测运行信息,仅将需要频繁运行的瓶颈部分进行编译,从而大大削减编译所需的时间. 而且,利用 ...

  2. day 0314函数的进阶

    1.空间:内置空间,全局空间,局部空间. 内置空间:空间存放python解释器,为我们提供了方便的名字:input,print,str,list,tuple 三个空间的加载顺序: 内置空间>&g ...

  3. [knowledge] netmap

    900MHz的单核处理10GB的包收/发. netmap has been implemented in FreeBSD and Linux and Gbit/s network adapters. ...

  4. knowledge learning things TODO

    加密分区 suricata调研 tor配置 tilda配置 automake / autoconf / libtool 使用 大页内存的深入原理 Memory channels Network Man ...

  5. SQL instr()函数的格式

    格式一:instr( string1, string2 )    /   instr(源字符串, 目标字符串) 格式二:instr( string1, string2 [, start_positio ...

  6. Dubbo服务化框架使用整理

    一.垂直应用架构拆分 在应用架构的演进过程中,垂直应用架构因为开发便捷,学习成本低,对于实现业务功能的增删改查提供了高效的开发支持,有利于前期业务高速发展的的快速实现.但是随着系统业务功能的不断扩展和 ...

  7. Python库源码学习1:Flask之app.run

    先列出app.run()实现的功能,我们以debug=True的情况下进行分析. 1. web服务器,处理http请求 2. 当代码修改后,重启服务器 那么app.run()是如何实现这两个功能的呢? ...

  8. MySQL准入规范及容量评估

    一.数据库设计 1.表结构设计 -表中的自增列(auto_increment属性)推荐使用bigint类型 -首选使用非空的唯一键, 其次选择自增列或发号器 不使用更新频繁的列,尽量不选择字符串列,不 ...

  9. 015-线程同步-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

    一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. syn ...

  10. 011-ThreadFactory线程工厂

    一.源码分析 ThreadFactory是一个线程工厂.用来创建线程.这里为什么要使用线程工厂呢?其实就是为了统一在创建线程时设置一些参数,如是否守护线程.线程一些特性等,如优先级.通过这个Tread ...