知识大全 设计自己的MVC框架

Posted 控制器

篇首语:愿你一生努力,一生被爱。想要的都拥有,得不到的都释怀。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 设计自己的MVC框架相关的知识,希望对你有一定的参考价值。

设计模式:设计自己的MVC框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

源代码放在的邮箱的收件箱里 用户名:sharesource 密码:javafans希望保留给有用的人 谢谢     取这样一个标题太大 吸引眼球嘛@_@     事实是最近读《J EE设计模式》讲述表达层模式的那几章 书中有一个前端控制器+mand模式的workflow例子 就琢磨著可以很简单地扩展成一个MVC框架 花了一个下午改写了下 对书中所述的理解更为深入 我想这也许对于学习和理解设计模式 以及初次接触struts等MVC框架的人可能有点帮助 因为整个模型类似于struts 我把它取名叫strutslet^_^ 学习性质 切勿认真 (一)完整的类图如下 前端控制器(FrontController):前端控制器提供了一个统一的位置来封装公共请求处理 它的任务相当简单 执行公共的任务 然后把请求转交给相应的控制器 在strutslet中 前端控制器主要作用也在于此 它初始化并解析配置文件 接受每个请求 并简单地把请求委托给调度器(Dispatcher) 由调度器执行相应的动作(Action) 调度器把action返回的url返回给FrontController FrontController负责转发 Action接口 mand模式很好的例子 它是一个命令接口 每一个实现了此接口的action都封装了某一个请求 新增一条数据记录并更新model 或者把某个文件写入磁盘 命令解耦了发送者和接受者之间联系  发送者调用一个操作 接受者接受请求执行相应的动作 因为使用Command模式解耦 发送者无需知道接受者任何接口 Dispatcher 调度器 负责流程的转发 负责调用action去执行业务逻辑 由调度器选择页面和action 它去除了应用行为和前端控制器间的耦合 调度器服务于前端控制器 它把model的更新委托给action 又提供页面选择给FrontController ActionForward 封装了转向操作所需要信息的一个模型 包括name和转向url ActionModel 解析配置文件后 将每一个Action封装成一个ActionModel对象 所有ActionModel构成一个map 并存储在ServletContext中 供整个框架使用 (二)源代码简单分析 Action接口 只有一个execute方法 任何一个action都只要实现此接口 并实现相应的业务逻辑 最后返回一个ActionForward 提供给Dispacher调用
    public  interface Action    public ActionForward execute(HttpServletRequest request ServletContext context); 
比如 我们要实现一个登陆系统(demo的例子) LoginAction验证用户名和密码 如果正确 返回success页面 如果登陆失败 返回fail页面
    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( ))       request setAttribute( name  name);        return ActionForward SUCCESS;   //登陆成功 返回success          else           return ActionForward FAIL;     //否则 返回fail  

   还是先来看下两个模型 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对象
    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方法     
知道了两个模型是什么样 也应该可以猜到我们的配置文件大概是什么样的了 与struts的配置文件格式类似
    <?xml version=  encoding= UTF ?> <actions>   <action path= /login            class= 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 Dispacher接口 主要是getNextPage方法 此方法负责获得下一个页面将导向哪里 提供给前端控制器转发
    public  interface Dispatcher    public  void setServletContext(ServletContext context);   public  String getNextPage(HttpServletRequest request ServletContext context);
