test erm update
This commit is contained in:
@@ -1,439 +1,439 @@
|
||||
/**
|
||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
*/
|
||||
package com.jeesite.common.web.http;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import com.jeesite.common.collect.MapUtils;
|
||||
import com.jeesite.common.io.PropertiesUtils;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.mapper.JsonMapper;
|
||||
import com.jeesite.common.mapper.XmlMapper;
|
||||
|
||||
/**
|
||||
* Http与Servlet工具类.
|
||||
* @author ThinkGem
|
||||
* @version 2014-8-19
|
||||
*/
|
||||
public class ServletUtils {
|
||||
|
||||
public static final String DEFAULT_PARAMS_PARAM = "params"; // 登录扩展参数(JSON字符串)优先级高于扩展参数前缀
|
||||
public static final String DEFAULT_PARAM_PREFIX_PARAM = "param_"; // 扩展参数前缀
|
||||
|
||||
// 定义静态文件后缀;静态文件排除URI地址
|
||||
private static String[] staticFiles;
|
||||
private static String[] staticFileExcludeUri;
|
||||
|
||||
/**
|
||||
* 获取当前请求对象
|
||||
* web.xml: <listener><listener-class>
|
||||
* org.springframework.web.context.request.RequestContextListener
|
||||
* </listener-class></listener>
|
||||
*/
|
||||
public static HttpServletRequest getRequest(){
|
||||
HttpServletRequest request = null;
|
||||
try{
|
||||
request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
|
||||
if (request == null){
|
||||
return null;
|
||||
}
|
||||
return request;
|
||||
}catch(Exception e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前相应对象
|
||||
* web.xml: <filter><filter-name>requestContextFilter</filter-name><filter-class>
|
||||
* org.springframework.web.filter.RequestContextFilter</filter-class></filter><filter-mapping>
|
||||
* <filter-name>requestContextFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
|
||||
*/
|
||||
public static HttpServletResponse getResponse(){
|
||||
HttpServletResponse response = null;
|
||||
try{
|
||||
response = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getResponse();
|
||||
if (response == null){
|
||||
return null;
|
||||
}
|
||||
}catch(Exception e){
|
||||
return null;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是Ajax异步请求
|
||||
* @param request
|
||||
*/
|
||||
public static boolean isAjaxRequest(HttpServletRequest request){
|
||||
|
||||
String accept = request.getHeader("accept");
|
||||
if (accept != null && accept.indexOf("application/json") != -1){
|
||||
return true;
|
||||
}
|
||||
|
||||
String xRequestedWith = request.getHeader("X-Requested-With");
|
||||
if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1){
|
||||
return true;
|
||||
}
|
||||
|
||||
String uri = request.getRequestURI();
|
||||
if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")){
|
||||
return true;
|
||||
}
|
||||
|
||||
String ajax = request.getParameter("__ajax");
|
||||
if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")){
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断访问URI是否是静态文件请求
|
||||
* @throws Exception
|
||||
*/
|
||||
public static boolean isStaticFile(String uri){
|
||||
if (staticFiles == null){
|
||||
PropertiesUtils pl = PropertiesUtils.getInstance();
|
||||
try{
|
||||
staticFiles = StringUtils.split(pl.getProperty("web.staticFile"), ",");
|
||||
staticFileExcludeUri = StringUtils.split(pl.getProperty("web.staticFileExcludeUri"), ",");
|
||||
}catch(NoSuchElementException nsee){
|
||||
; // 什么也不做
|
||||
}
|
||||
if (staticFiles == null){
|
||||
try {
|
||||
throw new Exception("检测到“jeesite.yml”中没有配置“web.staticFile”属性。"
|
||||
+ "配置示例:\n#静态文件后缀\nweb.staticFile=.css,.js,.png,.jpg,.gif,"
|
||||
+ ".jpeg,.bmp,.ico,.swf,.psd,.htc,.crx,.xpi,.exe,.ipa,.apk");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (staticFileExcludeUri != null){
|
||||
for (String s : staticFileExcludeUri){
|
||||
if (StringUtils.contains(uri, s)){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (StringUtils.endsWithAny(uri, staticFiles)){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回结果JSON字符串(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @param data 消息数据
|
||||
* @return JSON字符串:{result:'true',message:''}
|
||||
*/
|
||||
public static String renderResult(String result, String message) {
|
||||
return renderResult(result, message, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回结果JSON字符串(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @param data 消息数据
|
||||
* @return JSON字符串:{result:'true',message:'', if map then key:value,key2:value2... else data:{} }
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static String renderResult(String result, String message, Object data) {
|
||||
Map<String, Object> resultMap = MapUtils.newHashMap();
|
||||
resultMap.put("result", result);
|
||||
resultMap.put("message", message);
|
||||
if (data != null){
|
||||
if (data instanceof Map){
|
||||
resultMap.putAll((Map<String, Object>)data);
|
||||
}else{
|
||||
resultMap.put("data", data);
|
||||
}
|
||||
}
|
||||
HttpServletRequest request = ServletUtils.getRequest();
|
||||
String uri = request.getRequestURI();
|
||||
if (StringUtils.endsWithIgnoreCase(uri, ".xml")){
|
||||
return XmlMapper.toXml(resultMap);
|
||||
}else{
|
||||
String functionName = request.getParameter("__callback");
|
||||
if (StringUtils.isNotBlank(functionName)){
|
||||
return JsonMapper.toJsonp(functionName, resultMap);
|
||||
}else{
|
||||
return JsonMapper.toJson(resultMap);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接将结果JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param response 渲染对象:{result:'true',message:'',data:{}}
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @return null
|
||||
*/
|
||||
public static String renderResult(HttpServletResponse response, String result, String message) {
|
||||
return renderString(response, renderResult(result, message), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接将结果JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param response 渲染对象:{result:'true',message:'',data:{}}
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @param data 消息数据
|
||||
* @return null
|
||||
*/
|
||||
public static String renderResult(HttpServletResponse response, String result, String message, Object data) {
|
||||
return renderString(response, renderResult(result, message, data), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将对象转换为JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param response 渲染对象
|
||||
* @param object 待转换JSON并渲染的对象
|
||||
* @return null
|
||||
*/
|
||||
public static String renderObject(HttpServletResponse response, Object object) {
|
||||
HttpServletRequest request = ServletUtils.getRequest();
|
||||
String uri = request.getRequestURI();
|
||||
if (StringUtils.endsWithIgnoreCase(uri, ".xml")){
|
||||
return XmlMapper.toXml(object);
|
||||
}else{
|
||||
String functionName = request.getParameter("__callback");
|
||||
if (StringUtils.isNotBlank(functionName)){
|
||||
return renderString(response, JsonMapper.toJsonp(functionName, object));
|
||||
}else{
|
||||
return renderString(response, JsonMapper.toJson(object));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将字符串渲染到客户端
|
||||
* @param response 渲染对象
|
||||
* @param string 待渲染的字符串
|
||||
* @return null
|
||||
*/
|
||||
public static String renderString(HttpServletResponse response, String string) {
|
||||
return renderString(response, string, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将字符串渲染到客户端
|
||||
* @param response 渲染对象
|
||||
* @param string 待渲染的字符串
|
||||
* @return null
|
||||
*/
|
||||
public static String renderString(HttpServletResponse response, String string, String type) {
|
||||
try {
|
||||
// response.reset(); // 先注释掉,否则以前设置的Header会被清理掉,如ajax登录设置记住我Cookie
|
||||
response.setContentType(type == null ? "application/json" : type);
|
||||
response.setCharacterEncoding("utf-8");
|
||||
response.getWriter().print(string);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得请求参数值
|
||||
*/
|
||||
public static String getParameter(String name) {
|
||||
HttpServletRequest request = getRequest();
|
||||
if (request == null){
|
||||
return null;
|
||||
}
|
||||
return request.getParameter(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得请求参数Map
|
||||
*/
|
||||
public static Map<String, Object> getParameters() {
|
||||
return getParameters(getRequest());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得请求参数Map
|
||||
*/
|
||||
public static Map<String, Object> getParameters(ServletRequest request) {
|
||||
if (request == null){
|
||||
return MapUtils.newHashMap();
|
||||
}
|
||||
return getParametersStartingWith(request, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得带相同前缀的Request Parameters, copy from spring WebUtils.
|
||||
* 返回的结果的Parameter名已去除前缀.
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Map<String, Object> getParametersStartingWith(ServletRequest request, String prefix) {
|
||||
Validate.notNull(request, "Request must not be null");
|
||||
Enumeration paramNames = request.getParameterNames();
|
||||
Map<String, Object> params = new TreeMap<String, Object>();
|
||||
String pre = prefix;
|
||||
if (pre == null) {
|
||||
pre = "";
|
||||
}
|
||||
while (paramNames != null && paramNames.hasMoreElements()) {
|
||||
String paramName = (String) paramNames.nextElement();
|
||||
if ("".equals(pre) || paramName.startsWith(pre)) {
|
||||
String unprefixed = paramName.substring(pre.length());
|
||||
String[] values = request.getParameterValues(paramName);
|
||||
if (values == null || values.length == 0) {
|
||||
values = new String[]{};
|
||||
// Do nothing, no values found at all.
|
||||
} else if (values.length > 1) {
|
||||
params.put(unprefixed, values);
|
||||
} else {
|
||||
params.put(unprefixed, values[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
/**
|
||||
* 组合Parameters生成Query String的Parameter部分,并在paramter name上加上prefix.
|
||||
*/
|
||||
public static String encodeParameterStringWithPrefix(Map<String, Object> params, String prefix) {
|
||||
StringBuilder queryStringBuilder = new StringBuilder();
|
||||
String pre = prefix;
|
||||
if (pre == null) {
|
||||
pre = "";
|
||||
}
|
||||
Iterator<Entry<String, Object>> it = params.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
Entry<String, Object> entry = it.next();
|
||||
queryStringBuilder.append(pre).append(entry.getKey()).append("=").append(entry.getValue());
|
||||
if (it.hasNext()) {
|
||||
queryStringBuilder.append("&");
|
||||
}
|
||||
}
|
||||
return queryStringBuilder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 从请求对象中扩展参数数据,格式:JSON 或 param_ 开头的参数
|
||||
* @param request 请求对象
|
||||
* @return 返回Map对象
|
||||
*/
|
||||
public static Map<String, Object> getExtParams(ServletRequest request) {
|
||||
Map<String, Object> paramMap = null;
|
||||
String params = StringUtils.trim(request.getParameter(DEFAULT_PARAMS_PARAM));
|
||||
if (StringUtils.isNotBlank(params) && StringUtils.startsWith(params, "{")) {
|
||||
paramMap = JsonMapper.fromJson(params, Map.class);
|
||||
} else {
|
||||
paramMap = getParametersStartingWith(ServletUtils.getRequest(), DEFAULT_PARAM_PREFIX_PARAM);
|
||||
}
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置客户端缓存过期时间 的Header.
|
||||
*/
|
||||
public static void setExpiresHeader(HttpServletResponse response, long expiresSeconds) {
|
||||
// Http 1.0 header, set a fix expires date.
|
||||
response.setDateHeader(HttpHeaders.EXPIRES, System.currentTimeMillis() + expiresSeconds * 1000);
|
||||
// Http 1.1 header, set a time after now.
|
||||
response.setHeader(HttpHeaders.CACHE_CONTROL, "private, max-age=" + expiresSeconds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置禁止客户端缓存的Header.
|
||||
*/
|
||||
public static void setNoCacheHeader(HttpServletResponse response) {
|
||||
// Http 1.0 header
|
||||
response.setDateHeader(HttpHeaders.EXPIRES, 1L);
|
||||
response.addHeader(HttpHeaders.PRAGMA, "no-cache");
|
||||
// Http 1.1 header
|
||||
response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, max-age=0");
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置LastModified Header.
|
||||
*/
|
||||
public static void setLastModifiedHeader(HttpServletResponse response, long lastModifiedDate) {
|
||||
response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModifiedDate);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置Etag Header.
|
||||
*/
|
||||
public static void setEtag(HttpServletResponse response, String etag) {
|
||||
response.setHeader(HttpHeaders.ETAG, etag);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据浏览器If-Modified-Since Header, 计算文件是否已被修改.
|
||||
* 如果无修改, checkIfModify返回false ,设置304 not modify status.
|
||||
* @param lastModified 内容的最后修改时间.
|
||||
*/
|
||||
public static boolean checkIfModifiedSince(HttpServletRequest request, HttpServletResponse response,
|
||||
long lastModified) {
|
||||
long ifModifiedSince = request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
|
||||
if ((ifModifiedSince != -1) && (lastModified < ifModifiedSince + 1000)) {
|
||||
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据浏览器 If-None-Match Header, 计算Etag是否已无效.
|
||||
* 如果Etag有效, checkIfNoneMatch返回false, 设置304 not modify status.
|
||||
* @param etag 内容的ETag.
|
||||
*/
|
||||
public static boolean checkIfNoneMatchEtag(HttpServletRequest request, HttpServletResponse response, String etag) {
|
||||
String headerValue = request.getHeader(HttpHeaders.IF_NONE_MATCH);
|
||||
if (headerValue != null) {
|
||||
boolean conditionSatisfied = false;
|
||||
if (!"*".equals(headerValue)) {
|
||||
StringTokenizer commaTokenizer = new StringTokenizer(headerValue, ",");
|
||||
|
||||
while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) {
|
||||
String currentToken = commaTokenizer.nextToken();
|
||||
if (currentToken.trim().equals(etag)) {
|
||||
conditionSatisfied = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
conditionSatisfied = true;
|
||||
}
|
||||
|
||||
if (conditionSatisfied) {
|
||||
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
|
||||
response.setHeader(HttpHeaders.ETAG, etag);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
*/
|
||||
package com.jeesite.common.web.http;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.commons.lang3.Validate;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import com.jeesite.common.collect.MapUtils;
|
||||
import com.jeesite.common.io.PropertiesUtils;
|
||||
import com.jeesite.common.lang.StringUtils;
|
||||
import com.jeesite.common.mapper.JsonMapper;
|
||||
import com.jeesite.common.mapper.XmlMapper;
|
||||
|
||||
/**
|
||||
* Http与Servlet工具类.
|
||||
* @author ThinkGem
|
||||
* @version 2014-8-19
|
||||
*/
|
||||
public class ServletUtils {
|
||||
|
||||
public static final String DEFAULT_PARAMS_PARAM = "params"; // 登录扩展参数(JSON字符串)优先级高于扩展参数前缀
|
||||
public static final String DEFAULT_PARAM_PREFIX_PARAM = "param_"; // 扩展参数前缀
|
||||
|
||||
// 定义静态文件后缀;静态文件排除URI地址
|
||||
private static String[] staticFiles;
|
||||
private static String[] staticFileExcludeUri;
|
||||
|
||||
/**
|
||||
* 获取当前请求对象
|
||||
* web.xml: <listener><listener-class>
|
||||
* org.springframework.web.context.request.RequestContextListener
|
||||
* </listener-class></listener>
|
||||
*/
|
||||
public static HttpServletRequest getRequest(){
|
||||
HttpServletRequest request = null;
|
||||
try{
|
||||
request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
|
||||
if (request == null){
|
||||
return null;
|
||||
}
|
||||
return request;
|
||||
}catch(Exception e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前相应对象
|
||||
* web.xml: <filter><filter-name>requestContextFilter</filter-name><filter-class>
|
||||
* org.springframework.web.filter.RequestContextFilter</filter-class></filter><filter-mapping>
|
||||
* <filter-name>requestContextFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
|
||||
*/
|
||||
public static HttpServletResponse getResponse(){
|
||||
HttpServletResponse response = null;
|
||||
try{
|
||||
response = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getResponse();
|
||||
if (response == null){
|
||||
return null;
|
||||
}
|
||||
}catch(Exception e){
|
||||
return null;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否是Ajax异步请求
|
||||
* @param request
|
||||
*/
|
||||
public static boolean isAjaxRequest(HttpServletRequest request){
|
||||
|
||||
String accept = request.getHeader("accept");
|
||||
if (accept != null && accept.indexOf("application/json") != -1){
|
||||
return true;
|
||||
}
|
||||
|
||||
String xRequestedWith = request.getHeader("X-Requested-With");
|
||||
if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1){
|
||||
return true;
|
||||
}
|
||||
|
||||
String uri = request.getRequestURI();
|
||||
if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")){
|
||||
return true;
|
||||
}
|
||||
|
||||
String ajax = request.getParameter("__ajax");
|
||||
if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")){
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断访问URI是否是静态文件请求
|
||||
* @throws Exception
|
||||
*/
|
||||
public static boolean isStaticFile(String uri){
|
||||
if (staticFiles == null){
|
||||
PropertiesUtils pl = PropertiesUtils.getInstance();
|
||||
try{
|
||||
staticFiles = StringUtils.split(pl.getProperty("web.staticFile"), ",");
|
||||
staticFileExcludeUri = StringUtils.split(pl.getProperty("web.staticFileExcludeUri"), ",");
|
||||
}catch(NoSuchElementException nsee){
|
||||
; // 什么也不做
|
||||
}
|
||||
if (staticFiles == null){
|
||||
try {
|
||||
throw new Exception("检测到“jeesite.yml”中没有配置“web.staticFile”属性。"
|
||||
+ "配置示例:\n#静态文件后缀\nweb.staticFile=.css,.js,.png,.jpg,.gif,"
|
||||
+ ".jpeg,.bmp,.ico,.swf,.psd,.htc,.crx,.xpi,.exe,.ipa,.apk");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (staticFileExcludeUri != null){
|
||||
for (String s : staticFileExcludeUri){
|
||||
if (StringUtils.contains(uri, s)){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (StringUtils.endsWithAny(uri, staticFiles)){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回结果JSON字符串(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @param data 消息数据
|
||||
* @return JSON字符串:{result:'true',message:''}
|
||||
*/
|
||||
public static String renderResult(String result, String message) {
|
||||
return renderResult(result, message, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回结果JSON字符串(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @param data 消息数据
|
||||
* @return JSON字符串:{result:'true',message:'', if map then key:value,key2:value2... else data:{} }
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static String renderResult(String result, String message, Object data) {
|
||||
Map<String, Object> resultMap = MapUtils.newHashMap();
|
||||
resultMap.put("result", result);
|
||||
resultMap.put("message", message);
|
||||
if (data != null){
|
||||
if (data instanceof Map){
|
||||
resultMap.putAll((Map<String, Object>)data);
|
||||
}else{
|
||||
resultMap.put("data", data);
|
||||
}
|
||||
}
|
||||
HttpServletRequest request = ServletUtils.getRequest();
|
||||
String uri = request.getRequestURI();
|
||||
if (StringUtils.endsWithIgnoreCase(uri, ".xml")){
|
||||
return XmlMapper.toXml(resultMap);
|
||||
}else{
|
||||
String functionName = request.getParameter("__callback");
|
||||
if (StringUtils.isNotBlank(functionName)){
|
||||
return JsonMapper.toJsonp(functionName, resultMap);
|
||||
}else{
|
||||
return JsonMapper.toJson(resultMap);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接将结果JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param response 渲染对象:{result:'true',message:'',data:{}}
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @return null
|
||||
*/
|
||||
public static String renderResult(HttpServletResponse response, String result, String message) {
|
||||
return renderString(response, renderResult(result, message), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 直接将结果JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param response 渲染对象:{result:'true',message:'',data:{}}
|
||||
* @param result Global.TRUE or Globle.False
|
||||
* @param message 执行消息
|
||||
* @param data 消息数据
|
||||
* @return null
|
||||
*/
|
||||
public static String renderResult(HttpServletResponse response, String result, String message, Object data) {
|
||||
return renderString(response, renderResult(result, message, data), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将对象转换为JSON字符串渲染到客户端(支持JsonP,请求参数加:__callback=回调函数名)
|
||||
* @param response 渲染对象
|
||||
* @param object 待转换JSON并渲染的对象
|
||||
* @return null
|
||||
*/
|
||||
public static String renderObject(HttpServletResponse response, Object object) {
|
||||
HttpServletRequest request = ServletUtils.getRequest();
|
||||
String uri = request.getRequestURI();
|
||||
if (StringUtils.endsWithIgnoreCase(uri, ".xml")){
|
||||
return XmlMapper.toXml(object);
|
||||
}else{
|
||||
String functionName = request.getParameter("__callback");
|
||||
if (StringUtils.isNotBlank(functionName)){
|
||||
return renderString(response, JsonMapper.toJsonp(functionName, object));
|
||||
}else{
|
||||
return renderString(response, JsonMapper.toJson(object));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将字符串渲染到客户端
|
||||
* @param response 渲染对象
|
||||
* @param string 待渲染的字符串
|
||||
* @return null
|
||||
*/
|
||||
public static String renderString(HttpServletResponse response, String string) {
|
||||
return renderString(response, string, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将字符串渲染到客户端
|
||||
* @param response 渲染对象
|
||||
* @param string 待渲染的字符串
|
||||
* @return null
|
||||
*/
|
||||
public static String renderString(HttpServletResponse response, String string, String type) {
|
||||
try {
|
||||
// response.reset(); // 先注释掉,否则以前设置的Header会被清理掉,如ajax登录设置记住我Cookie
|
||||
response.setContentType(type == null ? "application/json" : type);
|
||||
response.setCharacterEncoding("utf-8");
|
||||
response.getWriter().print(string);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得请求参数值
|
||||
*/
|
||||
public static String getParameter(String name) {
|
||||
HttpServletRequest request = getRequest();
|
||||
if (request == null){
|
||||
return null;
|
||||
}
|
||||
return request.getParameter(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得请求参数Map
|
||||
*/
|
||||
public static Map<String, Object> getParameters() {
|
||||
return getParameters(getRequest());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得请求参数Map
|
||||
*/
|
||||
public static Map<String, Object> getParameters(ServletRequest request) {
|
||||
if (request == null){
|
||||
return MapUtils.newHashMap();
|
||||
}
|
||||
return getParametersStartingWith(request, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得带相同前缀的Request Parameters, copy from spring WebUtils.
|
||||
* 返回的结果的Parameter名已去除前缀.
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Map<String, Object> getParametersStartingWith(ServletRequest request, String prefix) {
|
||||
Validate.notNull(request, "Request must not be null");
|
||||
Enumeration paramNames = request.getParameterNames();
|
||||
Map<String, Object> params = new TreeMap<String, Object>();
|
||||
String pre = prefix;
|
||||
if (pre == null) {
|
||||
pre = "";
|
||||
}
|
||||
while (paramNames != null && paramNames.hasMoreElements()) {
|
||||
String paramName = (String) paramNames.nextElement();
|
||||
if ("".equals(pre) || paramName.startsWith(pre)) {
|
||||
String unprefixed = paramName.substring(pre.length());
|
||||
String[] values = request.getParameterValues(paramName);
|
||||
if (values == null || values.length == 0) {
|
||||
values = new String[]{};
|
||||
// Do nothing, no values found at all.
|
||||
} else if (values.length > 1) {
|
||||
params.put(unprefixed, values);
|
||||
} else {
|
||||
params.put(unprefixed, values[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return params;
|
||||
}
|
||||
|
||||
/**
|
||||
* 组合Parameters生成Query String的Parameter部分,并在paramter name上加上prefix.
|
||||
*/
|
||||
public static String encodeParameterStringWithPrefix(Map<String, Object> params, String prefix) {
|
||||
StringBuilder queryStringBuilder = new StringBuilder();
|
||||
String pre = prefix;
|
||||
if (pre == null) {
|
||||
pre = "";
|
||||
}
|
||||
Iterator<Entry<String, Object>> it = params.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
Entry<String, Object> entry = it.next();
|
||||
queryStringBuilder.append(pre).append(entry.getKey()).append("=").append(entry.getValue());
|
||||
if (it.hasNext()) {
|
||||
queryStringBuilder.append("&");
|
||||
}
|
||||
}
|
||||
return queryStringBuilder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 从请求对象中扩展参数数据,格式:JSON 或 param_ 开头的参数
|
||||
* @param request 请求对象
|
||||
* @return 返回Map对象
|
||||
*/
|
||||
public static Map<String, Object> getExtParams(ServletRequest request) {
|
||||
Map<String, Object> paramMap = null;
|
||||
String params = StringUtils.trim(request.getParameter(DEFAULT_PARAMS_PARAM));
|
||||
if (StringUtils.isNotBlank(params) && StringUtils.startsWith(params, "{")) {
|
||||
paramMap = JsonMapper.fromJson(params, Map.class);
|
||||
} else {
|
||||
paramMap = getParametersStartingWith(ServletUtils.getRequest(), DEFAULT_PARAM_PREFIX_PARAM);
|
||||
}
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置客户端缓存过期时间 的Header.
|
||||
*/
|
||||
public static void setExpiresHeader(HttpServletResponse response, long expiresSeconds) {
|
||||
// Http 1.0 header, set a fix expires date.
|
||||
response.setDateHeader(HttpHeaders.EXPIRES, System.currentTimeMillis() + expiresSeconds * 1000);
|
||||
// Http 1.1 header, set a time after now.
|
||||
response.setHeader(HttpHeaders.CACHE_CONTROL, "private, max-age=" + expiresSeconds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置禁止客户端缓存的Header.
|
||||
*/
|
||||
public static void setNoCacheHeader(HttpServletResponse response) {
|
||||
// Http 1.0 header
|
||||
response.setDateHeader(HttpHeaders.EXPIRES, 1L);
|
||||
response.addHeader(HttpHeaders.PRAGMA, "no-cache");
|
||||
// Http 1.1 header
|
||||
response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, max-age=0");
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置LastModified Header.
|
||||
*/
|
||||
public static void setLastModifiedHeader(HttpServletResponse response, long lastModifiedDate) {
|
||||
response.setDateHeader(HttpHeaders.LAST_MODIFIED, lastModifiedDate);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置Etag Header.
|
||||
*/
|
||||
public static void setEtag(HttpServletResponse response, String etag) {
|
||||
response.setHeader(HttpHeaders.ETAG, etag);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据浏览器If-Modified-Since Header, 计算文件是否已被修改.
|
||||
* 如果无修改, checkIfModify返回false ,设置304 not modify status.
|
||||
* @param lastModified 内容的最后修改时间.
|
||||
*/
|
||||
public static boolean checkIfModifiedSince(HttpServletRequest request, HttpServletResponse response,
|
||||
long lastModified) {
|
||||
long ifModifiedSince = request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE);
|
||||
if ((ifModifiedSince != -1) && (lastModified < ifModifiedSince + 1000)) {
|
||||
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据浏览器 If-None-Match Header, 计算Etag是否已无效.
|
||||
* 如果Etag有效, checkIfNoneMatch返回false, 设置304 not modify status.
|
||||
* @param etag 内容的ETag.
|
||||
*/
|
||||
public static boolean checkIfNoneMatchEtag(HttpServletRequest request, HttpServletResponse response, String etag) {
|
||||
String headerValue = request.getHeader(HttpHeaders.IF_NONE_MATCH);
|
||||
if (headerValue != null) {
|
||||
boolean conditionSatisfied = false;
|
||||
if (!"*".equals(headerValue)) {
|
||||
StringTokenizer commaTokenizer = new StringTokenizer(headerValue, ",");
|
||||
|
||||
while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) {
|
||||
String currentToken = commaTokenizer.nextToken();
|
||||
if (currentToken.trim().equals(etag)) {
|
||||
conditionSatisfied = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
conditionSatisfied = true;
|
||||
}
|
||||
|
||||
if (conditionSatisfied) {
|
||||
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
|
||||
response.setHeader(HttpHeaders.ETAG, etag);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
136
web/db/oracle/core.sql
Normal file
136
web/db/oracle/core.sql
Normal file
@@ -0,0 +1,136 @@
|
||||
|
||||
/* Drop Tables */
|
||||
|
||||
DROP TABLE test_data CASCADE CONSTRAINTS;
|
||||
DROP TABLE test_data_child CASCADE CONSTRAINTS;
|
||||
DROP TABLE test_tree CASCADE CONSTRAINTS;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Create Tables */
|
||||
|
||||
-- test_data
|
||||
CREATE TABLE test_data
|
||||
(
|
||||
id varchar2(64) NOT NULL,
|
||||
test_input varchar2(200),
|
||||
test_textarea varchar2(200),
|
||||
test_select varchar2(10),
|
||||
test_select_multiple varchar2(200),
|
||||
test_radio varchar2(10),
|
||||
test_checkbox varchar2(200),
|
||||
test_date timestamp,
|
||||
test_datetime timestamp,
|
||||
test_user_code varchar2(64),
|
||||
test_office_code varchar2(64),
|
||||
test_company_code varchar2(64),
|
||||
status char(1) DEFAULT '0' NOT NULL,
|
||||
create_by varchar2(64) NOT NULL,
|
||||
create_date timestamp NOT NULL,
|
||||
update_by varchar2(64) NOT NULL,
|
||||
update_date timestamp NOT NULL,
|
||||
remarks nvarchar2(500),
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
|
||||
-- test_data_child
|
||||
CREATE TABLE test_data_child
|
||||
(
|
||||
id varchar2(64) NOT NULL,
|
||||
test_sort number(10,0),
|
||||
test_data_id varchar2(64),
|
||||
test_input varchar2(200),
|
||||
test_textarea varchar2(200),
|
||||
test_select varchar2(10),
|
||||
test_select_multiple varchar2(200),
|
||||
test_radio varchar2(10),
|
||||
test_checkbox varchar2(200),
|
||||
test_date timestamp,
|
||||
test_datetime timestamp,
|
||||
test_user_code varchar2(64),
|
||||
test_office_code varchar2(64),
|
||||
test_company_code varchar2(64),
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
|
||||
-- test_tree
|
||||
CREATE TABLE test_tree
|
||||
(
|
||||
id varchar2(64) NOT NULL,
|
||||
parent_code varchar2(64) NOT NULL,
|
||||
parent_codes varchar2(2000) NOT NULL,
|
||||
tree_sort number(10) NOT NULL,
|
||||
tree_sorts varchar2(1200) NOT NULL,
|
||||
tree_leaf char(1) NOT NULL,
|
||||
tree_level number(4) NOT NULL,
|
||||
tree_names varchar2(2000) NOT NULL,
|
||||
tree_name nvarchar2(200) NOT NULL,
|
||||
status char(1) DEFAULT '0' NOT NULL,
|
||||
create_by varchar2(64) NOT NULL,
|
||||
create_date timestamp NOT NULL,
|
||||
update_by varchar2(64) NOT NULL,
|
||||
update_date timestamp NOT NULL,
|
||||
remarks nvarchar2(500),
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
|
||||
|
||||
/* Comments */
|
||||
|
||||
COMMENT ON TABLE test_data IS 'test_data';
|
||||
COMMENT ON COLUMN test_data.id IS '编号';
|
||||
COMMENT ON COLUMN test_data.test_input IS '单行文本';
|
||||
COMMENT ON COLUMN test_data.test_textarea IS '多行文本';
|
||||
COMMENT ON COLUMN test_data.test_select IS '下拉框';
|
||||
COMMENT ON COLUMN test_data.test_select_multiple IS '下拉多选';
|
||||
COMMENT ON COLUMN test_data.test_radio IS '单选框';
|
||||
COMMENT ON COLUMN test_data.test_checkbox IS '复选框';
|
||||
COMMENT ON COLUMN test_data.test_date IS '日期选择';
|
||||
COMMENT ON COLUMN test_data.test_datetime IS '日期时间选择';
|
||||
COMMENT ON COLUMN test_data.test_user_code IS '用户选择';
|
||||
COMMENT ON COLUMN test_data.test_office_code IS '部门选择';
|
||||
COMMENT ON COLUMN test_data.test_company_code IS '公司选择';
|
||||
COMMENT ON COLUMN test_data.status IS '状态(0正常 1删除 2停用)';
|
||||
COMMENT ON COLUMN test_data.create_by IS '创建者';
|
||||
COMMENT ON COLUMN test_data.create_date IS '创建时间';
|
||||
COMMENT ON COLUMN test_data.update_by IS '更新者';
|
||||
COMMENT ON COLUMN test_data.update_date IS '更新时间';
|
||||
COMMENT ON COLUMN test_data.remarks IS '备注信息';
|
||||
COMMENT ON TABLE test_data_child IS 'test_data_child';
|
||||
COMMENT ON COLUMN test_data_child.id IS '编号';
|
||||
COMMENT ON COLUMN test_data_child.test_sort IS '排序号';
|
||||
COMMENT ON COLUMN test_data_child.test_data_id IS '父表主键';
|
||||
COMMENT ON COLUMN test_data_child.test_input IS '单行文本';
|
||||
COMMENT ON COLUMN test_data_child.test_textarea IS '多行文本';
|
||||
COMMENT ON COLUMN test_data_child.test_select IS '下拉框';
|
||||
COMMENT ON COLUMN test_data_child.test_select_multiple IS '下拉多选';
|
||||
COMMENT ON COLUMN test_data_child.test_radio IS '单选框';
|
||||
COMMENT ON COLUMN test_data_child.test_checkbox IS '复选框';
|
||||
COMMENT ON COLUMN test_data_child.test_date IS '日期选择';
|
||||
COMMENT ON COLUMN test_data_child.test_datetime IS '日期时间选择';
|
||||
COMMENT ON COLUMN test_data_child.test_user_code IS '用户选择';
|
||||
COMMENT ON COLUMN test_data_child.test_office_code IS '部门选择';
|
||||
COMMENT ON COLUMN test_data_child.test_company_code IS '公司选择';
|
||||
COMMENT ON TABLE test_tree IS 'test_tree';
|
||||
COMMENT ON COLUMN test_tree.id IS '编号';
|
||||
COMMENT ON COLUMN test_tree.parent_code IS '父级编号';
|
||||
COMMENT ON COLUMN test_tree.parent_codes IS '所有父级编号';
|
||||
COMMENT ON COLUMN test_tree.tree_sort IS '本级排序号(升序)';
|
||||
COMMENT ON COLUMN test_tree.tree_sorts IS '所有级别排序号';
|
||||
COMMENT ON COLUMN test_tree.tree_leaf IS '是否最末级';
|
||||
COMMENT ON COLUMN test_tree.tree_level IS '层次级别';
|
||||
COMMENT ON COLUMN test_tree.tree_names IS '全节点名';
|
||||
COMMENT ON COLUMN test_tree.tree_name IS '树节点名';
|
||||
COMMENT ON COLUMN test_tree.status IS '状态(0正常 1删除 2停用)';
|
||||
COMMENT ON COLUMN test_tree.create_by IS '创建者';
|
||||
COMMENT ON COLUMN test_tree.create_date IS '创建时间';
|
||||
COMMENT ON COLUMN test_tree.update_by IS '更新者';
|
||||
COMMENT ON COLUMN test_tree.update_date IS '更新时间';
|
||||
COMMENT ON COLUMN test_tree.remarks IS '备注信息';
|
||||
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<category_index>0</category_index>
|
||||
<zoom>1.0</zoom>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<y>48</y>
|
||||
<default_color>
|
||||
<r>128</r>
|
||||
<g>128</g>
|
||||
|
||||
Reference in New Issue
Block a user