Struts2入門(三)——類型轉換

来源:http://www.cnblogs.com/IT-1994/archive/2016/10/25/5998458.html
-Advertisement-
Play Games

一、前言 筆者一直覺得,學習一個知識點,你首先要明白,這東西是什麼?有什麼用?這樣你才能瞭解。好了,不說廢話。 1.1、類型轉換為何存在?什麼是類型轉換? 在MVC框架中,都是屬於表示層解決方案,都需要負責收集用戶請求的參數,並且將請求參數傳給應用的控制器組件,但是,這裡有一個問題,客戶端提交的請求 ...


一、前言

筆者一直覺得,學習一個知識點,你首先要明白,這東西是什麼?有什麼用?這樣你才能瞭解。好了,不說廢話。

1.1、類型轉換為何存在?什麼是類型轉換?

在MVC框架中,都是屬於表示層解決方案,都需要負責收集用戶請求的參數,並且將請求參數傳給應用的控制器組件,但是,這裡有一個問題,客戶端提交的請求參數都是字元串數據類型,而java這門語言本身就是強類型語言,所以我們需要類型轉換,就是把字元串類型轉化為你所需要的類型。

在MVC框架中,表示層數據處理分為兩個方法:客戶端輸入數據,服務端輸出數據;客戶端輸入數據需要進行類型轉換才能確保我們的數據類型是正確的,服務端輸出數據無需經過類型轉換。

簡單說就是:

在javaweb中,當你在jsp頁面提交一個username到servlet中,你是否在通過request.getParameter("username")去獲取數據;但是

如果是一個Date時間類型呢?你是否要先指定時間的轉換格式,然後再根據request.getParameter("date");獲取數據之後再去轉換呢?但是,你想過沒有?如果是多個頁面請求數據的話,那你每次打getParameter();這個方法,累嗎?你不累,程式都累了。所以,Struts2 為我們提供了一種類型轉換器,只需要編寫固定的操作就能得到你想要的數據,簡單說來,就是把表單的數據賦值給實體類。

1.2、類型轉換器簡單介紹

1.2.1、類型轉換器需要繼承DefaultTypeConverter類,需要重寫該類的convertType方法。

convertType方法的作用:

1、負責對類型的轉換,不過這種轉換是雙向的,我們可以通過判斷數據的類型判斷轉換的方向

2、該方法有三個參數:

  context:是類型轉換環境的上下文

  value:    是需要轉換的參數(隨轉換方向不同,如果字元串向實例轉換時,它是字元串數組;如果實例字元串轉換時,它是實例)

  toType: 是轉換後的目標參數

1.2.2、當然,你也可以繼承StrutsTypeConverter是,它是Struts2為我們簡化的類型轉換器,是DefaultTypeConverter的子類,預設產生兩個方法,更加明確的告訴你你要在哪個方法進行轉換,這樣就不用跟繼承DefaultTypeConverter類一樣,通過convertType方法里的參數toType每次去判斷。繼承StrutsTypeConveter該類比較簡單。這裡兩種繼承都有說到。

二、類型轉換器

2.1、類型轉換器有兩種:局部類型轉換器和全局類型轉換器,就字面上的意思一樣,全局和局部的。

關於類型轉換器的註冊方式有三種:

1、局部類型轉換器僅僅對某個Action起作用

2、全局類型轉換器對所有Action特定類型的屬性都會起作用

3、我們可以通過註解的方式來生成類型轉換器(JDK1.5以上的註解)

2.2、局部類型轉換器:

新建實體類userbean:

package com.TypeConverter;

import java.util.Date;

public class userbean {
    private String uname;
    private String upwd;
    private int uage;
    private Date udate;
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public String getUpwd() {
        return upwd;
    }
    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }
    public int getUage() {
        return uage;
    }
    public void setUage(int uage) {
        this.uage = uage;
    }
    public Date getUdate() {
        return udate;
    }
    public void setUdate(Date date) {
        this.udate = date;
    }
    public userbean(){
}
    public userbean(String uname, String upwd, int uage, Date udate) {
        this.uname = uname;
        this.upwd = upwd;
        this.uage = uage;
        this.udate = udate;
    }
}    
userbean

 

建立jsp視圖:這裡的是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>局部類型轉換器</title>
</head>
<body>
    <h2>請輸入您的註冊信息</h2>
    <form action="user">
    <!-- 註意:name的名字必須是userbean1,跟useraction裡面屬性名字一樣 -->
    <label>用戶名:</label><input type="text" name="userbean1"><br/>
    <label>&nbsp;碼:</label><input type="text" name="userbean1"><br/>
    <label>&nbsp;齡:</label><input type="text" name="userbean1"><br/>
    <label>&nbsp;日:</label><input type="text" name="userbean1"><br/>
    <input type="submit">
    </form>
</body>
</html>

 

在struts.xml配置信息。我們只需要配置這個

 這裡的<result name="input">是錯誤機制處理程式,就是說當頁面跳轉錯誤或者異常問題的時候,會跳轉到你指定的頁面,這裡筆者是讓其自動跳轉到原來的頁面。

我們可以定義一個局部的錯誤處理消息提示,這裡筆者沒有做,但是可以瞭解下:

新建useraction.properties,放在同級目錄下,
這裡的useraction是值你繼承ActionSupport的類,然後往該文件中寫入:
invalid.fieldvalue.屬性名=提示消息(其中屬性名可以是:uname或者upwd等)
當類型轉換錯誤就會跳轉,你可以在頁面上使用JSTL列印,如:
<%@ taglib uri="/struts-tags" prefix="s"%>    
然後使用<s:fielderror/>該標簽顯示出你的提示消息
錯誤消息處理機制

 

新建useraction類,繼承ActionSupport。

package com.TypeConverter;

import com.opensymphony.xwork2.ActionSupport;

//使用的是局部的類型轉化器
public class useraction extends ActionSupport {
    private userbean userbean1;
    public userbean getUserbean1() {
        return userbean1;
    }
    public void setUserbean1(userbean userbean1) {
        this.userbean1 = userbean1;
    }
    public String execute(){
        System.out.println(userbean1.getUname());
        System.out.println("useraction");
        return SUCCESS;
    }
}

 

重點來了:我們需要新建類去繼承DefaultTypeConverter,然後重寫裡面的方法。

這裡的類名是TestType

package com.TypeConverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

//
public class TestType extends DefaultTypeConverter {
    @Override
    public Object convertValue(Map<String, Object> context, Object value, Class toType) {
        //需要將字元串向userbean類型轉換時
        if(toType==userbean.class){
            //系統的請求參數是一個字元串數組
            System.out.println("TestType");
            String params[] = (String[]) value;
            userbean user = new userbean();
            user.setUname(params[0]);
            user.setUpwd(params[1]);
            user.setUage(Integer.parseInt(params[2]));
            SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
            try {
                user.setUdate(s.parse(params[3]));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return user;
        }else if(toType==String.class){
            userbean user = (userbean) value;
            System.out.println("--------------------");
            return "<"+user.getUname()+">";
        }
        System.out.println("--------------------");
        return null;
    }
}

在這裡筆者遇到一點小問題:就是使用

SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");

s.format(param[3]);

一直報錯誤:Unexpected Exception caught setting 'userbean1' on 'class com.TypeConverter.useraction: Error setting expression 'userbean1' with value ['admin', '123', '20', '1992-1-2', ],直到我把userbean中的udate類型改為Date類型才能夠正常走,並且把s.format換成s.parse(param[3])。疑惑。

筆者測試代碼走的順序:

先走繼承DefaultTypeConverter類的TestType,然後跳轉到useraction類中的execute方法。

註意:我們還需要在建一個文件,告訴程式說,我們要把數據填充到類是哪一個?新建Actionname-conversion.properties

其中-conversion.properties是固定的,需要改變只是Actionname(表示繼承ActionSupport的類,這裡是useraction。對應struts.xml的class)

新建useraction-conversion.properties。放在同級目錄下:

該文件的內容有:

這裡的userbean1是你在useraction中實例化的名字。

後面的TestType是你繼承DefaultTypeConverter類的名字。這裡是TestType

代碼運行結果如下:

Test.jsp界面

target.jsp界面效果:

target.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>類型轉化器輸出結果</title>
</head>
<body>
    用戶名:${userbean1.uname }<br/>
    密碼:${userbean1.upwd }<br/>
    年齡:${userbean1.uage }<br/>
    生日:${userbean1.udate }<br/>
</body>
</html>
target.jsp的代碼

 

2.3、全局類型轉換

2.3.1、對指定的類型的全部屬性有效。基本操作一樣,只是有一點不同,properties文件放的位置和名字不同。

新建jsp頁面,頁面名:Test1.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>使用全局的類型轉換器</title>
</head>
<body>
    <h2>使用全局的類型轉換器</h2>
    <form action="Stubean">
    <label>用戶名:</label><input type="text" name="stu"><br/>
    <label>&nbsp;齡:</label><input type="text" name="stu"><br/>
    <input type="submit">
    </form>
</body>
</html>
Test1.jsp

 

新建實體類StuBean:

package com.TypeConverter.global;

public class StuBean {
    private String uname;
    private int uage;
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public int getUage() {
        return uage;
    }
    public void setUage(int uage) {
        this.uage = uage;
    }
}
StuBean

 

配置struts.xml

 

新建StuAction類繼承ActionSupport

package com.TypeConverter.global;

import com.opensymphony.xwork2.ActionSupport;

//使用全局的類型轉換器
//執行順序:類型轉換器——>execute

public class StuAction extends ActionSupport {
    private StuBean stu;

