一.概述
设计模式是对重复出现的问题的一种可以重用的解决方法,其本质其实是解偶.
1.J2EE应用模型的分层 (1)服务器端业务逻辑
(2)服务器端表示层
(3)客户端表示层
2.J2EE的设计模式 (1)表示层体系结构模式
(2)表示层高级体系结构模式
(3)表示层伸缩性模式
(4)业务层模式
(5)数据传递模式
(6)数据库模式
二.详解
1.表示层体系结构模式
1.1前端控制模式
通过创建统一而且集中的组建来执行公共的任务,在J2EE的功能是截取所有的请求,并根据选择利用这个前端控制器将请求转发到一个页面控制器,页面控制器解析用户的请求,选择具体的业务逻辑,并根据结果转到页面视图
一个Servlet可以作为一个前端控制器,也可以作为一个页面控制器,这个servlet调用请求所应该执行的业务逻辑,并根据业务逻辑的结果返回到具体的显示页面..
1.1.1.Struts框架前端模式的实现
Actionservlet是Struts框架的主要Servlet,所有请求都会通过它.在ActionServelt中,它会处理如下工作
1)ActionServelt调用RequestProcessor的Process方法处理公共任务
2)RequestProcessor得到请求对应的Action处理请求的具体工作
在RequestProcessor的process方法中最后会调用ProcessActionPerform方法,这就是一个命名模式的实现,将具体请求的工作分配到Action
1.2.1MVC模式
这个模式是Struts框架所遵循的模式,利用Model2构架来解偶,它在J2EE的工能为根据视图层,控制层和模型层3层的不同功能实现各层任务.
(1) 视图层提供显示页面的功能.
(2)控制器层则接收用户输入,并转到模型层来处理结果
(3)模型层处理业务逻辑在选择视图层的显示页面来完成工作
常见如下
*Struts框架的实现
*JeanBean或者EJB模型层,JSP或者HTML作为视图层,Servelt作为控制器
1.2.2装饰模式
该模式或为客户端提供一个透明的扩充某实例功能的方法.该方法的返回类型就是这个实例,在客户端不断调用这个方法的同时,该实例的内部表象已经随着功能改变完全不同了.
J2EE设计模式中的"装饰模式"
servelt本身就是支持装饰器模式,它的表现是装饰一个request请求,利用装饰器类截获所有发送给目标对象的请求,并执行需要的工作,完成工作之后再把请求转发到下一个装饰器,直到没有了装饰器,最后将请求发送到Servlet
Servlet利用过滤器来拦截请求和响应.在请求到达Servelt前,为这个请求做一些额外处理.过滤器可以被看成一个程序,每个过滤器之间都能互相传递.
过滤器Filter接口代码:
public interface Filter
{
public abstract void init(FilterConfig filterconfig) throwsException
//do Filter方法的FilterChain参数就是为了实现装饰器模式的必要条件
public abstrat void doFilter(ServletRequest serveltrequest,ServeltResponse servletsponse,FilterChain filterchain) throws IOException,servletExcetpion;
public abstract void destroy();
}
Filter()对象十分重用,doFilter()方法最后会调用FilterChain对象的doFilter()方法,FilterChain对象的doFilter()方法会激活下一个相关的过滤器
一个过滤器
这个过滤器SetCharacterEncodingFilter被用在当request请求到达Servelt前,为request的参数信息的字符编码进行设定
SetCharcterEncodingFilter.java(省略)
配置过滤器如下:
<filter>
<filter-name>Set character</filter-name>
<filter-class>XXX.XXX.SetcharacterEncodingFilter</filter-class>声明过滤器的java实体名
<init-param>/*表明了过滤器要传入的初始化方法*/
<param-name>encoding</param-name>
<param-value>UTF-8</param-valie>
</init-param>
</filter>
1.3.1表示层高级体系结构模式
1)复合视图模式(合成模式):提供一个树状的对象结构,树枝类与树叶类都实现同一个接口,以便客户端在调用任何对象时都只需要调用该树状结构的根接口就可以了
2) 复合视图在服务器端表示层使用,利用的合成模式的思想将视图的布局从视图中抽离出来,形成由一系列通用组件组成的模板
把视图("岛航","页眉","页脚"和"主体")的集合,每个元素是一个结点,而每个元素也可以是一个容器,包含更多的子元素.
模板可以被看成是接口,视图则可被看成树枝结点和树叶结点
1<?xml version="10" encoding="utf-8"?>
2<views>
3<view template="Template.jsp" name="page1">
4<include name="导航" url="navigation.jsp">
5<include name="页眉" url="header.jsp">
6<include name="主体" url="body1.jsp">
7<include name="页脚" url="footer.jsp">
8</view>
9<view template="Template2.jsp" name="page2">
10<include name="首页" url="template.jsp">
11</view>
12</views>
1.3.2视图助手模式
此模式避免视图过于特殊化,功能是使一组视图助手将模型数据转换成一种中间数据模式.视图或视图助手能够将中间数据模型转换成一种合适表达给用户的形式如"html""xml"
(1)标签的工作方式
标签库用来帮助程序员通过简单的代码构造实现页面逻辑.一个标签应该继承javax.servlet.jsp.tagext.tagsupport,并给出doStartTag和doEndTag两个方法来实现
doStartTag方法:在标签开始时由Jsp容器调用,通常在这个方法中实现业务逻辑
doEndTag方法:在标签结束时由JSP容器调用,通常在这个方法控制输出.
(2)标签的实现
以下是Struts框架提供的ConditionalTagBas部分代码
ConditionalTagBas
1public int doStartTag() throws JspException{
2 //doStartTag()表示标签开始
3 if(condition())
4 return(EVAL_BODY_INCLUDE);
5 //EVAL_BODY_INCLUDE告诉JSP容器标签正文的内容,并把这些内容送入输出流
6 else
7 return(SKIP_BODY);
8 //SKIP_BODY告诉JSP容器不要处理标签正文的内容
9 }
10public int doEndTag() throws JspException{
11//doEndTag() 表示标签结束
12 return(EVAL_PAGE);
13//EVAL_PAGE标签处理完毕
14}
1.3.3服务工作模式
服务工作者模式将页面流转,前端控制模式,视图助手模式合在一起使用,表示"请求--转发--视图"的整套流程,服务器工作者模式也是MVC模式的实现标准,Struts框架本身基于这个模式实现
1.4 表示层伸缩性模式
1.4.1异步页面模式
当远程数据发生变化时,将其缓存下来这个模式又被称为"发布者--订阅者--模型".功能是利用一个订阅者角色在一定的时间间隔或数据发生变化时接收来自发布者角色的数据,订阅者角色同时会利用模型层来更新数据库,常见的应用为,当发布服务器要显示最新信息的Html页面时,会利用一个订阅者角色我负责.
1.4.2
该模式可以缓存动态的页面,尽可能减少重复生成的页面,功能是利用一个缓存过滤器截获请求.判断该请求所返回的页面是否有缓存,如果它在缓存中,则以缓存的页面最高效地进行响应;如果没有可缓存数据,则执行随后的工作,缓存生成页面的结果,缓存过滤器应该被摆放在"装饰过滤器"和工作Servlet之前,该模式其实是装饰器模式的一种变体,常见为对HTTPServletResponse对象进行装饰来保存请求处理结果
1.4.3
资源池模式 JDBC连接池
客户
posted on 2007-10-04 12:48
冬天出走的猪 阅读(229)
评论(0) 编辑 收藏 所属分类:
struts