Struts2UI標簽 Sturts2為了簡化我們的開發,也為我們提供了UI標簽...也就是 顯示頁面的標簽 ..... 但是呢,Struts2是服務端的框架,因此使用頁面的標簽是 需要在伺服器端解析然後再被瀏覽器解析 , 最後才顯示在頁面上的。 因此,它的性能是不夠HTML標簽好的...HTML直 ...
Struts2UI標簽
Sturts2為了簡化我們的開發,也為我們提供了UI標簽...也就是顯示頁面的標簽.....
但是呢,Struts2是服務端的框架,因此使用頁面的標簽是需要在伺服器端解析然後再被瀏覽器解析,最後才顯示在頁面上的。因此,它的性能是不夠HTML標簽好的...HTML直接就能夠被瀏覽器解析
還有一點是:我們在寫網頁的時候,肯定是需要使用div+css的頁面佈局的。使用Struts2UI標簽也沒法幹了....因此,除了有必要的話,才去使用Struts2UI標簽
簡單使用Struts2UI標簽
<%--我們發現,Struts2UI標簽用起來和HTML是差不多的--%>
<s:form id="form1" name="form1" method="POST" action="#">
<%--輸入框數據,lable就相當於我們以前外邊寫的數據--%>
<s:textfield label="用戶名" name="user.username"/>
<%--密碼框--%>
<s:password label="密碼" name="user.password"/>
<%--提交按鈕--%>
<s:submit value="提交"/>
</s:form>
當我們查看源文件的時候,發現Struts2UI標簽為我們自動加入了很多的標簽
設置主題
上面已經說了,Struts2UI標簽為我們自動加入了很多的標簽,那有的時候,我們不想要,或者換一種風格的話,怎麼辦???
Struts2UI標簽也為我們提供了“主題”這樣的功能...
當我們在表單中設置theme屬性為simple之後...我們發現源文件Struts2自動為我們添加的標簽全沒了。
如果我們想整個項目都是使用simple為主題的話,我們可以在配置文件中配置!
<constant name="struts.ui.theme" value="simple"/>
數據回顯
我們對數據回顯也不會陌生,在使用EL表達式的時候就已經用過了數據回顯了....那為啥數據回顯放在Struts2標簽這裡講解呢???因為Struts2也提供了數據回顯的支持,並且,使用數據回顯必須要使用Struts2的標簽...
按照正常思路寫數據回顯
在Struts中按照正常思路寫數據回顯是這樣的:
把數據放到request域中存儲,跳轉到對應的JSP頁面...
public String login() { //把數據存儲到域中 Map<String, Object> request = ActionContext.getContext().getContextMap(); request.put("username", "zhongfucheng"); request.put("password", "123"); return SUCCESS; }
JSP頁面使用Struts2標簽,設置value屬性就可以進行數據回顯了
<s:form id="form1" name="form1" method="POST" action="" >
<%--輸入框數據,lable就相當於我們以前外邊寫的數據--%>
<s:textfield label="用戶名" name="user.username" value="%{#request.username}"/>
<%--密碼框--%>
<s:password label="密碼" name="user.password"/>
<%--提交按鈕--%>
<s:submit value="提交"/>
</s:form>
- 效果:
Struts2提供的數據回顯
其實,上面的代碼已經實現了數據回顯,但Struts2提供了一個更巧妙的方法
也就是說,Struts2可以直接在name中就可以實現數據回顯了....要做的是:
- 我們回顯的數據在根元素下的,也就是保存在CompoundRoot中的數據【保存在根元素的數據不用使用#號就可以獲取】
因此,我們把想要回顯的數據放在CompoundRoot下
- 直接放在值棧的數據就是根元素數據
//得到值棧對象
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.set("username","zhongfucheng");
- 在JSP就可以直接獲取了
<s:textfield label="用戶名" name="username"/>
- 效果:
Struts2標簽:checkboxlist
參考自博文:http://www.blogjava.net/koradji/articles/307399.html
語法:
<s:checkboxlist name="" list="" listKey="" listValue="" value="" />
- name定義標簽名,用於接收畫面上選中的覆選框,故應與Action里定義的屬性一致,且多為數組;
- list定義集合變數,用於輸出覆選框到畫面上,一般在Action里定義一個List或Map屬性;
- listKey如果在Action里定義的是一個List,則往往會在List里定義一個Bean,它只有兩個屬性,其中一個(比如id)就在這裡設置;
- 如果在Action里定義的是一個Map,則Map的key就在這裡設置;
- listValue如果在Action里定義的是一個List,則往往會在List里定義一個Bean,它只有兩個屬性,另外一個(比如name)就在這裡設置;
- 如果在Action里定義的是一個Map,則Map的value就在這裡設置;
- value用於回顯畫面上被選中的覆選框,假如畫面有輸入檢查,如果有錯則返回原畫面並顯示出錯信息,這時候就需要使用它。
- 一般把它設成和name一致就可以了。
例子:
查詢了所有的角色,得到用戶與角色的所有id了。把封裝到數組中。
public String editUI() {
//把所有的角色查詢出來,帶過去給JSP頁面顯示
ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects());
//外邊已經傳了id過來了,我們要找到id對應的User
if (user != null &&user.getId() != null ) {
//直接獲取出來,後面JSP會根據User有getter就能讀取對應的信息!
user = userServiceImpl.findObjectById(user.getId());
//通過用戶的id得到所擁有UserRole
List<UserRole> roles = userServiceImpl.findRoleById(user.getId());
//把用戶擁有角色的id填充到數組中,數組最後回顯到JSP頁面
int i=0;
userRoleIds = new String[roles.size()];
for (UserRole role : roles) {
userRoleIds[i++] = role.getUserRoleId().getRole().getRoleId();
}
}
return "editUI";
}
name值的是數組,可以用於自動回顯。Action得到角色的id也是通過它
<s:checkboxlist list="#roleList" name="userRoleIds" listKey="roleId" listValue="name"></s:checkboxlist>
資源國際化
我們在學JSTL標簽的時候就涉及到了資源國際化,,,但是呢,在JSP的章節我並沒有寫博文來講解怎麼弄....一方面感覺JSP的資源國際化好麻煩,另一方面是感覺用的地方很少.....因此就沒有深入去瞭解它...
今天呢,學習到了Struts2的資源國際化了。重新看回JSP資源國際化的步驟,再對比一下Struts的資源國際化
Servlet和Struts資源國際化區別
在Servlet寫資源國際化的步驟:
- 寫資源文件
- 基礎名.properties【預設】
- 基礎名_語言簡稱_ 國家簡稱.properties
- 讀取配置文件
- jstl提供的格式化與國際化標簽庫。
在Struts2寫資源國際化的步驟:
- 寫資源文件
- 基礎名.properties【預設】
- 基礎名_語言簡稱_ 國家簡稱.properties
- 讀取配置文件再使用
- struts標簽獲取資源文件內容
區別:
Struts2載入資源文件更加簡單,通過常量配置即可!提供的Struts標簽更簡單使用
資源國際化Demo
下麵就使用Struts來寫一個資源國際化的Demo....
寫資源文件
值得註意的是:在IDEA下寫properties資源文件,如果涉及到中文,預設是不會幫我們編碼的。它是不像eclipse的...因此需要我們手動去設置的......設置的教程在我的IDEA博文中有...如果出現了這個問題,那就去IDEA博文下找唄。。。
在Struts中使用常量載入資源文件
我們直接在Struts中使用contant節點來載入我們自己寫的配置文件。值得註意的是:value的值是文件的全名(也就是說,如果有包,就把包名寫上)....並且,不需要寫上尾碼...
<constant name="struts.custom.i18n.resources" value="msg"></constant>
Struts標簽使用國際化
name的值是配置文件中配置的信息,寫上就行了!
<head>
<title><s:text name="title"></s:text></title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<form method="post" action="${pageContext.request.contextPath }/user_login.action">
<s:text name="username"></s:text> <input name="admin.userName"><br/>
<s:text name="psd"></s:text><input type="text" name="admin.pwd"><br/>
<input type="submit" value="登陸"><br/>
</form>
</body>
測試
註意,title已經替換成了中文了!!
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關註微信公眾號:Java3y