深入浅出学习Struts1框架(九):截取URL

 前两篇博客介绍了ActionServlet的初始化,讲述了它在初始化的时候做的事情。有了ActionServlet初始化,才能说当我们访问页面如何利用digester读取struts-config.xml配置文件信息,如何讲这些信息存到ActionMapping中,如何完成相应的业务处理和页面跳转。

 

       那么今天就开始进入这一环节的分析。分析之前,希望大家还是好好看看原先的系列文章,那些文章都是引子,能够很清晰的认识struts框架大概的运行流程,所以不至于出现分析到底层源码的时候不好理解的现象。废话也不多说,现在开始分析。

 

      这节课我们开始从截取路径开始,在《struts1框架一》博客中的mvc小实例中就已经写到了截取路径了,主要代码就是:

[java]  view plain copy print ?
  1. String requestURI=request.getRequestURI();    
  2. System.out.println("request="+requestURI);            
  3. String path=requestURI.substring(requestURI.indexOf("/",1),requestURI.indexOf("."));    
  4. System.out.println("path="+path);    

      这样我们就能从一个url中获得最后的名称和前面的“/”,也就是/login之类的字符串,之后用if-else判断就初始化相应的Action,虽然说这仅仅是一个mvc的小实例,但是就是这一简单的过程其实就是Struts框架截取字符串实现的原理所在(我个人观点,如果有不同见解,希望沟通交流)。

 

      记得前几篇博客的朋友都知道,我对mvc小实例进行了几次重构,我把那些if-else中的字符串放到了配置文件中,最终变成了dom4j读取配置文件,之后动态相匹配通过多肽形式实例化Action,完成相应的业务逻辑和页面跳转。有了这个基础我们来看看struts框架是如何进行截取字符串的,相信大家会有所共鸣。


      下面我们来对ActionServlet深层次进行分析。我们用断点的调试的方式来看底层源码。因为这个实例是post方式提交,所以将断点设置到doPost方法上。

 

 

      我们debug运行程序,进入doPost里面的方法:

    

 

        这个方法非常重要是ActionServlet运行的核心方法,这个Process处理了非常多的事情,后面的博客会一一介绍。


        我们进入这个方法:


    

       再继续进入:



     

      我们赫然发现了这样一个方法就是processPath方法,这个方法就是截取字符串的方法。这个方法的源代码如下:


[java]  view plain copy print ?
  1. /** 
  2.      * <p>Identify and return the path component(from the request URI) that 
  3.      * we will use to select an <code>ActionMapping</code> with which todispatch. 
  4.      * If no such path can be identified,create an error response and return 
  5.      * <code>null</code>.</p> 
  6.      * 
  7.      * @param request The servlet request weare processing 
  8.      * @param response The servlet response weare creating 
  9.      * 
  10.      * @exception IOException if an input/outputerror occurs 
  11.      */  
  12.    protectedString processPath(HttpServletRequest request,  
  13.                                 HttpServletResponse response)  
  14.         throws IOException {  
  15.    
  16.         String path = null;  
  17.    
  18.         // For prefix matching, match on the path info (if any)  
  19.         path = (String) request.getAttribute(INCLUDE_PATH_INFO);  
  20.         if (path == null) {  
  21.             path = request.getPathInfo();  
  22.         }  
  23.         if ((path != null) && (path.length() > 0)) {  
  24.             return (path);  
  25.         }  
  26.    
  27.         // For extension matching, strip the module prefix and extension  
  28.         path = (String) request.getAttribute(INCLUDE_SERVLET_PATH);  
  29.         if (path == null) {  
  30.             path = request.getServletPath();  
  31.        }  
  32.         String prefix = moduleConfig.getPrefix();  
  33.         if (!path.startsWith(prefix)) {  
  34.             String msg =getInternal().getMessage("processPath");  
  35.              
  36.             log.error(msg + " " + request.getRequestURI());  
  37.            response.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);  
  38.    
  39.             return null;  
  40.         }  
  41.          
  42.         path = path.substring(prefix.length());  
  43.         int slash = path.lastIndexOf("/");  
  44.         int period = path.lastIndexOf(".");  
  45.        if ((period >= 0) && (period >slash)) {  
  46.             path = path.substring(0, period);  
  47.         }  
  48.         return (path);  
  49.    
  50. }  



