国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
用Stripes做Java Web開發(fā)
用Stripes做Java Web開發(fā)
2007年05月17日 星期四 12:34
 Stripes是一個以讓程序員的web開發(fā)簡單而高效為準則來設(shè)計的基于動作的開源Java web框架。傳統(tǒng)的Java web開發(fā)著眼于借去耦(Decoupling)來實現(xiàn)其靈活性,但導(dǎo)致多個的配置文件,額外的對象,和其他資源的分散。這些困難造成相當多的程序員的更高的學習時間和低下的效率。其結(jié)果是有些Java程序員被一些非Java的框架所吸引去了:Ruby on Rails或者Django。一些Java web框架,如Stripes,正在開始從這些非Java框架中汲取其成功經(jīng)驗:簡單而高效的開發(fā)。本文將介紹Stripes與其它如Struts之類基于動作的框架的區(qū)別和其提供的一些存在于Ruby on Rails之中的簡單性。

  圖1是典型的用Stripes寫的應(yīng)用程序中的正常事件流程和組件。


圖 1 典型Stripes流程

  如你所見,其流程基本上就是一個MVC框架。Stripes和其他的基于動作的框架的一個主要的區(qū)別是沒有一個外部的配置文件。我們隨后將看到,Stripes用annotation和約定而非配置來提高產(chǎn)出和減少雜亂。

  編寫你的第一個Stripe動作(Action)

  讓我們現(xiàn)在就開始通過創(chuàng)建Hello World例程來了解Stripes框架和理解其運作。HelloWorldAction類將提示用戶輸入姓氏和名字然后在另一個View里面顯示,首先我們來編寫controller類。

public class HelloWorldAction implements ActionBean {    

    @ValidateNestedProperties({
      @Validate(field = "firstName", required = true,
                on = {"hello"}),
      @Validate(field = "age", required = true, minvalue = 13,
                on = {"hello"})
    })
    private Person person;
    private ActionBeanContext context;
    
    @DefaultHandler
    public Resolution index() {
      return new ForwardResolution("Hello.jsp");
    }
        
    public Resolution hello() {
      return new ForwardResolution("SayHello.jsp");
    }

    public void setPerson(String person) {this.person = person;}
    public String getPerson() { return person;}
    public void setContext(ActionBeanContext c) {this.context = c; }
    public ActionBeanContext getContext() {return context; }
}

  Controller類是一個實現(xiàn)了Stripes特有接口ActionBean的POJO(Plain Old Java Object,譯注:讀破粥)。所有的Stripes動作類都要實現(xiàn)這一接口以讓StripesDispatcher servlet在運行服務(wù)時為其注入一個ActionBeanContext對象。ActionBeanContext對象可以讓你存取的對象如request、response、和servlet context等servlet API。大多數(shù)時候在Stripes應(yīng)用中是不用讀取這些底層API對象的。ActionBeanContext類還提供當前動作的狀態(tài)并可以添加信息消息和錯誤消息到當前動作中。ActionBeanContext的變量和其讀寫方法可以放在一個基類里面,因為所有的Stripes動作都要實現(xiàn)之。Controller類的其他部分對于任何Java程序員來說都是很面熟的。有一個Person對象和其讀寫方法是用來讀寫用戶的姓名給view的。雖然這僅僅是一個簡單的嵌套對象,Stripes可以通過Java集合、泛型支持、和下標化的屬性來實現(xiàn)更復(fù)雜完善的數(shù)據(jù)捆綁。因為Stripes可以處理復(fù)雜數(shù)據(jù)捆綁,你的領(lǐng)域?qū)ο?Domain Object)可以在其他需要它們的層重用。例如:通過Stripes你可以很容易的收集一個領(lǐng)域?qū)ο蟮男畔?,然后用其他的POJO框架,如Hibernate或者EJB3來對其進行持久化。

  Person對象變量上有一個Stripes驗證annotation用來保證用戶在激活hello方法的時候已經(jīng)輸入了姓名。如果用戶沒有輸入這兩個必需的變量,原始頁會被返回,并顯示一個相關(guān)的錯誤消息。該驗證只有在hello事件被申請的時候才會被激活,因為annotation的屬性中指定了(on = {"hello"})。Stripes還會使用實用默認法則,根據(jù)驗證方法和變量名稱產(chǎn)生一個錯誤信息。例如,如果Person類的firstName變量在提交的時候沒有提供,用戶將看到:

  Person First Name is a required field.

  這條消息是通過將Person.firstName進行刻讀化處理后得到的。如果有必要,這些錯誤消息可以被重載來提供更多的客戶自定義功能。

  另外還有一個Integer類型的變量age,是Person對象的一個屬性。Stripes首先試圖對request中命為person.age的parameter轉(zhuǎn)換為Integer類型,并將其捆綁到Person對象上。在Person對象的age變量被付值以后,Stripes將驗證該Integer值是否小于13。如果用戶輸入了一個字符串而非整數(shù),用戶得到這個消息:

  The value (Mark) entered in field Person Age must be a valid number.

  若是用戶輸入了一個小于13的整數(shù),用戶將看到這個消息:

  The minimum allowed value for Age is 13.

  同樣地,我們沒有必要為這些錯誤消息提供任何外部的配置文件。Annotation提供的驗證與你的變量在同一個位置上,使得程序員定位驗證、理解驗證的內(nèi)容、和對驗證進行維護變動更容易。

  這個Stripes動作還有兩個可被激活的方法(稱為事件)。事件是ActionBean類中有如下特征的方法:

  public Resolution eventName

  請注意index方法被標注為@DefaultHandler annotation。因為在本動作中有多個事件,其中一個必須被指定為默認事件。如果調(diào)用本動作的URL沒有指定哪個事件,Stripes則查找標注有@DefaultHandler annotation的事件,并執(zhí)行。

  顯示層(View)

  現(xiàn)在讓我們給Hello World例程加上顯示層的邏輯。Stripes默認支持JSP為顯示層的標準技術(shù),不過你也可以用其他的顯示層技術(shù),比如FreeMaker。除了Stripes的tag庫以外,沒有什么新的東西要學。Hello.jsp是初始的顯示,可以讓用戶輸入和提交姓名。

