官术网_书友最值得收藏!

6.7 在Struts中使用Velocity

的模板語言。在WebWork早期版本中是默認的模板編寫語言,不過升級Struts2后更加推薦使用FreeMarker,因為它有比Velocity更好的錯誤報告,支持JSP Tag,還有其他一些細微優點。當然,它們都是JSP很好的替代品。由Velocity編寫的文件后綴名為“.vm”。(請參考第5章中關于Velocity Result的介紹)。

本節介紹Velocity在Struts2中是如何應用的,Velocity的詳細使用方法請參考Velocity文檔。Velocity是apache基金會支持的一個項目,可以訪問它的網站http://velocity.apache.org/來學習它。

6.7.1 最簡單的應用

開始使用velocity,首先需要保證所有的依賴都已經被加入到工程的CLASSPATH。其次,struts-default.xml中要配置好VelocityResult,它將映射action和模板。這里給出的例子功能與6.6節給出的基本一樣,只是把登錄功能改成注冊功能。具體步驟如下:

1)在web.xml文件配置關于Struts2和velocity,具體內容如實例6-23所示。

【實例6-23】web.xml配置文件:web.xml

01          <filter>
02                <filter-name>struts2</filter-name>
03                <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
04          </filter>
05          <!--FilterDispatcher用來初始化Struts2并且處理所有的Web請求-->
06          <filter-mapping>
07                <filter-name>struts2</filter-name>
08                <url-pattern>/*</url-pattern>
09          </filter-mapping>
10          <servlet>
11                <servlet-name>velocity</servlet-name>
12                <servlet-class>org.apache.velocity.tools.view.VelocityViewServlet</servlet-
13     class>
14          </servlet>
15          <servlet-mapping>
16                <servlet-name>velocity</servlet-name>
17                <url-pattern>*.vm</url-pattern>
18          </servlet-mapping>
19          <welcome-file-list>
20                <welcome-file>index.jsp</welcome-file>
21          </welcome-file-list>
22     </web-app>

【代碼剖析】上述代碼的第6行到第9行實現對Struts2核心過濾器的配置,接著配置類velocity,該類支持在velocity中進行一些配置。

2)利用velocity模板創建出關于注冊、注冊成功和注冊失敗頁面,具體內容如實例6-24、實例6-25和實例6-26所示。

【實例6-24】關于注冊頁面:register.vm

01     <html>
02          <head>
03                <title>register</title>
04          </head>
05          <body>
06                <form action="userRegister.action" method="post">
07                     <table align="center">
08                          <tr>
09                                <td>
10                                    注冊頁面
11                                </td>
12                                <td>
13                                </td>
14                          </tr>
15                          <tr>
16                               <td>         <!--關于用戶名輸入框-->
17                                    用戶名:
18                                     <input type="text" name="username">
19                                </td>
20                          </tr>
21                          <tr>
22                               <td>         <!--關于密碼輸入框-->
23                                    密碼:
24                                     <input type="password"
25     name="password">
26
27                                </td>
28                          </tr>
29                          <tr>
30                               <td>         <!--關于年齡輸入框-->
31                                    年齡:
32                                     <input type="text" name="age">
33
34                                </td>
35                          </tr>
36                          <tr>
37                               <td>         <!--關于提交按鈕-->
38                                     <input type="submit" name="submit"
39     value="提交" />
40                                </td>
41                          </tr>
42                     </table>
43                </form>
44          </body>
45     </html>

【運行程序】瀏覽該頁面,結果如圖6.19所示。

【代碼剖析】上述代碼只是普通的HTML代碼,不過該文件的后綴名.vm。

【實例6-25】關于注冊成功頁面:success.vm

01     <html>
02          <head>
03                <title>success</title>
04          </head>
05          <body>
06               以下是您注冊的信息:
07                <br>
08               用戶名:$username                        <!--顯示用戶名-->
09                <br>
10               密碼:$password                          <!--顯示密碼-->
11                <br>
12               年齡:$age                              <!--顯示年齡-->
13                <br>
14          </body>
15     </html>

【運行程序】注冊成功,結果如圖6.20所示。

圖6.19 注冊頁面

圖6.20 注冊成功

【代碼剖析】上述代碼中通過$屬性名,來輸出保存在Session中user對象相應屬性的值。

【實例6-26】關于登錄失敗頁面:error.vm

01     <html>
02          <head>
03                <title>error</title>
04          </head>
05          <body>
06               $state                                               <!--顯示相應的信息-->
07          </body>
08     </html>

【運行程序】注冊失敗,結果如圖6.21所示。

圖6.21 注冊失敗

【代碼剖析】上述代碼中第6行$state表示輸出保存在ActionContext中的值。

3)建立Action類,該類主要通過獲取HTTP請求、參數等,然后實現該項目的邏輯功能,具體內容如實例6-27所示。

【實例6-27】關于Action類:RegiserAction.java

01     public class RegiserAction implements Action {
02          private String username;                               //關于用戶名變量
03          private String password;                               //關于密碼變量
04          private int age;                                     //關于年齡變量
05          public String getUsername() {                           //設置用戶名的getter和setter方法
06                return username;
07          }
08          public void setUsername(String username) {
09                this.username = username;
10          }
11          public String getPassword() {                           //設置密碼的getter和setter方法
12                return password;
13          }
14          public void setPassword(String password) {
15                this.password = password;
16          }
17          public int getAge() {                                 //設置年齡的getter和setter方法
18                return age;
19          }
20          public void setAge(int age) {
21                this.age = age;
22          }
23          public String execute() throws Exception {                //重寫執行方法
24               // 判斷注冊的用戶名是否存在
25                ActionContext ctx = ActionContext.getContext();
26                if (this.getUsername().equals("cjgong")) {
27                    ctx.put("state", "該用戶名已經存在, 請重新注冊");
28                    return "error";                          //返回出錯字符串
29                } else {
30                     ctx.put("username", this.getUsername());
31                     ctx.put("password", this.getPassword());
32                     ctx.put("age", this.getUsername());
33                    return "success";                        //返回成功字符串
34                }
35          }
36     }

【代碼剖析】上述代碼首先創建了關于用戶名字和密碼的屬性,然后為這些屬性創建方法,最后在execute()方法中實現了該項目的邏輯功能。

如果想讓該項目正常運行,還必須在struts.xml文件中配置上述代碼,具體內容如實例6-28所示。

【實例6-28】關于struts配置文件:struts.xml

01     <struts>
02          <package name="com" extends="struts-default">
03                <action name="*">
04                     <result type="velocity">/userRegister/{1}.vm</result>
05                </action>
06                <action name="userRegister" class="com.cjg.RegiserAction">
07                    <!--指定result的type為velocity-->
08                     <result name="success" type="velocity">
09                          /userRegister/success.vm
10                     </result>
11                     <result name="error" type="velocity">
12                          /userRegister/error.vm
13                     </result>
14                </action>
15          </package>
16     </struts>

【代碼剖析】上述代碼中將標簽<result>的type設為velocity,當注冊成功則會轉向success.vm,當注冊失敗則會轉向error.vm。

6.7.2 變量解析

在Velocity中,將從幾個不同的位置查找變量。順序如下:

1)值棧(value stack)。

2)action上下文(context)。

3)內置對象。

Velocity中內置對象如表6.27所示。

表6.27 Velocity內置對象表

6.7.3 配置Velocity

有時可能希望擴展Struts2提供的Velocity支持。最常見的原因是希望加入自己的標簽,就像從Struts2內建的標簽中擴展一樣。

想要這樣做,寫一個新的擴展自com.opensymphony.webwork. views.velocity.VelocityManager的類或者也可以覆蓋它,然后增加如下內容到webwork.properties:

webwork.velocity.manager.classname = com.yourcompany.YourVelocityManager

可以通過替換velocity.properties中的配置項來配置Velocity。

6.7.4 在VM文件中使用標簽

Velocity標簽是WebWork提供的一般Tag的擴展,只要簡單地了解這些標簽的訪問方式: #sxxx (...) ... #end (),就可以馬上開始使用了。

注意

“#s”后面是沒有空格的,它與標簽名稱直接連在一起(雖然不會發生什么混亂,但在閱讀上實在很不舒服,而且Velocity沒有采用主流的XML格式)。

還是那個例子,在JSP中可能這樣創建一個form:

<s:form action="updatePerson">
    <s:textfield label="First name" name="firstName"/>
    <s:submit value="Update"/>
</s:form>

在Velocity中同樣的form這樣創建:

#sform ("action=updatePerson")
    #stextfield ("label=First name" "name=firstName")
    #ssubmit ("value=Update")
#end

在上面的例子中注意到,一些標簽需要“#end”聲明,而其他的卻不需要。這是由于Velocity中的限制,如果有塊(block)或者內聯(inline)標簽在前面,標簽必須聲明#end。而默認情況下所有的標簽都是內聯(inline)的,除了很少的幾個,例如form標簽。

主站蜘蛛池模板: 榆中县| 双鸭山市| 大关县| 晋江市| 绵阳市| 阳泉市| 鲁山县| 中山市| 四川省| 巴楚县| 北碚区| 治县。| 丰顺县| 太康县| 长顺县| 鄄城县| 五常市| 铜山县| 昌吉市| 开鲁县| 中超| 固镇县| 盐津县| 鞍山市| 临邑县| 宁远县| 松原市| 焉耆| 澳门| 马公市| 和平县| 涞水县| 榆树市| 大英县| 龙游县| 江永县| 栖霞市| 邻水| 渝中区| 高台县| 依兰县|