原先书中实现了一个WorkFlow的Dispatcher 按照顺序调用action 实现工作流调用 而我们所需要的是根据请求的path调用相应的action 执行action的execute方法返回一个ActionForward 然后得到ActionForward的viewUrl 将此viewUrl提供给前端控制器转发 看看它的getNextPage方法
    public  String getNextPage(HttpServletRequest request  ServletContext context)    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  

   前端控制器(FrontController) 它的任务我们已经很清楚 初始化配置文件 存储所有action到ServletContext供整个框架使用 得到发起请求的path 提供给Dispachter查找相应的action 调用Dispatcher 执行getNextPage方法得到下一个页面的url并转发

    public  void init()  throws ServletException     //初始化配置文件   ServletContext context=getServletContext();    String config_file =getServletConfig() getInitParameter( config );    String dispatcher_name=getServletConfig() getInitParameter( dispatcher );    if (config_file ==  null || config_file equals( ))    config_file =  /WEB INF/strutslet config xml ;  //默认是/WEB INF/下面的strutslet config    if(dispatcher_name== null||dispatcher_name equals( ))    dispatcher_name=Constant DEFAULT_DISPATCHER;         try     Map< String  ActionModel> resources = ConfigUtil newInstance()   //工具类解析配置文件       parse(config_file  context);    context setAttribute(Constant ACTIONS_ATTR  resources);   //存储在ServletContext中    ( 初始化strutslet配置文件成功 );     catch ( Exception e)     log error( 初始化strutslet配置文件失败 );    e printStackTrace();       //实例化Dispacher    try     Class c =  Class forName(dispatcher_name);       Dispatcher dispatcher = (Dispatcher) c newInstance();       context setAttribute(Constant DISPATCHER_ATTR  dispatcher);  //放在ServletContext       ( 初始化Dispatcher成功 );    catch( Exception e)      log error( 初始化Dispatcher失败 );       e printStackTrace();      
doGet()和doPost方法我们都让它调用process方法
    protected  void process(HttpServletRequest request    HttpServletResponse response)  throws ServletException  IOException    ServletContext context = getServletContext();          //获取action的path     String reqURI = request getRequestURI();    int i=reqURI lastIndexOf( );    String contextPath=request getContextPath();    String path=reqURI substring(contextPath length() i);      request setAttribute(Constant REQUEST_ATTR  path);   Dispatcher dispatcher = (Dispatcher) context getAttribute(Constant DISPATCHER_ATTR);    // make sure we don t cache dynamic data   response setHeader( Cache Control   no cache );   response setHeader( Pragma   no cache );    // use the dispatcher to find the next page    String nextPage = dispatcher getNextPage(request  context); //调用Dispatcher的getNextPage    // forward control to the view   RequestDispatcher forwarder = request getRequestDispatcher( /     + nextPage);   forwarder forward(request  response);   //转发页面  
最后 web xml的配置就非常简单了 配置前端控制器 提供启动参数(配置文件所在位置 为空就查找/WEB INF/下面的strutslet config xml文件) 我们把所有以action结尾的请求都交给FrontController处理
    <servlet>     <servlet name>StrutsletController</servlet name>     <servlet class>re FrontController</servlet class>     <!        <init param>          <param name>config</param name>          <param value>/WEB INFstrutslet config xml</param value>     </init param>      >        <load on startup> </load on startup>   </servlet>  <servlet mapping>     <servlet name>StrutsletController</servlet name>     <url pattern>* action</url pattern>  </servlet mapping>
最后 让我们看看整个框架图   cha138/Article/program/Java/gj/201311/27610

相关参考

知识大全 自己动手实现Asp.net的MVC框架

自己动手实现Asp.net的MVC框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  了解JAV

知识大全 ASP.NET MVC 2.0之MVC框架简介

ASP.NETMVC2.0之MVC框架简介  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Web

知识大全 .NET MVC框架

.NETWeb开发震撼之变:.NETMVC框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!   

知识大全 开源MVC框架 XX Framework 1.1 发布

开源MVC框架XXFramework1.1发布  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  X

知识大全 逃脱Asp.Net MVC框架

逃脱Asp.NetMVC框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 浅谈Hibernate框架简述

浅谈Hibernate框架简述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在基于MVC设计模

知识大全 Spring MVC框架的高级配置(下)

SpringMVC框架的高级配置(下)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  上文介绍S

知识大全 浅谈对.NET MVC框架的理解

浅谈对.NETMVC框架的理解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  近来我发现有很多关

知识大全 ASP.NET MVC 4框架揭秘

ASP.NETMVC4框架揭秘  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第章ASPNET+

知识大全 对于Struts和Spring两种MVC框架的比较[2]

对于Struts和Spring两种MVC框架的比较[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下