IT虾米网

struts转换器详解

leader 2019年09月30日 编程语言 127 0

struts转换器:在B/S应用中,将字符串请求参数转换为相应的数据类型,是MVC框架提供的功能,而Struts2是很好的MVC框架实现者,理所当然,提供了类型转换机制。

一、类型转换的意义

对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构应用的请求参数是通过浏览器发送到服务器的,这些参数不可能有丰富的数据类型,因此必须在服务器端完成数据类型的转换

MVC框架是一个表现层解决方案,理应提供类型转换的支持,Struts2提供了功能非常强大的类型转换支持.

二、表现层数据的处理

1、对于web应用而言,表现层主要用于与用户交互,包括收集用户输入数据,向用户呈现服务器的状态。因此表现层的数据的流向主要有两个方向:输入数据和输出数据。


2、对于输入数据:则需要完成由字符串数据向多种类型数据的转化。程序通常无法自动完成,需要在代码中手动转化


3、对于输出数据:不管是java或是jsp都支持多种数据类型的直接输出。


4、表现层另外一个数据处理是:数据校验,分为客户校验和服务器端校验.后边会重点讲解

三、类型转换

1、HTTP参数都是字符串类型。 保存的数据可能是字符串、数字、布尔、日期时间等或者JavaBean类型。 手工的类型转换,比如将字符串转换为日期,通过: 通过request.getParameter方法获取字符串; 检查是否为空; 通过DateFormat.parse方法将字符串转换为Date对象

2、Struts2类型转换

Struts2内置的类型转换
String和boolean 完成字符串与布尔值之间的转换
String和char  往常字符串与字符之间的转换
String和int、Integer 完成字符串与整型之间的转换
String和Long 完成字符串与长整型值之间的转换
String和double、Double 完成字符串与双精度浮点值的转换
String和Float 完成字符串和单精度浮点之间的转换
String和Date 完成字符串和日期类型之间的转换,日期格式使用格式用户请求所在Locale的SHORT格式
String和数组 在默认的情况,数组元素是字符串,如果用户定义类型转换器,也可以是其它复合数据类型
String和Map、List

***************************************************************************************

应用场景:输出界面/输出界面 与 对象/数据库不是一一对应的关系。或者格式不一样。
例如:输入身份证号,自动解析出生日或其它信息。

首先做一个Student.java类:

package com.itnba.maya.model; 
 
public class Student { 
    private String name; 
    private String idNumber;// 身份证号 
    private String birthday; 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) { 
        this.name = name; 
    } 
    public String getIdNumber() { 
        return idNumber; 
    } 
    public void setIdNumber(String idNumber) { 
        this.idNumber = idNumber; 
    } 
    public String getBirthday() { 
        return birthday; 
    } 
    public void setBirthday(String birthday) { 
        this.birthday = birthday; 
    } 
     
}

配置struts.xml文件:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd"> 
 
<struts> 
 
    <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="true" /> 
 
    <package name="default" namespace="/" extends="struts-default">

<action name="*_*" class="com.itnba.maya.controller.{1}Action" method="{2}"> <result> {1}_{2}.jsp </result> </action> </package> </struts>

再做一个StudentAction.java类:

package com.itnba.maya.controller; 
 
import com.itnba.maya.model.Student; 
import com.opensymphony.xwork2.ActionSupport; 
 
public class StudentAction extends ActionSupport { 
    private Student stu; 
     
     
     
    public Student getStu() { 
        return stu; 
    } 
    public void setStu(Student stu) { 
        this.stu = stu; 
    } 
    public String input(){ 
        return SUCCESS; 
    } 
    public String show(){ 
         
        return SUCCESS; 
    } 
}

 

做转换器的类。 --- 继承StrutsTypeConverter

package com.itnba.maya.util; 
 
import java.util.Map; 
 
import org.apache.struts2.util.StrutsTypeConverter; 
 
import com.itnba.maya.model.Student; 
 
public class Zhuanhuanqi extends StrutsTypeConverter { 
 
    @Override 
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) { 
        String str = arg1[0];    //370303199009210989 
         
        //截取对应的日期 
        String year = str.substring(6, 10); 
        String month = str.substring(10, 12); 
        String day = str.substring(12, 14); 
         
        Student stu = new Student(); 
        stu.setBirthday(year+"-"+month+"-"+day);//获取到生日 
        stu.setIdNumber(str);//重新把身份证附给IdNumber 
         
        return stu; 
    } 
 
    @Override 
    public String convertToString(Map arg0, Object arg1) { 
 
        return null; 
    } 
}

转换器的配置:

全局配置和局部配置都可以实现,写一个即可


1.全局配置。在src根下,建立xwork-conversion.properties文件。


配置好实体类与转换类的二者完全限定名对应关系。如com.itnba.maya.model.Student=com.itnba.maya.util.Zhuanhuanqi

 

2.局部配置。在action的包里面,建立Action类名-conversion.properties文件(StudentAction-conversion.properties)。

 


配置好成员变量与转换类的对应关系。如stu=com.itnba.maya.util.Zhuanhuanqi

 

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="Student_show" method="post"> 
姓名:<input type="text" name="stu.name"><br> 
身份证号:<input type="text" name="stu"><br> 
<input type="submit" value="submit"> 
</form> 
</body> 
</html>

显示名字、生日、身份证号

<%@ 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> 
${stu.name } -- ${stu.idNumber } --${stu.birthday } 
 
<s:debug></s:debug> 
</body> 
</html>

显示结果:

 

 

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Struts拦截器详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。