Servlet 相关工具
| Modifiers | Name | Description |
|---|---|---|
static String |
X_REQUESTED_WITH |
AJAX请求头名称 |
static String |
contextPath |
当前 WebApp 的上下文根,值为 "/Foobar" 或 "" |
| Type | Name and description |
|---|---|
static javax.servlet.http.Cookie |
createCookie(String name, String value, Map options = null)创建 Cookie 对象 |
static javax.servlet.http.HttpServletRequest |
createMockRequest(String requestURI, String requestMethod = "GET")生成一个模拟的 request 对象 |
static javax.servlet.http.HttpServletResponse |
createMockResponse(java.io.PrintWriter writer)生成一个模拟的 response 对象,相比 MockHttpServletResponse,便于操作输出结果 |
static boolean |
executeWithSessionLock(String lockKey, Integer synSize, Integer waitMs, Closure callback, Closure callbackFail = null)在用户 session 范围内限定并发的执行,如果没有 session,则抛出 IllegalStateException。 |
static Map |
expandParams(Map params, Boolean removeExpanded = true)将 Map 展开,便于数据绑定。 |
static Map |
flattenParams(Map params)将 params 扁平化,便于 redirect 或 forward。 |
static String |
getActionName()获得当前控制器操作名 |
static String |
getCachableSessionId(String sessionId = null) |
static Map |
getClientBrowser(javax.servlet.http.HttpServletRequest request = getRequest()获得客户端浏览器信息 |
static Map |
getClientBrowser(String userAgent)获得客户端浏览器信息 |
static String |
getClientIpAddr(javax.servlet.http.HttpServletRequest request = getRequest()获得客户端IP地址 |
static String |
getClusterNode(Boolean configOnly = false)获取当前集群节点 |
static List<String> |
getClusterNodes(Boolean rebroadcast = false)获得所有集群节点 |
static String |
getControllerName()获得当前控制器名称 |
static javax.servlet.http.Cookie |
getCookie(javax.servlet.http.HttpServletRequest request, String name)获得 Cookie 对象 |
static String |
getCookieValue(javax.servlet.http.HttpServletRequest request, String name)获得 Cookie 的值 |
static Map |
getForwardParams()计算仅用于控制器中调用 forward 时设置的参数 params |
static Locale |
getLocale(javax.servlet.http.HttpServletRequest request = getRequest()获得当前请求的locale |
static org.springframework.ui.ModelMap |
getModelMap()获得当前控制器操作执行 render 时设置的 model 对象 |
static org.springframework.web.multipart.MultipartHttpServletRequest |
getMultipartRequest(javax.servlet.http.HttpServletRequest request = null)判断当前请求是否包含附件,是则返回对应的 MultipartHttpServletRequest 对象 |
static String |
getOriginalFilename(javax.servlet.http.HttpServletRequest request, org.springframework.web.multipart.MultipartFile mf)获得上传附件的原始名称 |
static grails.web.servlet.mvc.GrailsParameterMap |
getParams()获得当前控制器操作请求中的params对象 |
static javax.servlet.http.HttpServletRequest |
getRequest()获得当前请求的request对象 |
static javax.servlet.http.HttpServletResponse |
getResponse()获得当前请求的response对象 |
static String |
getServerHost(javax.servlet.http.HttpServletRequest request = getRequest(, Boolean isLocalAddr = false)获得服务器的主机地址 |
static String |
getServerURL(javax.servlet.http.HttpServletRequest request = getRequest(, Boolean isLocalAddr = false)获得服务器的绝对地址,如:http://xxx/cc/ |
static String |
getServletPath(javax.servlet.http.HttpServletRequest request = null, Boolean decodeQs = false)计算访问的URI路径(不带上下文根);如果请求带有参数,则参数也会拼在后面。 |
static javax.servlet.http.HttpSession |
getSession(javax.servlet.http.HttpServletRequest request = getRequest()获得当前请求用户的session |
static String |
getWebappPath()获得应用的web文件夹路径,如 /opt/Tomcat8/webapps/Foobar,或者开发环境下工程的 web-app 文件夹 |
static boolean |
isAjax(javax.servlet.http.HttpServletRequest request = getRequest(, String jsonp = "jsonp")通过 http 头、URL参数等条件,判断是否是 ajax 请求。 |
static boolean |
isRealAjax(javax.servlet.http.HttpServletRequest request = getRequest()通过 http 请求头 X-Requested-With 判断,是否是 ajax 请求 |
static void |
nocache(javax.servlet.http.HttpServletResponse response)禁止缓存 |
static String |
orderByParams(Map params, Map defaultOrders = null, String prefix = "")根据 params 中的排序参数(sort、order),获得排序的 hql 片段(order by ...) |
static Map |
paginateParams(Map params, Integer defaultMax = 20, Integer maxLimit = 200)处理 params 中的翻页参数 |
static javax.servlet.http.Cookie |
removeCookie(javax.servlet.http.HttpServletResponse response, String name, Map options = null)删除 Cookie |
static StringBuilder |
renderClose(StringBuilder sb, Map options)@see bropen.toolkit.traits.ControllerTrait#renderClose |
static void |
renderDownload(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, java.io.InputStream is, String filename = null, String contentType = null, Number contentLength = null, Map cacheArgs = null)将输入流写入http response中,实现下载 |
static void |
renderDownload(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Closure closure, String filename = null, String contentType = null, Number contentLength = null, Map cacheArgs = null)使用自定义闭包,将流写入http response中,实现下载 |
static void |
renderImage(javax.servlet.http.HttpServletResponse response, String contentType, java.io.InputStream imageIs)渲染图片 |
static void |
renderImage(javax.servlet.http.HttpServletResponse response, java.io.File imageFile, Map options)渲染图片 |
static void |
renderImage(java.io.OutputStream os, java.io.InputStream imageIs, Map options)渲染图片到输出流中 |
static StringBuilder |
renderImageData(java.io.InputStream imageIs, Map options)渲染图片为 data:image/png;base64,XXX 的字符串,用于 img 标签的 src 属性 |
static String |
renderModelAndView2Text(Map modelAndView, javax.servlet.http.HttpServletRequest request)返回渲染 ModelAndView(gsp)后的文本字符串,返回结果会自动套用 layout 模板 |
static String |
renderModelAndView2Text(Map modelAndView)返回渲染 ModelAndView(gsp)后的文本字符串,返回结果不会套用 layout 模板(可能导致公共的js、样式等无法加载)。 |
static StringBuilder |
renderReloadOpener(StringBuilder sb = null) |
static java.awt.image.BufferedImage |
scaleImage(java.awt.image.BufferedImage src, Integer w, Integer h) |
static void |
setFilename(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, String filename)转换文件名,并设置到 response 的 Content-Disposition 头中,已便客户端保存文件的时候显示正确的文件名 |
| Methods inherited from class | Name |
|---|---|
class Object |
Object#wait(long, int), Object#wait(long), Object#wait(), Object#equals(Object), Object#toString(), Object#hashCode(), Object#getClass(), Object#notify(), Object#notifyAll() |
AJAX请求头名称
当前 WebApp 的上下文根,值为 "/Foobar" 或 ""
创建 Cookie 对象
options.domain - 域名,如果为 null,则根据 request 头 Host 计算根域名options.path - 路径,默认为 /options.httpOnly - 是否限制 js 读取 Cookie,避免 XSS 攻击,默认为 falseoptions.maxAge - 默认为 -1,即浏览器关闭则失效options.secure - 默认为 falseoptions.request - 可用于计算 domain 的当前 http 请求生成一个模拟的 request 对象
生成一个模拟的 response 对象,相比 MockHttpServletResponse,便于操作输出结果
如:
ByteArrayOutputStream baos = new ByteArrayOutputStream()
def resp = ServletUtils.createMockResponse(new PrintWriter(baos))
....
contents = baos.toString()
baos.close()
在用户 session 范围内限定并发的执行,如果没有 session,则抛出 IllegalStateException。
需要执行的逻辑以闭包的形式传入。
lockKey - 锁的keysynSize - 最大并发数waitMs - 如果超过并发数时,等待重试的毫秒数;如果为小于等于0的数,则不等待、直接调用 callbackFail 并返回 falsecallback - 需要执行的闭包callbackFail - 超过并发数时执行的闭包;如果返回 true,则等待后其他线程执行完成(最长不超过1分钟)后继续执行。将 Map 展开,便于数据绑定。
如 ["a.b": 1 ] 将转为 ["a": ["b": 1]]。
removeExpanded - 是否删除展开前的键值对,即上例中是否删除键 “a.b”,默认为 true。将 params 扁平化,便于 redirect 或 forward。
如 ["a.b": 1, "a": ["b": 1]] 将去掉 Map 类型的参数 a。
获得当前控制器操作名
获得客户端浏览器信息
浏览器信息包括:
获得客户端浏览器信息
获得客户端IP地址
request - 请求对象获取当前集群节点
需配置 clusters.properties、并在系统防火墙中开放 ehcache 同步端口。
获得所有集群节点
需配置 clusters.properties、并在系统防火墙中开放ehcache同步端口。
获得当前控制器名称
获得 Cookie 对象
获得 Cookie 的值
计算仅用于控制器中调用 forward 时设置的参数 params
主要用于解决 Grails 的 bug,考虑下面的代码:
forward (controller: "foo" , action: "bar" , params: ?)
获得当前请求的locale
获得当前控制器操作执行 render 时设置的 model 对象
判断当前请求是否包含附件,是则返回对应的 MultipartHttpServletRequest 对象
获得上传附件的原始名称
主要是修正 IE11 的兼容问题。
mf - 附件对象获得当前控制器操作请求中的params对象
获得当前请求的request对象
获得当前请求的response对象
获得服务器的主机地址
request - 请求对象isLocalAddr - 是否取服务器的本地地址(如 apache 的 mod_proxy_http 绑定的地址)和端口,
默认为否,即取浏览器访问时使用的地址和端口获得服务器的绝对地址,如:http://xxx/cc/
request - 请求对象isLocalAddr - 是否取服务器的本地地址(如apache的mod_proxy_http绑定的地址)和端口,
默认为否,即取浏览器访问时使用的地址和端口。计算访问的URI路径(不带上下文根);如果请求带有参数,则参数也会拼在后面。
如:/foobar/list?disabled=1
request - 请求对象,默认自动计算当前请求decode - 是否解码 query string 中的参数,默认为否获得当前请求用户的session
获得应用的web文件夹路径,如 /opt/Tomcat8/webapps/Foobar,或者开发环境下工程的 web-app 文件夹
通过 http 头、URL参数等条件,判断是否是 ajax 请求。
参考 SpringSecurity 插件的 grails.plugin.springsecurity.SpringSecurityUtils 中的同名方法。
如果请求参数中有 ajax、或者存在 jsonp 的参数,则也认为是 ajax 请求。
如果只希望判断是不是真正的 ajax 请求(通过 http 头判断),请使用 isReadAjax 方法。
request - 请求对象jsonp - 在 URL 中的 jsonp 参数名称,默认为 jsonp,即找到名为 jsonp 的参数,则也认为是 ajax 请求;如果为空,则不判断。通过 http 请求头 X-Requested-With 判断,是否是 ajax 请求
禁止缓存
根据 params 中的排序参数(sort、order),获得排序的 hql 片段(order by ...)
params - 包含排序参数的 Map。排序参数 sort 可以为 [sort: foo, order: desc] 或 [sort: [fullSequance: asc, name: asc, ...]] 两种形式。defaultOrders - 默认排序,行如 [fullSequance: asc, name: asc, ...]。prefix - 排序列名称前缀,如 "d."。处理 params 中的翻页参数
params - 需要处理的 MapdefaultMax - 参数中不包含 max 时的默认值,默认为 20maxLimit - 最大的 max,如果 params 中的 max 大于本参数、且 params 中不包含参数 all,则重置为本参数,默认为 200删除 Cookie
options - 见 createCookie
options.message - 关闭窗口前要提示(alert)的消息文本options.before - 关闭窗口前要执行的js脚本options.wait - 关闭窗口前要等待的时间(毫秒数)options.reloadopener - 关闭窗口前,是否 reload 父窗口将输入流写入http response中,实现下载
is - 输入流,最后会自动关闭filename - 下载时的文件名,可为空;此时 contentType 不能为空。contentType - 文件类型,可为空contentLength - 文件大小(Byte),可为空cacheArgs - 浏览器缓存参数,可为空,参考:http://grails.org/plugin/cache-headers使用自定义闭包,将流写入http response中,实现下载
closure - 写 response 的闭包(BufferedOutputStream bos 参数可选)。执行完成后,会自动调用 response.flushBuffer()。渲染图片
contentType - 图片类型,默认为 "image/png"imageIs - 图片的输入流渲染图片
imageFile - 图片文件options.confusing - 是否在原图绘制随机的干扰线条options.scale - 图片缩放比例,取值范围为 [1, 100),如 50 表示 50%、即缩小一半;也可以使用 scaleWidth、scaleHeight 来精确缩放大小。options.scaleWidth - 缩放后的宽度,单位为像素options.scaleHeight - 缩放后的高度,单位为像素options.cacheArgs - 浏览器缓存参数,参考 http://grails.org/plugin/cache-headers渲染图片到输出流中
os - 输出流imageIs - 图片的输入流options.confusing - 是否在原图绘制随机的干扰线条options.scale - 图片缩放比例,取值范围为 [1, 100),如 50 表示 50%、即缩小一半;也可以使用 scaleWidth、scaleHeight 来精确缩放大小。options.scaleWidth - 缩放后的宽度,单位为像素options.scaleHeight - 缩放后的高度,单位为像素 渲染图片为 data:image/png;base64,XXX 的字符串,用于 img 标签的 src 属性
imageIs - 图片的输入流options.confusing - 是否在原图绘制随机的干扰线条options.scale - 图片缩放比例,取值范围为 [1, 100),如 50 表示 50%、即缩小一半;也可以使用 scaleWidth、scaleHeight 来精确缩放大小。options.scaleWidth - 缩放后的宽度,单位为像素options.scaleHeight - 缩放后的高度,单位为像素返回渲染 ModelAndView(gsp)后的文本字符串,返回结果会自动套用 layout 模板
modelAndView - 包含 view、model、plugin 属性的 Map(同控制器方法 render 的参数)request - 当前的 http 请求对象,用于套用 layout 模板返回渲染 ModelAndView(gsp)后的文本字符串,返回结果不会套用 layout 模板(可能导致公共的js、样式等无法加载)。
modelAndView - 包含 view、model、plugin 属性的 Map(同控制器方法 render 的参数);
此外,如果 view 是相对路径(不是/开头的),model 中可以包含 controllerName 参数用来计算 view 的绝对路径。转换文件名,并设置到 response 的 Content-Disposition 头中,已便客户端保存文件的时候显示正确的文件名
主要是修正 IE、Firefox 等浏览器的兼容性问题。