在Struts2.0框架中内置了类型转换器,可以很方便的实现在八大数据类型、Date类型之间的自动转换;此外也可以根据自己的需求自定义数据转换类。如下:
首先看一下项目工程中的目录
1.在新建的web project项目的web Root中新建input.jsp,用来输入用户名和密码
1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>My JSP 'input.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 <body > 27 28 <h1>使用分号隔开用户名与密码信息</h1> 29 30 <form action="userAction.action"> 31 32 user info 1: <input type="text" name="user"><br><!--这里name的属性值名称和UserAction中的Get/Set方法名称对应--> 33 <input type="submit" value="submit"> 34 35 </form> 36 </body> 37 </html>
2.继续在web Root中新建output.jsp页面,用来显示服务端传来的类型转换值(自定义类型--------->String类型)
1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> 2 <!-- 通过taglib导入Struts2中自带的标签库 --> 3 <%@ taglib prefix="s" uri="/struts-tags" %> 4 <% 5 String path = request.getContextPath(); 6 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 7 %> 8 9 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 10 <html> 11 <head> 12 <base href="<%=basePath%>"> 13 14 <title>显示结果页面</title> 15 16 <meta http-equiv="pragma" content="no-cache"> 17 <meta http-equiv="cache-control" content="no-cache"> 18 <meta http-equiv="expires" content="0"> 19 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 20 <meta http-equiv="description" content="This is my page"> 21 <!-- 22 <link rel="stylesheet" type="text/css" href="styles.css"> 23 --> 24 25 </head> 26 27 <body> 28 <!-- 获得转到jsp页面之前的user属性 这里的user要和对应action中的user对应--> 29 <s:property value="user" /> 30 </body> 31 </html>
3.在新建的web project项目的src中新建com.converter包,并在包中新建一个转换器类,如下图:
并在该UserConverter类中重写public Object convertValue(Map context, Object value, Class toType)函数,如下:
//类型转换方向有页面字符串转换为自定义类型对象,或自定义类型对象转换为字符串
//toType参数代表你需要转换的目标类型
//value参数是具体的需要转换的对象,如果value是页面往自定义类型转,则value应为String[]类型
1 package com.converter; 2 import java.util.Map; 3 import java.util.StringTokenizer; 4 import ognl.DefaultTypeConverter; 5 import com.bean.User; 6 public class UserConverter extends DefaultTypeConverter { 7 8 @Override 9 public Object convertValue(Map context, Object value, Class toType) { 10 if(User.class == toType) //从页面向后台对象转换 11 { 12 String[] str = (String[])value; //将获取到的value值转换为字符串数组 13 14 String firstValue = str[0]; 15 16 StringTokenizer st = new StringTokenizer(firstValue, ";"); 17 /*---------分隔字符串也可以使用一下split方法,效果和上面的方法效果一样 18 String[] str1=firstValue.split(";"); 19 String username = str1[0]; 20 String password = str1[1]; 21 */ 22 String username = st.nextToken(); 23 String password = st.nextToken(); 24 //创建User,并将转换后的username和password通过setXXX()方法放入到User对象中 25 User user = new User(); 26 27 user.setUsername(username); 28 user.setPassword(password); 29 30 return user; 31 }else if(toType == String.class){ //从服务器转到前端 32 //将value类型从object强制转换成User对象 33 User user = (User)value; 34 String username = user.getUsername(); 35 String password = user.getPassword(); 36 String userInfo = "username = " + username + ", password = " + password; 37 return userInfo; 38 } 39 return null; 40 } 41 42 }
4.在src中创建com.LHB.bean包并在包中创建User.java的bean
1 package com.LHB.bean; 2 public class User { 3 4 private String username; 5 private String password; 6 public String getUsername() { 7 return username; 8 } 9 public void setUsername(String username) { 10 this.username = username; 11 } 12 public String getPassword() { 13 return password; 14 } 15 public void setPassword(String password) { 16 this.password = password; 17 } 18 }
5.创建com.action包,在包建UserAction.java
1 package com.action; 2 3 import com.bean.User; 4 import com.opensymphony.xwork2.ActionSupport; 5 6 public class UserAction extends ActionSupport { 7 8 private User user; 9 10 public User getUser() { 11 return user; 12 } 13 14 public void setUser(User user) { 15 this.user = user; 16 } 17 18 @Override 19 public String execute() throws Exception { 20 System.out.println("username = " + user.getUsername()); 21 System.out.println("password = " + user.getPassword()); 22 return SUCCESS; 23 } 24 25 26 }
6.配置struts.xml文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <struts> 6 <!-- 设置Struts运行模式为开发者模式,如果value为false则关闭开发者模式 --> 7 <constant name="struts2.devMode" value="true"></constant> 8 <package name="default" namespace="/" extends="struts-default"> 9 10 <action name="userAction" class="com.action.UserAction"> 11 <!-- <result name="input">/upload.jsp</result> --> 12 <result name="success">/output.jsp</result> 13 </action> 14 </package> 15 </struts>
7.在com.action包下新建UserAction-conversion.properties属性文件配置User的转换信息找到对应的转换器类
注意:这里的属性文件名称命名是有规则的,XXXAction-conversion.properties中的XXX必须是对应action的文件名
user:表示需要转换的属性名,要执行的转换服务的转换器路径
8.结果:
用户信息输入
从页面String类型转换到服务器端自定义User类型在控制台中显示的结果信息
从服务器端的User类型转换为页面的String类型,结果显示在output.jsp页面中。如下: