3. 類型轉換初體驗 !--聖思園Struts 2.2筆記

1,每一次struts2請求都會生成一個a ction對象。

Struts2 的類型轉換,對於 8 個原生數據類型以及 Date,String 等 常見類型,
Struts2 能夠使用內建的類型轉換器實現自動的轉換; 但對於自定義的對象類型來講,
就須要咱們本身指定類型轉換的 方式了。

類型轉換範例:

頁面提交請求:
     <form action = "userAction.action" >
     < ! -- 以 ;分割  -- >
        USER : <input id = "user" name = "user"  / > <BR / >
         <input type = "submit" value = "submit" / >
     < /form >
struts2過濾器根據 userAction.action 請求找到struts.xml配置文件中相應的配置:
             <action name = "userAction"  class = "discovery.struts2.login.UserAction" >
                 <result name = "success" > /webs2 /userInfo.jsp < /result >
             < /action >
根據配置建立 discovery.struts2.login.UserAction 的實例,
注:
對於自定義的類型轉換器來講須要提供 3 個信息:Action 的名字、
Action 中待轉換的屬性名以及該屬性對應的類型轉換器。其中
Action 的名字是經過屬性文件名來得到的、 Action 中待轉換的屬性
名是經過屬性文件中的 key 來得到的,該屬性對應的類型轉換器是
經過該 key 所對應的 value 來得到的。

若在相同包下面找到配置文件 UserAction-conversion.properties
而且配置文件中定義了類型轉換參數
# UserAction中須要類型轉換的屬性=類型轉換器
# 說明須要對UserAction的user屬性使用該類型轉換器進行轉換
user =discovery.struts2.coverter.UserCoverter
則先生成 discovery.struts2.coverter.UserCoverter 的對象,調用方法:
public Object convertValue(Map context, Object value, Class toType);
package discovery.struts2.coverter;

import java.util.Map;
import java.util.StringTokenizer;

import ognl.DefaultTypeConverter;
import discovery.struts2.login.bean.User;

/**
 * 類型轉換器
 */

public class UserCoverter extends DefaultTypeConverter {
    /**
     * 類型轉換:
     * 將頁面字符串轉換爲後臺對象
     * 將後臺對象轉換爲頁面字符串
     */

    @Override
    public Object convertValue(Map context, Object value, Class toType) {
        if(User. class == toType){
            System.out.println( "將頁面字符串轉換爲後臺對象");
            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.setPassword(password);
            user.setUsername(username);
            return user;
        } else if(String. class == toType){
            System.out.println( "將後臺對象轉換爲頁面字符串");
            User user = (User)value;
           
            String username = user.getUsername();
            String password = user.getPassword();
           
            String userInfo = "username: " + username + ", password: " + password;
           
            return userInfo;
        }
        return null;
    }
}
返回user對象會被經過調用 UserAction 對象的setUser()方法設置到 UserAction 對象中。
設置完成以後調用 UserAction 對象的 public  String execute()  throws  Exception方法返回結果。
package discovery.struts2.login;
import com.opensymphony.xwork2.ActionSupport;
import discovery.struts2.login.bean.User;
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(user.getUsername());
        System.out.println(user.getPassword());
         return SUCCESS;
    }
}
將返回的結果與struts.xml配置文件的相關配置(result)相匹配:
< result name = "success" > / webs2 / userInfo.jsp < / result >
請求轉發到 userInfo.jsp頁面。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
//引入struts2 標籤庫
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>userInfo!</title>
  </head>   
  <body>
    //使用標籤獲取user數據時,將調用 discovery.struts2.coverter.UserCoverter類型轉換器將user信息轉換爲頁面顯示的數據;
          USER:<s:property value="user"/>
  </body>
</html>


能夠使用 Struts2 框架自帶的類型轉換器 StrutsTypeConverter 簡化 類 型 轉 換 代 碼 的 編 寫 ,
 StrutsTypeConverter 繼 承 於 DefaultTypeConverter 父 類 , 並 且 提 供 了 兩 個 抽 象 方 法 :
convertFromString 與 convertToString,
分別表示從頁面的字符串轉 換爲後臺對象以及從後臺對象轉換爲頁面的字符串,
咱們只需實 現這兩個抽象方法便可實現類型轉換。
public abstract class StrutsTypeConverter
extends com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter

Base class for type converters used in Struts. This class provides two abstract methods that are used to convert both to and from strings -- the critical functionality that is core to Struts's type coversion system. html

Type converters do not have to use this class. It is merely a helper base class, although it is recommended that you use this class as it provides the common type conversion contract required for all web-based type conversion. java

There's a hook (fall back method) called performFallbackConversion of which could be used to perform some fallback conversion if convertValue method of this failed. By default it just ask its super class (Ognl's DefaultTypeConverter) to do the conversion. web

