科技行者

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

知识库

知识库 安全导航

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

设计模式:设计自己的ccccc

  • 扫一扫
    分享文章到微信

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

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

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

关键字:

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

2.»¹ÊÇÏÈÀ´¿´ÏÂÁ½¸öÄ£ÐÍ£ºActionForwardºÍActionModel£¬Ã»Ê²Ã´¶«Î÷£¬ÊôÐÔÒÔ¼°ÏàÓ¦µÄgetter,setter·½·¨£º

  1. /**
  2.  * Àà˵Ã÷:תÏòÄ£ÐÍ
  3.  * @author dennis
  4.  *
  5.  * */
  6. public class ActionForward {
  7.  private String name;      //forwardµÄname
  8.  private String viewUrl;   //forwardµÄurl
  9.  public static final ActionForward SUCCESS=new ActionForward("success");
  10.  public static final ActionForward FAIL=new ActionForward("fail");
  11.  public  ActionForward(String name){
  12.   this.name=name;
  13.  }
  14.  public ActionForward(String name, String viewUrl) {
  15.   super();
  16.   this.name = name;
  17.   this.viewUrl = viewUrl;
  18.  }
  19.  //...nameºÍviewUrlµÄgetterºÍsetter·½·¨
  20. }   

ÎÒÃÇ¿´µ½ActionForwardÔ¤ÏÈ·â×°ÁËSUCCESSºÍFAIL¶ÔÏó¡£
  1. public class ActionModel {
  2.  private String path; // actionµÄpath
  3.  private String className; // actionµÄclass
  4.  private Map<String, ActionForward> forwards; // actionµÄforward
  5.  public ActionModel(){}
  6.  public ActionModel(String path, String className,
  7.    Map<String, ActionForward> forwards) {
  8.   super();
  9.   this.path = path;
  10.   this.className = className;
  11.   this.forwards = forwards;
  12.  }
  13.  //...ÏàÓ¦µÄgetterºÍsetter·½·¨     
  14. }


3¡£ÖªµÀÁËÁ½¸öÄ£ÐÍÊÇʲôÑù£¬Ò²Ó¦¸Ã¿ÉÒԲµ½ÎÒÃǵÄÅäÖÃÎļþ´ó¸ÅÊÇʲôÑùµÄÁË£¬ÓëstrutsµÄÅäÖÃÎļþ¸ñʽÀàËÆ£º
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <actions>
  3.   <action path="/login"
  4.           class="com.strutslet.demo.LoginAction">
  5.      <forward name="success" url="hello.jsp"/>
  6.      <forward name="fail" url="fail.jsp"/>
  7.    </action>       
  8. </actions>

pathÊÇÔÚÓ¦ÓÃÖн«±»µ÷ÓõÄ·¾¶£¬classÖ¸¶¨Á˵÷ÓõÄÄĸöaction£¬forwardÔªËØÖ¸¶¨ÁËתÏò£¬±ÈÈçÎÒÃÇÕâÀïÈç¹ûÊÇsuccess¾ÍתÏòhello.jsp£¬Ê§°ÜµÄ»°×ªÏòfail.jsp£¬ÕâÀïÅäÖÃÁËdemoÓõ½µÄLoginAction¡£

4¡£Dispacher½Ó¿Ú£¬Ö÷ÒªÊÇgetNextPage·½·¨£¬´Ë·½·¨¸ºÔð»ñµÃÏÂÒ»¸öÒ³Ã潫µ¼ÏòÄÄÀÌṩ¸øÇ°¶Ë¿ØÖÆÆ÷ת·¢¡£
  1. public interface Dispatcher {
  2.  public void setServletContext(ServletContext context);
  3.  public String getNextPage(HttpServletRequest request,ServletContext context);
  4. }


5¡£5¡£Ô­ÏÈÊéÖÐʵÏÖÁËÒ»¸öWorkFlowµÄDispatcher£¬°´ÕÕ˳Ðòµ÷ÓÃaction£¬ÊµÏÖ¹¤×÷Á÷µ÷Ó᣶øÎÒÃÇËùÐèÒªµÄÊǸù¾ÝÇëÇóµÄpathµ÷ÓÃÏàÓ¦µÄaction£¬Ö´ÐÐactionµÄexecute·½·¨·µ»ØÒ»¸öActionForward£¬È»ºóµÃµ½ActionForwardµÄviewUrl£¬½«´ËviewUrlÌṩ¸øÇ°¶Ë¿ØÖÆÆ÷ת·¢£¬¿´¿´ËüµÄgetNextPage·½·¨£º

  1. public String getNextPage(HttpServletRequest request, ServletContext context) {
  2.   setServletContext(context);
  3.   Map<String, ActionModel> actions = (Map<String, ActionModel>) context
  4.     .getAttribute(Constant.ACTIONS_ATTR);   //´ÓServletContextµÃµ½ËùÓÐactionÐÅÏ¢
  5.   String reqPath = (String) request.getAttribute(Constant.REQUEST_ATTR);//·¢ÆðÇëÇóµÄpath
  6.   ActionModel actionModel = actions.get(reqPath);  //¸ù¾ÝpathµÃµ½ÏàÓ¦µÄaction
  7.   String forward_name = "";
  8.   ActionForward actionForward;
  9.   try {
  10.    Class c = Class.forName(actionModel.getClassName());  //ÿ¸öÇëÇó¶ÔÓ¦Ò»¸öactionʵÀý
  11.    Action action = (Action) c.newInstance();
  12.    actionForward = action.execute(request, context);  //Ö´ÐÐactionµÄexecute·½·¨
  13.    forward_name = actionForward.getName();
  14.    
  15.   } catch (Exception e) {
  16.    log.error("can not find action "+actionModel.getClassName());
  17.    e.printStackTrace();
  18.   }
  19.   actionForward = actionModel.getForwards().get(forward_name);
  20.   if (actionForward == null) {
  21.    log.error("can not find page for forward "+forward_name);
  22.    return null;
  23.   } else
  24.    return actionForward.getViewUrl();      //·µ»ØActionForwardµÄviewUrl
  25.  }
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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