科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件设计模式:设计自己的ccccc

设计模式:设计自己的ccccc

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

事实是最近读《J2EE设计模式》讲述表达层模式的那几章,书中有一个前端控制器 command模式的workflow例子,就琢磨着可以很简单地扩展成一个MVC框架。

作者:中国IT实验室 来源:中国IT实验室 2007年8月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

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

  1. public void init() throws ServletException {
  2.   //初始化配置文件
  3.   ServletContext context=getServletContext();
  4.   String config_file =getServletConfig().getInitParameter("config");
  5.   String dispatcher_name=getServletConfig().getInitParameter("dispatcher");
  6.   if (config_file == null || config_file.equals(""))
  7.    config_file = "/WEB-INF/strutslet-config.xml"//默认是/WEB-INF/下面的strutslet-config
  8.   if(dispatcher_name==null||dispatcher_name.equals(""))
  9.    dispatcher_name=Constant.DEFAULT_DISPATCHER;
  10.     
  11.   try {
  12.    Map<String, ActionModel> resources = ConfigUtil.newInstance()  //工具类解析配置文件
  13.      .parse(config_file, context);
  14.    context.setAttribute(Constant.ACTIONS_ATTR, resources);  //存储在ServletContext中
  15.    log.info("初始化strutslet配置文件成功");
  16.   } catch (Exception e) {
  17.    log.error("初始化strutslet配置文件失败");
  18.    e.printStackTrace();
  19.   }
  20.   //实例化Dispacher
  21.   try{
  22.    Class c = Class.forName(dispatcher_name);
  23.       Dispatcher dispatcher = (Dispatcher) c.newInstance();
  24.       context.setAttribute(Constant.DISPATCHER_ATTR, dispatcher); //放在ServletContext
  25.       log.info("初始化Dispatcher成功");
  26.   }catch(Exception e) {
  27.     log.error("初始化Dispatcher失败");
  28.       e.printStackTrace();
  29.   }
  30.   .....


doGet()和doPost方法我们都让它调用process方法:
  1. protected void process(HttpServletRequest request,
  2.    HttpServletResponse response) throws ServletException, IOException {
  3.   ServletContext context = getServletContext();
  4.         //获取action的path 
  5.   String reqURI = request.getRequestURI();
  6.   int i=reqURI.lastIndexOf(".");
  7.   String contextPath=request.getContextPath();
  8.   String path=reqURI.substring(contextPath.length(),i);
  9.   
  10.   request.setAttribute(Constant.REQUEST_ATTR, path);
  11.   Dispatcher dispatcher = (Dispatcher) context.getAttribute(Constant.DISPATCHER_ATTR);
  12.   // make sure we don't cache dynamic data
  13.   response.setHeader("Cache-Control""no-cache");
  14.   response.setHeader("Pragma""no-cache");
  15.   // use the dispatcher to find the next page
  16.   String nextPage = dispatcher.getNextPage(request, context);//调用Dispatcher的getNextPage
  17.   // forward control to the view
  18.   RequestDispatcher forwarder = request.getRequestDispatcher("/"
  19.     + nextPage);
  20.   forwarder.forward(request, response);  //转发页面
  21.  }


7。最后,web.xml的配置就非常简单了,配置前端控制器,提供启动参数(配置文件所在位置,为空就查找/WEB-INF/下面的strutslet-config.xml文件),我们把所有以action结尾的请求都交给FrontController处理:
  1. <servlet>
  2.     <servlet-name>StrutsletController</servlet-name>
  3.     <servlet-class>com.strutslet.core.FrontController</servlet-class>
  4.     <!--  
  5.     <init-param>
  6.          <param-name>config</param-name>
  7.          <param-value>/WEB-INFstrutslet-config.xml</param-value>
  8.     </init-param>
  9.     -->
  10.        <load-on-startup>0</load-on-startup>
  11.   </servlet>
  12.  <servlet-mapping>
  13.     <servlet-name>StrutsletController</servlet-name>
  14.     <url-pattern>*.action</url-pattern>
  15.  </servlet-mapping>


最后,让我们看看整个框架图:
 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章