设计自己的MVC框架(2)

转自 http://www.blogjava.net/killme2008/archive/2007/02/06/98227.html


6。前端控制器(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中 
 
   log.info( " 初始化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 
 
      log.info( " 初始化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);  
 // 转发页面 
 
 } 

 

 

7。最后,web.xml的配置就非常简单了,配置前端控制器,提供启动参数(配置文件所在位置,为空就查找/WEB-INF/下面的strutslet-config.xml文件),我们把所有以action结尾的请求都交给FrontController处理:

 

  <  servlet  > 
    
  <  servlet  -  name  >  StrutsletController  </  servlet  -  name  > 
    
  <  servlet  -  class  >  com.strutslet.core.FrontController  </  servlet  -  class  > 
    
  <!--    
    
  <  init  -  param  > 
         
  <  param  -  name  >  config  </  param  -  name  > 
         
  <  param  -  value  >/  WEB  -  INF  /  strutslet  -  config.xml  </  param  -  value  > 
    
  </  init  -  param  > 
    
  --> 
       
  <  load  -  on  -  startup  >  0  </  load  -  on  -  startup  > 
  
  </  servlet  > 
 
  <  servlet  -  mapping  > 
    
  <  servlet  -  name  >  StrutsletController  </  servlet  -  name  > 
    
  <  url  -  pattern  >*  .action  </  url  -  pattern  > 
 
  </  servlet  -  mapping  >

 

最后,让我们看看整个框架图:

 test.jpg

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值