【Struts2】:基於OGNL的型別轉換

連江偉發表於2016-06-30

        藉助於內建的型別轉換器,Struts2可以完成字串和基本型別之間的型別轉換。除此之外,藉助於OGNL表示式的支援,Struts2允許使用另一種簡單方式將請求引數轉換成複合型別。系統的Action類的程式碼片段如下:

public class LoginAction extends ActionSupport
{
	// 使用User型別的成員變數封裝請求引數
	private User user;
	private String tip;

	// user的setter和getter方法
	public void setUser(User user)
	{
		this.user = user;
	}
	public User getUser()
	{
		return this.user;
	}
	public String execute() throws Exception
	{
		// 通過user的name屬性和pass屬性來判斷控制邏輯
		if (getUser().getName().equals("ljw")
			&& getUser().getPass().equals("123") )
		{
			addActionMessage("登入成功");
			return SUCCESS;
		}
		addActionMessage("登入失敗!!");
		return ERROR;
	}
}

從上面Action的程式碼可以看出,該請求Action裡包含一個User型別屬性——這個屬性需要進行型別轉換,Struts2框架接受到HTTP請求引數後,需要將這些請求引數封裝成User物件。
但Struts2提供的OGNL表示式允許開發者無須任何特殊處理,只需要在定義表單域時使用OGNL表示式來定義表單域的name屬性。JSP頁面的表單程式碼如下:
<body>
<h3>利用OGNL的進行型別轉換</h3>
<s:form action="login">
	<!-- 該表單域封裝的請求引數名為user.name -->
	<s:textfield name="user.name" label="使用者名稱"/>
	<!-- 該表單域封裝的請求引數名為user.pass -->
	<s:textfield name="user.pass" label="密碼"/>
	<tr>
		<td colspan="2"><s:submit value="轉換" theme="simple"/>
		<s:reset value="重填" theme="simple"/></td>
	</tr>
</s:form>
</body>
上面的表單程式碼中定義了兩個單行文字框,對應兩個請求引數,請求引數名並不是普通引數名,而是user.name和user.pass的形式——這就是OGNL表示式的形式,Struts2會把user.name引數的值賦值給Action例項的user屬性的name屬性,並將user.pass引數的值賦值給Action例項的user屬性的pass屬性。
        通過這種方式,Struts2可以將普通請求引數轉換成複合型別物件,但在使用這種方式時有如下幾點需要注意:
        1 因為Struts2將通過反射來建立一個複合類(User類)的例項,因此係統必須為該複合類提供無引數的構造器。
        2 如果希望使用user.name請求引數的形式為Action例項的user屬性的name屬性賦值,則必須為user屬性對應的複合類(User類)提供setName()方法,因為Struts2是通過呼叫該方法來為該屬性賦值的。當然Action類中還應該包含getUser()方法。

相關文章