Webx命名规范
Web请求响应
当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两件事:
首先,它会增强request、response、session的功能,并把它们打包成更易使用的RequestContext对象。
其次,它会调用相应子应用的pipeline,用它来做进一步的处理。
假如在上面的过程中出现异常,则会触发Webx Framework处理异常的过程。
此外,Webx Framework还提供了一组辅助开发的功能,例如查看环境变量,查看schema等。这些功能只在开发模式生效,生产模式下自动关闭。
public class WebxFrameworkFilter extends FilterBean {private final Logger log = LoggerFactory.getLogger(this.getClass());private String parentContextAttribute;private WebxComponents components;private RequestURIFilter excludeFilter;private RequestURIFilter passthruFilter;private String internalPathPrefix;...protected final void init() throws Exception {WebApplicationContext parentContext = this.findParentContext();if(parentContext instanceof WebxComponentsContext) {this.components = ((WebxComponentsContext)parentContext).getWebxComponents();WebxConfiguration rootController = this.components.getParentWebxConfiguration();if(rootController != null) {this.internalPathPrefix = rootController.getInternalPathPrefix();this.internalPathPrefix = FileUtil.normalizeAbsolutePath(this.internalPathPrefix, true);}}WebxRootController rootController1 = this.components.getWebxRootController();if(this.passthruFilter != null) {if(rootController1 instanceof PassThruSupportable) {((PassThruSupportable)rootController1).setPassthruFilter(this.passthruFilter);} else {...}}}...@Overrideprotected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {String path = getResourcePath(request);if (isExcluded(path)) {...return;} else {...}try {// 获取WebxRootController并且对request进行处理getWebxComponents().getWebxRootController().service(request, response, chain);} catch (IOException e) {throw e;} catch (ServletException e) {throw e;} catch (Exception e) {throw new ServletException(e);}}..
}
WebxRootController为接口,有一个实现了部分函数的抽象类AbstractWebxRootController
public final void service(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws Exception {RequestContext requestContext = null;try {requestContext = assertNotNull(getRequestContext(request, response), "could not get requestContext");// 如果请求已经结束,则不执行进一步的处理。例如,当requestContext已经被重定向了,则立即结束请求的处理。if (isRequestFinished(requestContext)) {return;}// 请求未结束,则继续处理...request = requestContext.getRequest();response = requestContext.getResponse();// 如果是一个内部请求,则执行内部请求// webx内部请求,如报错,开发者模式页面if (handleInternalRequest(request, response)) {return;}// 如果不是内部的请求,并且没有被passthru,则执行handleRequest// handleRequest抽象方法if (isRequestPassedThru(request) || !handleRequest(requestContext)) {// 如果请求被passthru,或者handleRequest返回false(即pipeline放弃请求),// 则调用filter chain,将控制交还给servlet engine。giveUpControl(requestContext, chain);}} catch (Throwable e) {handleException(requestContext, request, response, e);} finally {commitRequest(requestContext);}}
package com.alibaba.citrus.webx.impl;import javax.servlet.http.HttpServletRequest;
import com.alibaba.citrus.service.requestcontext.RequestContext;
import com.alibaba.citrus.util.ServletUtil;
import com.alibaba.citrus.webx.WebxComponent;
import com.alibaba.citrus.webx.support.AbstractWebxRootController;
import com.alibaba.citrus.webx.util.WebxUtil;public class WebxRootControllerImpl extends AbstractWebxRootController {// 处理外部请求@Overrideprotected boolean handleRequest(RequestContext requestContext) throws Exception {// WebxFrameWorkFilter封装的request+response+sessionHttpServletRequest request = requestContext.getRequest();// Servlet mapping有两种匹配方式:前缀匹配和后缀匹配。// 对于前缀匹配,例如:/servlet/aaa/bbb,servlet path为/servlet,path info为/aaa/bbb// 对于前缀匹配,当mapping pattern为/*时,/aaa/bbb,servlet path为"",path info为/aaa/bbb// 对于后缀匹配,例如:/aaa/bbb.html,servlet path为/aaa/bbb.html,path info为null//// 对于前缀匹配,取其pathInfo;对于后缀匹配,取其servletPath。String path = ServletUtil.getResourcePath(request);// 再根据path查找componentWebxComponent component = getComponents().findMatchedComponent(path);boolean served = false;if (component != null) {try {WebxUtil.setCurrentComponent(request, component);served = component.getWebxController().service(requestContext);} finally {WebxUtil.setCurrentComponent(request, null);}}return served;}
}
public WebxComponent findMatchedComponent(String path) {if (!path.startsWith("/")) {path = "/" + path;}WebxComponent defaultComponent = getDefaultComponent();WebxComponent matched = null;// 前缀匹配componentPath。// 子应用for (WebxComponent c