Struts2轉換器配置和用法


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.dao;

public class Student {
    private String name;
    private String idcard;
    private String birthday;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIdcard() {
        return idcard;
    }
    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
}

再做一個StudentAction.java類:

package com.controller;

import com.dao.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;
    }
}

配置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="false" />

    <package name="default" namespace="/" extends="struts-default">
        
        <action name="*_*" class="com.controller.{1}Action" method="{2}">

            <result>
                {1}/{2}.jsp
            </result>
        </action>
    </package>

   

</struts>

創建文件夾Student,再創建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="Student_show" method="post">
姓名:<input type="text" name="stu.name" ><br> //這里的name=“stu.name” 就不用走轉換器轉換,因為通過后面頁面接受的數據可以看出,直接就接收的事stu.name類型。
身份證號:<input type="text" name="stu" ><br>  //這里的name=“stu”就是走的轉換器轉換,因為他定義的事stu這個實體類,必須通過轉換器轉換成他的成員類
<input type="submit" value="go" >
</form>
</body>
</html>

創建show.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
${stu.name }---${stu.idcard }---${stu.birthday }
</body>
</html>

下面就是創建一個攔截器名為StudentConverter.java:

package com.util;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;

import com.dao.Student;

public class StudentConverter extends StrutsTypeConverter {

    @Override
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) {//字符串-->對象
        String str= arg1[0];
        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.setIdcard(str);
        return stu;
    }

    @Override
    public String convertToString(Map arg0, Object arg1) {//對象-->字符串
        // TODO 自動生成的方法存根
        return null;
    }

}

再就是在src根目錄下創建一個文件,名為xwork-conversion.properties:

com.dao.Student=com.util.StudentConverter;

上面這句話的意思為實體類與轉換類的二者完全限定名對應關系。

其實這里有兩種配制方法:

第一種:全局配置。在src根下,建立xwork-conversion.properties文件。配置好實體類與轉換類的二者完全限定名對應關系。
第二種:局部配置。在action的包里面,建立Action類名-conversion.properties文件(StudentAction-conversion.properties)。
配置好成員變量與轉換類的對應關系。stu=com.itnba.maya.util.StudentConverter

 

實現效果如下:

 

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM