R工具简介
R工具,是request、response工具,封闭了实用的操作request、response、session的方法。
R工具中,提供了大量的从Request获取参数并转换为合适的类型的简便方法--是对getParameter()的封装(是最常使用工具方法)
在做web开发时,使用R工具,可以方便开发工作。
R工具使用注意事项
只可以controller层使用R工具。
禁止在service、dao层使用R工具,因为R工具依赖servlet环境的request,会导致无法运行单元测试。
R工具的API
(标红色的表示常用)
方法 | 说明 |
---|---|
HttpServletRequest getRequest() |
获得Request |
HttpServletResponse getResponse() |
获取Response |
HttpSession getSession() |
获取session |
String get(String paramName ) |
最常用使用的方法
从Request中获取参数的值,并转换为String类型,并trim去掉前后半角空格
会对参数值使用trim()去掉前后的空格 |
String get(String paramName , String defaultValue ) |
从Request中获取参数的值,并转换为String类型,并trim去掉前后半角空格
是对getParameter()方法的封装,是最常使用工具方法
|
String[] getArray(String paramName ) | 如果一个key对应多个value,可以使用 String[] getArray(String paramName) 方法获取 |
Map<String, String> getMap() | 获取Request中的全部参数(如果一个key对应多个value,只保留第一个value) |
Map<String,String[]> getMapAll() | 获取Request中的全部参数(一个key可以对应多个value) |
LinkedHashMap<String, String> getPrameterWithPrefix(String prefix , boolean usefullname ) |
根据前缀名,取出一批值,是request.getParameter()的一个便捷工具方法
使用场景:当表单提交上来的数据有统一的前缀(attr_name,attr_image,attr_path)但数量不确定时,可使用本工具方法来取值。
|
String getIpAddress(HttpServletRequest request ) |
获取用户真实IP地址(只能获得用户的公网出口IP)
1、当客户端使用了透明代理时,可以通过本方法获取用户的公网出口IP。
如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,要取X-Forwarded-For中第一个非unknown的有效IP字符串。
|
String getCtx() |
获取应用上下文的根路径 |
void writeJson(String json ,String encoding ) |
用Response写出 json |
void writeHtml(String html ,String encoding ) |
用Response写出 html |
String getAllParameter() |
从Request中取出所有参数,拼成一个串:a=1&a=2&b=2&c=3
|
void redirect(String url ) |
重定向 |
void forward(String path ) |
转发请求 |
void setAttr(String key ,Object value ) |
R工具中,void setAttr(String key,Object value) -- 是对setAttribute()的封装 |
Object getAttr(String key ) |
R工具中,Object getAttr(String key) -- 是对getAttribute()的封装 |
Float getFloat(String paramName , Float defaultValue ) |
从Request中获取参数的值,并转换为Float类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Float getFloat(String paramName ) |
从Request中获取参数的值,并转换为Float类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
Boolean getBoolean(String paramName , Boolean defaultValue ) |
从Request中获取参数的值("true","false"),并转换为Boolean类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Boolean getBoolean(String paramName ) |
从Request中获取参数的值("true","false"),并转换为Boolean类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
Boolean getBoolean4Int(String paramName , int _true ) |
从Request中获取参数的值("1","0",等等int值),并转换为Boolean类型
@param paramName 参数名称
|
Boolean getBoolean4Int(String paramName ) |
从Request中获取参数的值,
如果遇到1就返回true,否则返回false
@param paramName 参数名称
|
Double getDouble(String paramName , Double defaultValue ) |
从Request中获取参数的值,并转换为Double类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Double getDouble(String paramName ) |
从Request中获取参数的值,并转换为Double类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
Integer getInteger(String paramName , Integer defaultValue ) |
从Request中获取参数的值,并转换为Integer类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Integer getInteger(String paramName ) |
从Request中获取参数的值,并转换为Integer类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
Long getLong(String paramName , Long defaultValue ) |
从Request中获取参数的值,并转换为Long类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Long getLong(String paramName ) |
从Request中获取参数的值,并转换为Long类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
Byte getByte(String paramName , Byte defaultValue ) |
从Request中获取参数的值,并转换为Byte类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Byte getByte(String paramName ) |
从Request中获取参数的值,并转换为Byte类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
Short getShort(String paramName , Short defaultValue ) |
从Request中获取参数的值,并转换为Short类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Short getShort(String paramName ) |
从Request中获取参数的值,并转换为Short类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
Date getDate(String paramName , String format ,Date defaultValue ) |
从Request中获取参数的值,并转换为Date类型
如果Request中无此参数(==null),则返回默认值。
@param paramName 参数名称
|
Date getDate(String paramName , String format ) |
从Request中获取参数的值,并转换为Date类型
如果Request中无此参数(==null),则返回null。
@param paramName 参数名称
|
R工具的配置
使用R工具前,应先在web.xml中进行配置。
一般情况下请使用“配置2”。
“配置1”与“配置2”,至少使用一个,两个都使用也中以。R工具在取request时,先查找“配置1”再查找“配置2”。
配置1
优点:
- 在Controller内使用R工具没有问题,表示都很好。
- 由于使用的是listener,不需要考虑在web.xml中的配置的顺序问题。遇到特殊情况举例一、二,在Controller内总能拿到最终的request。
缺点:
- 在Controller外比如Filter中,无法取到Response,取到null。
- 在Controller外比如Filter中,遇到特殊情况举例二,取到的request是不对的,取到的是原始的request,我想取最终的request。(使用了DelegatingFilterProxy也不行)
- 网上说在Controller内,遇到特殊情况举例三,无法取到参数。
<!-- 在spring mvc中,为了随时都能取到当前请求的request对象,可以使用RequestContextHolder,需要配置RequestContextListener --> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener>
配置2
缺点:由于使用的是filter,需要考虑在web.xml中的配置的顺序问题。遇到特殊情况举例一、二时,“特殊情况举例一、二”的filter要在前面,R工具的filter要在后面。这个R工具取出的Request才是被增强过的。
优点:在Controller外比如Filter中(注意顺序),都工作正常。
<!-- R工具过滤器 --> <filter> <filter-name>r</filter-name> <filter-class>com.sicheng.common.web.R</filter-class> </filter> <filter-mapping> <filter-name>r</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
特殊情况举例一
HttpServletRequestWrapper类给了我们对Request进行包装增强的机会。
本系统中就有防止 xss 攻击过滤器:com.sicheng.common.xss.XssFilter,使用了这个原理。
XssFilter会创建一个新的XssHttpServletRequestWrapper对象来替换最原始的request对象。
特殊情况举例二
如果你想做一个分布式的系统,第一步要解决session的问题,你可以使用spring-session,它会接管seesion存储到Redis中。它创建一个新的Requet对象替换最原始的request对象。
特殊情况举例三
使用了文件上传,form表单的enctype类型为”multipart/form-data”,spring mvc对文件上传的处理类实际却为spring-mvc.xml文件中配置的CommonsMultipartResolver。
它创建一个MultipartHttpServletRequet对象替换最原始的request对象。
文章: https://dinguangx.iteye.com/blog/2227049 (我还未通过实验来证实)