国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Petstore源碼追蹤記

2019-11-18 16:21:50
字體:
來源:轉載
供稿:網友
前言

透過前面的介紹,我們能夠了解Petstore中Model、Controller、View是如何相互合作,現在讓筆者來說明Petstore商業邏輯(Business Logic)的處理方式,首先讓我們先了解為什么要將商業邏輯與資料展現(PResentation)分開,如此做有下列的好處:

1.減少程序變動的沖擊:商業邏輯及資料展現彼此獨立,不因商業邏輯改變而影響資料展現的程序代碼,反之亦然。
2.易于維護:將商業邏輯集中管理,一旦日后有修改,僅須修改一個地方。
3.重復使用:商業邏輯若與資料展現層程序混在一起,如此商業邏輯只能服務一種使用者接口(Client),若將兩者分離,我們可以很容易擴充第二種使用者接口。
4.各司其職:資料展現的設計人員與商業邏輯的設計人員通常是不一樣的,彼此獨立讓術業有專攻,品質及效率皆能提升。

隱形角色
在追縱Petstore商業邏輯處理方式前,我們先來看看Petstore中的隱形角色,這些隱形角色在服務器(RI)激活時即默默準備好,待適當時機為Petstore中商業邏輯處理服務,所以筆者須先介紹它們。

請開啟
Petstore_home(注一)/src/apps/petstore/src/docroot/WEB-INF/web.xml
我們可以看到:
<!-- Encoding Filter Declaration Start -->
<filter>  //1.第一個Fliter
    <filter-name>EncodingFilter</filter-name>
    <display-name>EncodingFilter</display-name>
    <description>no description</description>
    <filter-class>com.sun.j2ee.blueprints.encodingfilter.web.EncodingFilter
</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
</filter>
<!-- Encoding Filter Declaration End -->
<!-- Signon Filter Declaration Start -->
<filter>  //2.第二個Filter
    <filter-name>SignOnFilter</filter-name>
    <display-name>SignOnFilter</display-name>
    <description>no description</description>
    <filter-class>com.sun.j2ee.blueprints.signon.web.SignOnFilter</filter-class>
</filter>
<!-- Signon Filter Declaration End -->

<!-- Encoding Filter Mapping Start-->
<filter-mapping> //第一個Filter對應
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Encoding Filter Mapping End -->
<!-- Signon Filter Mapping Start-->
<filter-mapping> //第二個Filter對應
    <filter-name>SignOnFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Signon Filter Mapping End -->

<!-- ComponentManager Listener -->
<listener> //3.第一個Listerner

<listener-class>com.sun.j2ee.blueprints.petstore.controller.web.PetstoreComponentManager</listener-class>
</listener>

<!-- SignOn Attribute Listener -->
<listener> //4.第二個Listerner

<listener-class>com.sun.j2ee.blueprints.petstore.controller.web.SignOnNotifier</listener-class>
</listener>


Filter與Listener是Servlet2.3增加的功能,Filter可以在接受使用者的Request之后,做一些檢查處理,若沒問題則把使用者要求的Response丟回給使用者,反之則丟回系統預設的處理畫面,最常使用的情況就是登入,在網頁應用系統中有些功能是必須登入才能使用,過去的做法我們會將登入檢查寫在這些個別功能上,如此會造成登入檢查若要修正,則必須逐支修改,造成時間浪費,運用Filter,我們可將登入檢查程序與其它程序獨立,日后容易維護。Listener則是增加對Context,session生命周期的控制,例如我們能夠在Session初始化時,將所需使用的資料一起產生,并將Reference存入Session,Seesion關閉時可順便將相關資源移除,如此資源集中控管,容易維護。

Encoding Filter
它的程序代碼位置在
Petstore_home/src/components/encodingfilter/src/com/sun/j2ee/blueprints/encodingfilter/web/EncodingFilter.java
,它會再讀取web.xml(位置在Petstore_home/src/apps/petstore/src/docroot/WEB-INF/web.xml)中的參數,決定編碼方式再將其設入Request中:

web.xml
<!-- Encoding Filter Declaration Start -->
  <filter>
    <filter-name>EncodingFilter</filter-name>
    <display-name>EncodingFilter</display-name>
    <description>no description</description>
    <filter-class>com.sun.j2ee.blueprints.encodingfilter.web.EncodingFilter
</filter-class>
    <init-param> //設定編碼方式參數
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>

EncodingFilter.java
public class EncodingFilter implements Filter {