<%@ taglib prefix="stripes"
            uri="http://stripes.sourceforge.net/stripes.tld" %>
......
      <stripes:errors/>
      <stripes:form
          beanclass="com.
                     myco.
                     web.
                     stripes.
                     action.
                     example.
                     HelloWorldAction">
      Say hello to: <br>
      First name: <stripes:text name="person.firstName"/>
      <br>
      Age:<stripes:text name="person.age"/><br>
      <stripes:submit name="hello" value="Say Hello"/>
      </stripes:form>
......

這個JSP易讀易維護。而Stripes用于form和input的tag跟對應(yīng)的HTML代碼非常相似。stripes:form tag包含一個beanclass屬性,其值為我們前面定義的controller類的完整類名。我們可以用stripes:form中的action屬性來替換beanclass屬性,但是beanclass屬性可以讓你在以后對Stripes動作進行重構(gòu)的時候更加方便。如果你要用在stripes:form tag中使用action屬性,方法如下:

<stripes:form action="/example/HelloWorld.action">

  有一個stripes:input tag指定了一個名為person.firstName屬性,其作用是將其儲存的輸入值付給controller的Person對象的firstName變量中。最后,stripes:submit tag指定一個name屬性來告訴Stripes的HelloWorldAction類使用哪一個事件。

  我們現(xiàn)在已經(jīng)完成了提交姓名的值給HelloWorldAction,剩下的就是在另一個view中將其反饋給用戶了。

<%@ taglib prefix="stripes"
         uri="http://stripes.sourceforge.net/stripes.tld" %>
......
      <stripes:errors/>
      <h2>Hello ${actionBean.person.firstName} your age is
                ${actionBean.person.age} </h2>
      <p/>
      <stripes:link beanclass="com.myco.web.stripes.action.
                                     example.HelloWorldAction">
        Say Hello Again
      </stripes:link>
......

  本JSP將自己通過一個對動作的引用讀取person的姓名信息并顯示。為達到這一目的,Stripes自動在request的屬性中添加一個名為actionBean動作對象,以供JSTL存取。最后,我們用了一個strips:link tag來建立一個返回HelloWorldAction地鏈接從而可以讓我們輸入不同的姓名。我們以可以通過如下辦法顯式地創(chuàng)建一個指向index事件的stripes:link:

<stripes:link
    beanclass="com.myco.web.stripes.action.
                   example.HelloWorldAction"
    event="index">Say Hello Again</stripes:link>

  因為我們已經(jīng)用annotation把index方法標記為@DefaultHandler,Stripes無須event屬性也知道要執(zhí)行哪一個方法。

  用約定、不用配置文件

  我們現(xiàn)在有了Java組件,我們該做配置了,把動作映射的一個URL上,并將其連接到我們的兩個view上面去。等一下!我們在用Stripes,我們不需要外部配置文件!

  雖然這聽來好像好得不像是真的,但這的確是Stripes的一項最具生產(chǎn)效率的功能。Stripes使用約定而非配置文件來映射動作到URL上。我們也無須使用一個外部配置文件來把view映射到一個個標記名字上。這意味著程序員不用再為了一個標記名字——比方說SUCCESS——的實際來源,而在配置文件中跳來跳去了。沒有必要在Java和view組件的外部進行配線,因而導(dǎo)致更好地維護性和更高的生產(chǎn)率。

  Stripes是如何提供隱式的URL映射而無需在外部配置每一個動作或者而外的annotation呢?這個可以從Stripes在web.xml中的配置以及它是如何通過實用默認法建立URL映射來解釋。首先,我們來看看Servlet過濾器:StripesFilter。其在web.xml中的默認配置如下:

<filter>
    <display-name>Stripes Filter</display-name>
    <filter-name>StripesFilter</filter-name>
    <filter-class>
      net.sourceforge.stripes.controller.StripesFilter
    </filter-class>
      <init-param>
      <param-name>ActionResolver.UrlFilters</param-name>
      <param-value>/WEB-INF/classes</param-value>
    </init-param>
</filter>

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)于Java中static關(guān)鍵字的用法以及從內(nèi)存角度解析
java為什么要使用反射(☆)
IbatisNet開發(fā)使用小結(jié) 之一
JAVA對象比較器Comparator
怎樣對帶有不可序列化屬性的Java對象進行序列化
您不知道的 5 件事……: Java Collections API,第 2 部分
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服