struts1源码学习6(doPost和doGet)
来源:互联网 发布:郑州大学网络教育学费 编辑:程序博客网 时间:2024/06/01 14:16
ActionServlet中的doPost和doGet的代码是一样的,都是调用process
直接看process代码
protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ModuleUtils.getInstance().selectModule(request, getServletContext()); ModuleConfig config = getModuleConfig(request); RequestProcessor processor = getProcessorForModule(config); if (processor == null) { processor = getRequestProcessor(config); } processor.process(request, response); }
简单几行,不过每行都很有货啊!(否则前面那么复杂的配置怎么体现)
1、process第一行代码
ModuleUtils.getInstance().selectModule(request, getServletContext());ModuleUtils
public void selectModule(HttpServletRequest request, ServletContext context) { // Compute module name String prefix = getModuleName(request, context); // Expose the resources for this module this.selectModule(prefix, request, context); }
getModuleName
根据请求路径,找到匹配的prefix。
public String getModuleName(HttpServletRequest request, ServletContext context) { // Acquire the path used to compute the module String matchPath = (String) request.getAttribute(RequestProcessor.INCLUDE_SERVLET_PATH); if (matchPath == null) { matchPath = request.getServletPath(); }//从这可以看出来,prefix的配置实际上是为了实现多个模块。此处就是返回相应的模块名 return this.getModuleName(matchPath, context); }再看this.selectModule(prefix,request,context)
public void selectModule(String prefix, HttpServletRequest request, ServletContext context) { // Expose the resources for this module //根据prefix,和ServletContext,获取ModuleConfig //就是前面init方法中设置的玩意 ModuleConfig config = getModuleConfig(prefix, context); //存在对应moduleConfig的情况 if (config != null) { //设置当前匹配的config到request中 request.setAttribute(Globals.MODULE_KEY, config); //先得到messageResource配置 MessageResourcesConfig[] mrConfig = config.findMessageResourcesConfigs(); for (int i = 0; i < mrConfig.length; i++) { String key = mrConfig[i].getKey(); //遍历MessageResourcesConfig,找到匹配的MessageResources,然后将MessageResources放到request中 MessageResources resources = (MessageResources) context.getAttribute(key + prefix); //这里可以看到,在配置MessageResources时,key值是要唯一的,否则可能被覆盖掉 if (resources != null) { request.setAttribute(key, resources); } else { request.removeAttribute(key); } } } else { request.removeAttribute(Globals.MODULE_KEY); } }
实际上第一行代码是设置了模块的ModuleConfig到request中
2、process第二行代码
ModuleConfig config = getModuleConfig(request);回到process中,发现getModuleConfig就是从request或者ServletContext中获取到moduleConfig
protected ModuleConfig getModuleConfig(HttpServletRequest request) { ModuleConfig config = (ModuleConfig) request.getAttribute(Globals.MODULE_KEY); if (config == null) { config = (ModuleConfig) getServletContext().getAttribute(Globals.MODULE_KEY); } return (config); }3、process第三、四行代码
RequestProcessor processor = getProcessorForModule(config);
if (processor == null) { processor = getRequestProcessor(config); }getProcessorForModule
private RequestProcessor getProcessorForModule(ModuleConfig config) { String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix(); return (RequestProcessor) getServletContext().getAttribute(key); }在只配置一个模块的情况下,config.getPrefix()是空串。
public static final String REQUEST_PROCESSOR_KEY = "org.apache.struts.action.REQUEST_PROCESSOR";
当getProcessorForModule返回null时,执行getRequestProcessor
protected synchronized RequestProcessor getRequestProcessor( ModuleConfig config) throws ServletException { RequestProcessor processor = this.getProcessorForModule(config); if (processor == null) { try { //在这里,模块会拿到config的ControllerCOnfig //如果用户没有配置controller,那么config.getControllerConfig()会生成一个new ControllerConfig() //而这个controller的默认ProcessorClass是org.apache.struts.chain.ComposableRequestProcessor //也就是说,默认情况下,processor是org.apache.struts.chain.ComposableRequestProcessor的一个实例 processor = (RequestProcessor) RequestUtils.applicationInstance(config.getControllerConfig() .getProcessorClass()); } catch (Exception e) { throw new UnavailableException( "Cannot initialize RequestProcessor of class " + config.getControllerConfig().getProcessorClass() + ": " + e); } //初始化 processor.init(this, config); String key = Globals.REQUEST_PROCESSOR_KEY + config.getPrefix(); getServletContext().setAttribute(key, processor); } return (processor); }
4、最后一句代码
processor.process(request, response);处理请求与响应
0 0
- struts1源码学习6(doPost和doGet)
- Servlet学习(三)doGet与doPost
- doGet和doPost的区别(servlet)
- doGet和doPost的区别(servlet)
- 浅谈doGet和doPost
- doGet 和 doPost区别
- android doGet和doPost
- day0812-doGet和doPost
- DoGet和DoPost
- doPost()和doGet()
- doGet和doPost
- doGet和doPost乱码
- doGet和doPost区别
- servlet(doget和dopost)
- doget和dopost区别
- Java for Web学习笔记(八):Servlet(6)doGet()和doPost()是线程还是队列
- service()和doGet()和doPost()
- Java学习之路0813(HttpClient中的doGet和doPost实例)
- error C2061: 语法错误: 标识符“__RPC__out_xcount_part” VS2010
- HDU 2639 Bone Collector II 背包k优解
- linux学习笔记4----vim编辑器
- java.lang.IllegalStateException: You cannot call onTextChanged with a non filterable adapter
- 3.3-多个栈组合模拟一个栈
- struts1源码学习6(doPost和doGet)
- 如何调用DLL
- Jquery json jsp实例
- Leetcode--Divide Two Integers
- 基于gnu-arm-linux的LPC2220的简单工程模板
- HDU 4902 Nice boat(线段树 区间更新)
- ural 1932 The Secret of Identifier (容斥原理)
- HDU 4786 Fibonacci Tree 最小生成树 kruskal算法
- FFT.c