Petstore源码追踪记(3)-商业逻辑处理(一)

原创 2003年01月28日 18:55:00

作者:欧宣修

 

图文并茂版请参考
http://www.javatwo.net/JavaPaper/Petstore-3_business_logic.pdf

前言
透过前面的介绍,我们能够了解PetstoreModelControllerView是如何相互合作,现在让笔者来说明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
ListenerServlet2.3增加的功能,Filter可以在接受使用者的Request之后,做一些检查处理,若没问题则把使用者要求的Response丢回给使用者,反之则丢回系统预设的处理画面,最常使用的情况就是登入,在网页应用系统中有些功能是必须登入才能使用,过去的做法我们会将登入检查写在这些个别功能上,如此会造成登入检查若要修正,则必须逐支修改,造成时间浪费,运用Filter,我们可将登入检查程序与其它程序独立,日后容易维护。Listener则是增加对Context,Session生命周期的控制,例如我们能够在Session初始化时,将所需使用的资料一起产生,并将Reference存入SessionSeesion关闭时可顺便将相关资源移除,如此资源集中控管,容易维护。

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+JavaBeansWeb Application,在Tomcat3.2.x,预设编码是UTF-8,所以我们处理中文时,必须自行在程序中处理,在存入数据库前须将中文字编码由Unicode转成Big5;到了Tomcat3.3.xTomcat会从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基本上它是一个EJBJMS资源连结服务提供者,且它的服务不因使用者不同而有所改变,所以它使用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建构子中运用CollectionsStatic Method(静态函式)synchronizedMap()来产生HashMap容器,依J2SDK API文件说法,透过此函式可产生出具同步化及安全执行绪的HashMap容器。


23种设计模式分析(2):创建型模式

1.1.3 Singleton模式   保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自...
  • zm1_1zm
  • zm1_1zm
  • 2017年03月20日 21:26
  • 156

Petstore源码追踪记(3)-商业逻辑处理(五)

 (接上期)Web tier当使用者输入http://localhost:8080/petstore/customer.do,MainServlet接收到Request,转到doProcess()函数...
  • jiangtao
  • jiangtao
  • 2003年01月31日 15:44
  • 2764

Petstore源码追踪记(3)-商业逻辑处理(三)

  (接上期)作者:欧宣修 图10 编译成功画面重新部署如:build deploy图11 部署成功画面现在我们可开启浏览器,依上述流程重新执行一次,当进入http://localhost:8080/...
  • bruce
  • bruce
  • 2003年01月28日 19:01
  • 1429

Petstore源码追踪记(3)-商业逻辑处理(四)

Petstore源码记纵记(3)-商业逻辑处理(下)                                          ( 欧宣修 )图文并茂版请参考http://www.javatw...
  • jiangtao
  • jiangtao
  • 2003年01月31日 15:32
  • 2159

Petstore源码追踪记(3)-商业逻辑处理(二)

使用者基本数据浏览流程=======================现在让我们进入主题-Petstore商业逻辑,笔者以使用者基本资料浏览流程为例,请激活cloudscape数据库:cloudscap...
  • bruce
  • bruce
  • 2003年01月28日 18:58
  • 1622

<java EE 项目:petstore> 从一个简单项目看 java web 如何在本jsp页面上对用户输入的格式进行限制与验证

项目说明: 在我们写一些类似于登入注册页面,需要用户输入信息时,往往要对用户的输入信息的格式进行验证与限制。一般我们会将表单提交后在另一个Servlet或jsp页面上进行验证,但是一出错页面就会重新...
  • STILLxjy
  • STILLxjy
  • 2017年06月28日 10:21
  • 534

webx--借用petstore快速入门

前言本博客记录来阿里实习的第一个任务–webx框架学习,会不断更新学习心得。配置对应环境,运行petstore通过官网给的命令行方法,来运行petstore petstore是java ee的经典学习...
  • zy416548283
  • zy416548283
  • 2015年06月29日 13:13
  • 3322

petstore结构的解读摘要(一)

petstore:zip包中的安装程序使用了ant对其进行编译    编译petstore前需要修改/src/bulid.properties    编译方法和步骤参考http://java.sun....
  • uhcdivad
  • uhcdivad
  • 2005年04月03日 17:57
  • 1797

Webx示例-PetStore分析1

转自:http://www.cnblogs.com/lddbupt/p/5578371.html 1. 下载源码   2. 启动容器,加载组件--WebxContextLoade...
  • hjwang1
  • hjwang1
  • 2016年09月22日 23:27
  • 896

应用逻辑(业务、商业逻辑)抽象出来

那东西主要就是将应用逻辑(业务、商业逻辑)抽象出来,与前端表现界面分开,从而体现三层、多层结构的易拓展、易维护性的特性。 业务逻辑又分为业务规则和业务外观分开设计的目的是提高应用程序的可伸缩性和可维护...
  • jingshuaizh
  • jingshuaizh
  • 2008年05月13日 15:07
  • 1473
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Petstore源码追踪记(3)-商业逻辑处理(一)
举报原因:
原因补充:

(最多只允许输入30个字)