1. 程式人生 > 其它 >Struts2【UI標籤、資料回顯、資源國際化】

Struts2【UI標籤、資料回顯、資源國際化】

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已經替換成了中文了!!

這裡寫圖片描述