zoukankan      html  css  js  c++  java
  • Struts2 类型转换

    实现的目标,将页面中的字符转为对象,如Larry;123456 转为 User对象,username为Larry,password为123456。

    如何实现:

    Struts的类型转换,对于8个原生数据类型以及Date,String等常见类型,
    Struts2可以使用内建的类型转换器实现自动转换;但对于自定义的对象
    来说,就需要我们自己指定类型转换的方式了。

     一、原始的类型转换方式 (局部类型转换)

    工程用到的文件如下图所示

    1、创建测试页面test.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
    	<h1>使用分号隔开用户名和密码</h1>
    	<form action="userAction">
    	 user info: <input type="text" name="user"> <br>
    	 
    	 <input type="submit" value="submit">
    	</form>
    </body>
    </html>
    

      

    2、创建userAction

    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;
    		
    	}
    }
    

      输出用户名和密码

    3、在struts.xml中添加配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
    	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    	"http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
       <!-- 是否开启动态方法调用 -->
        <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    	<package name="default" namespace="/" extends="struts-default">
    		 <action name="login" class="com.example.struts2.LoginAction" method="login">
    			<result name="success">/success.jsp</result>
    			<result name="error">/error.jsp</result>
    			<result name="result">/result.jsp</result>
    		</action> 
    		<action name="helloworld" class="com.example.struts2.HelloWorldAction">
    			<result name="success">/success.jsp</result>
    			<result name="result">/result.jsp</result>
    		</action> 
    		<action name="userAction" class="com.example.struts2.UserAction">
    			<result name="success">/output.jsp</result>
    		</action>
    	</package>
    </struts>  

    output.jsp文件如下:

    <%@ page language="java" contentType="text/html;charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
        
    <!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:property value="user" />
    
    </body>
    
    </html>
    

      

      

    4、创建转换器

    public class UserConverter extends DefaultTypeConverter {
    	
    	
    
    	@Override
    	public Object convertValue(Map<String, Object> context, Object value, Class toType) {
    		
    		if(User.class == toType){ //从页面向后台对象转换
    			String[] str = (String[])value;
    			String firstValue = str[0];
    			StringTokenizer st = new StringTokenizer(firstValue,";");
    			String username = st.nextToken();
    			String password = st.nextToken();
    			
    			User user = new User();
    			user.setUsername(username);
    			user.setPassword(password);
    			
    			return user;
    			
    			
    		}
    		
    		return null;
    		
    	}
    	
    }
    

      并且增加配置文件UserAction-conversion.properties

    内容为:user=com.example.converter.UserConverter

    位于UserAction中的user变量使用com.example.converter.UserConverter转换器

    5、测试

    打开test.jsp

     然后点击提交

    控制台输出如下

     提交后页面结果

    二、Struts自带的类型转换 (局部类型转换)

    可以使用Struts2框架自带的类型转换器StrutsTypeConverter简化类型转换代码的编,
    StrutsTypeConverter继承于DefaultTypeConverter父类,并且提供了两个抽象方法
    convertFromString与convertToString,分别表示从页面的字符串转换为后台对象以及
    从后台对象转换为页面的字符串,我们只需实现这两个抽象方法即可实现类型转换。

    1、单个类型转换

    创建类型转换器

    public class UserConverter2 extends StrutsTypeConverter {
    
    
    	@Override
    	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
    		User user = new User();
    		String value = arg1[0];
    	
    		StringTokenizer st = new StringTokenizer(value,";");
    		user.setUsername(st.nextToken());
    		user.setPassword(st.nextToken());
    		return user;
    	}
    
    
    	@Override
    	public String convertToString(Map arg0, Object arg1) {
    		
    		User user = (User)arg1;
    		
    		String username = user.getUsername();
    		String password = user.getPassword();
    		
    		String userInfo = "username :" + username + ",password :" + password;
    		
    		
    		return userInfo;
    	}
    	
    	
    
    	
    	
    }
    

      修改配置文件

     输出结果和上面是一致的。

    2、批量类型转换(局部类型转换)

     1)增加input.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
    	<h1>使用分号隔开用户名和密码</h1>
    	<form action="userAction2">
    	 user info 1: <input type="text" name="user"> <br>
    	 user info 2: <input type="text" name="user"> <br>
    	 user info 3: <input type="text" name="user"> <br>
    	 user info 4: <input type="text" name="user"> <br>
    	 
    	 <input type="submit" value="submit">
    	</form>
    </body>
    </html>
    

      

    2)UserAction2 

    public class UserAction2 extends ActionSupport {
    
    	
    	private List<User> user;
    
    
    	public List<User> getUser() {
    		return user;
    	}
    
    
    	public void setUser(List<User> user) {
    		this.user = user;
    	}
    
    
    
    	@Override
    	public String execute() throws Exception {
    		for(User u: user){
    			System.out.println("username:" + u.getUsername());
    			System.out.println("password:" + u.getPassword());
    		}
    		
    		return SUCCESS;
    		
    	}
    }
    

      

    3)struts.xml增加配置

    	<action name="userAction2" class="com.example.struts2.UserAction2">
    			<result name="success">/output.jsp</result>
    		</action>
    

      

    4、增加转换器

    public class UserConverter3 extends StrutsTypeConverter {
    
    
    	@Override
    	public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
    		List<User> list = new ArrayList<>();
    		
    		for(String value : arg1){
    			User user = new User();
    			StringTokenizer st = new StringTokenizer(value,";");
    			user.setUsername(st.nextToken());
    			user.setPassword(st.nextToken());
    			list.add(user);
    		}
    		
    		return list;
    	}
    
    
    	@Override
    	public String convertToString(Map arg0, Object arg1) {
    		
    		List<User> list = (List<User>)arg1;
    		StringBuffer buffer = new StringBuffer();
    		for(User user : list){
    			String username = user.getUsername();
    			String password = user.getPassword();
    			buffer.append("username:").append(username).append(",password:" ).append(password).append(" ");
    			
    		}
    		
    		
    		
    		
    		return buffer.toString();
    	}
    	
    	
    
    	
    	
    }
    

      增加属性文件

    5)测试结果

     点击提交后返回

    三、全局类型转换

    在src目录下创建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字,即

    com.example.bean.User=com.exmaple.converter.UserConverter2

     1、创建全局配置属性文件

    2、修改input.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>
    	<h1>使用分号隔开用户名和密码</h1>
    	<form action="userAction">
    	 user info 1: <input type="text" name="user"> <br>
    	 <input type="submit" value="submit">
    	</form>
    </body>
    </html>
    

      

    3、提交后显示

  • 相关阅读:
    优云蒋君伟:自动化运维成本仍然很高
    广通软件携手华为,联合发布远程运维服务:开启智能运维模式
    优云软件叶帅:“互联网+”时代的云数据中心运维思辨(下)
    关于对象转json字符串存在Date类型转换格式问题解决方案
    JAVA过滤emoji表情包
    Java关于list集合根据集合元素对象的某个或多个属性进行排序的工具类
    Linux下备份mysql数据库以及mongodb
    Linux系统备份Tomcat下的项目
    Java关于计算某年某月有多少天的问题
    有关Java POI导出excel表格中,单元格合并之后显示不全的解决方法。
  • 原文地址:https://www.cnblogs.com/linlf03/p/11519798.html
Copyright © 2011-2022 走看看