zoukankan      html  css  js  c++  java
  • Struts、Ajax、Restful、Web Service 狂想曲框架实现篇(二)

          上篇说过,所有提交到web程序的url都被此UrlFilter拦截。拦截到请求后,UrlFilter则召集它的好多个得力干将Router 们, 询问他们:“谁能处理此URL啊 ?”

    这时一位叫做AMPRouter 首当其冲 说:“这个url交给我了”。这时filter就会把此url全权交给AMPRouter来办,至于如何去处理,filter也不再过问,它觉得:“我把任务都交给你了,怎么解决是你的事”。

          根据单一职责的原则,UrlFilter就负责上面情景中的分发urlRouter中的差事,url如何分发交给Router处理。并且Router实际是一个接口,使用框架的用户完全可以自己实现Router,这样用户可以自主定义的url分发的策略。另外呢,框架初始化的一些操作它也是 推脱不掉的,像根据unicorn-config.xml初始化系统中的RouterAction'。下面是具体的代码:

     

    @Override
    public void init(FilterConfig config) throws ServletException {
    	application = config.getServletContext();
    	String loadPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
    	String classPath = loadPath.substring(1, loadPath.length());
    	ArrayList<String> actions = XMLReader.getNodeValues(classPath + "unicorn-config.xml", "actions");
    	this.initActions(actions);
    	ArrayList<String> routers = XMLReader.getNodeValues(classPath + "unicorn-config.xml", "routers");
    	this.initRouters(routers);
    }

     

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
    			throws IOException, ServletException {
    	HttpServletRequest request = (HttpServletRequest) servletRequest;
    	String path = request.getContextPath();
    	String uri = request.getRequestURI();
    	String relativeUri = uri.substring(path.length(), uri.length());
    	this.request = request;
    	this.session = request.getSession();
    	this.response = (HttpServletResponse) servletResponse;
    	// 用户自定义的Router优先级最高,url先通过用户定义的
    	Iterator<IPathRouter> iterator = routerList.iterator();
    	while(iterator.hasNext()) {
    		IPathRouter router = iterator.next();
    		if(router.route(relativeUri, this)) {
    			return ;
    		}
    	}
    	// 拦截不到的继续访问
    	filterChain.doFilter(servletRequest, servletResponse);
    }
    

            其中Router类的初始化,Action类的初始化于这个类似:

    private void initRouters(ArrayList<String> routers) {
    	routerList = new ArrayList<IPathRouter>();
    	for (int i = 0; i < routers.size(); i++) {
    		String routerName = routers.get(i);
    		try {
    			Class<?> clz = Class.forName(routers.get(i));
    			// 单例模式通过方法获取对象实例
    			IPathRouter router = (IPathRouter) clz.newInstance();
    			routerList.add(router);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			e.printStackTrace();
    		} catch (InstantiationException e) {
    			e.printStackTrace();
    		}
    	}
    	// 最后把框架默认的Router加入进来
    	routerList.add(new AMPPathRouter());
    }
    

            其中unicorn-config.xml文件的编写,拿其中我一个项目里的这个文件来举例:

    <?xml version="1.0" encoding="UTF-8" ?>
    <config>
    <routers>
    <router class="com.mh.router.MySessionCheckRouter"></router>
    </routers>
    <actions>
    <action class="com.mh.action.UserAction"></action>
    <action class="com.mh.action.InformationAction"></action>
    <action class="com.mh.action.UploadInformationIconAction"></action>
    <action class="com.mh.action.TempPicAction"></action>
    <action class="com.mh.action.MobileAction"></action>
    </actions>
    </config>

          这里即定义了Action,也定义了自己的Router,并且从名称上可以看出,这个SessionCheckRouter是要判断所有提交到服务器的指定url的请求 是否已经登录过,没有登录,可能会把此请求遣送会登录页。以及初始化所有的Action,在Router处理完请求,分发给action时,可以从filter里面去取。

     


  • 相关阅读:
    Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
    Luogu 1314 【NOIP2011】聪明的质检员 (二分)
    Luogu 1315 【NOIP2011】观光公交 (贪心)
    Luogu 1312 【NOIP2011】玛雅游戏 (搜索)
    Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)
    Luogu 1514 引水入城 (搜索,动态规划)
    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
    Luogu 1437 [HNOI2004]敲砖块 (动态规划)
    Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
    HDU 1176 免费馅饼 (动态规划)
  • 原文地址:https://www.cnblogs.com/mahang/p/2263029.html
Copyright © 2011-2022 走看看