天天看點

Struts2之類型轉換中的錯誤

1. 處理類型轉換錯誤

在Web的應用中,表現層主要涉及到資料校驗和類型轉換,這兩個是緊密相關的。在實際中,隻有通過了類型轉換,下一步才會去實作資料上的校驗。那麼今天,筆者将向大家介紹關于Struts2的類型轉換的應用。主要是通過例子來說明,例子的應用大概是在頁面中輸入使用者名、密碼、生日,然後校驗通過後才可進入資料校驗。

1)        建立一個LoginAction.java,這個Action的類必須繼承ActionSupport基類,因為Struts2的ActionSupport負責收集類型轉換錯誤、輸入校驗,并将它們封裝成FieldError對象,添加到ActionContext中。

public class LoginAction extends ActionSupport
{
	private User user;
	// user的setter和getter方法
	public void setUser(User user)
	{
		this.user = user;
	}
	public User getUser()
	{
		return user;
	}
	// 沒有execute方法,直接使用ActionSupport的execute方法
}
           

2)        配置struts.xml。要求是在登入時,如果類型校驗沒有通過的話,那麼還是要跳到input.jsp的界面,如果成功,那麼就轉入welcom.jsp界面。

<!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.custom.i18n.resources" value="mess"/>
	<constant name="struts.i18n.encoding" value="GBK"/>
	<package name="lee" extends="struts-default">
	<!-- 定義處理使用者請求的Action -->
		<action name="login" class="org.crazyit.app.action.LoginAction">
			<!-- 配置名為input的邏輯視圖,當轉換失敗後轉入該邏輯視圖 -->
			<result name="input">/WEB-INF/content/input.jsp</result>
			<!-- 配置名為success的邏輯視圖 -->			<result>/WEB-INF/content/welcome.jsp</result> 		<result name="error">/WEB-INF/content/welcome.jsp</result> 
		</action>
	<action name="*">
		<result>/WEB-INF/content/{1}.jsp</result>
		</action>
	</package>
</struts>
           

3)        建立JSP的視圖界面,該界面中需要加入<s:fielderror/>的标簽,隻有這樣才可以輸出類型轉換的錯誤資訊。下面是input.jsp界面。

<body>
<s:fielderror />
<h2>類型轉換的錯誤處理</h2>
<p><b>請輸入使用者資訊</b></p>
<s:form action="login">
	<s:textfield name="user.name" label="使用者名"/>
	<s:textfield name="user.age" label="年齡"/>
	<s:textfield name="user.birth" label="生日"/>
	<tr>
		<td colspan="2"><s:submit value="轉換" theme="simple"/>
		<s:reset value="重填" theme="simple"/></td>
	</tr>
</s:form>
</body>
           

4)        當然還少不了domain的對象User,下面就建立個User.java.

public class User
{
	private String name;
	private Integer age;
	private Date birth;
	// 省略setter和getter方法
	

	}
           

5)        指定在校驗某個字段無效時,使用xwork.default.invalid.fieldvalue的消息作為标準的資訊提示,注意放在檔案的根目錄下。同時,在JSP的界面上要加入标簽<s:fielderror/>。下面的檔案是mess.properties

xwork.default.invalid.fieldvalue={0}字段無效
           

6)        在第(5)中是對JSP中的表單中的參數做校驗,然後輸出對應的表單中name的值錯誤資訊提示。如果要用特定的字段指定特别的資訊,即對User類中的birth指定特定的資訊提示,那麼就要用這個形式:invalid.fieldvalue.<propName>=<tipMsg>。其中propName就是類型轉換的屬性名,如:user.birth.下面是LoginAction.properties,這個檔案應該放在XXAction的同包名下。

invalid.fieldvalue.user.birth=生日資訊必須滿足yyyy-MM-dd格式
           

7)        最後的頁面圖。

Struts2之類型轉換中的錯誤

2. 處理集合屬性的轉換錯誤

     假如Action的類中含有集合屬性,例如類裡含有list屬性,那我們應該如何處理呢?

1)        建立LoginAction.java

public class LoginAction extends ActionSupport
{
	private List<User> users;
	// users的setter和getter方法
	public void setUsers(List<User> users)
	{
		this.users = users;
	}
	public List<User> getUsers()
	{
		return users;
	}
}
           

2)        定義xwork-conversion.properties說明User的執行個體對象。這裡要提一下,這是一注冊類的轉換器。這裡用的是全局類型轉換器,而如果是局部類型轉換器,那麼應該使用:<propName>=<ConverterClass>,即user= com.owen.app.converter.UserConverter.

com.owen.app.domain.User=com.owen.app.converter.UserConverter
           

3)        指定集合元素的類。

public class UserConverter extends StrutsTypeConverter
{
	// 實作将字元串類型轉換成複合類型的方法
	public Object convertFromString(Map context
		, String[] values , Class toClass)
	{
		// 建立一個User執行個體
		User user = new User();
		// 隻處理請求參數數組第一個數組元素,
		// 并将該字元串以英文逗号分割成兩個字元串
		String[] userValues = values[0].split(",");
		// 為User執行個體指派
		user.setName(userValues[0]);
		user.setPass(userValues[1]);
		// 傳回轉換來的User執行個體
		return user;
	}
	// 實作将複合類型轉換成字元串類型的方法
	public String convertToString(Map context, Object o)
	{
		// 将需要轉換的值強制類型轉換為User執行個體
		User user = (User) o;
		return "<" + user.getName() + ","
			+ user.getPass() + ">";
	}
}
           

4)        建立JSP有界面:input.jsp

<body>
<s:fielderror />
<h3>類型轉換的錯誤處理</h3>
<s:form action="login">
	<s:iterator value="{0, 1, 2}" status="stat">
		<!-- 将會依次生成多個請求參數 -->
		<s:textfield name="users[%{#stat.index}]" 
			label="第%{#stat.index}個使用者資訊"/>
	</s:iterator>
	<tr>
		<td colspan="2"><s:submit value="轉換" theme="simple"/>
		<s:reset value="重填" theme="simple"/></td>
	</tr>
</s:form>
</body>
           

5)        其它資訊與上一個例子相同

6)        結果

Struts2之類型轉換中的錯誤

3. Struts2類型轉換處理流程

Struts2之類型轉換中的錯誤