Struts2 $,#,%詳解及實例代碼
最近在學ssh,一直搞不懂$,%,#的區(qū)別,做了點小練習,慢慢也懂了一點,將自己所學的也記錄下來吧。
存在一下一個實體entity:
public class Person { private int id ; private String Name ; public int getId() { return id; } public Person(int id, String name) { super(); this.id = id; Name = name; } public Person() { super(); } public void setId(int id) { this.id = id; } public String getName() { return Name; } public void setName(String name) { Name = name; } }
在struts2的Action中,寫了如下代碼:
@Override public String execute() throws Exception { //application Person p = new Person(1,"zhangsan") ; ActionContext.getContext().getApplication().put("person", p); //session Person p1 = new Person(3,"wangwu"); ActionContext.getContext().getSession().put("person", p1); //request Person p2 = new Person(2,"lisi"); ActionContext.getContext().put("person", p2) ; //servletContext Person p3 = new Person(5,"xiaoming"); ActionContext.getContext().getContextMap().put("person", p3); Person p4 = new Person(3,"wangwu"); ActionContext.getContext().getValueStack().push(p4); return "success"; }
分別在application,session,request,servletContext,valueStack中存入一個person對象,那么在JSP中我們可以按照一下方式獲?。?br />
person: <input type="text" name="name" value="${person }" /><br /> id: <input type="text" name="name" value="${person.id }" /><br /> name: <input type="text" name="name" value="${person.name }" /><br /> <hr>
以上代碼所得出的person信息時xiaoming的,即ActionContext.getContext().getContextMap()中存放的信息,通過查詢$的用法,發(fā)現(xiàn)$獲取對象的方式是有方式的,即
ActionContext.getContext().getContextMap() > ActionContext.getContext() >ActionContext.getContext().getSession() >ActionContext.getContext().getApplication(),對于不同的scope(范圍)中存在同名對象時,$的查找方式將會按照以上步驟進行,找到即輸出,沒有找到繼續(xù)上一級查找,到頂不存在時將輸出null。
那么$的用法為:${scope.object.attribute}
scope的屬性值為request,session,application,默認不寫時將按照上述所說的方案查找,找到即輸出相關屬性值。
在struts標簽中,存一個這樣的:
<s:property value="#application.person"/>
可以看出,此時用到了#號,個人認為,其實#和$的用法完全是一樣的,只要你將需要輸出的對象裝進不同范圍的map(servletContext,request,session和application),在view中展示時,使用<s:property value="#scope.object.attribute">跟$理解完全是一樣的。但是你在使用struts的標簽時,比如:
<s:textfield name="person.name"></s:textfield>
完全可以理解為
<input type="text" name="persom.name" id="person.name" value="<s:property value="#person.name"/>" />
即struts的標簽已經(jīng)在HTML的text中給我們封裝了<s:property value="#target.name"/>,可以給我省去很多代碼的。
同理,那么#的用法為:<s:property value="#scope.object.attribute" />
當然完全可以使用struts2給我們定義的標簽,這樣完全可以省去寫過多重復代碼的麻煩。其實#還有其他的用法,比如用來構造map等對象,但是個人覺得在view中寫過多代碼的時代已經(jīng)過去,這種用法已經(jīng)沒有太多的意義,況且這次我只寫出在view展示的過程,因此其它地方不扯了。
最后,扯一點%的用法,簡單的看,%{}就是字符串計算表達式,舉個例子,view中存在某個環(huán)節(jié),一般都存在CRUD等基本功能,對于add和uppdate功能,完全可以在同一個頁面完成,不同的是我們提交的地址是不同的,比如可能只這樣的:對于add方法,地址為user_add.action,對于udpate方法,地址為user_update.action,那么在form中,可以使用%進行判斷:
<s:form action="user_%{ id == 0 ? 'add' : 'update' }"></form>
呵呵,這樣以前的兩個頁面現(xiàn)在完全一個頁面可以解決掉。
同理,%與struts中的if,ifelse等判斷標簽聯(lián)合起來用得比較多,畢竟是比較的嗎。。。。
<s:if test="%{false}"> <div>Will Not Be Executed</div> </s:if> <s:elseif test="%{true}"> <div>Will Be Executed</div> </s:elseif> <s:else> <div>Will Not Be Executed</div> </s:else>
最后,說說這個%很有用的做法,假設存在一個列表展示student全部及格的成績(即不及格的成績將不會展示在上面),如果使用的%將是非常簡單的。不扯,先上代碼:
public class Stduent implements java.io.Serializable{ private static final long serialVersionUID = -691038814755396419L; private int id ; private String name ; private int score ; private String subject ; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } /** * 此處判斷成績是否及格 * @param socre * @return */ public boolean isPast(int socre){ return getScore() > 60 ; } }
那么,現(xiàn)在數(shù)據(jù)庫中查找學生成績,放到list中暫時存放起來,在JSP頁面,我們可以使用以下代碼來控成績制輸出是否及格:
<s:iterator value="#allUser"> <!-- 判斷是否過線,過線即輸出,否則舍去! --> <s:if test="#session.user.isPast(score)"> name: <s:textfield name="name"></s:textfield> score: <s:textfield name="score"></s:textfield>\ subject:<s:textfield name="subject"></s:textfield> </s:if> </s:iterator>
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- struts2+spring+hibernate分頁代碼[比較多]
- ajax+json+Struts2實現(xiàn)list傳遞實例講解
- 關于Struts2的類型轉換詳解
- java中struts2實現(xiàn)文件上傳下載功能實例解析
- 使用maven+eclipse搭建struts2開發(fā)環(huán)境
- struts2單個文件上傳的兩種實現(xiàn)方式
- struts2+jquery實現(xiàn)ajax登陸實例詳解
- Java(基于Struts2) 分頁實現(xiàn)代碼
- Struts2的s:radio標簽使用及用jquery添加change事件
- java Struts2 在攔截器里的跳轉問題
- struts2中一個表單中提交多個請求的例子(多個提交按鈕)
- struts2 jquery 打造無限層次的樹
相關文章
基于Java的Socket編寫的C/S聊天程序實現(xiàn)
這篇文章主要介紹了基于Java的Socket編寫的C/S聊天程序實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03emoji表情與unicode編碼互轉的實現(xiàn)(JS,JAVA,C#)
這篇文章主要介紹了emoji表情與unicode編碼互轉的實現(xiàn)(JS,JAVA,C#),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01