由getRequestURI,getServletPath,getPathInfo说开

如果要自己写个resetful框架,那么框架路由这块一定会接触到servlet或者Filter。

例如:以一个servlet作为框架入口

<servlet-mapping>
    <servlet-name>flowServlet</servlet-name>
    <url-pattern>/flowServlet/*</url-pattern>
</servlet-mapping>

框架中获取请求的路径:

System.out.println(request.getRequestURI());
System.out.println(request.getServletPath());
System.out.println(request.getPathInfo());

iflow为ContextPath路径时输出:

/iflow/flowServlet/process
/flowServlet
/process
getRequestURI() == getContextPath() + getServletPath() + getPathInfo() + ;jsessionid=sessionid
request.getServletPath() returns the URL pattern excluding /*
request.getPathInfo() returns the part matched by /* (or null for exact match).

那么对于采用servlet为入口的框架来说getPathInfo或许是最方便的。

/**
 * @see HttpServlet#service(HttpServletRequest req, HttpServletResponse resp)
 */
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	String method = req.getMethod().toUpperCase();
	String target = request.getPathInfo();
	// 注意[null,"",/]三者,都为首页请求
	if (target == null) { target = ""; }
	RequestMethod requestMethod = RequestMethod.valueOf(method)
	// mapping信息
	MappingInfo mappingInfo = new MappingInfo(target, requestMethod);
	Method method = routes.get(mappingInfo);
	if (null == method) {
		LOGGER.error("{}: {} 404 Not Found!", requestMethod, target);
		response.setStatus(HttpServletResponse.SC_NOT_FOUND);
		return;
	}
	// 控制器类
	Class clazz = method.getDeclaringClass();
	// 每次new Controller 线程安全
	Controller controller = ClassHelper.newInstance(clazz);
	// 构造控制器
	controller.init(request, response);
	// 执行请求
	try {
		method.invoke(controller);
	} catch (Throwable e) {
		// 对异常进行处理,使异常更加准确
		Throwable throwable = e.getCause() == null ? e : e.getCause();
		LOGGER.error(throwable.getMessage(), throwable);
		// 将异常抛给tomcat,可在web.xml配置500页处理
		throw throwable instanceof RuntimeException ? 
				(RuntimeException) throwable : new RuntimeException(throwable);
	}
}
捐助共勉
版权声明:若无特殊注明,本文皆为原创,转载请保留文章出处。