    public StuBean getStu() {
        return stu;
    }

    public void setStu(StuBean stu) {
        this.stu = stu;
    }
    
    public String execute(){
        System.out.println("StuAction");
        System.out.println(stu.getUname());
        return SUCCESS;
    }
}
StuAction

 

 

新建GlobalTypeConverter類繼承StrutsTypeConverter,這裡的StrutsTypeConverter是簡化類型轉換器,它是DefaultTypeConverter的子類。以下是代碼:

package com.TypeConverter.global;

import java.util.Map;

import org.apache.struts2.util.StrutsTypeConverter;


public class GlobalTypeConverter extends StrutsTypeConverter {
    
    //轉化為javabean對象
    @Override
    public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
        System.out.println("Global...");
        StuBean stu = new StuBean();
        stu.setUname(arg1[0]);
        stu.setUage(Integer.parseInt(arg1[1]));
        return stu;
    }

    //轉化為String對象
    @Override
    public String convertToString(Map arg0, Object arg1) {
        StuBean s = (StuBean)arg1;
        return s.getUname()+"!!";
    }

}
GlobalTypeConverter

 

註意:全局與局部不同的地方在於properties文件名和放的位置不同,全局的文件名為:xwork-conversion.properties

位置在:

放在classes之下,有些沒有classes文件,需要自己創建。

內容為:

前面的是該StuBean實體類的路徑,後面的是繼承StrutsTypeConverter類的類型轉換器

如果要設置錯誤處理消息的話,我們可以添加一行代碼,當頁面出錯的時候提示,這裡筆者沒有做,但是可以瞭解,添加代碼為:

xwork.default.invalid.fieldvalue=提示消息

顯示效果上面有介紹。如果你需要的話可以使用。

代碼運行結果為:

Test1.jsp界面

target1.jsp界面

有誰能介紹一個錄製操作的軟體,謝謝。

以上就是Struts2 類型轉換器的基本知識,有不足的請下方留言。謝謝。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 筆者最近入手ThinkPHP5,準備用它來實現一個學生作業管理系統。簡單的說就是學生在上面交老師佈置的課程作業,老師也可以發佈修改作業。過程中勢必會碰到學生、班級和老師之間的關係。它們之間的關係是多對多的關係。下麵我們主要分析班級和作業的關係。每個班級的學生可以有多個作業,同樣的作業也可以佈置給不同 ...
  • 簡單來說: .h的是標準C的頭文件,沒有.h的是標準C++的頭文件,兩種都是頭文件。 造成這兩種形式不同的原因,是C++的發展歷史決定的,剛纔正好有別的人也問這個問題,這裡我再回答一下(註意vs2008和vs2005對標準C++的支持是一樣的): 1、以iostream和stdio.h為例,iost ...
  • 英文文檔: filter(function, iterable) Construct an iterator from those elements of iterable for which function returns true. iterable may be either a seque ...
  • 1、用戶發送請求到前端控制器(DispatcherServlet); 2、前端控制器轉發請求到處理器映射器(HandlerMapping); 3、處理器映射器將攔截的Action返回到前端控制器; 4、前端控制器將攔截的Action請求處理器適配器(HandlerAdapter); 5、處理器適配器 ...
  • 1.輸入參數為單個值 delete from MemberAccessLog where accessTimestamp = #value# delete from MemberAccessLog where accessTimestamp = #value# 2.輸入參數為一個對象 ... ...
  • ord('a');//=>97 返回小寫a 的ascii碼值97 chr(97);//=>a 返回ascii碼表上的97對應的 小寫a ...
  • dedecms 基本包含了一個常規網站需要的一切功能,擁有完善的中文學習資料,很容易上手。學會dedecms 的模板修改、欄目新增、內容模型新增和常用的標簽調用方法後,即便我們不懂 php 語言也能獨立完成一個網站了。 在百度網盤中分享,織夢CMS模板製作手冊 http://pan.baidu.co ...
  • 回到目錄 一般sso的說明 在Lind.DDD框架里,有對單點登陸的集成,原理就是各個網站去sso網站統一登陸授權,之後在sso網站將登陸的token進行存儲,存儲方式隨你(cache,redis,mongodb,file),之後業務平臺在訪問資源時,如果這些資源需要用戶登陸才能訪問,就會去sso網 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...