    private FilterConfig config = null;
    // default to ASCII
    private String targetEncoding = "ASCII";

    //初始化時讀取參數
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
        this.targetEncoding = config.getInitParameter("encoding");
    }

    public void destroy() {
        config = null;
        targetEncoding = null;
    }
     //將編碼方式參數存入reqeust,結束此Filter
     public void doFilter(ServletRequest srequest, ServletResponse  sresponse,
    FilterChain chain)
        throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest)srequest;
        request.setCharacterEncoding(targetEncoding);
        // move on to the next
       chain.doFilter(srequest,sresponse);
    }
}


筆者覺得這個Filter滿有用的,可以單獨運用在傳統jsp+JavaBeans的Web application,在Tomcat3.2.x,預設編碼是UTF-8,所以我們處理中文時,必須自行在程序中處理,在存入數據庫前須將中文字編碼由Unicode轉成Big5;到了Tomcat3.3.x,Tomcat會從OS取得預設編碼方式,所以我們不必再自行處理;到了Tomcat4.0.x之后,情況又回到與Tomcat3.2.x一樣,筆者開發Web Application就碰到這個情況,歷經三個版本的Tomcat,程序改過來改過去的,盡做些白工,后來筆者改運用這個Filter,就不需在存入數據庫前須將中文字編碼由Unicode轉成Big5。

ComponentManager Listener

第二個Filter主要掌管登入,與本次主題有密切關系,為使流程順暢,所以稍后再說明。我們來看第一個Listener,它的主要功能是作為服務連結提供者,當使用者進入本系統時,應用服務器(Application Sever)會在Session產生時會建置儲存服務連結容器,并將其置入Session,待后續程序服務產生后使用。

DefaultComponentManager.java,源碼
Petstore_home/src/waf/src/controller/com/sun/j2ee/blueprints/waf/controller/web

public void sessionCreated(HttpSessionEvent se) {
     HttpSession session = se.getSession();
     //產生服務連結容器
     sl = ServiceLocator.getInstance();
     //將本Listener存入Session
     session.setAttribute(WebKeys.COMPONENT_MANAGER, this);
}

ServiceLacator.java,源碼在
Petstore_home/src/components/servicelocator/src/com/sun/j2ee/blueprints/servicelocator/web
,此類別寫法滿特別的,大家又可多學一種程序設計技巧,追縱前輩源碼,除了能夠了解各種功能如何設計之外,程序代碼分解(Refactor)、撰寫風格、設計技巧,對我們來說都是很重要的收獲!ServiceLacator基本上它是一個EJB及JMS資源連結服務提供者,且它的服務不因使用者不同而有所改變,所以它使用static寫法來達到這個效果。

public class ServiceLocator {

    private InitialContext ic;
    private Map cache; //used to hold references to EJBHomes/JMS Resources for
          //re-use

    private static ServiceLocator me;
    //初次宣告此對象時會執行初始化動作
    static {
      try {
        me = new ServiceLocator();
      } catch(ServiceLocatorException se) {
        System.err.println(se);
        se.printStackTrace(System.err);
      }
    }
    //建構子,產生JNDI連結及同步化HashMap容器
    private ServiceLocator() throws ServiceLocatorException  {
      try {
        ic = new InitialContext();
        cache = Collections.synchronizedMap(new HashMap());
      } catch (NamingException ne) {
            throw new ServiceLocatorException(ne);
      } catch (Exception e) {
            throw new ServiceLocatorException(e);
       }
    }

    //將本對象參考傳出
    static public ServiceLocator getInstance() {
      return me;
    }

以下略過…
}

上述ServiceLocator建構子中運用Collections的Static Method(靜態函式)synchronizedMap()來產生HashMap容器,依J2SDK API文件說法,透過此函式可產生出具同步化及安全執行緒的HashMap容器。

bill-轉自:csdn進入討論組討論。

(出處:http://m.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蒙城县| 保德县| 邯郸市| 长白| 南城县| 禹州市| 汝南县| 无锡市| 海晏县| 巨野县| 阿图什市| 鄄城县| 全州县| 成武县| 龙门县| 新密市| 濉溪县| 莱西市| 南召县| 拉萨市| 平原县| 庐江县| 扎兰屯市| 三河市| 广德县| 湖南省| 云南省| 安宁市| 石阡县| 无极县| 乌兰浩特市| 新晃| 吴旗县| 施甸县| 拉萨市| 盖州市| 彭泽县| 建阳市| 滨州市| 四平市| 乐业县|