淺談Struts2前臺後臺的資料傳遞
剛接觸SSH,確實感覺到他的強大和便捷。在學習過程中遇到了一些困惑,解決後想要寫寫,在自己以後的程式設計中儘量避免,並幫助一些菜鳥朋友快速入門。
Struts2前臺後臺的資料傳遞問題,我要分兩方面說,首先,我要說後臺資料如何通過前臺使用者輸入來獲取的。至於Struts2跳轉流程這裡不做介紹。首先,Struts利用Action來接收前臺資料,他繼承了ActionSupport類。在前臺中,假設有username和password兩個屬性,如:
<body>
<form action="login.action">
使用者名稱:<input type="text" name="username"/></br>
密碼:<input type="password" name="password"/></br>
<input type="submit" value="註冊"/>
</form>
<a href="list.action">查詢使用者列表</a>
</body>
那麼在對應Action中,如LoginAction中,想要接收使用者輸入的資訊,就必須有和前臺接收引數同名的屬性,按上述程式碼,LoginAction中必須有username和password兩個屬性。其次,為了能夠獲取屬性,還要為這兩個屬性設定特有的get()set()方法,這樣Struts2才能呼叫這兩個方法對屬性獲取。第三,在獲取時,直接寫屬性名就可以。當然,LoginAction要實現ActionSupport。如:
public String execute(){
confirm.add(username, password);
System.out.println(username);
System.out.println(password);
return "success";
}
這樣在前臺使用者輸入的資訊就能被後臺獲取了。
第二我要說的是如何在前臺獲取後臺的資料。首先,要用Action訪問Servlet API。這裡不作為重點,只提供一種方法,即ServletActionContext訪問Servlet API。
public String list(){
List list=confirm.list();
ActionContext ct=ActionContext.getContext();
ct.put("box", list);
return "list";
}
用ActionContext.getContext()方法得到PageContext物件。ct.put()方法是將list連結串列放到名為“box”的裡面。box名是任意的。這樣就可以在前臺獲取了。
<table>
<s:iterator value="box" id="li">
<tr>
<td><s:property value="#li.username"/></td>
<td><s:property value="#li.password"/></td>
<td><a href="delete.action?id=<s:property value="#li.id"/>">刪除使用者</a><td>
</tr>
</s:iterator>
</table>
上面用到Struts2標籤,這裡不做解釋,請查API。iterator用來遍歷集合。value值就是後臺用put()方法放入的名稱,上題是box。property是輸出單一屬性,value為輸出內容。這裡重點說一下OGNL表示式。
OGNL為表示式,用來顯示物件屬性。用OGNL顯示屬性有兩種:
1、當訪問OGNL的Stack context里根物件的屬性時,可以省略物件名。
如:若foo為context的根物件,假設foo有blah屬性,前臺獲取該屬性時,只需寫:
blah;//呼叫了foo的getBlah()方法返回屬性值。
2、當訪問OGNL的Stack context裡非根物件的屬性時,要用#物件名.屬性訪問。
如:#person.name
下面的問題就是如何確定哪些是OGNL的Stack context里根物件,進而選擇用哪種方法。