Tomcat如何处理请求参数,相信很多没有经验的人对此无能为力。为此,本文总结了问题产生的原因和解决方法,希望大家可以通过这篇文章来解决这个问题。
带有参数的url形式(也就是我们常说的GET请求)以请求目标后的问号开始,后面是参数名称-值对,多个名称-值对之间用&符号()分隔。
Tomcat中URL传递的参数是如何解析的?
一般来说,我们希望在Servlet中获得某个参数,一般有以下几种方式。
字符串值=request . getparameter('paramName');
需要的时候我们直接通过参数名来取。这个值的设置是什么?名称-值对如何对应?
让我们按照getParameter的方法来实现这个瓜。
当我们使用对象HttpServletRequest时,我们已经使用了它的一个门面对象(RequestFacade)。这个对象在设计模式中使用了facade模式,在HttpServletRequest中封装了一些细节,并且只公开了一些必要的API。
当实际处理请求时,调用封装的请求对象。
getParameter方法的代码如下所示:
/*返回指定请求参数的值(如果有);否则,
*返回codenull/code。如果定义了多个值,
*只返回第一个。
* @参数名所需请求参数的名称
*/
公共字符串getParameter(字符串名称){ 0
if(!parameters sparsed){ 0
parseParameters();
}
返回郊狼请求. getParameters()。getParameter(名称);
}
在每次请求时,它将首先确定参数是否已被解析,如果已被解析,它将直接返回。
受保护的void parseParameters(){ 0
parametersParsed = true; //注意这里,解析之后就设为true了。
Parameters parameters=郊狼请求. getparameters();
布尔成功=假;
尝试{
//每次通过JMX更改限额时设置该值
parameters . setlimit(GetConnector()。getMaxParameterCount());
}
.
参数。handleQueryParameters();
}
因此,当第一次调用getParameter方法时,会对这个名称-值对进行配置和初始化。
接下来,这个handleQueryParameters就是具体的处理方法。让我们假设请求了以下url:
http://localhost:8080/test?abc=1def=2
在handleQueryParameters方法中,我们通过调试界面进行观察。
这里,参数包含一个属性queryMB,它的值正好是我们传入的字符串。因此,以下参数处理基于此属性。
然后,在参数类的processParameter方法中,
我们明白了,基本是遍历字符串中的各个char,遇到特定字符=和之后,再从各个index获取等号前后的名和值.
中间一个特别的地方是遇到%和+时,是出现了像汉字一类的,其实是需要转义的,所以处理也是在此进行的.
解析后,名称-值对被存储在像数组列表这样的数据结构中。看看下面的代码,
公共void addParameter(字符串键,字符串值){ 0
ArrayListString值=paramashvalues . get(key);
if(values==null){ 0
values=新数组列表(1);
paramHashValues.put(key, values);
}
values.add(value);
}
执行上述方法后,代码向下执行,您看到的parameters对象的值如下所示:
abc=1,\n def=2,\n
注意上面标有红色和粗体的两条线,
你还记得上面提到如果有多个参数,重名的只会返回第一个匹配项吗?
在请求的具体参数请求中,如果不涉及初始处理,执行下面的代码,非常简单,就是直接从Map里取对应key的ArrayList,有值的话就从中取第一个值。.
公共字符串getParameter(字符串名称){ 0
handleQueryParameters();
ArrayListString值=paramashvalues . get(name);
if (values!=null){ 0
if(values . size()==0){ 0
返回“”;
}
return values.get(0); //注意这里,就是在兑现只返回第一个的承诺!!!
} else {
返回null
}
}看完上面的内容,你掌握Tomcat如何处理请求参数了吗?如果您想学习更多技能或了解更多相关内容,请关注行业资讯频道,感谢您的阅读!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/138394.html