posts - 297,  comments - 1618,  trackbacks - 0
           

          說明:本文經(jīng)過筆者對struts2.0.8自帶的實例struts2-blank-2.0.8學(xué)習(xí)而寫,對該例子進(jìn)行了部分修改,希望對廣大象要學(xué)習(xí)struts2的朋友有所幫助。

          一.             實例說明

           本例是Struts2的簡單實例,通過本工程的學(xué)習(xí),我們將會對struts2的表單以及表單驗證有一個初步的認(rèn)識、了解struts2的配置以及初探Struts2的本地化輸出。

          二.             編碼準(zhǔn)備

          1. 包的引入

          MyEclipseNetBeans中建立web工程,將所需的包放入WebRoot/lib目錄中,本實例所需的包有:

           commons-logging-1.1.jar

           freemarker-2.3.8.jar

           ognl-2.6.11.jar

           struts2-core-2.0.8.jar

           xwork-2.0.3.jar

           這些包在struts-2.0.8-all\struts-2.0.8\lib目錄下都可以找到,請讀者自行下載。

          2. web.xml的配置

          要使struts能正常工作,需修改web.xml的內(nèi)容,為其增加struts2FilterDispatcher,修改后的web.xml的內(nèi)容如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
              
          <display-name>Struts Blank</display-name>
              
          <filter>
                  
          <filter-name>struts2</filter-name>
                  
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
              
          </filter>

              
          <filter-mapping>
                  
          <filter-name>struts2</filter-name>
                  
          <url-pattern>/*</url-pattern>
              
          </filter-mapping>

              
          <welcome-file-list>
                  
          <welcome-file>index.html</welcome-file>
              
          </welcome-file-list>

          </web-app>

          3. 建立源碼目錄和jsp存放目錄

           src目錄下建立example文件夾,用于存放本實例的java文件等。在WebRoot文件夾下建立子文件夾example,用于存放本工程的jsp文件。

          三.             編碼

          1.       Welcome.jspLogin.jsp的編寫

          首先我們建立Welcome.jsp,該文件包含兩個鏈接,點擊“登錄”鏈接后跳轉(zhuǎn)到登錄信息輸入頁面,點擊“注冊”按鈕跳轉(zhuǎn)到注冊頁,為了學(xué)習(xí)struts2配置中的通配符使用,我們暫不實現(xiàn)注冊功能。Welcome.jsp的代碼如下:
          <%@ page contentType="text/html; charset=UTF-8" %>
          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head>
              
          <title>歡迎界面</title>
              
          <link href="<s:url value="/css/examplecss"/>" rel="stylesheet" type="text/css"/>
          </head>

          <body>
              
          <h3>導(dǎo)航</h3>
              
          <ul>
                  
          <li><href="<s:url value="/example/Login.jsp"/>">登錄</a></li>
                  
          <li><href="<s:url action="Register"/>">注冊</a></li>
              
          </ul>
          </body>
          </html>
           

          在該頁面的頂部,我們需要將struts2的標(biāo)簽庫引入,語句為:<%@ taglib prefix="s" uri="/struts-tags" %>

          在該頁面,主要用到struts2<s:url>標(biāo)簽,該頁面主要用到該標(biāo)簽的兩個屬性,分別為valueaction,其中action屬性表示用action來產(chǎn)生url,而value表示使用的目標(biāo)值。在頁面上點擊“查看源文件”按鈕,可看到生成的語句分別變?yōu)椋?/span>

          <link href="/struts2-blank-2.0.8/css/examplecss" rel="stylesheet" type="text/css"/>

          <a href="/struts2-blank-2.0.8/example/Login.jsp ">

          <a href="/struts2-blank-2.0.8/example/Register.action">

          由此可知使用該標(biāo)簽時,struts2會自動為我們帶上下文路徑,對于加了屬性action<s:url>標(biāo)簽,后面會自動帶上“.action”作為后綴。

           點擊“登錄”鏈接后,跳轉(zhuǎn)到Login.jsp頁面,該頁包含一個登錄表單,讓用戶輸入用戶名和密碼信息,用戶點擊提交按鈕,跳轉(zhuǎn)到指定的Action——Login進(jìn)行處理。Login.jsp的內(nèi)容如下:

          <%@ page contentType="text/html; charset=UTF-8" %>
          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head>
              
          <title>登錄</title>
          </head>
          <body>
          <s:form action="Login">
              
          <s:textfield name="username" label="用戶名"/>
              
          <s:password name="password"  label="密碼"/>
              
          <s:submit/>
          </s:form>
          </body>
          </html>

          該頁用到Struts2的表單標(biāo)簽<s:form><s:textfield><s:password>

           <s:form>action屬性表示表單提交后跳轉(zhuǎn)的action的名稱,此處為Login,該標(biāo)簽最終將生成HTMLform

           <s:textfield>標(biāo)簽類同于HTML<input type=”text” …>,其中name表示屬性域的名稱,label表示其前的提示名;

           <s:password>標(biāo)簽類同于HTML<input type=”password” …>,其namelabel類同于<s:textfield>,在此略。

          2.       配置文件struts.xmlexample.xml

          在上述jsp頁面,我們需跳轉(zhuǎn)到兩個Action地址,需在struts2的配置文件中配置,因當(dāng)工程變大時,一個龐大的struts2的配置極難維護(hù),建議按包路徑分開配置文件,所以本實例除了struts.xml配置文件外,還新增了一個額外的配置文件example.xml。該文件在struts.xml中引用。struts.xml放在src目錄下,該文件的內(nèi)容如下:
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
              "http://struts.apache.org/dtds/struts-2.0.dtd"
          >

          <struts>
              
          <constant name="struts.enable.DynamicMethodInvocation" value="false" />
              
          <constant name="struts.devMode" value="false" />
              
          <include file="example.xml"/>
              
          <!-- Add packages here -->
          </struts>

          可看到該文件通過<include file="example.xml"/>example.xml也作為struts2的配置文件。

          接下來,讓我們看看example.xml的配置:

          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC
                  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
                  "http://struts.apache.org/dtds/struts-2.0.dtd"
          >
          <struts>
          <package name="example" namespace="/example" extends="struts-default">
                  
          <action name="Login_input" class="example.Login">
                      
          <result name="input">/example/Login.jsp</result>
                      
          <result type="redirect-action">Menu</result>
                  
          </action>
                  
          <!-- 為學(xué)習(xí)struts2配置文件中通配符的使用,我們將未定義的action的引用都定向到example.ExampleSupport這個Action中, -->
                  
          <!-- 需定向的Action的名字傳到{1}中,eg.若請求Register這個action,當(dāng)ExampleSupport返回success時,跳轉(zhuǎn)到/example/Register.jsp -->
                  
          <action name="*" class="example.ExampleSupport">
                      
          <result>/example/{1}.jsp</result>
                  
          </action>
              
          </package>
          </struts>

          3.       LoginExampleSupport類以及驗證配置類Login-validation.xml的編寫

          在配置文件example.xml中,定義了兩個Action,下面我們用代碼來實現(xiàn)這兩個Action

          首先讓我們來看看ExampleSupport這個Action,這個Action不做任何操作,集成自ActionSupport,是本工程的各Action類的基類,該類的代碼如下:

          package example;
          import com.opensymphony.xwork2.ActionSupport;
          public class ExampleSupport extends ActionSupport {
          }


          接著讓我們來看看Login這個Action,該類繼承自ExampleSupport類,該Action需實現(xiàn)的業(yè)務(wù)邏輯如下:

          1)       當(dāng)用戶名(username)或密碼(password)有一者或兩者為空時,登錄不成功,跳轉(zhuǎn)到登錄信息輸入頁面;

          2)       當(dāng)用戶名(username)和密碼(password)都不為空時,登錄成功,跳轉(zhuǎn)到主菜單頁。

           對于用戶名和密碼的驗證,我們可以先考慮在Login類中用代碼實現(xiàn)的方式,此時該類的代碼如下:
          package example;

          public class Login extends ExampleSupport {
              
          public String execute() throws Exception {
                  
          if (isInvalid(getUsername())) 
                      
          return INPUT;
                  
          if (isInvalid(getPassword())) 
                      
          return INPUT;
                  
          return SUCCESS;
              }


              
          private boolean isInvalid(String value) {
                  
          return (value == null || value.length() == 0);
              }


              
          private String username;

              
          public String getUsername() {
                  
          return username;
              }


              
          public void setUsername(String username) {
                  
          this.username = username;
              }


              
          private String password;

              
          public String getPassword() {
                  
          return password;
              }


              
          public void setPassword(String password) {
                  
          this.password = password;
              }


          }


          當(dāng)工程變得愈發(fā)復(fù)雜時,這一小段一小段驗證代碼將會變得難以維護(hù),出于此原因,我們可以考慮采用struts2提供的驗證機制來實現(xiàn)。在src目錄下建立實現(xiàn)驗證的xml文件Login-validation.xml,為Login Action中的usernamepassword屬性增加非空驗證,驗證配置如下:

          <!DOCTYPE validators PUBLIC
                  "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
                  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"
          >

          <validators>
              
          <field name="username">
                  
          <field-validator type="requiredstring">
                      
          <message key="requiredstring"/>
                  
          </field-validator>
              
          </field>
              
          <field name="password">
                  
          <field-validator type="requiredstring">
                      
          <message key="requiredstring"/>
                  
          </field-validator>
              
          </field>
          </validators>

          當(dāng)驗證未通過時,將不會進(jìn)入Login Action中的execute方法,此時可刪除掉Login這個Action中的驗證內(nèi)容,該類的execute方法直接跳轉(zhuǎn)到SUCCESS即可,修改后的代碼略。

          4. 本地化輸出——資源文件package.properties

          為了本地化的輸出驗證錯誤信息,我們可以將參數(shù)信息和錯誤信息放入資源文件中,資源文件package.properties位于src/example目錄下,內(nèi)容如下:

          requiredstring = ${getText(fieldName)}不能為空.

          password = 密碼

          username = 用戶名

          Missing.message = 該部分尚未構(gòu)建,請稍候訪問...

          src/example目下下建立對應(yīng)的中文資源文件package_zh_CN.properties,為了避免中文亂碼問題,我們編寫一個批處理文件code.bat來對package.properties進(jìn)行編碼處理,主要用到native2ascii命令,其內(nèi)容如下:

          del package_zh_CN.properties

          copy package.properties package_zh_CN.properties.gbk

          native2ascii -encoding GBK package_zh_CN.properties.gbk package_zh_CN.properties

          del package_zh_CN.properties.gbk

          del *.bak

          運行該批處理文件,可在package_zh_CN.properties中可看到編碼后的資源文件信息,如下:

          requiredstring = ${getText(fieldName)}\u4e0d\u80fd\u4e3a\u7a7a.

          password = \u5bc6\u7801

          username = \u7528\u6237\u540d

          Missing.message = \u8be5\u90e8\u5206\u5c1a\u672a\u6784\u5efa\uff0c\u8bf7\u7a0d\u5019\u8bbf\u95ee...

          5. Register.jspMissing.jsp的編寫

          2中的example.xml中,我們配置了通配符映射,在Welcome.jsp中,我們使用

          <a href="<s:url action="Register"/>">注冊</a>

          其中的Registerexample中找不到相關(guān)映射,于是在用戶點擊“注冊”按鈕時,將映射到通配符所映射的Actionexample. ExampleSupport.而后跳轉(zhuǎn)到Register.jsp頁面,其代碼如下:
          <%@ page contentType="text/html; charset=UTF-8" %>
          <%@ taglib prefix="s" uri="/struts-tags" %>
          <s:include value="Missing.jsp"/>

          該頁面包含Missing.jsp頁面,其代碼如下:

          <%@ page contentType="text/html; charset=UTF-8" %>
          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head><title>未構(gòu)建頁面</title></head>

          <body>
          <p>
              
          <!-- 讀取配置文件中的對應(yīng)信息. -->
              
          <s:text name="Missing.message"/>
          </p>
          </body>
          </html>

          四.總結(jié)

           到此為止,我們的實例已構(gòu)建完,可通過瀏覽器訪問:http://localhost:8080/struts2-blank-2.0.8/example/Welcome.jsp看到我們的勞動成果。下面總結(jié)一下我們在該實例中學(xué)到的東西。

          1. 常用的一些標(biāo)簽的使用

          在本實例中,我們學(xué)習(xí)了<s:textfield><s:password><s:form>以及<s:url>的使用。

          2. 表單數(shù)據(jù)的驗證

          本文描述了一個簡單的表單的數(shù)據(jù)非空驗證。

          3. 本地化輸出錯誤提示信息

          在驗證失敗時,用資源文件來輸出錯誤提示信息。

          4Strut2配置文件中通配符的使用

          對于某些地址,我們可以使用在struts2的配置通配符來使其映射到某個Action中去。

          下一篇:實例篇:struts2-mailreader-2.0.8實例學(xué)習(xí)

          上一篇:基礎(chǔ)篇:本地化輸出

          posted on 2007-08-02 15:25 阿蜜果 閱讀(10788) 評論(13)  編輯  收藏 所屬分類: Struts2


          FeedBack:
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-08-03 11:59 | ehe
          hehe....  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-08-03 17:11 | Thomas
          非常棒,繼續(xù)努力,加油!  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-08-06 11:39 | 五星-六日
          摟主寫的東西對我的工作幫助很大。感謝的說  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-08-22 12:15 | 何紹親
          很好,我也正在學(xué)習(xí)  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-08-29 16:21 | 阿干
          不錯。。。!
          謝謝 謝星星。!
          ^_^!
          luky-52@163.com  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-09-04 16:42 | tlb
          我覺得,因該把學(xué)習(xí)中的BUG提出來,我學(xué)習(xí)這個例子遇到好多困難,最后還是各個擊破了。現(xiàn)在spring struts2 結(jié)合起來,遇到問題,怎樣定制錯誤葉面,根據(jù)exception 不同而現(xiàn)實msg,有興趣可以討論下 tlbfpx@163.com  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-09-22 08:24 | 阿信
          樓主JJ,你好啊,有幾個問題不懂,向你請教。

          1:Welcome.jsp中,
          <link href="<s:url value="/css/examplecss"/>" rel="stylesheet" type="text/css"/>
          是不是要找一個CSS文件,好象沒有啊。

          2:example.xml中的{1}代表什么意思啊?
          method="{1}" ,<result>/example/{1}.jsp</result>

          3:為什么Login.jsp中的<s:form action="Login">的action名字和 .xml文件中<action name="Login_input" method="{1}" class="example.Login">不一樣呢。  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-10-10 20:59 | lancy
          提出樓主給的這個例子的幾個錯誤:驗證的xml文件應(yīng)該放在包中;那個method={1}在這里應(yīng)該去掉,否則出錯;還有就是jsp中的那個action應(yīng)該與xml中的action中的那個name一樣,否則也會出錯。
            回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)[未登錄]
          2007-10-11 08:45 | 阿蜜果
          @lancy
          這篇是對struts2.0.8自帶的實例struts2-blank-2.0.8學(xué)習(xí)而寫,驗證的xml文件應(yīng)該放在包中,忘了說明了,呵呵
          那個method={1}的是要去掉的,寫文章的時候忘了
          多謝提醒阿  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-11-01 18:29 | 中華信鴿
          寫的真不錯呀.  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2007-11-10 16:33 | arewei
          很不錯!
          謝謝啦!!  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2008-03-19 18:12 | tarzan
          謝謝,做得很好  回復(fù)  更多評論
            
          # re: Struts2學(xué)習(xí)進(jìn)階(實例篇一)——struts2-blank-2.0.8實例學(xué)習(xí)
          2008-03-20 09:30 | df
          @ehe
          hehe  回復(fù)  更多評論
            
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關(guān)注blog

          積分與排名

          • 積分 - 2296330
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 竹溪县| 灵山县| 乌恰县| 辽中县| 固始县| 包头市| 庆城县| 灵璧县| 措勤县| 岳池县| 广安市| 收藏| 河北省| 会昌县| 连江县| 定西市| 华池县| 吴堡县| 永宁县| 揭东县| 敦煌市| 武安市| 镇沅| 广宁县| 莆田市| 城固县| 崇州市| 通河县| 搜索| 汨罗市| 海城市| 广元市| 鄂尔多斯市| 远安县| 温宿县| 浦东新区| 奎屯市| 西城区| 鄂伦春自治旗| 镇雄县| 张掖市|