struts2.0自定义类型转换

在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页面中。如下:

原文地址:https://www.cnblogs.com/lihuibin/p/7905413.html