分析一下这段代码:

 

[java]  view plain copy print ?
  1. path = (String)request.getAttribute(INCLUDE_PATH_INFO);  
  2.         if (path == null) {  
  3.             path = request.getPathInfo();  
  4.         }  
  5.         if ((path != null) && (path.length() > 0)) {  
  6.             return (path);  
  7.         }  

         这段代码首先判断一下javax.servlet.include.path_info是否存在路径信息,这里要知道当当一个页面是以RequestDispatcher.include方式显示的话,这个属性值才存在。所以这里没有值,就会进入path =request.getPathInfo()程序中,这里的getPathInfo获取的值是相对servlet的路径信息。具体见博客(request.getPathInfo()方法的作用),通过那篇博客的分析,所以这里getPathInfo是获取不到值的。所以会进入下面的代码:

[java]  view plain copy print ?
  1. // For extension matching, stripthe module prefix and extension  
  2.         path = (String) request.getAttribute(INCLUDE_SERVLET_PATH);  
  3.         if (path == null) {  
  4.             path = request.getServletPath();  
  5.        }  
  6.         String prefix = moduleConfig.getPrefix();  
  7.         if (!path.startsWith(prefix)) {  
  8.             String msg =getInternal().getMessage("processPath");  
  9.              
  10.             log.error(msg + " " + request.getRequestURI());  
  11.            response.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);  
  12.    
  13.             return null;  
  14.         }  


        这一段代码是判断javax.servlet.include.servlet_path是否存在值,这个也是当一个页面是以equestDispatcher.include方式显示的话,这个属性值才存在,所以这里的值没有。之后进入path = request.getServletPath();这个方法是获得返回请求URI上下文后的子串,所以这里的返回值就是“/”和访问页面名称和后缀(这里和我的mvc实例截取的是不是一样的道理)。随后进入下面代码:


[java]  view plain copy print ?
  1. path = path.substring(prefix.length());  
  2.         intslash = path.lastIndexOf("/");  
  3.         intperiod = path.lastIndexOf(".");  
  4.         if((period >= 0) && (period > slash)) {  
  5.             path = path.substring(0, period);  
  6.         }  
  7.        return (path);  


       这里的方法主要和我的上面的那里是一样的,主要就是去掉后缀。

 

       到此为止,截取字符串的工作就算完成了。接下来就是要和action标签匹配,把相应信息放到ActionMapping中。

随着分析的深入,这专栏的连载会越来越精彩。敬请关注!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Struts1框架来实现一个POST请求的HTTP接口,你需要按照以下步骤进行操作: 1. 首先,确保你已经将Struts1框架集成到你的项目中。你可以在项目的依赖管理文件(比如Maven的pom.xml)中添加Struts1相关的依赖项,然后执行相应的构建命令。 2. 在你的项目中创建一个名为`user`的包,然后在该包下创建一个名为`AuthAction`的类。 3. 在`AuthAction`类中添加一个名为`execute`的方法,并继承自`org.apache.struts.action.Action`类。例如: ```java package com.example.user; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AuthAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 在这里编写处理POST请求的逻辑 return mapping.findForward("success"); } } ``` 4. 根据你的业务需求,在`execute`方法中编写处理POST请求的逻辑。你可以通过`request`对象获取POST请求的参数,然后进行相应的处理。 5. 配置Struts的路由规则,将请求路径映射到`AuthAction`类中的`execute`方法。在struts-config.xml配置文件中,添加如下配置: ```xml <action path="/user/auth" type="com.example.user.AuthAction" name="authForm" scope="request" validate="false"> <forward name="success" path="/success.jsp" /> </action> ``` 这里,我们将请求路径为`/user/auth`的POST请求映射到`AuthAction`类的`execute`方法,并将执行结果转发到名为`success`的页面。 6. 确保你的项目已经正确配置了Struts1框架的相关配置文件,比如struts-config.xml等。 这样,当有POST请求发送到`/user/auth`路径时,Struts1框架将会调用`AuthAction`类中的`execute`方法,并执行处理POST请求的逻辑。最后,根据配置的转发规则,将结果返回给客户端。 请注意,以上步骤是一般的示例,实际应用中可能需要根据具体需求进行适当调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值