• 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、提交后显示

  • 相关阅读:
    DAOFactory复用代码
    WebUtils复用代码【request2Bean、UUID】
    过滤器复用代码【中文乱码、HTML转义】
    数据库复用代码【c3p0配置文件、数据库连接池】
    分页复用代码【Page类、JSP显示页面】
    AJAX应用【股票案例】
    JavaScript中的for in循环
    JSON【介绍、语法、解析JSON】
    javaScript【创建对象、创建类、成员变量、方法、公有和私有、静态】
    DOM【介绍、HTML中的DOM、XML中的DOM】
  • 原文地址:https://www.cnblogs.com/linlf03/p/11519798.html
Copyright © 2020-2023  润新知