To allow the framework to recognize that a conversion error has occurred, throw an XWorkException or preferable a TypeConversionException. apache

package discovery.struts2.coverter;

import java.util.Map;
import java.util.StringTokenizer;

import org.apache.struts2.util.StrutsTypeConverter;

import discovery.struts2.login.bean.User;

public class UserStruts2Coverter extends StrutsTypeConverter {

    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        System.out.println( "convertFromString將頁面字符串轉換爲後臺對象");
        String firstValue = values[ 0];
        StringTokenizer st = new StringTokenizer(firstValue, ";");
        String username = st.nextToken();
        String password = st.nextToken();
        User user = new User();
        user.setPassword(password);
        user.setUsername(username);
        return user;
    }

    @Override
    public String convertToString(Map context, Object o) {
        System.out.println( "convertToString將後臺對象轉換爲頁面字符串");
        User user = (User)o;
       
        String username = user.getUsername();
        String password = user.getPassword();
       
        String userInfo = "username: " + username + ", password: " + password;
       
        return userInfo;
    }

}

修改配置文件UserAction-conversion.properties:
# UserAction中須要類型轉換的屬性=類型轉換器
# user=discovery.struts2.coverter.UserCoverter
user=discovery.struts2.coverter.UserStruts2Coverter

StrutsTypeConverter源代碼:
package org.apache.struts2.util;

import java.util.Map;

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

public abstract class StrutsTypeConverter extends DefaultTypeConverter {

    public Object convertValue(Map context, Object o, Class toClass) {
        if ( toClass.equals(String.class)) {
            return convertToString(context, o);
        } else if ( o instanceof String[]) {
            return convertFromString(context, (String[]) o, toClass);
        } else if ( o instanceof String) {
            return convertFromString(context, new String[]{(String) o}, toClass);
        } else {
            return performFallbackConversion(context, o, toClass);
        }
    }

    /**
     * Hook to perform a fallback conversion if every default options failed. By default
     * this will ask Ognl's DefaultTypeConverter (of which this class extends) to
     * perform the conversion.
     */

    protected Object performFallbackConversion(Map context, Object o, Class toClass) {
        return super.convertValue(context, o, toClass);
    }


    /**
     * Converts one or more String values to the specified class.
     */

    public abstract Object convertFromString(Map context, String[] values, Class toClass);

    /**
     * Converts the specified object to a String.
     */

    public abstract String convertToString(Map context, Object o);
}


批量類型轉換:

提交請求頁面:/reborn/rebornWeb/webs2/userList.jsp
    <form action="userListAction.action">
    <!-- 以;分割 -->
        USER1:<input name="user" /><BR/>
        USER2:<input name="user" /><BR/>
        USER3:<input name="user" /><BR/>
        USER4:<input name="user" /><BR/>
        <input type="submit" value="submit"/>
    </form>
                                  

Action:
package discovery.struts2.login;

import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

import discovery.struts2.login.bean.User;

public class UserListAction 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(u.getUsername());
        }
        return SUCCESS;
    }
}

struts.xml
            <action name="userListAction" class="discovery.struts2.login.UserListAction">
                <result name="success">/webs2/userListInfo.jsp</result>
            </action>

轉換器配置:/reborn/src/discovery/struts2/login/UserListAction-conversion.properties
# UserListAction中須要類型轉換的屬性=類型轉換器
user=discovery.struts2.coverter.UserListStruts2Coverter

轉換器:
package discovery.struts2.coverter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import discovery.struts2.login.bean.User;
public class UserListStruts2Coverter extends StrutsTypeConverter {
    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        List<User> list = new ArrayList<User>();
        for (String value : values)
        {
            StringTokenizer st = new StringTokenizer(value, ";");
            User user = new User();
            user.setUsername(st.nextToken());
            user.setPassword(st.nextToken());
            list.add(user);
        }
        return list;
    }
    @Override
    public String convertToString(Map context, Object o) {
        List<User> list = (List<User>) o;
        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();
    }
}
顯示頁面:/reborn/rebornWeb/webs2/userListInfo.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>userInfo!</title>
  </head>
  
  <body>
          USER:<s:property value="user"/>
  </body>
</html>
 

全局轉換器:

無論是哪一個Action ,只要使用到了某個屬性,就使用特定的轉換器。
上面所述轉換器爲局部轉換器,對某個Action某個屬性使用哪一個轉換器。

src下新建xwork-conversion.properties

#要轉換的類 =類型轉換器:只要Action中包含了該類類型的屬性,便使用該轉換器轉換。
discovery.struts2.login.bean.User=discovery.struts2.coverter.UserStruts2Coverter










相關文章
相關標籤/搜索