`

struts2源码分析之获取请求uri,ActionMapping的封装

阅读更多
struts2当请求一个action时:
直接进入:StrutsPrepareAndExecuteFilter的doFilter所以struts2是基于拦截器实现的。
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        try {
            prepare.setEncodingAndLocale(request, response);
            prepare.createActionContext(request, response);
            prepare.assignDispatcherToThread();
			if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
				chain.doFilter(request, response);
			} else {
				request = prepare.wrapRequest(request);
				//根据请求的uri封装为一个ActionMapping ActionMapping源码如下:
				/* public class ActionMapping {

                                  private String name;
                                  private String namespace;
                                  private String method;
                                  private String extension;
                                  private Map<String, Object> params;
                                  private Result result;
				*/
				//这个方法里面有一步判断如果不是以<constant name="struts.action.extension" value="do,action,"></constant>中的配置结尾的mapping就会为null
				//就会直接放行该方法源码如下:
				/**
				  protected String dropExtension(String name, ActionMapping mapping) {
        if (extensions == null) {
            return name;
        }
        for (String ext : extensions) {
            if ("".equals(ext)) {
                // This should also handle cases such as /foo/bar-1.0/description. It is tricky to
                // distinquish /foo/bar-1.0 but perhaps adding a numeric check in the future could
                // work
                int index = name.lastIndexOf('.');
                if (index == -1 || name.indexOf('/', index) >= 0) {
                    return name;
                }
            } else {
                String extension = "." + ext;
                if (name.endsWith(extension)) {
                    name = name.substring(0, name.length() - extension.length());
                    mapping.setExtension(ext);
                    return name;
                }
            }
        }
        return null;
				*/
				ActionMapping mapping = prepare.findActionMapping(request, response, true);
				//判断mapping如果为空,放行
				if (mapping == null) {
					boolean handled = execute.executeStaticResourceRequest(request, response);
					if (!handled) {
						chain.doFilter(request, response);
					}
				} else {
					//进入主要拦截方法了
					execute.executeAction(request, response, mapping);
				}
			}
        } finally {
            prepare.cleanupRequest(request);
        }
    }
分享到:
评论

相关推荐

    struts2源码分析总结

    本文将深入探讨Struts2的源码分析,特别是关于StrutsPrepareAndExecuteFilter的初始化过程,这是Struts2的核心组件之一,负责处理HTTP请求。 首先,我们来看`StrutsPrepareAndExecuteFilter`的初始化。这个过滤器...

    Struts1源码解析

    2. `getModuleConfig()`获取封装了请求的`ModuleConfig`对象。 3. 根据`ModuleConfig`获取Action处理类的实例,并调用其`process()`方法。 在`process()`方法内部: 1. `processPath()`解析请求的URI路径,用于...

    Strutssource源码

    7. **国际化与本地化**:Struts支持多语言环境,源码中的`org.apache.struts.util`包包含了一些本地化工具类,如MessageResources,用于加载和获取不同语言的资源文件。 8. **异常处理**:在`org.apache.struts....

    Struts开发中有哪几个关键对象

    在struts-config.xml文件中,每个ActionMapping对应一个请求URI,它包含了Action类的全限定名、ActionForm的类名以及Action完成后可能转发的ActionForward列表。当ActionServlet接收到请求时,会查找ActionMapping来...

    精通struts1.x技术,struts1完整详细教程

    此外,Struts还提供了ActionMapping、ActionForward等工具来帮助管理请求的流向和控制视图的呈现。 使用Struts1.x框架有以下优势: 1. 可靠性:业务逻辑和表示层分离,改动视图不会影响到后台代码。 2. 高重用性...

    Struts分页显示源码实例

    ### Struts分页显示源码实例解析 #### 一、背景介绍 在Web应用开发中,特别是使用MVC架构的框架如Struts时,分页显示是常见的需求之一。分页不仅能提高用户体验,还能减轻服务器压力。本文档将详细介绍如何在...

    Struts2自定义标签

    ### Struts2自定义标签详解 #### 一、引言 在Java Web开发中,Struts2框架因其灵活的架构和强大的功能而受到广大开发者们的青睐。其中,自定义标签是Struts2的一个强大特性,它允许开发者创建自己的HTML标签,以...

    Struts1实现文件上传源码

    2. **创建ActionForm**:创建一个继承自Struts1的`ActionForm`类,如`UploadForm`,并添加一个`File`类型的属性,用于存储上传的文件信息: ```java public class UploadForm extends ActionForm { private File...

    Struts framework的工作原理和组件Struts framework的工作原理和组件

    2. **ActionServlet接收请求**:ActionServlet作为前端控制器接收请求,并通过解析请求的URI来定位到对应的ActionMapping。 3. **查找ActionMapping**:根据ActionMapping中配置的信息(如路径、类型等),Action...

    MVC框架struts学习笔记

    2. 请求到达ActionServlet,ActionServlet解析请求URI,找到对应的ActionMapping。 3. ActionServlet将请求参数绑定到ActionForm对象,并传递给对应的Action类实例。 4. Action类执行业务逻辑,可能涉及数据库操作。...

    经典struts+hiberante+spring课件

    ActionServlet根据请求URI和ActionMapping对象决定调用哪个Action,并通过ActionForward指定响应页面。 总的来说,"经典struts+hiberante+spring课件"涉及的知识点主要包括Java Web开发中的Struts、Hibernate和...

    struts文件上传.pdf

    ### Struts文件上传知识点 #### 一、Struts框架简介 Struts是一个开源的MVC(Model-View-Controller)框架,它简化了基于Java的Web应用程序开发过程。Struits框架提供了一种结构化的方式来组织代码,使得开发更加...

    struts运行基本原理(详细)

    2. **查找映射**:`ActionServlet`根据请求的URI,查找`struts-config.xml`中的`ActionMapping`配置,确定应该调用哪个`Action`。 3. **实例化ActionForm**:如果`ActionMapping`中指定了`ActionForm`,`Action...

    struts+hibernate查询所有记录

    ### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...

    一个简单的struts 应用

    &lt;%@ taglib prefix="s" uri="/struts-tags" %&gt; &lt;form action="&lt;s:url action='test'/&gt;" method="post"&gt; 请输入数据"/&gt; 提交"/&gt; ``` 7. **运行和测试**:部署应用到服务器,访问`test.jsp`,填写表单并提交,...

    struts的错误处理

    在Struts中,ActionForm对象用于封装用户表单数据,并且可以实现表单数据的验证功能。当表单数据不符合预期时,可以通过ActionForm对象来捕获这些错误,并将其返回给用户。下面将详细介绍如何在ActionForm中实现错误...

    struts深入理解

    在Struts中,`ActionServlet`扮演了核心的角色,它作为控制器,负责接收客户端的请求,并根据请求的URI或路径决定由哪个`Action`来处理这些请求。当`ActionServlet`接收到请求后,会通过配置文件(struts-config.xml)...

    在struts中实现下拉列表

    在Struts中,ActionForm Bean是用来封装表单数据的对象。你需要在ActionForm类中创建一个与`property`属性对应的字段,比如: ```java public class YourForm extends ActionForm { private String selectedOption...

    Struts原理、开发及项目实施

    Struts原理、开发及项目实施 Holen 2002-9-12 &lt;br/&gt;1、 摘要 2、 关键词 3、 Framework 4、 Struts的起源 5、 Struts工作原理 6、 Struts安装 7、 一个实例 8、 Struts优缺点...

Global site tag (gtag.js) - Google Analytics