- 浏览: 258232 次
- 性别:
- 来自: 多伦多
文章分类
- 全部博客 (127)
- Java 基础 (46)
- Java EE (3)
- Clouds (1)
- Spring 编程 (7)
- Spring Batch 编程 (1)
- Quartz 编程 (9)
- Seam 编程 (4)
- Hibernate 编程 (1)
- JSF 编程 (3)
- jQuery 编程 (3)
- Interview Question 汇总 (3)
- 日常应用 (3)
- Maven 编程 (2)
- WebService 编程 (10)
- Scala 编程 (5)
- Coherence 编程 (8)
- OO 编程 (1)
- Java 线程 (6)
- DB 编程 (2)
- WebService 安全 (4)
- Oracle Fusion 编程 (2)
- JavsScript/Ajax 编程 (1)
最新评论
-
chainal:
赞,说的很好
Scala 有趣的Trait -
wuliupo:
RRRR-MM-DD HH24:MI:SS
如何让Oracle SQL Developer显示的包含在日期字段中的时间 -
pengain:
...
使用Spring Roo ,感受ROR式的开发 -
zeng1990:
def getPersonInfo() = {
(&quo ...
Java 的继位人? - Scala简介 -
zeng1990:
我使用的是2.9.2版本的!
Java 的继位人? - Scala简介
转自 http://www.blogjava.net/killme2008/archive/2007/02/06/98227.html
事实是最近读《J2EE设计模式》讲述表达层模式的那几章,书中有一个前端控制器+command模式的workflow例子,就琢磨着可以很简单地扩展成一个MVC框架。花了一个下午改写了下,对书中所述的理解更为深入。我想这也许对于学习和理解设计模式,以及初次接触struts等MVC框架的人可能有点帮助。因为整个模型类似于struts,我把它取名叫strutslet^_^
(一)完整的类图如下:
1。前端控制器(FrontController):前端控制器提供了一个统一的位置来封装公共请求处理,它的任务相当简单,执行公共的任务,然后把请求转交给相应的控制器。在strutslet中,前端控制器主要作用也在于此,它初始化并解析配置文件,接受每个请求,并简单地把请求委托给调度器(Dispatcher),由调度器执行相应的动作(Action)。调度器把action返回的url返回给FrontController, FrontController负责转发。
2。Action接口:command模式很好的例子,它是一个命令接口,每一个实现了此接口的action都封装了某一个请求:新增一条数据记录并更新model,或者把某个文件写入磁盘。命令解耦了发送者和接受者之间联系。发送者调用一个操作,接受者接受请求执行相应的动作,因为使用Command模式解耦,发送者无需知道接受者任何接口。
3。Dispatcher:调度器,负责流程的转发,负责调用action去执行业务逻辑。由调度器选择页面和action,它去除了应用行为和前端控制器间的耦合。调度器服务于前端控制器,它把model的更新委托给action,又提供页面选择给FrontController
4。ActionForward:封装了转向操作所需要信息的一个模型,包括name和转向url
5。ActionModel:解析配置文件后,将每一个Action封装成一个ActionModel对象,所有ActionModel构成一个map,并存储在ServletContext中,供整个框架使用。
(二)源代码分析:
1。Action接口,只有一个execute方法,任何一个action都只要实现此接口,并实现相应的业务逻辑,最后返回一个ActionForward,提供给Dispacher调用。
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import com.strutslet.model.ActionForward;
/**
* command接口
* @author dennis
*
*/
public interface Action {
public ActionForward execute(HttpServletRequest request,ServletContext context);
}
比如,我们要实现一个登陆系统,LoginAction验证用户名和密码,如果正确,返回success页面,如果登陆失败,返回fail页面:
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import com.strutslet.core.Action;
import com.strutslet.model.ActionForward;
public class LoginAction implements Action {
private String name = "" ;
public ActionForward execute(HttpServletRequest request,
ServletContext context) {
String userName = request.getParameter( " userName " );
String password = request.getParameter( " password " );
if (userName.equals( " dennis " ) && password.equals( " 123 " )) {
request.setAttribute( " name " , name);
return ActionForward.SUCCESS; // 登陆成功,返回success
} else
return ActionForward.FAIL; // 否则,返回fail
}
}
2。还是先来看下两个模型:ActionForward和ActionModel,没什么东西,属性以及相应的getter,setter方法:
/**
* 类说明:转向模型
* @author dennis
*
* */
public class ActionForward {
private String name; // forward的name
private String viewUrl; // forward的url
public static final ActionForward SUCCESS = new ActionForward( " success " );
public static final ActionForward FAIL = new ActionForward( " fail " );
public ActionForward(String name) {
this .name = name;
}
public ActionForward(String name, String viewUrl) {
super ();
this .name = name;
this .viewUrl = viewUrl;
}
// name和viewUrl的getter和setter方法
}
我们看到ActionForward预先封装了SUCCESS和FAIL对象。
// ActionModel.java
package com.strutslet.model;
import java.util.Map;
/**
* 类说明:
* @author dennis
*
*/
public class ActionModel {
private String path; // action的path
private String className; // action的class
private Map < String, ActionForward > forwards; // action的forward
public ActionModel() {}
public ActionModel(String path, String className,
Map < String, ActionForward > forwards) {
super ();
this .path = path;
this .className = className;
this .forwards = forwards;
}
// 相应的getter和setter方法
}
3。知道了两个模型是什么样,也应该可以猜到我们的配置文件大概是什么样的了,与struts的配置文件格式类似:
< actions >
< action path = " /login "
class = " com.strutslet.demo.LoginAction " >
< forward name = " success " url = " hello.jsp " />
< forward name = " fail " url = " fail.jsp " />
</ action >
</ actions >
path是在应用中将被调用的路径,class指定了调用的哪个action,forward元素指定了转向,比如我们这里如果是success就转向hello.jsp,失败的话转向fail.jsp,这里配置了demo用到的LoginAction。
4。Dispacher接口,主要是getNextPage方法,此方法负责获得下一个页面将导向哪里,提供给前端控制器转发。
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
/**
* service to worker模式,提供给FrontController使用
* 负责流程转发
* @author dennis
*
*/
public interface Dispatcher {
public void setServletContext(ServletContext context);
public String getNextPage(HttpServletRequest request,ServletContext context);
}
5。原先书中实现了一个WorkFlow的Dispatcher,按照顺序调用action,实现工作流调用。而我们所需要的是根据请求的path 调用相应的action,执行action的execute方法返回一个ActionForward,然后得到ActionForward的 viewUrl,将此viewUrl提供给前端控制器转发,看看它的getNextPage方法:
setServletContext(context);
Map < String, ActionModel > actions = (Map < String, ActionModel > ) context
.getAttribute(Constant.ACTIONS_ATTR); // 从ServletContext得到所有action信息
String reqPath = (String) request.getAttribute(Constant.REQUEST_ATTR); // 发起请求的path
ActionModel actionModel = actions.get(reqPath); // 根据path得到相应的action
String forward_name = "" ;
ActionForward actionForward;
try {
Class c = Class.forName(actionModel.getClassName()); // 每个请求对应一个action实例
Action action = (Action) c.newInstance();
actionForward = action.execute(request, context); // 执行action的execute方法
forward_name = actionForward.getName();
} catch (Exception e) {
log.error( " can not find action " + actionModel.getClassName());
e.printStackTrace();
}
actionForward = actionModel.getForwards().get(forward_name);
if (actionForward == null ) {
log.error( " can not find page for forward " + forward_name);
return null ;
} else
return actionForward.getViewUrl(); // 返回ActionForward的viewUrl
}
发表评论
-
设计模式之事务处理
2010-11-25 07:36 889转自 http://www.blogjava.net/kill ... -
设计自己的MVC框架(2)
2010-11-25 07:24 1152转自 http://www.blogjava.ne ... -
使用Annotation设计持久层
2010-11-25 06:59 919(From http://www.blogjava. ... -
Jakarta Commons StringUtils类使用
2010-11-25 06:58 911转自http://www.blogjava.net/ ... -
Jakarta Commons ArrayUtils类使用
2010-11-25 06:57 1106转自http://www.blogjava.net/ ... -
Reflection的三个动态性质
2010-11-25 06:56 990转自http://www.blogjava. ... -
用commons.fileupload实现文件的上传和下载
2010-11-25 06:55 1363转自http://www.blogjav ... -
JAVA基础:共享内存在Java中的实现和应用
2010-11-25 06:54 852(转自 http://www.bu ... -
JAVA变量类型之间的相互转换
2010-11-25 06:52 878(转自 http://www.builder.c ... -
优秀Java程序员必须了解的GC工作原理
2010-11-25 06:52 865(转自 http://www.build ... -
几种版权信息详解
2010-11-25 06:49 1106BSD开源协议(original ... -
Java JDK 1.4 JCE Provider issue.
2010-11-25 06:48 1151Bundled JCE provider in jdk1 ... -
Why use Map.entrySet() instead of Map.keySet()?
2010-11-25 06:45 1370(From http://www.coderan ... -
Credit Card Mod10 校验
2010-11-25 06:27 2023以下是几种Mod10的实现。第一种最为简洁,最后一种 ... -
如何知道方法的调用者
2010-11-25 05:57 7370转自http://hellboys.bok ... -
Java加解密的基础
2010-11-25 05:49 2801在Java的安全包中,包括了三部分内容: ... -
Java日志框架:SLF4J, Apache Common-Logging, Log4J和Logback
2010-11-25 05:47 1834Log4j Apache的一个开放源代码项目,通过 ... -
Java SE 6新特性:Instrumentation
2010-11-25 05:35 1061(转自http://baike.baidu.com ... -
JBOSS 启动 加载 过程
2010-09-11 00:26 2980(转自: http://blog.csdn.net/ylli_ ... -
JAVA性能优化—Sun Hotspot JDK JVM参数设置
2010-09-11 00:18 1156(转自: http://www.hashei.me/2009/ ...
相关推荐
基于ASP.NET_MVC框架的Web设计基于ASP.NET_MVC框架的Web设计基于ASP.NET_MVC框架的Web设计基于ASP.NET_MVC框架的Web设计基于ASP.NET_MVC框架的Web设计基于ASP.NET_MVC框架的Web设计
基于MVC框架下房产营销管理系统的设计与实现.docx基于MVC框架下房产营销管理系统的设计与实现.docx基于MVC框架下房产营销管理系统的设计与实现.docx基于MVC框架下房产营销管理系统的设计与实现.docx基于MVC框架下...
课程设计,有利于初学者学习,欢迎下载,可以用,本人亲手写
基于ASP.NET商城系统项目毕业设计源代码 bootstrip+MVC框架 基于ASP.NET MVC 的商品管理系统 本系统是一套商城项目,后端使用微软强大的ASP.NET MVC 框架,前端使用bootstrip框架,同时使用STMP邮件发送服务器,等等...
自己写的MVC框架,功能完善,用来写一些小项目是绰绰有余了。实现了MVC三层架构,支持模块化设计,应用目录自动生成,命名空间自动加载到类,url mode,url路由等功能。感兴趣的朋友可以下载回去,一起探讨一起学习...
基于Java Web MVC框架的学生成绩管理系统设计.pdf
超轻量级MVC框架的设计和实现(源码),一个最简单最小巧的MVC框架,花哨的功能一个不要,越简洁越好,并且不使用XML配置文件,而是完全用Java 5注解配置。
基于模式设计的MVC框架原理研究
设计 REST 风格的 MVC 框架
这是一个完整的MVC框架,给刚接触MVC架构的同学或网站开发者了解MVC,记得要把根目录设计成myweb这个目录才可以过去。当然要在PHP的环境下。
MVC框架在Python与Django下的设计研究.pdf
本文将Ajax技术与MVC模式紧密结合,设计了一个新的MVC框架。应用该框架后,客户端请求基本都是Ajax请求。本文首次采用了Container这一概念,并提出了Container树结构信息的表示法,设计了针对该表示法的解析及生成算法。...
ActionScript编程必备技术,PureMVC框架简易教程!PureMVC是一个定位于设计高性能 RIA客户端的基于模式 的框架。
一个国人写的开源blog系统,使用ASP.NET MVC框架开发. 具有以下优点: 1,代码精练,优雅,。 2,使用了大量的设计模式 3,采用N层架构设计,分层非常合理。 4,支持强大的扶肤功能 5,大量使用了.net Framework 3.5...
eclipse中利用JAVA_MVC框架编写的学生管理系统,比较适合大学毕业设计及初学者参考
基于设计模式的一种MVC框架的实现
自己写的MVC框架,功能完善,用来写一些小项目是绰绰有余了。实现了MVC三层架构,支持模块化设计,应用目录自动生成,命名空间自动加载到类,url mode,url路由等功能。
基于MVC框架自习室管理和预约系统设计与实现论文-java-文档-基于MVC框架自习室管理和预约系统设计与实现论文: !!!本文档只是论文参考文档! 需要项目源码、数据库sql、开发文档、毕设咨询等,请私信联系~ ① ...
A blazing fast Model View Controller framework MicroMVC 是一个基于模块化设计的 MVC 框架,提供全功能的 ORM 库、移植以及管理脚手架,同时提供很多常用的 PHP 工具包。 标签:MicroMVC Web框架
轻量级MVC框架:基于Java开发,包含89个文件,包括25个Java类文件、21个HTML文件、11个JavaScript文件、7个XML配置文件、7个JSP页面、4个.gitignore文件、3个CSS样式文件、1个LICENSE文件、1个Markdown文档和1个...