Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
JeeSpringCloud
Commits
8b643e22
Commit
8b643e22
authored
Oct 12, 2018
by
HuangBingGui
Browse files
no commit message
parent
563ff060
Changes
385
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
20 of 385+
files are displayed.
Plain diff
Email patch
JeeSpringCloud/src/main/java/com/jeespring/common/utils/FileUtils.java
0 → 100644
View file @
8b643e22
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.io.BufferedOutputStream
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.io.RandomAccessFile
;
import
java.util.Enumeration
;
import
java.util.List
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.tools.zip.ZipEntry
;
import
org.apache.tools.zip.ZipFile
;
import
org.apache.tools.zip.ZipOutputStream
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.google.common.collect.Lists
;
/**
* 文件操作工具类
* 实现文件的创建、删除、复制、压缩、解压以及目录的创建、删除、复制、压缩解压等功能
* @author 黄炳桂 516821420@qq.com
* @version 2015-3-16
*/
public
class
FileUtils
extends
org
.
apache
.
commons
.
io
.
FileUtils
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
FileUtils
.
class
);
/**
* 复制单个文件,如果目标文件存在,则不覆盖
* @param srcFileName 待复制的文件名
* @param descFileName 目标文件名
* @return 如果复制成功,则返回true,否则返回false
*/
public
static
boolean
copyFile
(
String
srcFileName
,
String
descFileName
)
{
return
FileUtils
.
copyFileCover
(
srcFileName
,
descFileName
,
false
);
}
/**
* 复制单个文件
* @param srcFileName 待复制的文件名
* @param descFileName 目标文件名
* @param coverlay 如果目标文件已存在,是否覆盖
* @return 如果复制成功,则返回true,否则返回false
*/
public
static
boolean
copyFileCover
(
String
srcFileName
,
String
descFileName
,
boolean
coverlay
)
{
File
srcFile
=
new
File
(
srcFileName
);
// 判断源文件是否存在
if
(!
srcFile
.
exists
())
{
logger
.
debug
(
"复制文件失败,源文件 "
+
srcFileName
+
" 不存在!"
);
return
false
;
}
// 判断源文件是否是合法的文件
else
if
(!
srcFile
.
isFile
())
{
logger
.
debug
(
"复制文件失败,"
+
srcFileName
+
" 不是一个文件!"
);
return
false
;
}
File
descFile
=
new
File
(
descFileName
);
// 判断目标文件是否存在
if
(
descFile
.
exists
())
{
// 如果目标文件存在,并且允许覆盖
if
(
coverlay
)
{
logger
.
debug
(
"目标文件已存在,准备删除!"
);
if
(!
FileUtils
.
delFile
(
descFileName
))
{
logger
.
debug
(
"删除目标文件 "
+
descFileName
+
" 失败!"
);
return
false
;
}
}
else
{
logger
.
debug
(
"复制文件失败,目标文件 "
+
descFileName
+
" 已存在!"
);
return
false
;
}
}
else
{
if
(!
descFile
.
getParentFile
().
exists
())
{
// 如果目标文件所在的目录不存在,则创建目录
logger
.
debug
(
"目标文件所在的目录不存在,创建目录!"
);
// 创建目标文件所在的目录
if
(!
descFile
.
getParentFile
().
mkdirs
())
{
logger
.
debug
(
"创建目标文件所在的目录失败!"
);
return
false
;
}
}
}
// 准备复制文件
// 读取的位数
int
readByte
=
0
;
InputStream
ins
=
null
;
OutputStream
outs
=
null
;
try
{
// 打开源文件
ins
=
new
FileInputStream
(
srcFile
);
// 打开目标文件的输出流
outs
=
new
FileOutputStream
(
descFile
);
byte
[]
buf
=
new
byte
[
1024
];
// 一次读取1024个字节,当readByte为-1时表示文件已经读取完毕
while
((
readByte
=
ins
.
read
(
buf
))
!=
-
1
)
{
// 将读取的字节流写入到输出流
outs
.
write
(
buf
,
0
,
readByte
);
}
logger
.
debug
(
"复制单个文件 "
+
srcFileName
+
" 到"
+
descFileName
+
"成功!"
);
return
true
;
}
catch
(
Exception
e
)
{
logger
.
debug
(
"复制文件失败:"
+
e
.
getMessage
());
return
false
;
}
finally
{
// 关闭输入输出流,首先关闭输出流,然后再关闭输入流
if
(
outs
!=
null
)
{
try
{
outs
.
close
();
}
catch
(
IOException
oute
)
{
oute
.
printStackTrace
();
}
}
if
(
ins
!=
null
)
{
try
{
ins
.
close
();
}
catch
(
IOException
ine
)
{
ine
.
printStackTrace
();
}
}
}
}
/**
* 复制整个目录的内容,如果目标目录存在,则不覆盖
* @param srcDirName 源目录名
* @param descDirName 目标目录名
* @return 如果复制成功返回true,否则返回false
*/
public
static
boolean
copyDirectory
(
String
srcDirName
,
String
descDirName
)
{
return
FileUtils
.
copyDirectoryCover
(
srcDirName
,
descDirName
,
false
);
}
/**
* 复制整个目录的内容
* @param srcDirName 源目录名
* @param descDirName 目标目录名
* @param coverlay 如果目标目录存在,是否覆盖
* @return 如果复制成功返回true,否则返回false
*/
public
static
boolean
copyDirectoryCover
(
String
srcDirName
,
String
descDirName
,
boolean
coverlay
)
{
File
srcDir
=
new
File
(
srcDirName
);
// 判断源目录是否存在
if
(!
srcDir
.
exists
())
{
logger
.
debug
(
"复制目录失败,源目录 "
+
srcDirName
+
" 不存在!"
);
return
false
;
}
// 判断源目录是否是目录
else
if
(!
srcDir
.
isDirectory
())
{
logger
.
debug
(
"复制目录失败,"
+
srcDirName
+
" 不是一个目录!"
);
return
false
;
}
// 如果目标文件夹名不以文件分隔符结尾,自动添加文件分隔符
String
descDirNames
=
descDirName
;
if
(!
descDirNames
.
endsWith
(
File
.
separator
))
{
descDirNames
=
descDirNames
+
File
.
separator
;
}
File
descDir
=
new
File
(
descDirNames
);
// 如果目标文件夹存在
if
(
descDir
.
exists
())
{
if
(
coverlay
)
{
// 允许覆盖目标目录
logger
.
debug
(
"目标目录已存在,准备删除!"
);
if
(!
FileUtils
.
delFile
(
descDirNames
))
{
logger
.
debug
(
"删除目录 "
+
descDirNames
+
" 失败!"
);
return
false
;
}
}
else
{
logger
.
debug
(
"目标目录复制失败,目标目录 "
+
descDirNames
+
" 已存在!"
);
return
false
;
}
}
else
{
// 创建目标目录
logger
.
debug
(
"目标目录不存在,准备创建!"
);
if
(!
descDir
.
mkdirs
())
{
logger
.
debug
(
"创建目标目录失败!"
);
return
false
;
}
}
boolean
flag
=
true
;
// 列出源目录下的所有文件名和子目录名
File
[]
files
=
srcDir
.
listFiles
();
for
(
int
i
=
0
;
i
<
files
.
length
;
i
++)
{
// 如果是一个单个文件,则直接复制
if
(
files
[
i
].
isFile
())
{
flag
=
FileUtils
.
copyFile
(
files
[
i
].
getAbsolutePath
(),
descDirName
+
files
[
i
].
getName
());
// 如果拷贝文件失败,则退出循环
if
(!
flag
)
{
break
;
}
}
// 如果是子目录,则继续复制目录
if
(
files
[
i
].
isDirectory
())
{
flag
=
FileUtils
.
copyDirectory
(
files
[
i
]
.
getAbsolutePath
(),
descDirName
+
files
[
i
].
getName
());
// 如果拷贝目录失败,则退出循环
if
(!
flag
)
{
break
;
}
}
}
if
(!
flag
)
{
logger
.
debug
(
"复制目录 "
+
srcDirName
+
" 到 "
+
descDirName
+
" 失败!"
);
return
false
;
}
logger
.
debug
(
"复制目录 "
+
srcDirName
+
" 到 "
+
descDirName
+
" 成功!"
);
return
true
;
}
/**
*
* 删除文件,可以删除单个文件或文件夹
*
* @param fileName 被删除的文件名
* @return 如果删除成功,则返回true,否是返回false
*/
public
static
boolean
delFile
(
String
fileName
)
{
File
file
=
new
File
(
fileName
);
if
(!
file
.
exists
())
{
logger
.
debug
(
fileName
+
" 文件不存在!"
);
return
true
;
}
else
{
if
(
file
.
isFile
())
{
return
FileUtils
.
deleteFile
(
fileName
);
}
else
{
return
FileUtils
.
deleteDirectory
(
fileName
);
}
}
}
/**
*
* 删除单个文件
*
* @param fileName 被删除的文件名
* @return 如果删除成功,则返回true,否则返回false
*/
public
static
boolean
deleteFile
(
String
fileName
)
{
File
file
=
new
File
(
fileName
);
if
(
file
.
exists
()
&&
file
.
isFile
())
{
if
(
file
.
delete
())
{
logger
.
debug
(
"删除文件 "
+
fileName
+
" 成功!"
);
return
true
;
}
else
{
logger
.
debug
(
"删除文件 "
+
fileName
+
" 失败!"
);
return
false
;
}
}
else
{
logger
.
debug
(
fileName
+
" 文件不存在!"
);
return
true
;
}
}
/**
*
* 删除目录及目录下的文件
*
* @param dirName 被删除的目录所在的文件路径
* @return 如果目录删除成功,则返回true,否则返回false
*/
public
static
boolean
deleteDirectory
(
String
dirName
)
{
String
dirNames
=
dirName
;
if
(!
dirNames
.
endsWith
(
File
.
separator
))
{
dirNames
=
dirNames
+
File
.
separator
;
}
File
dirFile
=
new
File
(
dirNames
);
if
(!
dirFile
.
exists
()
||
!
dirFile
.
isDirectory
())
{
logger
.
debug
(
dirNames
+
" 目录不存在!"
);
return
true
;
}
boolean
flag
=
true
;
// 列出全部文件及子目录
File
[]
files
=
dirFile
.
listFiles
();
for
(
int
i
=
0
;
i
<
files
.
length
;
i
++)
{
// 删除子文件
if
(
files
[
i
].
isFile
())
{
flag
=
FileUtils
.
deleteFile
(
files
[
i
].
getAbsolutePath
());
// 如果删除文件失败,则退出循环
if
(!
flag
)
{
break
;
}
}
// 删除子目录
else
if
(
files
[
i
].
isDirectory
())
{
flag
=
FileUtils
.
deleteDirectory
(
files
[
i
]
.
getAbsolutePath
());
// 如果删除子目录失败,则退出循环
if
(!
flag
)
{
break
;
}
}
}
if
(!
flag
)
{
logger
.
debug
(
"删除目录失败!"
);
return
false
;
}
// 删除当前目录
if
(
dirFile
.
delete
())
{
logger
.
debug
(
"删除目录 "
+
dirName
+
" 成功!"
);
return
true
;
}
else
{
logger
.
debug
(
"删除目录 "
+
dirName
+
" 失败!"
);
return
false
;
}
}
/**
* 创建单个文件
* @param descFileName 文件名,包含路径
* @return 如果创建成功,则返回true,否则返回false
*/
public
static
boolean
createFile
(
String
descFileName
)
{
File
file
=
new
File
(
descFileName
);
if
(
file
.
exists
())
{
logger
.
debug
(
"文件 "
+
descFileName
+
" 已存在!"
);
return
false
;
}
if
(
descFileName
.
endsWith
(
File
.
separator
))
{
logger
.
debug
(
descFileName
+
" 为目录,不能创建目录!"
);
return
false
;
}
if
(!
file
.
getParentFile
().
exists
())
{
// 如果文件所在的目录不存在,则创建目录
if
(!
file
.
getParentFile
().
mkdirs
())
{
logger
.
debug
(
"创建文件所在的目录失败!"
);
return
false
;
}
}
// 创建文件
try
{
if
(
file
.
createNewFile
())
{
logger
.
debug
(
descFileName
+
" 文件创建成功!"
);
return
true
;
}
else
{
logger
.
debug
(
descFileName
+
" 文件创建失败!"
);
return
false
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
logger
.
debug
(
descFileName
+
" 文件创建失败!"
);
return
false
;
}
}
/**
* 创建目录
* @param descDirName 目录名,包含路径
* @return 如果创建成功,则返回true,否则返回false
*/
public
static
boolean
createDirectory
(
String
descDirName
)
{
String
descDirNames
=
descDirName
;
if
(!
descDirNames
.
endsWith
(
File
.
separator
))
{
descDirNames
=
descDirNames
+
File
.
separator
;
}
File
descDir
=
new
File
(
descDirNames
);
if
(
descDir
.
exists
())
{
logger
.
debug
(
"目录 "
+
descDirNames
+
" 已存在!"
);
return
false
;
}
// 创建目录
if
(
descDir
.
mkdirs
())
{
logger
.
debug
(
"目录 "
+
descDirNames
+
" 创建成功!"
);
return
true
;
}
else
{
logger
.
debug
(
"目录 "
+
descDirNames
+
" 创建失败!"
);
return
false
;
}
}
/**
* 写入文件
* @param file 要写入的文件
*/
public
static
void
writeToFile
(
String
fileName
,
String
content
,
boolean
append
)
{
try
{
FileUtils
.
write
(
new
File
(
fileName
),
content
,
"utf-8"
,
append
);
logger
.
debug
(
"文件 "
+
fileName
+
" 写入成功!"
);
}
catch
(
IOException
e
)
{
logger
.
debug
(
"文件 "
+
fileName
+
" 写入失败! "
+
e
.
getMessage
());
}
}
/**
* 写入文件
* @param file 要写入的文件
*/
public
static
void
writeToFile
(
String
fileName
,
String
content
,
String
encoding
,
boolean
append
)
{
try
{
FileUtils
.
write
(
new
File
(
fileName
),
content
,
encoding
,
append
);
logger
.
debug
(
"文件 "
+
fileName
+
" 写入成功!"
);
}
catch
(
IOException
e
)
{
logger
.
debug
(
"文件 "
+
fileName
+
" 写入失败! "
+
e
.
getMessage
());
}
}
/**
* 压缩文件或目录
* @param srcDirName 压缩的根目录
* @param fileName 根目录下的待压缩的文件名或文件夹名,其中*或""表示跟目录下的全部文件
* @param descFileName 目标zip文件
*/
public
static
void
zipFiles
(
String
srcDirName
,
String
fileName
,
String
descFileName
)
{
// 判断目录是否存在
if
(
srcDirName
==
null
)
{
logger
.
debug
(
"文件压缩失败,目录 "
+
srcDirName
+
" 不存在!"
);
return
;
}
File
fileDir
=
new
File
(
srcDirName
);
if
(!
fileDir
.
exists
()
||
!
fileDir
.
isDirectory
())
{
logger
.
debug
(
"文件压缩失败,目录 "
+
srcDirName
+
" 不存在!"
);
return
;
}
String
dirPath
=
fileDir
.
getAbsolutePath
();
File
descFile
=
new
File
(
descFileName
);
try
{
ZipOutputStream
zouts
=
new
ZipOutputStream
(
new
FileOutputStream
(
descFile
));
if
(
"*"
.
equals
(
fileName
)
||
""
.
equals
(
fileName
))
{
FileUtils
.
zipDirectoryToZipFile
(
dirPath
,
fileDir
,
zouts
);
}
else
{
File
file
=
new
File
(
fileDir
,
fileName
);
if
(
file
.
isFile
())
{
FileUtils
.
zipFilesToZipFile
(
dirPath
,
file
,
zouts
);
}
else
{
FileUtils
.
zipDirectoryToZipFile
(
dirPath
,
file
,
zouts
);
}
}
zouts
.
close
();
logger
.
debug
(
descFileName
+
" 文件压缩成功!"
);
}
catch
(
Exception
e
)
{
logger
.
debug
(
"文件压缩失败:"
+
e
.
getMessage
());
e
.
printStackTrace
();
}
}
/**
* 解压缩ZIP文件,将ZIP文件里的内容解压到descFileName目录下
* @param zipFileName 需要解压的ZIP文件
* @param descFileName 目标文件
*/
public
static
boolean
unZipFiles
(
String
zipFileName
,
String
descFileName
)
{
String
descFileNames
=
descFileName
;
if
(!
descFileNames
.
endsWith
(
File
.
separator
))
{
descFileNames
=
descFileNames
+
File
.
separator
;
}
try
{
// 根据ZIP文件创建ZipFile对象
ZipFile
zipFile
=
new
ZipFile
(
zipFileName
);
ZipEntry
entry
=
null
;
String
entryName
=
null
;
String
descFileDir
=
null
;
byte
[]
buf
=
new
byte
[
4096
];
int
readByte
=
0
;
// 获取ZIP文件里所有的entry
@SuppressWarnings
(
"rawtypes"
)
Enumeration
enums
=
zipFile
.
getEntries
();
// 遍历所有entry
while
(
enums
.
hasMoreElements
())
{
entry
=
(
ZipEntry
)
enums
.
nextElement
();
// 获得entry的名字
entryName
=
entry
.
getName
();
descFileDir
=
descFileNames
+
entryName
;
if
(
entry
.
isDirectory
())
{
// 如果entry是一个目录,则创建目录
new
File
(
descFileDir
).
mkdirs
();
continue
;
}
else
{
// 如果entry是一个文件,则创建父目录
new
File
(
descFileDir
).
getParentFile
().
mkdirs
();
}
File
file
=
new
File
(
descFileDir
);
// 打开文件输出流
OutputStream
os
=
new
FileOutputStream
(
file
);
// 从ZipFile对象中打开entry的输入流
InputStream
is
=
zipFile
.
getInputStream
(
entry
);
while
((
readByte
=
is
.
read
(
buf
))
!=
-
1
)
{
os
.
write
(
buf
,
0
,
readByte
);
}
os
.
close
();
is
.
close
();
}
zipFile
.
close
();
logger
.
debug
(
"文件解压成功!"
);
return
true
;
}
catch
(
Exception
e
)
{
logger
.
debug
(
"文件解压失败:"
+
e
.
getMessage
());
return
false
;
}
}
/**
* 将目录压缩到ZIP输出流
* @param dirPath 目录路径
* @param fileDir 文件信息
* @param zouts 输出流
*/
public
static
void
zipDirectoryToZipFile
(
String
dirPath
,
File
fileDir
,
ZipOutputStream
zouts
)
{
if
(
fileDir
.
isDirectory
())
{
File
[]
files
=
fileDir
.
listFiles
();
// 空的文件夹
if
(
files
.
length
==
0
)
{
// 目录信息
ZipEntry
entry
=
new
ZipEntry
(
getEntryName
(
dirPath
,
fileDir
));
try
{
zouts
.
putNextEntry
(
entry
);
zouts
.
closeEntry
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
;
}
for
(
int
i
=
0
;
i
<
files
.
length
;
i
++)
{
if
(
files
[
i
].
isFile
())
{
// 如果是文件,则调用文件压缩方法
FileUtils
.
zipFilesToZipFile
(
dirPath
,
files
[
i
],
zouts
);
}
else
{
// 如果是目录,则递归调用
FileUtils
.
zipDirectoryToZipFile
(
dirPath
,
files
[
i
],
zouts
);
}
}
}
}
/**
* 将文件压缩到ZIP输出流
* @param dirPath 目录路径
* @param file 文件
* @param zouts 输出流
*/
public
static
void
zipFilesToZipFile
(
String
dirPath
,
File
file
,
ZipOutputStream
zouts
)
{
FileInputStream
fin
=
null
;
ZipEntry
entry
=
null
;
// 创建复制缓冲区
byte
[]
buf
=
new
byte
[
4096
];
int
readByte
=
0
;
if
(
file
.
isFile
())
{
try
{
// 创建一个文件输入流
fin
=
new
FileInputStream
(
file
);
// 创建一个ZipEntry
entry
=
new
ZipEntry
(
getEntryName
(
dirPath
,
file
));
// 存储信息到压缩文件
zouts
.
putNextEntry
(
entry
);
// 复制字节到压缩文件
while
((
readByte
=
fin
.
read
(
buf
))
!=
-
1
)
{
zouts
.
write
(
buf
,
0
,
readByte
);
}
zouts
.
closeEntry
();
fin
.
close
();
System
.
out
.
println
(
"添加文件 "
+
file
.
getAbsolutePath
()
+
" 到zip文件中!"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
/**
* 获取待压缩文件在ZIP文件中entry的名字,即相对于跟目录的相对路径名
* @param dirPat 目录名
* @param file entry文件名
* @return
*/
private
static
String
getEntryName
(
String
dirPath
,
File
file
)
{
String
dirPaths
=
dirPath
;
if
(!
dirPaths
.
endsWith
(
File
.
separator
))
{
dirPaths
=
dirPaths
+
File
.
separator
;
}
String
filePath
=
file
.
getAbsolutePath
();
// 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储
if
(
file
.
isDirectory
())
{
filePath
+=
"/"
;
}
int
index
=
filePath
.
indexOf
(
dirPaths
);
return
filePath
.
substring
(
index
+
dirPaths
.
length
());
}
/**
* 根据“文件名的后缀”获取文件内容类型(而非根据File.getContentType()读取的文件类型)
* @param returnFileName 带验证的文件名
* @return 返回文件类型
*/
public
static
String
getContentType
(
String
returnFileName
)
{
String
contentType
=
"application/octet-stream"
;
if
(
returnFileName
.
lastIndexOf
(
"."
)
<
0
)
return
contentType
;
returnFileName
=
returnFileName
.
toLowerCase
();
returnFileName
=
returnFileName
.
substring
(
returnFileName
.
lastIndexOf
(
"."
)
+
1
);
if
(
returnFileName
.
equals
(
"html"
)
||
returnFileName
.
equals
(
"htm"
)
||
returnFileName
.
equals
(
"shtml"
))
{
contentType
=
"text/html"
;
}
else
if
(
returnFileName
.
equals
(
"apk"
))
{
contentType
=
"application/vnd.android.package-archive"
;
}
else
if
(
returnFileName
.
equals
(
"sis"
))
{
contentType
=
"application/vnd.symbian.install"
;
}
else
if
(
returnFileName
.
equals
(
"sisx"
))
{
contentType
=
"application/vnd.symbian.install"
;
}
else
if
(
returnFileName
.
equals
(
"exe"
))
{
contentType
=
"application/x-msdownload"
;
}
else
if
(
returnFileName
.
equals
(
"msi"
))
{
contentType
=
"application/x-msdownload"
;
}
else
if
(
returnFileName
.
equals
(
"css"
))
{
contentType
=
"text/css"
;
}
else
if
(
returnFileName
.
equals
(
"xml"
))
{
contentType
=
"text/xml"
;
}
else
if
(
returnFileName
.
equals
(
"gif"
))
{
contentType
=
"image/gif"
;
}
else
if
(
returnFileName
.
equals
(
"jpeg"
)
||
returnFileName
.
equals
(
"jpg"
))
{
contentType
=
"image/jpeg"
;
}
else
if
(
returnFileName
.
equals
(
"js"
))
{
contentType
=
"application/x-javascript"
;
}
else
if
(
returnFileName
.
equals
(
"atom"
))
{
contentType
=
"application/atom+xml"
;
}
else
if
(
returnFileName
.
equals
(
"rss"
))
{
contentType
=
"application/rss+xml"
;
}
else
if
(
returnFileName
.
equals
(
"mml"
))
{
contentType
=
"text/mathml"
;
}
else
if
(
returnFileName
.
equals
(
"txt"
))
{
contentType
=
"text/plain"
;
}
else
if
(
returnFileName
.
equals
(
"jad"
))
{
contentType
=
"text/vnd.sun.j2me.app-descriptor"
;
}
else
if
(
returnFileName
.
equals
(
"wml"
))
{
contentType
=
"text/vnd.wap.wml"
;
}
else
if
(
returnFileName
.
equals
(
"htc"
))
{
contentType
=
"text/x-component"
;
}
else
if
(
returnFileName
.
equals
(
"png"
))
{
contentType
=
"image/png"
;
}
else
if
(
returnFileName
.
equals
(
"tif"
)
||
returnFileName
.
equals
(
"tiff"
))
{
contentType
=
"image/tiff"
;
}
else
if
(
returnFileName
.
equals
(
"wbmp"
))
{
contentType
=
"image/vnd.wap.wbmp"
;
}
else
if
(
returnFileName
.
equals
(
"ico"
))
{
contentType
=
"image/x-icon"
;
}
else
if
(
returnFileName
.
equals
(
"jng"
))
{
contentType
=
"image/x-jng"
;
}
else
if
(
returnFileName
.
equals
(
"bmp"
))
{
contentType
=
"image/x-ms-bmp"
;
}
else
if
(
returnFileName
.
equals
(
"svg"
))
{
contentType
=
"image/svg+xml"
;
}
else
if
(
returnFileName
.
equals
(
"jar"
)
||
returnFileName
.
equals
(
"var"
)
||
returnFileName
.
equals
(
"ear"
))
{
contentType
=
"application/java-archive"
;
}
else
if
(
returnFileName
.
equals
(
"doc"
))
{
contentType
=
"application/msword"
;
}
else
if
(
returnFileName
.
equals
(
"pdf"
))
{
contentType
=
"application/pdf"
;
}
else
if
(
returnFileName
.
equals
(
"rtf"
))
{
contentType
=
"application/rtf"
;
}
else
if
(
returnFileName
.
equals
(
"xls"
))
{
contentType
=
"application/vnd.ms-excel"
;
}
else
if
(
returnFileName
.
equals
(
"ppt"
))
{
contentType
=
"application/vnd.ms-powerpoint"
;
}
else
if
(
returnFileName
.
equals
(
"7z"
))
{
contentType
=
"application/x-7z-compressed"
;
}
else
if
(
returnFileName
.
equals
(
"rar"
))
{
contentType
=
"application/x-rar-compressed"
;
}
else
if
(
returnFileName
.
equals
(
"swf"
))
{
contentType
=
"application/x-shockwave-flash"
;
}
else
if
(
returnFileName
.
equals
(
"rpm"
))
{
contentType
=
"application/x-redhat-package-manager"
;
}
else
if
(
returnFileName
.
equals
(
"der"
)
||
returnFileName
.
equals
(
"pem"
)
||
returnFileName
.
equals
(
"crt"
))
{
contentType
=
"application/x-x509-ca-cert"
;
}
else
if
(
returnFileName
.
equals
(
"xhtml"
))
{
contentType
=
"application/xhtml+xml"
;
}
else
if
(
returnFileName
.
equals
(
"zip"
))
{
contentType
=
"application/zip"
;
}
else
if
(
returnFileName
.
equals
(
"mid"
)
||
returnFileName
.
equals
(
"midi"
)
||
returnFileName
.
equals
(
"kar"
))
{
contentType
=
"audio/midi"
;
}
else
if
(
returnFileName
.
equals
(
"mp3"
))
{
contentType
=
"audio/mpeg"
;
}
else
if
(
returnFileName
.
equals
(
"ogg"
))
{
contentType
=
"audio/ogg"
;
}
else
if
(
returnFileName
.
equals
(
"m4a"
))
{
contentType
=
"audio/x-m4a"
;
}
else
if
(
returnFileName
.
equals
(
"ra"
))
{
contentType
=
"audio/x-realaudio"
;
}
else
if
(
returnFileName
.
equals
(
"3gpp"
)
||
returnFileName
.
equals
(
"3gp"
))
{
contentType
=
"video/3gpp"
;
}
else
if
(
returnFileName
.
equals
(
"mp4"
))
{
contentType
=
"video/mp4"
;
}
else
if
(
returnFileName
.
equals
(
"mpeg"
)
||
returnFileName
.
equals
(
"mpg"
))
{
contentType
=
"video/mpeg"
;
}
else
if
(
returnFileName
.
equals
(
"mov"
))
{
contentType
=
"video/quicktime"
;
}
else
if
(
returnFileName
.
equals
(
"flv"
))
{
contentType
=
"video/x-flv"
;
}
else
if
(
returnFileName
.
equals
(
"m4v"
))
{
contentType
=
"video/x-m4v"
;
}
else
if
(
returnFileName
.
equals
(
"mng"
))
{
contentType
=
"video/x-mng"
;
}
else
if
(
returnFileName
.
equals
(
"asx"
)
||
returnFileName
.
equals
(
"asf"
))
{
contentType
=
"video/x-ms-asf"
;
}
else
if
(
returnFileName
.
equals
(
"wmv"
))
{
contentType
=
"video/x-ms-wmv"
;
}
else
if
(
returnFileName
.
equals
(
"avi"
))
{
contentType
=
"video/x-msvideo"
;
}
return
contentType
;
}
/**
* 向浏览器发送文件下载,支持断点续传
* @param file 要下载的文件
* @param request 请求对象
* @param response 响应对象
* @return 返回错误信息,无错误信息返回null
*/
public
static
String
downFile
(
File
file
,
HttpServletRequest
request
,
HttpServletResponse
response
){
return
downFile
(
file
,
request
,
response
,
null
);
}
/**
* 向浏览器发送文件下载,支持断点续传
* @param file 要下载的文件
* @param request 请求对象
* @param response 响应对象
* @param fileName 指定下载的文件名
* @return 返回错误信息,无错误信息返回null
*/
public
static
String
downFile
(
File
file
,
HttpServletRequest
request
,
HttpServletResponse
response
,
String
fileName
){
String
error
=
null
;
if
(
file
!=
null
&&
file
.
exists
())
{
if
(
file
.
isFile
())
{
if
(
file
.
length
()
<=
0
)
{
error
=
"该文件是一个空文件。"
;
}
if
(!
file
.
canRead
())
{
error
=
"该文件没有读取权限。"
;
}
}
else
{
error
=
"该文件是一个文件夹。"
;
}
}
else
{
error
=
"文件已丢失或不存在!"
;
}
if
(
error
!=
null
){
logger
.
debug
(
"---------------"
+
file
+
" "
+
error
);
return
error
;
}
long
fileLength
=
file
.
length
();
// 记录文件大小
long
pastLength
=
0
;
// 记录已下载文件大小
int
rangeSwitch
=
0
;
// 0:从头开始的全文下载;1:从某字节开始的下载(bytes=27000-);2:从某字节开始到某字节结束的下载(bytes=27000-39000)
long
toLength
=
0
;
// 记录客户端需要下载的字节段的最后一个字节偏移量(比如bytes=27000-39000,则这个值是为39000)
long
contentLength
=
0
;
// 客户端请求的字节总量
String
rangeBytes
=
""
;
// 记录客户端传来的形如“bytes=27000-”或者“bytes=27000-39000”的内容
RandomAccessFile
raf
=
null
;
// 负责读取数据
OutputStream
os
=
null
;
// 写出数据
OutputStream
out
=
null
;
// 缓冲
byte
b
[]
=
new
byte
[
1024
];
// 暂存容器
if
(
request
.
getHeader
(
"Range"
)
!=
null
)
{
// 客户端请求的下载的文件块的开始字节
response
.
setStatus
(
HttpServletResponse
.
SC_PARTIAL_CONTENT
);
logger
.
debug
(
"request.getHeader(\"Range\") = "
+
request
.
getHeader
(
"Range"
));
rangeBytes
=
request
.
getHeader
(
"Range"
).
replaceAll
(
"bytes="
,
""
);
if
(
rangeBytes
.
indexOf
(
'-'
)
==
rangeBytes
.
length
()
-
1
)
{
// bytes=969998336-
rangeSwitch
=
1
;
rangeBytes
=
rangeBytes
.
substring
(
0
,
rangeBytes
.
indexOf
(
'-'
));
pastLength
=
Long
.
parseLong
(
rangeBytes
.
trim
());
contentLength
=
fileLength
-
pastLength
;
// 客户端请求的是 969998336 之后的字节
}
else
{
// bytes=1275856879-1275877358
rangeSwitch
=
2
;
String
temp0
=
rangeBytes
.
substring
(
0
,
rangeBytes
.
indexOf
(
'-'
));
String
temp2
=
rangeBytes
.
substring
(
rangeBytes
.
indexOf
(
'-'
)
+
1
,
rangeBytes
.
length
());
pastLength
=
Long
.
parseLong
(
temp0
.
trim
());
// bytes=1275856879-1275877358,从第 1275856879 个字节开始下载
toLength
=
Long
.
parseLong
(
temp2
);
// bytes=1275856879-1275877358,到第 1275877358 个字节结束
contentLength
=
toLength
-
pastLength
;
// 客户端请求的是 1275856879-1275877358 之间的字节
}
}
else
{
// 从开始进行下载
contentLength
=
fileLength
;
// 客户端要求全文下载
}
// 如果设设置了Content-Length,则客户端会自动进行多线程下载。如果不希望支持多线程,则不要设置这个参数。 响应的格式是:
// Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
// ServletActionContext.getResponse().setHeader("Content- Length", new Long(file.length() - p).toString());
response
.
reset
();
// 告诉客户端允许断点续传多线程连接下载,响应的格式是:Accept-Ranges: bytes
if
(
pastLength
!=
0
)
{
response
.
setHeader
(
"Accept-Ranges"
,
"bytes"
);
// 如果是第一次下,还没有断点续传,状态是默认的 200,无需显式设置;响应的格式是:HTTP/1.1 200 OK
// 不是从最开始下载, 响应的格式是: Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
logger
.
debug
(
"---------------不是从开始进行下载!服务器即将开始断点续传..."
);
switch
(
rangeSwitch
)
{
case
1
:
{
// 针对 bytes=27000- 的请求
String
contentRange
=
new
StringBuffer
(
"bytes "
).
append
(
new
Long
(
pastLength
).
toString
()).
append
(
"-"
)
.
append
(
new
Long
(
fileLength
-
1
).
toString
()).
append
(
"/"
).
append
(
new
Long
(
fileLength
).
toString
()).
toString
();
response
.
setHeader
(
"Content-Range"
,
contentRange
);
break
;
}
case
2
:
{
// 针对 bytes=27000-39000 的请求
String
contentRange
=
rangeBytes
+
"/"
+
new
Long
(
fileLength
).
toString
();
response
.
setHeader
(
"Content-Range"
,
contentRange
);
break
;
}
default
:
{
break
;
}
}
}
else
{
// 是从开始下载
logger
.
debug
(
"---------------是从开始进行下载!"
);
}
try
{
response
.
addHeader
(
"Content-Disposition"
,
"attachment; filename=\""
+
Encodes
.
urlEncode
(
StringUtils
.
isBlank
(
fileName
)
?
file
.
getName
()
:
fileName
)
+
"\""
);
response
.
setContentType
(
getContentType
(
file
.
getName
()));
// set the MIME type.
response
.
addHeader
(
"Content-Length"
,
String
.
valueOf
(
contentLength
));
os
=
response
.
getOutputStream
();
out
=
new
BufferedOutputStream
(
os
);
raf
=
new
RandomAccessFile
(
file
,
"r"
);
try
{
switch
(
rangeSwitch
)
{
case
0
:
{
// 普通下载,或者从头开始的下载 同1
}
case
1
:
{
// 针对 bytes=27000- 的请求
raf
.
seek
(
pastLength
);
// 形如 bytes=969998336- 的客户端请求,跳过 969998336 个字节
int
n
=
0
;
while
((
n
=
raf
.
read
(
b
,
0
,
1024
))
!=
-
1
)
{
out
.
write
(
b
,
0
,
n
);
}
break
;
}
case
2
:
{
// 针对 bytes=27000-39000 的请求
raf
.
seek
(
pastLength
);
// 形如 bytes=1275856879-1275877358 的客户端请求,找到第 1275856879 个字节
int
n
=
0
;
long
readLength
=
0
;
// 记录已读字节数
while
(
readLength
<=
contentLength
-
1024
)
{
// 大部分字节在这里读取
n
=
raf
.
read
(
b
,
0
,
1024
);
readLength
+=
1024
;
out
.
write
(
b
,
0
,
n
);
}
if
(
readLength
<=
contentLength
)
{
// 余下的不足 1024 个字节在这里读取
n
=
raf
.
read
(
b
,
0
,
(
int
)
(
contentLength
-
readLength
));
out
.
write
(
b
,
0
,
n
);
}
break
;
}
default
:
{
break
;
}
}
out
.
flush
();
logger
.
debug
(
"---------------下载完成!"
);
}
catch
(
IOException
ie
)
{
/**
* 在写数据的时候, 对于 ClientAbortException 之类的异常,
* 是因为客户端取消了下载,而服务器端继续向浏览器写入数据时, 抛出这个异常,这个是正常的。
* 尤其是对于迅雷这种吸血的客户端软件, 明明已经有一个线程在读取 bytes=1275856879-1275877358,
* 如果短时间内没有读取完毕,迅雷会再启第二个、第三个。。。线程来读取相同的字节段, 直到有一个线程读取完毕,迅雷会 KILL
* 掉其他正在下载同一字节段的线程, 强行中止字节读出,造成服务器抛 ClientAbortException。
* 所以,我们忽略这种异常
*/
logger
.
debug
(
"提醒:向客户端传输时出现IO异常,但此异常是允许的,有可能客户端取消了下载,导致此异常,不用关心!"
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
finally
{
if
(
out
!=
null
)
{
try
{
out
.
close
();
}
catch
(
IOException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
if
(
raf
!=
null
)
{
try
{
raf
.
close
();
}
catch
(
IOException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
}
return
null
;
}
/**
* 修正路径,将 \\ 或 / 等替换为 File.separator
* @param path 待修正的路径
* @return 修正后的路径
*/
public
static
String
path
(
String
path
){
String
p
=
StringUtils
.
replace
(
path
,
"\\"
,
"/"
);
p
=
StringUtils
.
join
(
StringUtils
.
split
(
p
,
"/"
),
"/"
);
if
(!
StringUtils
.
startsWithAny
(
p
,
"/"
)
&&
StringUtils
.
startsWithAny
(
path
,
"\\"
,
"/"
)){
p
+=
"/"
;
}
if
(!
StringUtils
.
endsWithAny
(
p
,
"/"
)
&&
StringUtils
.
endsWithAny
(
path
,
"\\"
,
"/"
)){
p
=
p
+
"/"
;
}
if
(
path
!=
null
&&
path
.
startsWith
(
"/"
)){
p
=
"/"
+
p
;
// linux下路径
}
return
p
;
}
/**
* 获目录下的文件列表
* @param dir 搜索目录
* @param searchDirs 是否是搜索目录
* @return 文件列表
*/
public
static
List
<
String
>
findChildrenList
(
File
dir
,
boolean
searchDirs
)
{
List
<
String
>
files
=
Lists
.
newArrayList
();
for
(
String
subFiles
:
dir
.
list
())
{
File
file
=
new
File
(
dir
+
"/"
+
subFiles
);
if
(((
searchDirs
)
&&
(
file
.
isDirectory
()))
||
((!
searchDirs
)
&&
(!
file
.
isDirectory
())))
{
files
.
add
(
file
.
getName
());
}
}
return
files
;
}
/**
* 获取文件扩展名(返回小写)
* @param fileName 文件名
* @return 例如:test.jpg 返回: jpg
*/
public
static
String
getFileExtension
(
String
fileName
)
{
if
((
fileName
==
null
)
||
(
fileName
.
lastIndexOf
(
"."
)
==
-
1
)
||
(
fileName
.
lastIndexOf
(
"."
)
==
fileName
.
length
()
-
1
))
{
return
null
;
}
return
StringUtils
.
lowerCase
(
fileName
.
substring
(
fileName
.
lastIndexOf
(
"."
)
+
1
));
}
/**
* 获取文件名,不包含扩展名
* @param fileName 文件名
* @return 例如:d:\files\test.jpg 返回:d:\files\test
*/
public
static
String
getFileNameWithoutExtension
(
String
fileName
)
{
if
((
fileName
==
null
)
||
(
fileName
.
lastIndexOf
(
"."
)
==
-
1
))
{
return
null
;
}
return
fileName
.
substring
(
0
,
fileName
.
lastIndexOf
(
"."
));
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/FreeMarkers.java
0 → 100644
View file @
8b643e22
/**
* * Copyright © 2015-2020 <a href="https://gitee.com/JeeHuangBingGui/JeeSpring">JeeSpring</a> All rights reserved..
*/
package
com.jeespring.common.utils
;
import
java.io.IOException
;
import
java.io.StringReader
;
import
java.io.StringWriter
;
import
java.util.Map
;
import
org.springframework.core.io.DefaultResourceLoader
;
import
org.springframework.core.io.Resource
;
import
freemarker.template.Configuration
;
import
freemarker.template.Template
;
/**
* FreeMarkers工具类
* @author 黄炳桂 516821420@qq.com
* @version 2013-01-15
*/
public
class
FreeMarkers
{
public
static
String
renderString
(
String
templateString
,
Map
<
String
,
?>
model
)
{
try
{
StringWriter
result
=
new
StringWriter
();
Template
t
=
new
Template
(
"name"
,
new
StringReader
(
templateString
),
new
Configuration
());
t
.
process
(
model
,
result
);
return
result
.
toString
();
}
catch
(
Exception
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
public
static
String
renderTemplate
(
Template
template
,
Object
model
)
{
try
{
StringWriter
result
=
new
StringWriter
();
template
.
process
(
model
,
result
);
return
result
.
toString
();
}
catch
(
Exception
e
)
{
throw
Exceptions
.
unchecked
(
e
);
}
}
public
static
Configuration
buildConfiguration
(
String
directory
)
throws
IOException
{
Configuration
cfg
=
new
Configuration
();
Resource
path
=
new
DefaultResourceLoader
().
getResource
(
directory
);
cfg
.
setDirectoryForTemplateLoading
(
path
.
getFile
());
return
cfg
;
}
public
static
void
main
(
String
[]
args
)
throws
IOException
{
// // renderString
// Map<String, String> model = com.google.common.collect.Maps.newHashMap();
// model.put("userName", "calvin");
// String result = FreeMarkers.renderString("hello ${userName}", model);
// System.out.println(result);
// // renderTemplate
// Configuration cfg = FreeMarkers.buildConfiguration("classpath:/");
// Template template = cfg.getTemplate("testTemplate.ftl");
// String result2 = FreeMarkers.renderTemplate(template, model);
// System.out.println(result2);
// Map<String, String> model = com.google.common.collect.Maps.newHashMap();
// model.put("userName", "calvin");
// String result = FreeMarkers.renderString("hello ${userName} ${r'${userName}'}", model);
// System.out.println(result);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/GsonUtils.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
com.google.gson.Gson
;
import
com.google.gson.GsonBuilder
;
import
com.google.gson.JsonParseException
;
import
java.lang.reflect.Type
;
/**
* Json工具类.
*/
public
class
GsonUtils
{
private
static
Gson
gson
=
new
GsonBuilder
().
create
();
public
static
String
toJson
(
Object
value
)
{
return
gson
.
toJson
(
value
);
}
public
static
<
T
>
T
fromJson
(
String
json
,
Class
<
T
>
classOfT
)
throws
JsonParseException
{
return
gson
.
fromJson
(
json
,
classOfT
);
}
public
static
<
T
>
T
fromJson
(
String
json
,
Type
typeOfT
)
throws
JsonParseException
{
return
(
T
)
gson
.
fromJson
(
json
,
typeOfT
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/HttpRequest.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.io.PrintWriter
;
import
java.net.URL
;
import
java.net.URLConnection
;
import
java.util.List
;
import
java.util.Map
;
public
class
HttpRequest
{
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public
static
String
sendGet
(
String
url
,
String
param
)
{
String
result
=
""
;
BufferedReader
in
=
null
;
try
{
String
urlNameString
=
url
+
"?"
+
param
;
URL
realUrl
=
new
URL
(
urlNameString
);
// 打开和URL之间的连接
URLConnection
connection
=
realUrl
.
openConnection
();
// 设置通用的请求属性
connection
.
setRequestProperty
(
"accept"
,
"*/*"
);
connection
.
setRequestProperty
(
"connection"
,
"Keep-Alive"
);
connection
.
setRequestProperty
(
"user-agent"
,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"
);
// 建立实际的连接
connection
.
connect
();
// 获取所有响应头字段
//Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
//for (String key : map.keySet()) {
// System.out.println(key + "--->" + map.get(key));
//}
// 定义 BufferedReader输入流来读取URL的响应
in
=
new
BufferedReader
(
new
InputStreamReader
(
connection
.
getInputStream
()));
String
line
;
while
((
line
=
in
.
readLine
())
!=
null
)
{
result
+=
line
;
}
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"发送GET请求出现异常!"
+
e
.
toString
());
result
=
"Down"
;
//e.printStackTrace();
}
// 使用finally块来关闭输入流
finally
{
try
{
if
(
in
!=
null
)
{
in
.
close
();
}
}
catch
(
Exception
e2
)
{
e2
.
printStackTrace
();
}
}
return
result
;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url
* 发送请求的 URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public
static
String
sendPost
(
String
url
,
String
param
)
{
PrintWriter
out
=
null
;
BufferedReader
in
=
null
;
String
result
=
""
;
try
{
URL
realUrl
=
new
URL
(
url
);
// 打开和URL之间的连接
URLConnection
conn
=
realUrl
.
openConnection
();
// 设置通用的请求属性
conn
.
setRequestProperty
(
"accept"
,
"*/*"
);
conn
.
setRequestProperty
(
"connection"
,
"Keep-Alive"
);
conn
.
setRequestProperty
(
"user-agent"
,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"
);
// 发送POST请求必须设置如下两行
conn
.
setDoOutput
(
true
);
conn
.
setDoInput
(
true
);
// 获取URLConnection对象对应的输出流
out
=
new
PrintWriter
(
conn
.
getOutputStream
());
// 发送请求参数
out
.
print
(
param
);
// flush输出流的缓冲
out
.
flush
();
// 定义BufferedReader输入流来读取URL的响应
in
=
new
BufferedReader
(
new
InputStreamReader
(
conn
.
getInputStream
()));
String
line
;
while
((
line
=
in
.
readLine
())
!=
null
)
{
result
+=
line
;
}
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"发送 POST 请求出现异常!"
+
e
.
toString
());
//e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally
{
try
{
if
(
out
!=
null
){
out
.
close
();
}
if
(
in
!=
null
){
in
.
close
();
}
}
catch
(
IOException
ex
){
ex
.
printStackTrace
();
}
}
return
result
;
}
public
static
String
getParameterMapString
(
HttpServletRequest
request
){
if
(
request
.
getQueryString
()!=
null
){
if
(
request
.
getQueryString
().
length
()>
0
){
return
request
.
getQueryString
();
}
}
Map
map
=
request
.
getParameterMap
();
java
.
util
.
Enumeration
enumx
=
request
.
getParameterNames
();
String
result
=
""
;
while
(
enumx
.
hasMoreElements
()){
String
paramName
=(
String
)
enumx
.
nextElement
();
String
[]
values
=
request
.
getParameterValues
(
paramName
);
for
(
int
i
=
0
;
i
<
values
.
length
;
i
++){
result
+=
paramName
+
"="
+
values
[
i
]+
"&"
;
}
}
return
result
;
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/HttpUtil.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
java.io.BufferedReader
;
import
java.io.DataOutputStream
;
import
java.io.InputStreamReader
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.util.List
;
import
java.util.Map
;
/**
* http 工具类
*/
public
class
HttpUtil
{
public
static
String
post
(
String
requestUrl
,
String
accessToken
,
String
params
)
throws
Exception
{
String
contentType
=
"application/x-www-form-urlencoded"
;
return
HttpUtil
.
post
(
requestUrl
,
accessToken
,
contentType
,
params
);
}
public
static
String
post
(
String
requestUrl
,
String
accessToken
,
String
contentType
,
String
params
)
throws
Exception
{
String
encoding
=
"UTF-8"
;
if
(
requestUrl
.
contains
(
"nlp"
))
{
encoding
=
"GBK"
;
}
return
HttpUtil
.
post
(
requestUrl
,
accessToken
,
contentType
,
params
,
encoding
);
}
public
static
String
post
(
String
requestUrl
,
String
accessToken
,
String
contentType
,
String
params
,
String
encoding
)
throws
Exception
{
String
url
=
requestUrl
+
"?access_token="
+
accessToken
;
return
HttpUtil
.
postGeneralUrl
(
url
,
contentType
,
params
,
encoding
);
}
public
static
String
postGeneralUrl
(
String
generalUrl
,
String
contentType
,
String
params
,
String
encoding
)
throws
Exception
{
URL
url
=
new
URL
(
generalUrl
);
// 打开和URL之间的连接
HttpURLConnection
connection
=
(
HttpURLConnection
)
url
.
openConnection
();
connection
.
setRequestMethod
(
"POST"
);
// 设置通用的请求属性
connection
.
setRequestProperty
(
"Content-Type"
,
contentType
);
connection
.
setRequestProperty
(
"Connection"
,
"Keep-Alive"
);
connection
.
setUseCaches
(
false
);
connection
.
setDoOutput
(
true
);
connection
.
setDoInput
(
true
);
// 得到请求的输出流对象
DataOutputStream
out
=
new
DataOutputStream
(
connection
.
getOutputStream
());
out
.
write
(
params
.
getBytes
(
encoding
));
out
.
flush
();
out
.
close
();
// 建立实际的连接
connection
.
connect
();
// 获取所有响应头字段
Map
<
String
,
List
<
String
>>
headers
=
connection
.
getHeaderFields
();
// 遍历所有的响应头字段
for
(
String
key
:
headers
.
keySet
())
{
System
.
err
.
println
(
key
+
"--->"
+
headers
.
get
(
key
));
}
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader
in
=
null
;
in
=
new
BufferedReader
(
new
InputStreamReader
(
connection
.
getInputStream
(),
encoding
));
String
result
=
""
;
String
getLine
;
while
((
getLine
=
in
.
readLine
())
!=
null
)
{
result
+=
getLine
;
}
in
.
close
();
System
.
err
.
println
(
"result:"
+
result
);
return
result
;
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/IdGen.java
0 → 100644
View file @
8b643e22
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
org.activiti.engine.impl.cfg.IdGenerator
;
import
org.apache.shiro.session.Session
;
import
org.apache.shiro.session.mgt.eis.SessionIdGenerator
;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.stereotype.Service
;
import
java.io.Serializable
;
import
java.security.SecureRandom
;
import
java.util.UUID
;
/**
* 封装各种生成唯一性ID算法的工具类.
*
* @author 黄炳桂 516821420@qq.com
* @version 2013-01-15
*/
@Service
@Lazy
(
false
)
public
class
IdGen
implements
IdGenerator
,
SessionIdGenerator
{
private
static
SecureRandom
random
=
new
SecureRandom
();
/**
* 封装JDK自带的UUID, 通过Random数字生成, 中间无-分割.
*/
public
static
String
uuid
()
{
return
UUID
.
randomUUID
().
toString
().
replaceAll
(
"-"
,
""
);
}
/**
* 使用SecureRandom随机生成Long.
*/
public
static
long
randomLong
()
{
return
Math
.
abs
(
random
.
nextLong
());
}
/**
* 基于Base62编码的SecureRandom随机生成bytes.
*/
public
static
String
randomBase62
(
int
length
)
{
byte
[]
randomBytes
=
new
byte
[
length
];
random
.
nextBytes
(
randomBytes
);
return
Encodes
.
encodeBase62
(
randomBytes
);
}
/**
* Activiti ID 生成
*/
//@Override
public
String
getNextId
()
{
return
IdGen
.
uuid
();
}
@Override
public
Serializable
generateId
(
Session
session
)
{
return
IdGen
.
uuid
();
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/IdcardUtils.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Map
;
import
org.apache.commons.lang3.StringUtils
;
/**
* 身份证工具类
*
* @author June
* @version 1.0, 2010-06-17
*/
public
class
IdcardUtils
extends
StringUtils
{
/** 中国公民身份证号码最小长度。 */
public
static
final
int
CHINA_ID_MIN_LENGTH
=
15
;
/** 中国公民身份证号码最大长度。 */
public
static
final
int
CHINA_ID_MAX_LENGTH
=
18
;
/** 省、直辖市代码表 */
public
static
final
String
cityCode
[]
=
{
"11"
,
"12"
,
"13"
,
"14"
,
"15"
,
"21"
,
"22"
,
"23"
,
"31"
,
"32"
,
"33"
,
"34"
,
"35"
,
"36"
,
"37"
,
"41"
,
"42"
,
"43"
,
"44"
,
"45"
,
"46"
,
"50"
,
"51"
,
"52"
,
"53"
,
"54"
,
"61"
,
"62"
,
"63"
,
"64"
,
"65"
,
"71"
,
"81"
,
"82"
,
"91"
};
/** 每位加权因子 */
public
static
final
int
power
[]
=
{
7
,
9
,
10
,
5
,
8
,
4
,
2
,
1
,
6
,
3
,
7
,
9
,
10
,
5
,
8
,
4
,
2
};
/** 第18位校检码 */
public
static
final
String
verifyCode
[]
=
{
"1"
,
"0"
,
"X"
,
"9"
,
"8"
,
"7"
,
"6"
,
"5"
,
"4"
,
"3"
,
"2"
};
/** 最低年限 */
public
static
final
int
MIN
=
1930
;
public
static
Map
<
String
,
String
>
cityCodes
=
new
HashMap
<
String
,
String
>();
/** 台湾身份首字母对应数字 */
public
static
Map
<
String
,
Integer
>
twFirstCode
=
new
HashMap
<
String
,
Integer
>();
/** 香港身份首字母对应数字 */
public
static
Map
<
String
,
Integer
>
hkFirstCode
=
new
HashMap
<
String
,
Integer
>();
static
{
cityCodes
.
put
(
"11"
,
"北京"
);
cityCodes
.
put
(
"12"
,
"天津"
);
cityCodes
.
put
(
"13"
,
"河北"
);
cityCodes
.
put
(
"14"
,
"山西"
);
cityCodes
.
put
(
"15"
,
"内蒙古"
);
cityCodes
.
put
(
"21"
,
"辽宁"
);
cityCodes
.
put
(
"22"
,
"吉林"
);
cityCodes
.
put
(
"23"
,
"黑龙江"
);
cityCodes
.
put
(
"31"
,
"上海"
);
cityCodes
.
put
(
"32"
,
"江苏"
);
cityCodes
.
put
(
"33"
,
"浙江"
);
cityCodes
.
put
(
"34"
,
"安徽"
);
cityCodes
.
put
(
"35"
,
"福建"
);
cityCodes
.
put
(
"36"
,
"江西"
);
cityCodes
.
put
(
"37"
,
"山东"
);
cityCodes
.
put
(
"41"
,
"河南"
);
cityCodes
.
put
(
"42"
,
"湖北"
);
cityCodes
.
put
(
"43"
,
"湖南"
);
cityCodes
.
put
(
"44"
,
"广东"
);
cityCodes
.
put
(
"45"
,
"广西"
);
cityCodes
.
put
(
"46"
,
"海南"
);
cityCodes
.
put
(
"50"
,
"重庆"
);
cityCodes
.
put
(
"51"
,
"四川"
);
cityCodes
.
put
(
"52"
,
"贵州"
);
cityCodes
.
put
(
"53"
,
"云南"
);
cityCodes
.
put
(
"54"
,
"西藏"
);
cityCodes
.
put
(
"61"
,
"陕西"
);
cityCodes
.
put
(
"62"
,
"甘肃"
);
cityCodes
.
put
(
"63"
,
"青海"
);
cityCodes
.
put
(
"64"
,
"宁夏"
);
cityCodes
.
put
(
"65"
,
"新疆"
);
cityCodes
.
put
(
"71"
,
"台湾"
);
cityCodes
.
put
(
"81"
,
"香港"
);
cityCodes
.
put
(
"82"
,
"澳门"
);
cityCodes
.
put
(
"91"
,
"国外"
);
twFirstCode
.
put
(
"A"
,
10
);
twFirstCode
.
put
(
"B"
,
11
);
twFirstCode
.
put
(
"C"
,
12
);
twFirstCode
.
put
(
"D"
,
13
);
twFirstCode
.
put
(
"E"
,
14
);
twFirstCode
.
put
(
"F"
,
15
);
twFirstCode
.
put
(
"G"
,
16
);
twFirstCode
.
put
(
"H"
,
17
);
twFirstCode
.
put
(
"J"
,
18
);
twFirstCode
.
put
(
"K"
,
19
);
twFirstCode
.
put
(
"L"
,
20
);
twFirstCode
.
put
(
"M"
,
21
);
twFirstCode
.
put
(
"N"
,
22
);
twFirstCode
.
put
(
"P"
,
23
);
twFirstCode
.
put
(
"Q"
,
24
);
twFirstCode
.
put
(
"R"
,
25
);
twFirstCode
.
put
(
"S"
,
26
);
twFirstCode
.
put
(
"T"
,
27
);
twFirstCode
.
put
(
"U"
,
28
);
twFirstCode
.
put
(
"V"
,
29
);
twFirstCode
.
put
(
"X"
,
30
);
twFirstCode
.
put
(
"Y"
,
31
);
twFirstCode
.
put
(
"W"
,
32
);
twFirstCode
.
put
(
"Z"
,
33
);
twFirstCode
.
put
(
"I"
,
34
);
twFirstCode
.
put
(
"O"
,
35
);
hkFirstCode
.
put
(
"A"
,
1
);
hkFirstCode
.
put
(
"B"
,
2
);
hkFirstCode
.
put
(
"C"
,
3
);
hkFirstCode
.
put
(
"R"
,
18
);
hkFirstCode
.
put
(
"U"
,
21
);
hkFirstCode
.
put
(
"Z"
,
26
);
hkFirstCode
.
put
(
"X"
,
24
);
hkFirstCode
.
put
(
"W"
,
23
);
hkFirstCode
.
put
(
"O"
,
15
);
hkFirstCode
.
put
(
"N"
,
14
);
}
/**
* 将15位身份证号码转换为18位
*
* @param idCard
* 15位身份编码
* @return 18位身份编码
*/
public
static
String
conver15CardTo18
(
String
idCard
)
{
String
idCard18
=
""
;
if
(
idCard
.
length
()
!=
CHINA_ID_MIN_LENGTH
)
{
return
null
;
}
if
(
isNum
(
idCard
))
{
// 获取出生年月日
String
birthday
=
idCard
.
substring
(
6
,
12
);
Date
birthDate
=
null
;
try
{
birthDate
=
new
SimpleDateFormat
(
"yyMMdd"
).
parse
(
birthday
);
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
Calendar
cal
=
Calendar
.
getInstance
();
if
(
birthDate
!=
null
)
cal
.
setTime
(
birthDate
);
// 获取出生年(完全表现形式,如:2010)
String
sYear
=
String
.
valueOf
(
cal
.
get
(
Calendar
.
YEAR
));
idCard18
=
idCard
.
substring
(
0
,
6
)
+
sYear
+
idCard
.
substring
(
8
);
// 转换字符数组
char
[]
cArr
=
idCard18
.
toCharArray
();
if
(
cArr
!=
null
)
{
int
[]
iCard
=
converCharToInt
(
cArr
);
int
iSum17
=
getPowerSum
(
iCard
);
// 获取校验位
String
sVal
=
getCheckCode18
(
iSum17
);
if
(
sVal
.
length
()
>
0
)
{
idCard18
+=
sVal
;
}
else
{
return
null
;
}
}
}
else
{
return
null
;
}
return
idCard18
;
}
/**
* 验证身份证是否合法
*/
public
static
boolean
validateCard
(
String
idCard
)
{
String
card
=
idCard
.
trim
();
if
(
validateIdCard18
(
card
))
{
return
true
;
}
if
(
validateIdCard15
(
card
))
{
return
true
;
}
String
[]
cardval
=
validateIdCard10
(
card
);
if
(
cardval
!=
null
)
{
if
(
cardval
[
2
].
equals
(
"true"
))
{
return
true
;
}
}
return
false
;
}
/**
* 验证18位身份编码是否合法
*
* @param idCard
* 身份编码
* @return 是否合法
*/
public
static
boolean
validateIdCard18
(
String
idCard
)
{
boolean
bTrue
=
false
;
if
(
idCard
.
length
()
==
CHINA_ID_MAX_LENGTH
)
{
// 前17位
String
code17
=
idCard
.
substring
(
0
,
17
);
// 第18位
String
code18
=
idCard
.
substring
(
17
,
CHINA_ID_MAX_LENGTH
);
if
(
isNum
(
code17
))
{
char
[]
cArr
=
code17
.
toCharArray
();
if
(
cArr
!=
null
)
{
int
[]
iCard
=
converCharToInt
(
cArr
);
int
iSum17
=
getPowerSum
(
iCard
);
// 获取校验位
String
val
=
getCheckCode18
(
iSum17
);
if
(
val
.
length
()
>
0
)
{
if
(
val
.
equalsIgnoreCase
(
code18
))
{
bTrue
=
true
;
}
}
}
}
}
return
bTrue
;
}
/**
* 验证15位身份编码是否合法
*
* @param idCard
* 身份编码
* @return 是否合法
*/
public
static
boolean
validateIdCard15
(
String
idCard
)
{
if
(
idCard
.
length
()
!=
CHINA_ID_MIN_LENGTH
)
{
return
false
;
}
if
(
isNum
(
idCard
))
{
String
proCode
=
idCard
.
substring
(
0
,
2
);
if
(
cityCodes
.
get
(
proCode
)
==
null
)
{
return
false
;
}
String
birthCode
=
idCard
.
substring
(
6
,
12
);
Date
birthDate
=
null
;
try
{
birthDate
=
new
SimpleDateFormat
(
"yy"
).
parse
(
birthCode
.
substring
(
0
,
2
));
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
Calendar
cal
=
Calendar
.
getInstance
();
if
(
birthDate
!=
null
)
cal
.
setTime
(
birthDate
);
if
(!
valiDate
(
cal
.
get
(
Calendar
.
YEAR
),
Integer
.
valueOf
(
birthCode
.
substring
(
2
,
4
)),
Integer
.
valueOf
(
birthCode
.
substring
(
4
,
6
))))
{
return
false
;
}
}
else
{
return
false
;
}
return
true
;
}
/**
* 验证10位身份编码是否合法
*
* @param idCard
* 身份编码
* @return 身份证信息数组
* <p>
* [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false)
* 若不是身份证件号码则返回null
* </p>
*/
public
static
String
[]
validateIdCard10
(
String
idCard
)
{
String
[]
info
=
new
String
[
3
];
String
card
=
idCard
.
replaceAll
(
"[\\(|\\)]"
,
""
);
if
(
card
.
length
()
!=
8
&&
card
.
length
()
!=
9
&&
idCard
.
length
()
!=
10
)
{
return
null
;
}
if
(
idCard
.
matches
(
"^[a-zA-Z][0-9]{9}$"
))
{
// 台湾
info
[
0
]
=
"台湾"
;
System
.
out
.
println
(
"11111"
);
String
char2
=
idCard
.
substring
(
1
,
2
);
if
(
char2
.
equals
(
"1"
))
{
info
[
1
]
=
"M"
;
System
.
out
.
println
(
"MMMMMMM"
);
}
else
if
(
char2
.
equals
(
"2"
))
{
info
[
1
]
=
"F"
;
System
.
out
.
println
(
"FFFFFFF"
);
}
else
{
info
[
1
]
=
"N"
;
info
[
2
]
=
"false"
;
System
.
out
.
println
(
"NNNN"
);
return
info
;
}
info
[
2
]
=
validateTWCard
(
idCard
)
?
"true"
:
"false"
;
}
else
if
(
idCard
.
matches
(
"^[1|5|7][0-9]{6}\\(?[0-9A-Z]\\)?$"
))
{
// 澳门
info
[
0
]
=
"澳门"
;
info
[
1
]
=
"N"
;
}
else
if
(
idCard
.
matches
(
"^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$"
))
{
// 香港
info
[
0
]
=
"香港"
;
info
[
1
]
=
"N"
;
info
[
2
]
=
validateHKCard
(
idCard
)
?
"true"
:
"false"
;
}
else
{
return
null
;
}
return
info
;
}
/**
* 验证台湾身份证号码
*
* @param idCard
* 身份证号码
* @return 验证码是否符合
*/
public
static
boolean
validateTWCard
(
String
idCard
)
{
String
start
=
idCard
.
substring
(
0
,
1
);
String
mid
=
idCard
.
substring
(
1
,
9
);
String
end
=
idCard
.
substring
(
9
,
10
);
Integer
iStart
=
twFirstCode
.
get
(
start
);
Integer
sum
=
iStart
/
10
+
(
iStart
%
10
)
*
9
;
char
[]
chars
=
mid
.
toCharArray
();
Integer
iflag
=
8
;
for
(
char
c
:
chars
)
{
sum
=
sum
+
Integer
.
valueOf
(
c
+
""
)
*
iflag
;
iflag
--;
}
return
(
sum
%
10
==
0
?
0
:
(
10
-
sum
%
10
))
==
Integer
.
valueOf
(
end
)
?
true
:
false
;
}
/**
* 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)
* <p>
* 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35
* 最后一位校验码为0-9的数字加上字符"A","A"代表10
* </p>
* <p>
* 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效
* </p>
*
* @param idCard
* 身份证号码
* @return 验证码是否符合
*/
public
static
boolean
validateHKCard
(
String
idCard
)
{
String
card
=
idCard
.
replaceAll
(
"[\\(|\\)]"
,
""
);
Integer
sum
=
0
;
if
(
card
.
length
()
==
9
)
{
sum
=
(
Integer
.
valueOf
(
card
.
substring
(
0
,
1
).
toUpperCase
()
.
toCharArray
()[
0
])
-
55
)
*
9
+
(
Integer
.
valueOf
(
card
.
substring
(
1
,
2
).
toUpperCase
()
.
toCharArray
()[
0
])
-
55
)
*
8
;
card
=
card
.
substring
(
1
,
9
);
}
else
{
sum
=
522
+
(
Integer
.
valueOf
(
card
.
substring
(
0
,
1
).
toUpperCase
()
.
toCharArray
()[
0
])
-
55
)
*
8
;
}
String
mid
=
card
.
substring
(
1
,
7
);
String
end
=
card
.
substring
(
7
,
8
);
char
[]
chars
=
mid
.
toCharArray
();
Integer
iflag
=
7
;
for
(
char
c
:
chars
)
{
sum
=
sum
+
Integer
.
valueOf
(
c
+
""
)
*
iflag
;
iflag
--;
}
if
(
end
.
toUpperCase
().
equals
(
"A"
))
{
sum
=
sum
+
10
;
}
else
{
sum
=
sum
+
Integer
.
valueOf
(
end
);
}
return
(
sum
%
11
==
0
)
?
true
:
false
;
}
/**
* 将字符数组转换成数字数组
*
* @param ca
* 字符数组
* @return 数字数组
*/
public
static
int
[]
converCharToInt
(
char
[]
ca
)
{
int
len
=
ca
.
length
;
int
[]
iArr
=
new
int
[
len
];
try
{
for
(
int
i
=
0
;
i
<
len
;
i
++)
{
iArr
[
i
]
=
Integer
.
parseInt
(
String
.
valueOf
(
ca
[
i
]));
}
}
catch
(
NumberFormatException
e
)
{
e
.
printStackTrace
();
}
return
iArr
;
}
/**
* 将身份证的每位和对应位的加权因子相乘之后,再得到和值
*
* @param iArr
* @return 身份证编码。
*/
public
static
int
getPowerSum
(
int
[]
iArr
)
{
int
iSum
=
0
;
if
(
power
.
length
==
iArr
.
length
)
{
for
(
int
i
=
0
;
i
<
iArr
.
length
;
i
++)
{
for
(
int
j
=
0
;
j
<
power
.
length
;
j
++)
{
if
(
i
==
j
)
{
iSum
=
iSum
+
iArr
[
i
]
*
power
[
j
];
}
}
}
}
return
iSum
;
}
/**
* 将power和值与11取模获得余数进行校验码判断
*
* @param iSum
* @return 校验位
*/
public
static
String
getCheckCode18
(
int
iSum
)
{
String
sCode
=
""
;
switch
(
iSum
%
11
)
{
case
10
:
sCode
=
"2"
;
break
;
case
9
:
sCode
=
"3"
;
break
;
case
8
:
sCode
=
"4"
;
break
;
case
7
:
sCode
=
"5"
;
break
;
case
6
:
sCode
=
"6"
;
break
;
case
5
:
sCode
=
"7"
;
break
;
case
4
:
sCode
=
"8"
;
break
;
case
3
:
sCode
=
"9"
;
break
;
case
2
:
sCode
=
"x"
;
break
;
case
1
:
sCode
=
"0"
;
break
;
case
0
:
sCode
=
"1"
;
break
;
}
return
sCode
;
}
/**
* 根据身份编号获取年龄
*
* @param idCard
* 身份编号
* @return 年龄
*/
public
static
int
getAgeByIdCard
(
String
idCard
)
{
int
iAge
=
0
;
if
(
idCard
.
length
()
==
CHINA_ID_MIN_LENGTH
)
{
idCard
=
conver15CardTo18
(
idCard
);
}
String
year
=
idCard
.
substring
(
6
,
10
);
Calendar
cal
=
Calendar
.
getInstance
();
int
iCurrYear
=
cal
.
get
(
Calendar
.
YEAR
);
iAge
=
iCurrYear
-
Integer
.
valueOf
(
year
);
return
iAge
;
}
/**
* 根据身份编号获取生日
*
* @param idCard
* 身份编号
* @return 生日(yyyyMMdd)
*/
public
static
String
getBirthByIdCard
(
String
idCard
)
{
Integer
len
=
idCard
.
length
();
if
(
len
<
CHINA_ID_MIN_LENGTH
)
{
return
null
;
}
else
if
(
len
==
CHINA_ID_MIN_LENGTH
)
{
idCard
=
conver15CardTo18
(
idCard
);
}
return
idCard
.
substring
(
6
,
14
);
}
/**
* 根据身份编号获取生日年
*
* @param idCard
* 身份编号
* @return 生日(yyyy)
*/
public
static
Short
getYearByIdCard
(
String
idCard
)
{
Integer
len
=
idCard
.
length
();
if
(
len
<
CHINA_ID_MIN_LENGTH
)
{
return
null
;
}
else
if
(
len
==
CHINA_ID_MIN_LENGTH
)
{
idCard
=
conver15CardTo18
(
idCard
);
}
return
Short
.
valueOf
(
idCard
.
substring
(
6
,
10
));
}
/**
* 根据身份编号获取生日月
*
* @param idCard
* 身份编号
* @return 生日(MM)
*/
public
static
Short
getMonthByIdCard
(
String
idCard
)
{
Integer
len
=
idCard
.
length
();
if
(
len
<
CHINA_ID_MIN_LENGTH
)
{
return
null
;
}
else
if
(
len
==
CHINA_ID_MIN_LENGTH
)
{
idCard
=
conver15CardTo18
(
idCard
);
}
return
Short
.
valueOf
(
idCard
.
substring
(
10
,
12
));
}
/**
* 根据身份编号获取生日天
*
* @param idCard
* 身份编号
* @return 生日(dd)
*/
public
static
Short
getDateByIdCard
(
String
idCard
)
{
Integer
len
=
idCard
.
length
();
if
(
len
<
CHINA_ID_MIN_LENGTH
)
{
return
null
;
}
else
if
(
len
==
CHINA_ID_MIN_LENGTH
)
{
idCard
=
conver15CardTo18
(
idCard
);
}
return
Short
.
valueOf
(
idCard
.
substring
(
12
,
14
));
}
/**
* 根据身份编号获取性别
*
* @param idCard
* 身份编号
* @return 性别(M-男,F-女,N-未知)
*/
public
static
String
getGenderByIdCard
(
String
idCard
)
{
String
sGender
=
"N"
;
if
(
idCard
.
length
()
==
CHINA_ID_MIN_LENGTH
)
{
idCard
=
conver15CardTo18
(
idCard
);
}
String
sCardNum
=
idCard
.
substring
(
16
,
17
);
if
(
Integer
.
parseInt
(
sCardNum
)
%
2
!=
0
)
{
sGender
=
"M"
;
}
else
{
sGender
=
"F"
;
}
return
sGender
;
}
/**
* 根据身份编号获取户籍省份
*
* @param idCard
* 身份编码
* @return 省级编码。
*/
public
static
String
getProvinceByIdCard
(
String
idCard
)
{
int
len
=
idCard
.
length
();
String
sProvince
=
null
;
String
sProvinNum
=
""
;
if
(
len
==
CHINA_ID_MIN_LENGTH
||
len
==
CHINA_ID_MAX_LENGTH
)
{
sProvinNum
=
idCard
.
substring
(
0
,
2
);
}
sProvince
=
cityCodes
.
get
(
sProvinNum
);
return
sProvince
;
}
/**
* 数字验证
*
* @param val
* @return 提取的数字。
*/
public
static
boolean
isNum
(
String
val
)
{
return
val
==
null
||
""
.
equals
(
val
)
?
false
:
val
.
matches
(
"^[0-9]*$"
);
}
/**
* 验证小于当前日期 是否有效
*
* @param iYear
* 待验证日期(年)
* @param iMonth
* 待验证日期(月 1-12)
* @param iDate
* 待验证日期(日)
* @return 是否有效
*/
public
static
boolean
valiDate
(
int
iYear
,
int
iMonth
,
int
iDate
)
{
Calendar
cal
=
Calendar
.
getInstance
();
int
year
=
cal
.
get
(
Calendar
.
YEAR
);
int
datePerMonth
;
if
(
iYear
<
MIN
||
iYear
>=
year
)
{
return
false
;
}
if
(
iMonth
<
1
||
iMonth
>
12
)
{
return
false
;
}
switch
(
iMonth
)
{
case
4
:
case
6
:
case
9
:
case
11
:
datePerMonth
=
30
;
break
;
case
2
:
boolean
dm
=
((
iYear
%
4
==
0
&&
iYear
%
100
!=
0
)
||
(
iYear
%
400
==
0
))
&&
(
iYear
>
MIN
&&
iYear
<
year
);
datePerMonth
=
dm
?
29
:
28
;
break
;
default
:
datePerMonth
=
31
;
}
return
(
iDate
>=
1
)
&&
(
iDate
<=
datePerMonth
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/ImageGeo.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
com.drew.metadata.*
;
import
com.drew.metadata.exif.*
;
import
com.drew.imaging.jpeg.*
;
import
com.drew.lang.*
;
import
java.io.*
;
public
class
ImageGeo
{
public
double
lat
=
0.0
;
public
double
lon
=
0.0
;
public
double
alt
=
0.0
;
public
boolean
error
=
false
;
public
ImageGeo
(
String
filename
)
{
try
{
error
=
false
;
File
jpegFile
=
new
File
(
filename
);
Metadata
metadata
=
JpegMetadataReader
.
readMetadata
(
jpegFile
);
GpsDirectory
gpsdir
=
(
GpsDirectory
)
metadata
.
getDirectory
(
GpsDirectory
.
class
);
Rational
latpart
[]
=
gpsdir
.
getRationalArray
(
GpsDirectory
.
TAG_GPS_LATITUDE
);
Rational
lonpart
[]
=
gpsdir
.
getRationalArray
(
GpsDirectory
.
TAG_GPS_LONGITUDE
);
String
northing
=
gpsdir
.
getString
(
GpsDirectory
.
TAG_GPS_LATITUDE_REF
);
String
easting
=
gpsdir
.
getString
(
GpsDirectory
.
TAG_GPS_LONGITUDE_REF
);
try
{
alt
=
gpsdir
.
getDouble
(
GpsDirectory
.
TAG_GPS_ALTITUDE
);
}
catch
(
Exception
ex
)
{
}
double
latsign
=
1.0d
;
if
(
northing
.
equalsIgnoreCase
(
"S"
))
latsign
=
-
1.0d
;
double
lonsign
=
1.0d
;
if
(
easting
.
equalsIgnoreCase
(
"W"
))
lonsign
=
-
1.0d
;
lat
=
(
Math
.
abs
(
latpart
[
0
].
doubleValue
())
+
latpart
[
1
].
doubleValue
()
/
60.0d
+
latpart
[
2
]
.
doubleValue
()
/
3600.0d
)
*
latsign
;
lon
=
(
Math
.
abs
(
lonpart
[
0
].
doubleValue
())
+
lonpart
[
1
].
doubleValue
()
/
60.0d
+
lonpart
[
2
]
.
doubleValue
()
/
3600.0d
)
*
lonsign
;
if
(
Double
.
isNaN
(
lat
)
||
Double
.
isNaN
(
lon
))
error
=
true
;
}
catch
(
Exception
ex
)
{
error
=
true
;
}
System
.
out
.
println
(
filename
+
": ("
+
lat
+
", "
+
lon
+
")"
);
}
public
static
void
main
(
String
[]
args
)
{
ImageGeo
imageGeo
=
new
ImageGeo
(
ImageGeo
.
class
.
getResource
(
"IMAG0068.jpg"
).
getFile
());
System
.
out
.
println
(
imageGeo
.
lon
+
","
+
imageGeo
.
lat
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/IpUtils.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
javax.servlet.http.HttpServletRequest
;
/**
* 获取IP方法
*
* @author JeeSpring
*/
public
class
IpUtils
{
public
static
String
getIpAddr
(
HttpServletRequest
request
)
{
if
(
request
==
null
)
{
return
"unknown"
;
}
String
ip
=
request
.
getHeader
(
"x-forwarded-for"
);
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getHeader
(
"Proxy-Client-IP"
);
}
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getHeader
(
"X-Forwarded-For"
);
}
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
}
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getHeader
(
"X-Real-IP"
);
}
if
(
ip
==
null
||
ip
.
length
()
==
0
||
"unknown"
.
equalsIgnoreCase
(
ip
))
{
ip
=
request
.
getRemoteAddr
();
}
return
"0:0:0:0:0:0:0:1"
.
equals
(
ip
)
?
"127.0.0.1"
:
ip
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/MacUtils.java
0 → 100644
View file @
8b643e22
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
/**
* MAC地址工具
*
* @author 黄炳桂 516821420@qq.com
* @version 2013-12-21
*/
public
class
MacUtils
{
/**
* 获取当前操作系统名称. return 操作系统名称 例如:windows,Linux,Unix等.
*/
public
static
String
getOSName
()
{
return
System
.
getProperty
(
"os.name"
).
toLowerCase
();
}
/**
* 获取Unix网卡的mac地址.
*
* @return mac地址
*/
public
static
String
getUnixMACAddress
()
{
String
mac
=
null
;
BufferedReader
bufferedReader
=
null
;
Process
process
=
null
;
try
{
/**
* Unix下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
*/
process
=
Runtime
.
getRuntime
().
exec
(
"ifconfig eth0"
);
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getInputStream
()));
String
line
=
null
;
int
index
=
-
1
;
while
((
line
=
bufferedReader
.
readLine
())
!=
null
)
{
/**
* 寻找标示字符串[hwaddr]
*/
index
=
line
.
toLowerCase
().
indexOf
(
"hwaddr"
);
/**
* 找到了
*/
if
(
index
!=
-
1
)
{
/**
* 取出mac地址并去除2边空格
*/
mac
=
line
.
substring
(
index
+
"hwaddr"
.
length
()
+
1
).
trim
();
break
;
}
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
if
(
bufferedReader
!=
null
)
{
bufferedReader
.
close
();
}
}
catch
(
IOException
e1
)
{
e1
.
printStackTrace
();
}
bufferedReader
=
null
;
process
=
null
;
}
return
mac
;
}
/**
* 获取Linux网卡的mac地址.
*
* @return mac地址
*/
public
static
String
getLinuxMACAddress
()
{
String
mac
=
null
;
BufferedReader
bufferedReader
=
null
;
Process
process
=
null
;
try
{
/**
* linux下的命令,一般取eth0作为本地主网卡 显示信息中包含有mac地址信息
*/
process
=
Runtime
.
getRuntime
().
exec
(
"ifconfig eth0"
);
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getInputStream
()));
String
line
=
null
;
int
index
=
-
1
;
while
((
line
=
bufferedReader
.
readLine
())
!=
null
)
{
index
=
line
.
toLowerCase
().
indexOf
(
"硬件地址"
);
/**
* 找到了
*/
if
(
index
!=
-
1
)
{
/**
* 取出mac地址并去除2边空格
*/
mac
=
line
.
substring
(
index
+
4
).
trim
();
break
;
}
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
if
(
bufferedReader
!=
null
)
{
bufferedReader
.
close
();
}
}
catch
(
IOException
e1
)
{
e1
.
printStackTrace
();
}
bufferedReader
=
null
;
process
=
null
;
}
// 取不到,试下Unix取发
if
(
mac
==
null
){
return
getUnixMACAddress
();
}
return
mac
;
}
/**
* 获取widnows网卡的mac地址.
*
* @return mac地址
*/
public
static
String
getWindowsMACAddress
()
{
String
mac
=
null
;
BufferedReader
bufferedReader
=
null
;
Process
process
=
null
;
try
{
/**
* windows下的命令,显示信息中包含有mac地址信息
*/
process
=
Runtime
.
getRuntime
().
exec
(
"ipconfig /all"
);
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
process
.
getInputStream
()));
String
line
=
null
;
int
index
=
-
1
;
while
((
line
=
bufferedReader
.
readLine
())
!=
null
)
{
/**
* 寻找标示字符串[physical address]
*/
// index = line.toLowerCase().indexOf("physical address");
// if (index != -1) {
if
(
line
.
split
(
"-"
).
length
==
6
){
index
=
line
.
indexOf
(
":"
);
if
(
index
!=
-
1
)
{
/**
* 取出mac地址并去除2边空格
*/
mac
=
line
.
substring
(
index
+
1
).
trim
();
}
break
;
}
index
=
line
.
toLowerCase
().
indexOf
(
"物理地址"
);
if
(
index
!=
-
1
)
{
index
=
line
.
indexOf
(
":"
);
if
(
index
!=
-
1
)
{
/**
* 取出mac地址并去除2边空格
*/
mac
=
line
.
substring
(
index
+
1
).
trim
();
}
break
;
}
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
try
{
if
(
bufferedReader
!=
null
)
{
bufferedReader
.
close
();
}
}
catch
(
IOException
e1
)
{
e1
.
printStackTrace
();
}
bufferedReader
=
null
;
process
=
null
;
}
return
mac
;
}
public
static
String
getMac
(){
String
os
=
getOSName
();
String
mac
;
if
(
os
.
startsWith
(
"windows"
))
{
mac
=
getWindowsMACAddress
();
}
else
if
(
os
.
startsWith
(
"linux"
))
{
mac
=
getLinuxMACAddress
();
}
else
{
mac
=
getUnixMACAddress
();
}
return
mac
==
null
?
""
:
mac
;
}
/**
* 测试用的main方法.
*
* @param argc 运行参数.
*/
public
static
void
main
(
String
[]
argc
)
{
String
os
=
getOSName
();
System
.
out
.
println
(
"os: "
+
os
);
if
(
os
.
startsWith
(
"windows"
))
{
String
mac
=
getWindowsMACAddress
();
System
.
out
.
println
(
"mac: "
+
mac
);
}
else
if
(
os
.
startsWith
(
"linux"
))
{
String
mac
=
getLinuxMACAddress
();
System
.
out
.
println
(
"mac: "
+
mac
);
}
else
{
String
mac
=
getUnixMACAddress
();
System
.
out
.
println
(
"mac: "
+
mac
);
}
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/MyBeanUtils.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
java.beans.PropertyDescriptor
;
import
java.lang.reflect.InvocationTargetException
;
import
java.util.Iterator
;
import
java.util.Map
;
import
org.apache.commons.beanutils.DynaBean
;
import
org.apache.commons.beanutils.DynaProperty
;
import
org.apache.commons.beanutils.PropertyUtils
;
import
org.apache.commons.beanutils.PropertyUtilsBean
;
/**
* <p>Title: </p>
* <p>Description: </p>
* @author 刘高峰
* @version 2.0
*/
public
class
MyBeanUtils
extends
PropertyUtilsBean
{
private
static
void
convert
(
Object
dest
,
Object
orig
)
throws
IllegalAccessException
,
InvocationTargetException
{
// Validate existence of the specified beans
if
(
dest
==
null
)
{
throw
new
IllegalArgumentException
(
"No destination bean specified"
);
}
if
(
orig
==
null
)
{
throw
new
IllegalArgumentException
(
"No origin bean specified"
);
}
// Copy the properties, converting as necessary
if
(
orig
instanceof
DynaBean
)
{
DynaProperty
origDescriptors
[]
=
(
(
DynaBean
)
orig
).
getDynaClass
().
getDynaProperties
();
for
(
int
i
=
0
;
i
<
origDescriptors
.
length
;
i
++)
{
String
name
=
origDescriptors
[
i
].
getName
();
if
(
PropertyUtils
.
isWriteable
(
dest
,
name
))
{
Object
value
=
(
(
DynaBean
)
orig
).
get
(
name
);
try
{
getInstance
().
setSimpleProperty
(
dest
,
name
,
value
);
}
catch
(
Exception
e
)
{
;
// Should not happen
}
}
}
}
else
if
(
orig
instanceof
Map
)
{
Iterator
names
=
(
(
Map
)
orig
).
keySet
().
iterator
();
while
(
names
.
hasNext
())
{
String
name
=
(
String
)
names
.
next
();
if
(
PropertyUtils
.
isWriteable
(
dest
,
name
))
{
Object
value
=
(
(
Map
)
orig
).
get
(
name
);
try
{
getInstance
().
setSimpleProperty
(
dest
,
name
,
value
);
}
catch
(
Exception
e
)
{
;
// Should not happen
}
}
}
}
else
/* if (orig is a standard JavaBean) */
{
PropertyDescriptor
origDescriptors
[]
=
PropertyUtils
.
getPropertyDescriptors
(
orig
);
for
(
int
i
=
0
;
i
<
origDescriptors
.
length
;
i
++)
{
String
name
=
origDescriptors
[
i
].
getName
();
// String type = origDescriptors[i].getPropertyType().toString();
if
(
"class"
.
equals
(
name
))
{
continue
;
// No point in trying to set an object's class
}
if
(
PropertyUtils
.
isReadable
(
orig
,
name
)
&&
PropertyUtils
.
isWriteable
(
dest
,
name
))
{
try
{
Object
value
=
PropertyUtils
.
getSimpleProperty
(
orig
,
name
);
getInstance
().
setSimpleProperty
(
dest
,
name
,
value
);
}
catch
(
IllegalArgumentException
ie
)
{
;
// Should not happen
}
catch
(
Exception
e
)
{
;
// Should not happen
}
}
}
}
}
/**
* 对象拷贝
* 数据对象空值不拷贝到目标对象
*
* @param dataObject
* @param toObject
* @throws NoSuchMethodException
* copy
*/
public
static
void
copyBeanNotNull2Bean
(
Object
databean
,
Object
tobean
)
throws
Exception
{
PropertyDescriptor
origDescriptors
[]
=
PropertyUtils
.
getPropertyDescriptors
(
databean
);
for
(
int
i
=
0
;
i
<
origDescriptors
.
length
;
i
++)
{
String
name
=
origDescriptors
[
i
].
getName
();
// String type = origDescriptors[i].getPropertyType().toString();
if
(
"class"
.
equals
(
name
))
{
continue
;
// No point in trying to set an object's class
}
if
(
PropertyUtils
.
isReadable
(
databean
,
name
)
&&
PropertyUtils
.
isWriteable
(
tobean
,
name
))
{
try
{
Object
value
=
PropertyUtils
.
getSimpleProperty
(
databean
,
name
);
if
(
value
!=
null
){
getInstance
().
setSimpleProperty
(
tobean
,
name
,
value
);
}
}
catch
(
IllegalArgumentException
ie
)
{
;
// Should not happen
}
catch
(
Exception
e
)
{
;
// Should not happen
}
}
}
}
/**
* 把orig和dest相同属性的value复制到dest中
* @param dest
* @param orig
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public
static
void
copyBean2Bean
(
Object
dest
,
Object
orig
)
throws
Exception
{
convert
(
dest
,
orig
);
}
public
static
void
copyBean2Map
(
Map
map
,
Object
bean
){
PropertyDescriptor
[]
pds
=
PropertyUtils
.
getPropertyDescriptors
(
bean
);
for
(
int
i
=
0
;
i
<
pds
.
length
;
i
++)
{
PropertyDescriptor
pd
=
pds
[
i
];
String
propname
=
pd
.
getName
();
try
{
Object
propvalue
=
PropertyUtils
.
getSimpleProperty
(
bean
,
propname
);
map
.
put
(
propname
,
propvalue
);
}
catch
(
IllegalAccessException
e
)
{
//e.printStackTrace();
}
catch
(
InvocationTargetException
e
)
{
//e.printStackTrace();
}
catch
(
NoSuchMethodException
e
)
{
//e.printStackTrace();
}
}
}
/**
* 将Map内的key与Bean中属性相同的内容复制到BEAN中
* @param bean Object
* @param properties Map
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public
static
void
copyMap2Bean
(
Object
bean
,
Map
properties
)
throws
IllegalAccessException
,
InvocationTargetException
{
// Do nothing unless both arguments have been specified
if
(
(
bean
==
null
)
||
(
properties
==
null
))
{
return
;
}
// Loop through the property name/value pairs to be set
Iterator
names
=
properties
.
keySet
().
iterator
();
while
(
names
.
hasNext
())
{
String
name
=
(
String
)
names
.
next
();
// Identify the property name and value(s) to be assigned
if
(
name
==
null
)
{
continue
;
}
Object
value
=
properties
.
get
(
name
);
try
{
Class
clazz
=
PropertyUtils
.
getPropertyType
(
bean
,
name
);
if
(
null
==
clazz
)
{
continue
;
}
String
className
=
clazz
.
getName
();
if
(
className
.
equalsIgnoreCase
(
"java.sql.Timestamp"
))
{
if
(
value
==
null
||
value
.
equals
(
""
))
{
continue
;
}
}
getInstance
().
setSimpleProperty
(
bean
,
name
,
value
);
}
catch
(
NoSuchMethodException
e
)
{
continue
;
}
}
}
/**
* 自动转Map key值大写
* 将Map内的key与Bean中属性相同的内容复制到BEAN中
* @param bean Object
* @param properties Map
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public
static
void
copyMap2Bean_Nobig
(
Object
bean
,
Map
properties
)
throws
IllegalAccessException
,
InvocationTargetException
{
// Do nothing unless both arguments have been specified
if
(
(
bean
==
null
)
||
(
properties
==
null
))
{
return
;
}
// Loop through the property name/value pairs to be set
Iterator
names
=
properties
.
keySet
().
iterator
();
while
(
names
.
hasNext
())
{
String
name
=
(
String
)
names
.
next
();
// Identify the property name and value(s) to be assigned
if
(
name
==
null
)
{
continue
;
}
Object
value
=
properties
.
get
(
name
);
// 命名应该大小写应该敏感(否则取不到对象的属性)
//name = name.toLowerCase();
try
{
if
(
value
==
null
)
{
// 不光Date类型,好多类型在null时会出错
continue
;
// 如果为null不用设 (对象如果有特殊初始值也可以保留?)
}
Class
clazz
=
PropertyUtils
.
getPropertyType
(
bean
,
name
);
if
(
null
==
clazz
)
{
// 在bean中这个属性不存在
continue
;
}
String
className
=
clazz
.
getName
();
// 临时对策(如果不处理默认的类型转换时会出错)
if
(
className
.
equalsIgnoreCase
(
"java.util.Date"
))
{
value
=
new
java
.
util
.
Date
(((
java
.
sql
.
Timestamp
)
value
).
getTime
());
// wait to do:貌似有时区问题, 待进一步确认
}
// if (className.equalsIgnoreCase("java.sql.Timestamp")) {
// if (value == null || value.equals("")) {
// continue;
// }
// }
getInstance
().
setSimpleProperty
(
bean
,
name
,
value
);
}
catch
(
NoSuchMethodException
e
)
{
continue
;
}
}
}
/**
* Map内的key与Bean中属性相同的内容复制到BEAN中
* 对于存在空值的取默认值
* @param bean Object
* @param properties Map
* @param defaultValue String
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public
static
void
copyMap2Bean
(
Object
bean
,
Map
properties
,
String
defaultValue
)
throws
IllegalAccessException
,
InvocationTargetException
{
// Do nothing unless both arguments have been specified
if
(
(
bean
==
null
)
||
(
properties
==
null
))
{
return
;
}
// Loop through the property name/value pairs to be set
Iterator
names
=
properties
.
keySet
().
iterator
();
while
(
names
.
hasNext
())
{
String
name
=
(
String
)
names
.
next
();
// Identify the property name and value(s) to be assigned
if
(
name
==
null
)
{
continue
;
}
Object
value
=
properties
.
get
(
name
);
try
{
Class
clazz
=
PropertyUtils
.
getPropertyType
(
bean
,
name
);
if
(
null
==
clazz
)
{
continue
;
}
String
className
=
clazz
.
getName
();
if
(
className
.
equalsIgnoreCase
(
"java.sql.Timestamp"
))
{
if
(
value
==
null
||
value
.
equals
(
""
))
{
continue
;
}
}
if
(
className
.
equalsIgnoreCase
(
"java.lang.String"
))
{
if
(
value
==
null
)
{
value
=
defaultValue
;
}
}
getInstance
().
setSimpleProperty
(
bean
,
name
,
value
);
}
catch
(
NoSuchMethodException
e
)
{
continue
;
}
}
}
public
MyBeanUtils
()
{
super
();
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/ObjectFieldUtils.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
java.lang.reflect.Field
;
public
class
ObjectFieldUtils
{
/**
*
* 获取对象属性赋值
*
* @param dObject
* @param fieldName
* 字段别名
* @return
*/
public
static
Object
getFieldValue
(
Object
dObject
,
String
fieldName
)
{
Object
result
=
null
;
try
{
Field
fu
=
dObject
.
getClass
().
getDeclaredField
(
fieldName
);
// 获取对象的属性域
try
{
fu
.
setAccessible
(
true
);
// 设置对象属性域的访问属性
result
=
fu
.
get
(
dObject
);
// 获取对象属性域的属性值
}
catch
(
IllegalAccessException
e
)
{
e
.
printStackTrace
();
}
}
catch
(
NoSuchFieldException
e
)
{
e
.
printStackTrace
();
}
return
result
;
}
/**
* 给对象属性赋值
*
* @param dObject
* @param fieldName
* @param val
* @return
*/
public
static
Object
setFieldValue
(
Object
dObject
,
String
fieldName
,
Object
val
)
{
Object
result
=
null
;
try
{
Field
fu
=
dObject
.
getClass
().
getDeclaredField
(
fieldName
);
// 获取对象的属性域
try
{
fu
.
setAccessible
(
true
);
// 设置对象属性域的访问属性
fu
.
set
(
dObject
,
val
);
// 设置对象属性域的属性值
result
=
fu
.
get
(
dObject
);
// 获取对象属性域的属性值
}
catch
(
IllegalAccessException
e
)
{
e
.
printStackTrace
();
}
}
catch
(
NoSuchFieldException
e
)
{
e
.
printStackTrace
();
}
return
result
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/ObjectUtils.java
0 → 100644
View file @
8b643e22
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.io.ByteArrayInputStream
;
import
java.io.ByteArrayOutputStream
;
import
java.io.ObjectInputStream
;
import
java.io.ObjectOutputStream
;
import
java.lang.reflect.Method
;
import
java.math.BigDecimal
;
import
java.util.Collection
;
import
java.util.Map
;
import
org.apache.commons.lang3.StringUtils
;
/**
* 对象操作工具类, 继承org.apache.commons.lang3.ObjectUtils类
* @author 黄炳桂 516821420@qq.com
* @version 2014-6-29
*/
public
class
ObjectUtils
extends
org
.
apache
.
commons
.
lang3
.
ObjectUtils
{
/**
* 注解到对象复制,只复制能匹配上的方法。
* @param annotation
* @param object
*/
public
static
void
annotationToObject
(
Object
annotation
,
Object
object
){
if
(
annotation
!=
null
){
Class
<?>
annotationClass
=
annotation
.
getClass
();
Class
<?>
objectClass
=
object
.
getClass
();
for
(
Method
m
:
objectClass
.
getMethods
()){
if
(
StringUtils
.
startsWith
(
m
.
getName
(),
"set"
)){
try
{
String
s
=
StringUtils
.
uncapitalize
(
StringUtils
.
substring
(
m
.
getName
(),
3
));
Object
obj
=
annotationClass
.
getMethod
(
s
).
invoke
(
annotation
);
if
(
obj
!=
null
&&
!
""
.
equals
(
obj
.
toString
())){
if
(
object
==
null
){
object
=
objectClass
.
newInstance
();
}
m
.
invoke
(
object
,
obj
);
}
}
catch
(
Exception
e
)
{
// 忽略所有设置失败方法
}
}
}
}
}
/**
* 序列化对象
* @param object
* @return
*/
public
static
byte
[]
serialize
(
Object
object
)
{
ObjectOutputStream
oos
=
null
;
ByteArrayOutputStream
baos
=
null
;
try
{
if
(
object
!=
null
){
baos
=
new
ByteArrayOutputStream
();
oos
=
new
ObjectOutputStream
(
baos
);
oos
.
writeObject
(
object
);
return
baos
.
toByteArray
();
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/**
* 反序列化对象
* @param bytes
* @return
*/
public
static
Object
unserialize
(
byte
[]
bytes
)
{
ByteArrayInputStream
bais
=
null
;
try
{
if
(
bytes
!=
null
&&
bytes
.
length
>
0
){
bais
=
new
ByteArrayInputStream
(
bytes
);
ObjectInputStream
ois
=
new
ObjectInputStream
(
bais
);
return
ois
.
readObject
();
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
private
static
final
int
ErrorRe
=-
1
;
private
static
final
String
NullStringRe
=
""
;
public
static
boolean
isEmpty
(
Object
o
)
{
return
o
==
null
||
o
.
toString
().
length
()
<=
0
;
}
public
static
BigDecimal
convertObjectToBigDecimal
(
Object
o
)
{
return
o
==
null
?
null
:
BigDecimal
.
valueOf
(
Double
.
parseDouble
(
o
.
toString
()));
}
public
static
Integer
convertObjectToInteger
(
Object
o
)
{
return
o
==
null
?
null
:
Integer
.
parseInt
(
o
.
toString
());
}
public
static
String
convertObjectToString
(
Object
o
)
{
return
o
==
null
?
null
:
o
.
toString
();
}
public
static
Integer
convertObjectToInteger2
(
Object
o
)
{
return
o
==
null
?
ErrorRe
:
Integer
.
parseInt
(
o
.
toString
());
}
public
static
String
convertObjectToString2
(
Object
o
)
{
return
o
==
null
?
NullStringRe
:
o
.
toString
();
}
@SuppressWarnings
(
"unchecked"
)
private
static
<
T
>
T
getMapValue
(
Map
<?,
?>
params
,
Object
key
)
{
return
(
T
)
(
null
==
params
?
null
:
params
.
get
(
key
));
}
@SuppressWarnings
(
"unchecked"
)
public
static
<
T
>
T
getMapValue
(
Map
<?,
?>
params
,
Object
key
,
Class
<
T
>
t
)
{
return
(
T
)
getMapValue
(
params
,
key
);
}
public
static
String
getMapNotNullStrValue
(
Map
<?,
?>
params
,
Object
key
)
{
Object
value
=
getMapValue
(
params
,
key
);
if
(
null
==
value
)
{
return
NullStringRe
;
}
return
String
.
valueOf
(
value
);
}
public
static
int
getMapNotNullIntValue
(
Map
<?,
?>
params
,
Object
key
)
{
Object
value
=
getMapValue
(
params
,
key
);
if
(
null
==
value
)
{
return
0
;
}
int
v
=
0
;
if
(
value
instanceof
Integer
)
{
v
=
((
Integer
)
value
).
intValue
();
}
else
{
try
{
v
=
Integer
.
parseInt
(
String
.
valueOf
(
value
));
}
catch
(
Exception
e
)
{
}
}
return
v
;
}
public
static
Integer
getMapIntegerValue
(
Map
<?,
?>
params
,
Object
key
)
{
Object
value
=
getMapValue
(
params
,
key
);
if
(
null
==
value
)
{
return
null
;
}
Integer
v
=
0
;
if
(
value
instanceof
Integer
)
{
v
=
((
Integer
)
value
).
intValue
();
}
else
{
try
{
v
=
Integer
.
parseInt
(
String
.
valueOf
(
value
));
}
catch
(
Exception
e
)
{
v
=
null
;
}
}
return
v
;
}
public
static
boolean
isEmpty
(
Collection
<?>
c
)
{
return
c
==
null
||
c
.
isEmpty
();
}
public
static
boolean
isNotEmpty
(
Collection
<?>
c
)
{
return
!
isEmpty
(
c
);
}
public
static
boolean
isEmpty
(
Map
<?,
?>
c
)
{
return
c
==
null
||
c
.
isEmpty
();
}
public
static
boolean
isNotEmpty
(
Map
<?,
?>
c
)
{
return
!
isEmpty
(
c
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/OrderProperties.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
java.io.BufferedReader
;
import
java.io.BufferedWriter
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.io.OutputStream
;
import
java.io.OutputStreamWriter
;
import
java.util.List
;
import
java.util.Properties
;
import
com.google.common.base.Objects
;
import
com.google.common.collect.Lists
;
/**
* <p>
* 有序的properties的工具类,由于JDK自身的写会乱序,所以采用这个工具类来保证读写次序正常.
* </p>
*
* @author poplar.yfyang
* @version 1.0 2013-01-02 12:57 PM
* @since JDK 1.5
*/
public
class
OrderProperties
extends
Properties
{
/** 序列化ID */
private
static
final
long
serialVersionUID
=
-
762117852594617585L
;
private
static
final
String
keyValueSeparators
=
"=: \t\r\n\f"
;
private
static
final
String
strictKeyValueSeparators
=
"=:"
;
private
static
final
String
specialSaveChars
=
"=: \t\r\n\f#!"
;
private
static
final
String
whiteSpaceChars
=
" \t\r\n\f"
;
/** A table of hex digits */
private
static
final
char
[]
hexDigit
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
private
PropertiesContext
context
=
new
PropertiesContext
();
private
static
void
writeln
(
BufferedWriter
bw
,
String
s
)
throws
IOException
{
bw
.
write
(
s
);
bw
.
newLine
();
}
/**
* Convert a nibble to a hex character
*
* @param nibble the nibble to convert.
*/
private
static
char
toHex
(
int
nibble
)
{
return
hexDigit
[(
nibble
&
0xF
)];
}
public
PropertiesContext
getContext
()
{
return
context
;
}
public
synchronized
void
load
(
InputStream
inStream
)
throws
IOException
{
BufferedReader
in
;
in
=
new
BufferedReader
(
new
InputStreamReader
(
inStream
,
"8859_1"
));
while
(
true
)
{
// Get next line
String
line
=
in
.
readLine
();
// intract property/comment string
String
intactLine
=
line
;
if
(
line
==
null
)
return
;
if
(
line
.
length
()
>
0
)
{
// Find start of key
int
len
=
line
.
length
();
int
keyStart
;
for
(
keyStart
=
0
;
keyStart
<
len
;
keyStart
++)
if
(
whiteSpaceChars
.
indexOf
(
line
.
charAt
(
keyStart
))
==
-
1
)
break
;
// Blank lines are ignored
if
(
keyStart
==
len
)
continue
;
// Continue lines that end in slashes if they are not comments
char
firstChar
=
line
.
charAt
(
keyStart
);
if
((
firstChar
!=
'#'
)
&&
(
firstChar
!=
'!'
))
{
while
(
continueLine
(
line
))
{
String
nextLine
=
in
.
readLine
();
intactLine
=
intactLine
+
"\n"
+
nextLine
;
if
(
nextLine
==
null
)
nextLine
=
""
;
String
loppedLine
=
line
.
substring
(
0
,
len
-
1
);
// Advance beyond whitespace on new line
int
startIndex
;
for
(
startIndex
=
0
;
startIndex
<
nextLine
.
length
();
startIndex
++)
if
(
whiteSpaceChars
.
indexOf
(
nextLine
.
charAt
(
startIndex
))
==
-
1
)
break
;
nextLine
=
nextLine
.
substring
(
startIndex
,
nextLine
.
length
());
line
=
loppedLine
+
nextLine
;
len
=
line
.
length
();
}
// Find separation between key and value
int
separatorIndex
;
for
(
separatorIndex
=
keyStart
;
separatorIndex
<
len
;
separatorIndex
++)
{
char
currentChar
=
line
.
charAt
(
separatorIndex
);
if
(
currentChar
==
'\\'
)
separatorIndex
++;
else
if
(
keyValueSeparators
.
indexOf
(
currentChar
)
!=
-
1
)
break
;
}
// Skip over whitespace after key if any
int
valueIndex
;
for
(
valueIndex
=
separatorIndex
;
valueIndex
<
len
;
valueIndex
++)
if
(
whiteSpaceChars
.
indexOf
(
line
.
charAt
(
valueIndex
))
==
-
1
)
break
;
// Skip over one non whitespace key value separators if any
if
(
valueIndex
<
len
)
if
(
strictKeyValueSeparators
.
indexOf
(
line
.
charAt
(
valueIndex
))
!=
-
1
)
valueIndex
++;
// Skip over white space after other separators if any
while
(
valueIndex
<
len
)
{
if
(
whiteSpaceChars
.
indexOf
(
line
.
charAt
(
valueIndex
))
==
-
1
)
break
;
valueIndex
++;
}
String
key
=
line
.
substring
(
keyStart
,
separatorIndex
);
String
value
=
(
separatorIndex
<
len
)
?
line
.
substring
(
valueIndex
,
len
)
:
""
;
// Convert then store key and value
key
=
loadConvert
(
key
);
value
=
loadConvert
(
value
);
//memorize the property also with the whold string
put
(
key
,
value
,
intactLine
);
}
else
{
//memorize the comment string
context
.
addCommentLine
(
intactLine
);
}
}
else
{
//memorize the string even the string is empty
context
.
addCommentLine
(
intactLine
);
}
}
}
/*
* Converts encoded \uxxxx to unicode chars and changes special saved
* chars to their original forms
*/
private
String
loadConvert
(
String
theString
)
{
char
aChar
;
int
len
=
theString
.
length
();
StringBuilder
outBuffer
=
new
StringBuilder
(
len
);
for
(
int
x
=
0
;
x
<
len
;
)
{
aChar
=
theString
.
charAt
(
x
++);
if
(
aChar
==
'\\'
)
{
aChar
=
theString
.
charAt
(
x
++);
if
(
aChar
==
'u'
)
{
// Read the xxxx
int
value
=
0
;
for
(
int
i
=
0
;
i
<
4
;
i
++)
{
aChar
=
theString
.
charAt
(
x
++);
switch
(
aChar
)
{
case
'0'
:
case
'1'
:
case
'2'
:
case
'3'
:
case
'4'
:
case
'5'
:
case
'6'
:
case
'7'
:
case
'8'
:
case
'9'
:
value
=
(
value
<<
4
)
+
aChar
-
'0'
;
break
;
case
'a'
:
case
'b'
:
case
'c'
:
case
'd'
:
case
'e'
:
case
'f'
:
value
=
(
value
<<
4
)
+
10
+
aChar
-
'a'
;
break
;
case
'A'
:
case
'B'
:
case
'C'
:
case
'D'
:
case
'E'
:
case
'F'
:
value
=
(
value
<<
4
)
+
10
+
aChar
-
'A'
;
break
;
default
:
throw
new
IllegalArgumentException
(
"Malformed \\uxxxx encoding."
);
}
}
outBuffer
.
append
((
char
)
value
);
}
else
{
if
(
aChar
==
't'
)
outBuffer
.
append
(
'\t'
);
/* ibm@7211 */
else
if
(
aChar
==
'r'
)
outBuffer
.
append
(
'\r'
);
/* ibm@7211 */
else
if
(
aChar
==
'n'
)
{
/*
* ibm@8897 do not convert a \n to a line.separator
* because on some platforms line.separator is a String
* of "\r\n". When a Properties class is saved as a file
* (store()) and then restored (load()) the restored
* input MUST be the same as the output (so that
* Properties.equals() works).
*
*/
outBuffer
.
append
(
'\n'
);
/* ibm@8897 ibm@7211 */
}
else
if
(
aChar
==
'f'
)
outBuffer
.
append
(
'\f'
);
/* ibm@7211 */
else
/* ibm@7211 */
outBuffer
.
append
(
aChar
);
/* ibm@7211 */
}
}
else
outBuffer
.
append
(
aChar
);
}
return
outBuffer
.
toString
();
}
public
synchronized
void
store
(
OutputStream
out
,
String
header
)
throws
IOException
{
BufferedWriter
awriter
;
awriter
=
new
BufferedWriter
(
new
OutputStreamWriter
(
out
,
"8859_1"
));
if
(
header
!=
null
)
writeln
(
awriter
,
"#"
+
header
);
@SuppressWarnings
(
"rawtypes"
)
List
entrys
=
context
.
getCommentOrEntrys
();
for
(
Object
obj
:
entrys
)
{
if
(
obj
.
toString
()
!=
null
)
{
writeln
(
awriter
,
obj
.
toString
());
}
}
awriter
.
flush
();
}
private
boolean
continueLine
(
String
line
)
{
int
slashCount
=
0
;
int
index
=
line
.
length
()
-
1
;
while
((
index
>=
0
)
&&
(
line
.
charAt
(
index
--)
==
'\\'
))
slashCount
++;
return
(
slashCount
%
2
==
1
);
}
/*
* Converts unicodes to encoded \uxxxx and writes out any of the
* characters in specialSaveChars with a preceding slash
*/
private
String
saveConvert
(
String
theString
,
boolean
escapeSpace
)
{
int
len
=
theString
.
length
();
StringBuilder
outBuffer
=
new
StringBuilder
(
len
*
2
);
for
(
int
x
=
0
;
x
<
len
;
x
++)
{
char
aChar
=
theString
.
charAt
(
x
);
switch
(
aChar
)
{
case
' '
:
if
(
x
==
0
||
escapeSpace
)
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
' '
);
break
;
case
'\\'
:
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
'\\'
);
break
;
case
'\t'
:
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
't'
);
break
;
case
'\n'
:
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
'n'
);
break
;
case
'\r'
:
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
'r'
);
break
;
case
'\f'
:
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
'f'
);
break
;
default
:
if
((
aChar
<
0x0020
)
||
(
aChar
>
0x007e
))
{
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
'u'
);
outBuffer
.
append
(
toHex
((
aChar
>>
12
)
&
0xF
));
outBuffer
.
append
(
toHex
((
aChar
>>
8
)
&
0xF
));
outBuffer
.
append
(
toHex
((
aChar
>>
4
)
&
0xF
));
outBuffer
.
append
(
toHex
(
aChar
&
0xF
));
}
else
{
if
(
specialSaveChars
.
indexOf
(
aChar
)
!=
-
1
)
outBuffer
.
append
(
'\\'
);
outBuffer
.
append
(
aChar
);
}
}
}
return
outBuffer
.
toString
();
}
public
synchronized
Object
put
(
Object
key
,
Object
value
)
{
context
.
putOrUpdate
(
key
.
toString
(),
value
.
toString
());
return
super
.
put
(
key
,
value
);
}
public
synchronized
Object
put
(
Object
key
,
Object
value
,
String
line
)
{
context
.
putOrUpdate
(
key
.
toString
(),
value
.
toString
(),
line
);
return
super
.
put
(
key
,
value
);
}
public
synchronized
Object
remove
(
Object
key
)
{
context
.
remove
(
key
.
toString
());
return
super
.
remove
(
key
);
}
/** @param comment */
public
void
addComment
(
String
comment
)
{
if
(
comment
!=
null
)
{
context
.
addCommentLine
(
"#"
+
comment
);
}
}
class
PropertiesContext
{
/** 描述信息 */
private
List
<
Object
>
commentOrEntrys
=
Lists
.
newArrayList
();
@SuppressWarnings
(
"rawtypes"
)
public
List
getCommentOrEntrys
()
{
return
commentOrEntrys
;
}
public
void
addCommentLine
(
String
line
)
{
commentOrEntrys
.
add
(
line
);
}
public
void
putOrUpdate
(
PropertyEntry
pe
)
{
remove
(
pe
.
getKey
());
commentOrEntrys
.
add
(
pe
);
}
public
void
putOrUpdate
(
String
key
,
String
value
,
String
line
)
{
PropertyEntry
pe
=
new
PropertyEntry
(
key
,
value
,
line
);
remove
(
key
);
commentOrEntrys
.
add
(
pe
);
}
public
void
putOrUpdate
(
String
key
,
String
value
)
{
PropertyEntry
pe
=
new
PropertyEntry
(
key
,
value
);
int
index
=
remove
(
key
);
commentOrEntrys
.
add
(
index
,
pe
);
}
public
int
remove
(
String
key
)
{
for
(
int
index
=
0
;
index
<
commentOrEntrys
.
size
();
index
++)
{
Object
obj
=
commentOrEntrys
.
get
(
index
);
if
(
obj
instanceof
PropertyEntry
)
{
if
(!
Objects
.
equal
(
obj
,
null
))
{
if
(
key
.
equals
(((
PropertyEntry
)
obj
).
getKey
()))
{
commentOrEntrys
.
remove
(
obj
);
return
index
;
}
}
}
}
return
commentOrEntrys
.
size
();
}
/** 属性描述 */
class
PropertyEntry
{
/** 属性KEY */
private
String
key
;
/** 属性值 */
private
String
value
;
/** 属性行 */
private
String
line
;
public
PropertyEntry
(
String
key
,
String
value
)
{
this
.
key
=
key
;
this
.
value
=
value
;
}
/**
* 构建属性描述
*
* @param key key
* @param value value
* @param line line
*/
public
PropertyEntry
(
String
key
,
String
value
,
String
line
)
{
this
(
key
,
value
);
this
.
line
=
line
;
}
public
String
getLine
()
{
return
line
;
}
public
void
setLine
(
String
line
)
{
this
.
line
=
line
;
}
public
String
getKey
()
{
return
key
;
}
public
void
setKey
(
String
key
)
{
this
.
key
=
key
;
}
public
String
getValue
()
{
return
value
;
}
public
void
setValue
(
String
value
)
{
this
.
value
=
value
;
}
public
String
toString
()
{
if
(
line
!=
null
)
{
return
line
;
}
if
(
key
!=
null
&&
value
!=
null
)
{
String
k
=
saveConvert
(
key
,
true
);
String
v
=
saveConvert
(
value
,
false
);
return
k
+
"="
+
v
;
}
return
null
;
}
}
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/PropertiesLoader.java
0 → 100644
View file @
8b643e22
/**
* Copyright (c) 2005-2011 springside.org.cn
* <p>
* $Id: PropertiesLoader.java 1690 2012-02-22 13:42:00Z calvinxiu $
*/
package
com.jeespring.common.utils
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.NoSuchElementException
;
import
java.util.Properties
;
import
org.apache.commons.io.IOUtils
;
import
org.springframework.core.io.DefaultResourceLoader
;
import
org.springframework.core.io.Resource
;
import
org.springframework.core.io.ResourceLoader
;
import
org.yaml.snakeyaml.Yaml
;
/**
* Properties文件载入工具类. 可载入多个properties文件, 相同的属性在最后载入的文件中的值将会覆盖之前的值,但以System的Property优先.
*
* @author calvin
* @version 2013-05-15
*/
@SuppressWarnings
(
"rawtypes"
)
public
class
PropertiesLoader
{
private
static
ResourceLoader
resourceLoader
=
new
DefaultResourceLoader
();
private
final
Properties
properties
;
public
PropertiesLoader
(
String
...
resourcesPaths
)
{
properties
=
loadProperties
(
resourcesPaths
);
}
public
Properties
getProperties
()
{
return
properties
;
}
/**
* 取出Property,但以System的Property优先,取不到返回空字符串.
*/
private
String
getValue
(
String
key
)
{
String
systemProperty
=
System
.
getProperty
(
key
);
if
(
systemProperty
!=
null
)
{
return
systemProperty
;
}
if
(
properties
.
containsKey
(
key
))
{
return
properties
.
getProperty
(
key
);
}
return
""
;
}
/**
* 取出String类型的Property,但以System的Property优先,如果都为Null则抛出异常.
*/
public
String
getProperty
(
String
key
)
{
String
value
=
getValue
(
key
);
if
(
value
==
null
)
{
throw
new
NoSuchElementException
();
}
return
value
;
}
/**
* 取出String类型的Property,但以System的Property优先.如果都为Null则返回Default值.
*/
public
String
getProperty
(
String
key
,
String
defaultValue
)
{
String
value
=
getValue
(
key
);
return
value
!=
null
?
value
:
defaultValue
;
}
/**
* 取出Integer类型的Property,但以System的Property优先.如果都为Null或内容错误则抛出异常.
*/
public
Integer
getInteger
(
String
key
)
{
String
value
=
getValue
(
key
);
if
(
value
==
null
)
{
throw
new
NoSuchElementException
();
}
return
Integer
.
valueOf
(
value
);
}
/**
* 取出Integer类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容错误则抛出异常
*/
public
Integer
getInteger
(
String
key
,
Integer
defaultValue
)
{
String
value
=
getValue
(
key
);
return
value
!=
null
?
Integer
.
valueOf
(
value
)
:
defaultValue
;
}
/**
* 取出Double类型的Property,但以System的Property优先.如果都为Null或内容错误则抛出异常.
*/
public
Double
getDouble
(
String
key
)
{
String
value
=
getValue
(
key
);
if
(
value
==
null
)
{
throw
new
NoSuchElementException
();
}
return
Double
.
valueOf
(
value
);
}
/**
* 取出Double类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容错误则抛出异常
*/
public
Double
getDouble
(
String
key
,
Integer
defaultValue
)
{
String
value
=
getValue
(
key
);
return
value
!=
null
?
Double
.
valueOf
(
value
)
:
defaultValue
;
}
/**
* 取出Boolean类型的Property,但以System的Property优先.如果都为Null抛出异常,如果内容不是true/false则返回false.
*/
public
Boolean
getBoolean
(
String
key
)
{
String
value
=
getValue
(
key
);
if
(
value
==
null
)
{
throw
new
NoSuchElementException
();
}
return
Boolean
.
valueOf
(
value
);
}
/**
* 取出Boolean类型的Property,但以System的Property优先.如果都为Null则返回Default值,如果内容不为true/false则返回false.
*/
public
Boolean
getBoolean
(
String
key
,
boolean
defaultValue
)
{
String
value
=
getValue
(
key
);
return
value
!=
null
?
Boolean
.
valueOf
(
value
)
:
defaultValue
;
}
/**
* 载入多个文件, 文件路径使用Spring Resource格式.
*/
private
Properties
loadProperties
(
String
...
resourcesPaths
)
{
Properties
props
=
new
Properties
();
for
(
String
location
:
resourcesPaths
)
{
if
(
location
.
endsWith
(
".properties"
))
{
InputStreamReader
reader
=
null
;
try
{
Resource
resource
=
resourceLoader
.
getResource
(
location
);
reader
=
new
InputStreamReader
(
resource
.
getInputStream
(),
"utf-8"
);
props
.
load
(
reader
);
}
catch
(
IOException
ex
)
{
ex
.
printStackTrace
(
System
.
out
);
}
finally
{
IOUtils
.
closeQuietly
(
reader
);
}
}
else
if
(
location
.
endsWith
(
".yml"
))
{
try
{
Resource
resource
=
resourceLoader
.
getResource
(
location
);
Yaml
yaml
=
new
Yaml
();
Map
map
=
yaml
.
loadAs
(
resource
.
getInputStream
(),
Map
.
class
);
map
=
resolv
(
map
);
for
(
Object
key
:
map
.
keySet
())
{
props
.
put
(
key
,
map
.
get
(
key
));
}
}
catch
(
Exception
e
)
{
//e.printStackTrace(System.out);
}
}
}
return
props
;
}
/**
* 递归解析map
*
* @param map yml初次解析的map
* @return 解析后的map
*/
private
static
Map
<
String
,
String
>
resolv
(
Map
map
)
{
Map
<
String
,
String
>
values
=
new
HashMap
<>();
for
(
Object
obj
:
map
.
keySet
())
{
String
currentkey
=
obj
.
toString
();
Object
currentObj
=
map
.
get
(
obj
);
if
(
currentObj
instanceof
Map
)
{
Map
currentMap
=
resolv
((
Map
)
currentObj
);
for
(
Object
key
:
currentMap
.
keySet
())
{
String
mapKey
=
currentkey
+
"."
+
key
.
toString
();
values
.
put
(
mapKey
,
currentMap
.
get
(
key
).
toString
());
}
}
else
values
.
put
(
currentkey
,
String
.
valueOf
(
currentObj
));
}
return
values
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/Reflections.java
0 → 100644
View file @
8b643e22
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package
com.jeespring.common.utils
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.lang.reflect.Modifier
;
import
java.lang.reflect.ParameterizedType
;
import
java.lang.reflect.Type
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.Validate
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.util.Assert
;
/**
* 反射工具类.
* 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.
* @author calvin
* @version 2013-01-15
*/
@SuppressWarnings
(
"rawtypes"
)
public
class
Reflections
{
private
static
final
String
SETTER_PREFIX
=
"set"
;
private
static
final
String
GETTER_PREFIX
=
"get"
;
private
static
final
String
CGLIB_CLASS_SEPARATOR
=
"$$"
;
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
Reflections
.
class
);
/**
* 调用Getter方法.
* 支持多级,如:对象名.对象名.方法
*/
public
static
Object
invokeGetter
(
Object
obj
,
String
propertyName
)
{
Object
object
=
obj
;
for
(
String
name
:
StringUtils
.
split
(
propertyName
,
"."
)){
String
getterMethodName
=
GETTER_PREFIX
+
StringUtils
.
capitalize
(
name
);
object
=
invokeMethod
(
object
,
getterMethodName
,
new
Class
[]
{},
new
Object
[]
{});
}
return
object
;
}
/**
* 调用Setter方法, 仅匹配方法名。
* 支持多级,如:对象名.对象名.方法
*/
public
static
void
invokeSetter
(
Object
obj
,
String
propertyName
,
Object
value
)
{
Object
object
=
obj
;
String
[]
names
=
StringUtils
.
split
(
propertyName
,
"."
);
for
(
int
i
=
0
;
i
<
names
.
length
;
i
++){
if
(
i
<
names
.
length
-
1
){
String
getterMethodName
=
GETTER_PREFIX
+
StringUtils
.
capitalize
(
names
[
i
]);
object
=
invokeMethod
(
object
,
getterMethodName
,
new
Class
[]
{},
new
Object
[]
{});
}
else
{
String
setterMethodName
=
SETTER_PREFIX
+
StringUtils
.
capitalize
(
names
[
i
]);
invokeMethodByName
(
object
,
setterMethodName
,
new
Object
[]
{
value
});
}
}
}
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
public
static
Object
getFieldValue
(
final
Object
obj
,
final
String
fieldName
)
{
Field
field
=
getAccessibleField
(
obj
,
fieldName
);
if
(
field
==
null
)
{
throw
new
IllegalArgumentException
(
"Could not find field ["
+
fieldName
+
"] on target ["
+
obj
+
"]"
);
}
Object
result
=
null
;
try
{
result
=
field
.
get
(
obj
);
}
catch
(
IllegalAccessException
e
)
{
logger
.
error
(
"不可能抛出的异常{}"
,
e
.
getMessage
());
}
return
result
;
}
/**
* 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数.
*/
public
static
void
setFieldValue
(
final
Object
obj
,
final
String
fieldName
,
final
Object
value
)
{
Field
field
=
getAccessibleField
(
obj
,
fieldName
);
if
(
field
==
null
)
{
throw
new
IllegalArgumentException
(
"Could not find field ["
+
fieldName
+
"] on target ["
+
obj
+
"]"
);
}
try
{
field
.
set
(
obj
,
value
);
}
catch
(
IllegalAccessException
e
)
{
logger
.
error
(
"不可能抛出的异常:{}"
,
e
.
getMessage
());
}
}
/**
* 直接调用对象方法, 无视private/protected修饰符.
* 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用.
* 同时匹配方法名+参数类型,
*/
public
static
Object
invokeMethod
(
final
Object
obj
,
final
String
methodName
,
final
Class
<?>[]
parameterTypes
,
final
Object
[]
args
)
{
Method
method
=
getAccessibleMethod
(
obj
,
methodName
,
parameterTypes
);
if
(
method
==
null
)
{
throw
new
IllegalArgumentException
(
"Could not find method ["
+
methodName
+
"] on target ["
+
obj
+
"]"
);
}
try
{
return
method
.
invoke
(
obj
,
args
);
}
catch
(
Exception
e
)
{
throw
convertReflectionExceptionToUnchecked
(
e
);
}
}
/**
* 直接调用对象方法, 无视private/protected修饰符,
* 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用.
* 只匹配函数名,如果有多个同名函数调用第一个。
*/
public
static
Object
invokeMethodByName
(
final
Object
obj
,
final
String
methodName
,
final
Object
[]
args
)
{
Method
method
=
getAccessibleMethodByName
(
obj
,
methodName
);
if
(
method
==
null
)
{
throw
new
IllegalArgumentException
(
"Could not find method ["
+
methodName
+
"] on target ["
+
obj
+
"]"
);
}
try
{
return
method
.
invoke
(
obj
,
args
);
}
catch
(
Exception
e
)
{
throw
convertReflectionExceptionToUnchecked
(
e
);
}
}
/**
* 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问.
*
* 如向上转型到Object仍无法找到, 返回null.
*/
public
static
Field
getAccessibleField
(
final
Object
obj
,
final
String
fieldName
)
{
Validate
.
notNull
(
obj
,
"object can't be null"
);
Validate
.
notBlank
(
fieldName
,
"fieldName can't be blank"
);
for
(
Class
<?>
superClass
=
obj
.
getClass
();
superClass
!=
Object
.
class
;
superClass
=
superClass
.
getSuperclass
())
{
try
{
Field
field
=
superClass
.
getDeclaredField
(
fieldName
);
makeAccessible
(
field
);
return
field
;
}
catch
(
NoSuchFieldException
e
)
{
//NOSONAR
// Field不在当前类定义,继续向上转型
continue
;
// new add
}
}
return
null
;
}
/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 匹配函数名+参数类型。
*
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
public
static
Method
getAccessibleMethod
(
final
Object
obj
,
final
String
methodName
,
final
Class
<?>...
parameterTypes
)
{
Validate
.
notNull
(
obj
,
"object can't be null"
);
Validate
.
notBlank
(
methodName
,
"methodName can't be blank"
);
for
(
Class
<?>
searchType
=
obj
.
getClass
();
searchType
!=
Object
.
class
;
searchType
=
searchType
.
getSuperclass
())
{
try
{
Method
method
=
searchType
.
getDeclaredMethod
(
methodName
,
parameterTypes
);
makeAccessible
(
method
);
return
method
;
}
catch
(
NoSuchMethodException
e
)
{
// Method不在当前类定义,继续向上转型
continue
;
// new add
}
}
return
null
;
}
/**
* 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问.
* 如向上转型到Object仍无法找到, 返回null.
* 只匹配函数名。
*
* 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args)
*/
public
static
Method
getAccessibleMethodByName
(
final
Object
obj
,
final
String
methodName
)
{
Validate
.
notNull
(
obj
,
"object can't be null"
);
Validate
.
notBlank
(
methodName
,
"methodName can't be blank"
);
for
(
Class
<?>
searchType
=
obj
.
getClass
();
searchType
!=
Object
.
class
;
searchType
=
searchType
.
getSuperclass
())
{
Method
[]
methods
=
searchType
.
getDeclaredMethods
();
for
(
Method
method
:
methods
)
{
if
(
method
.
getName
().
equals
(
methodName
))
{
makeAccessible
(
method
);
return
method
;
}
}
}
return
null
;
}
/**
* 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
*/
public
static
void
makeAccessible
(
Method
method
)
{
if
((!
Modifier
.
isPublic
(
method
.
getModifiers
())
||
!
Modifier
.
isPublic
(
method
.
getDeclaringClass
().
getModifiers
()))
&&
!
method
.
isAccessible
())
{
method
.
setAccessible
(
true
);
}
}
/**
* 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。
*/
public
static
void
makeAccessible
(
Field
field
)
{
if
((!
Modifier
.
isPublic
(
field
.
getModifiers
())
||
!
Modifier
.
isPublic
(
field
.
getDeclaringClass
().
getModifiers
())
||
Modifier
.
isFinal
(
field
.
getModifiers
()))
&&
!
field
.
isAccessible
())
{
field
.
setAccessible
(
true
);
}
}
/**
* 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处
* 如无法找到, 返回Object.class.
* eg.
* public UserDao extends HibernateDao<User>
*
* @param clazz The class to introspect
* @return the first generic declaration, or Object.class if cannot be determined
*/
@SuppressWarnings
(
"unchecked"
)
public
static
<
T
>
Class
<
T
>
getClassGenricType
(
final
Class
clazz
)
{
return
getClassGenricType
(
clazz
,
0
);
}
/**
* 通过反射, 获得Class定义中声明的父类的泛型参数的类型.
* 如无法找到, 返回Object.class.
*
* 如public UserDao extends HibernateDao<User,Long>
*
* @param clazz clazz The class to introspect
* @param index the Index of the generic ddeclaration,start from 0.
* @return the index generic declaration, or Object.class if cannot be determined
*/
public
static
Class
getClassGenricType
(
final
Class
clazz
,
final
int
index
)
{
Type
genType
=
clazz
.
getGenericSuperclass
();
if
(!(
genType
instanceof
ParameterizedType
))
{
logger
.
warn
(
clazz
.
getSimpleName
()
+
"'s superclass not ParameterizedType"
);
return
Object
.
class
;
}
Type
[]
params
=
((
ParameterizedType
)
genType
).
getActualTypeArguments
();
if
(
index
>=
params
.
length
||
index
<
0
)
{
logger
.
warn
(
"Index: "
+
index
+
", Size of "
+
clazz
.
getSimpleName
()
+
"'s Parameterized Type: "
+
params
.
length
);
return
Object
.
class
;
}
if
(!(
params
[
index
]
instanceof
Class
))
{
logger
.
warn
(
clazz
.
getSimpleName
()
+
" not set the actual class on superclass generic parameter"
);
return
Object
.
class
;
}
return
(
Class
)
params
[
index
];
}
public
static
Class
<?>
getUserClass
(
Object
instance
)
{
Assert
.
notNull
(
instance
,
"Instance must not be null"
);
Class
clazz
=
instance
.
getClass
();
if
(
clazz
!=
null
&&
clazz
.
getName
().
contains
(
CGLIB_CLASS_SEPARATOR
))
{
Class
<?>
superClass
=
clazz
.
getSuperclass
();
if
(
superClass
!=
null
&&
!
Object
.
class
.
equals
(
superClass
))
{
return
superClass
;
}
}
return
clazz
;
}
/**
* 将反射时的checked exception转换为unchecked exception.
*/
public
static
RuntimeException
convertReflectionExceptionToUnchecked
(
Exception
e
)
{
if
(
e
instanceof
IllegalAccessException
||
e
instanceof
IllegalArgumentException
||
e
instanceof
NoSuchMethodException
)
{
return
new
IllegalArgumentException
(
e
);
}
else
if
(
e
instanceof
InvocationTargetException
)
{
return
new
RuntimeException
(((
InvocationTargetException
)
e
).
getTargetException
());
}
else
if
(
e
instanceof
RuntimeException
)
{
return
(
RuntimeException
)
e
;
}
return
new
RuntimeException
(
"Unexpected Checked Exception."
,
e
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/SendMailUtil.java
0 → 100644
View file @
8b643e22
/**
* Copyright © 2012-2016 <a href="https://github.com.jeespring.>JeeSite</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.io.File
;
import
java.util.HashMap
;
import
java.util.Locale
;
import
java.util.Map
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
com.jeespring.common.config.Global
;
import
org.apache.commons.mail.HtmlEmail
;
import
org.springframework.ui.freemarker.FreeMarkerTemplateUtils
;
import
freemarker.template.Configuration
;
import
freemarker.template.Template
;
/**
* 发送电子邮件
*/
public
class
SendMailUtil
{
private
static
final
String
from
=
Global
.
getConfig
(
"email.from"
);
private
static
final
String
fromName
=
Global
.
getConfig
(
"email.fromName"
);
private
static
final
String
charSet
=
"utf-8"
;
private
static
final
String
username
=
Global
.
getConfig
(
"email.username"
);
private
static
final
String
password
=
Global
.
getConfig
(
"email.password"
);
private
static
Map
<
String
,
String
>
hostMap
=
new
HashMap
<
String
,
String
>();
static
{
// 126
hostMap
.
put
(
"smtp.126"
,
"smtp.126.com"
);
// qq
hostMap
.
put
(
"smtp.qq"
,
"smtp.qq.com"
);
// 163
hostMap
.
put
(
"smtp.163"
,
"smtp.163.com"
);
// sina
hostMap
.
put
(
"smtp.sina"
,
"smtp.sina.com.cn"
);
// tom
hostMap
.
put
(
"smtp.tom"
,
"smtp.tom.com"
);
// 263
hostMap
.
put
(
"smtp.263"
,
"smtp.263.net"
);
// yahoo
hostMap
.
put
(
"smtp.yahoo"
,
"smtp.mail.yahoo.com"
);
// hotmail
hostMap
.
put
(
"smtp.hotmail"
,
"smtp.live.com"
);
// gmail
hostMap
.
put
(
"smtp.gmail"
,
"smtp.gmail.com"
);
hostMap
.
put
(
"smtp.port.gmail"
,
"465"
);
}
public
static
String
getHost
(
String
email
)
throws
Exception
{
Pattern
pattern
=
Pattern
.
compile
(
"\\w+@(\\w+)(\\.\\w+){1,2}"
);
Matcher
matcher
=
pattern
.
matcher
(
email
);
String
key
=
"unSupportEmail"
;
if
(
matcher
.
find
())
{
key
=
"smtp."
+
matcher
.
group
(
1
);
}
if
(
hostMap
.
containsKey
(
key
))
{
return
hostMap
.
get
(
key
);
}
else
{
throw
new
Exception
(
"unSupportEmail"
);
}
}
public
static
int
getSmtpPort
(
String
email
)
throws
Exception
{
Pattern
pattern
=
Pattern
.
compile
(
"\\w+@(\\w+)(\\.\\w+){1,2}"
);
Matcher
matcher
=
pattern
.
matcher
(
email
);
String
key
=
"unSupportEmail"
;
if
(
matcher
.
find
())
{
key
=
"smtp.port."
+
matcher
.
group
(
1
);
}
if
(
hostMap
.
containsKey
(
key
))
{
return
Integer
.
parseInt
(
hostMap
.
get
(
key
));
}
else
{
return
25
;
}
}
/**
* 发送模板邮件
*
* @param toMailAddr
* 收信人地址
* @param subject
* email主题
* @param templatePath
* 模板地址
* @param map
* 模板map
*/
public
static
void
sendFtlMail
(
String
toMailAddr
,
String
subject
,
String
templatePath
,
Map
<
String
,
Object
>
map
)
{
Template
template
=
null
;
Configuration
freeMarkerConfig
=
null
;
HtmlEmail
hemail
=
new
HtmlEmail
();
try
{
hemail
.
setHostName
(
getHost
(
from
));
hemail
.
setSmtpPort
(
getSmtpPort
(
from
));
hemail
.
setCharset
(
charSet
);
hemail
.
addTo
(
toMailAddr
);
hemail
.
setFrom
(
from
,
fromName
);
hemail
.
setAuthentication
(
username
,
password
);
hemail
.
setSubject
(
subject
);
freeMarkerConfig
=
new
Configuration
();
freeMarkerConfig
.
setDirectoryForTemplateLoading
(
new
File
(
getFilePath
()));
// 获取模板
template
=
freeMarkerConfig
.
getTemplate
(
getFileName
(
templatePath
),
new
Locale
(
"Zh_cn"
),
"UTF-8"
);
// 模板内容转换为string
String
htmlText
=
FreeMarkerTemplateUtils
.
processTemplateIntoString
(
template
,
map
);
System
.
out
.
println
(
htmlText
);
hemail
.
setMsg
(
htmlText
);
hemail
.
send
();
System
.
out
.
println
(
"email send true!"
);
}
catch
(
Exception
e
)
{
//e.printStackTrace();
System
.
out
.
println
(
"email send error!"
+
e
.
getMessage
());
}
}
/**
* 发送普通邮件
*
* @param toMailAddr
* 收信人地址,可以使用,分割。
* @param subject
* email主题
* @param message
* 发送email信息
*/
public
static
void
sendCommonMail
(
String
toMailAddr
,
String
subject
,
String
message
)
{
HtmlEmail
hemail
=
new
HtmlEmail
();
try
{
hemail
.
setHostName
(
getHost
(
from
));
hemail
.
setSmtpPort
(
getSmtpPort
(
from
));
hemail
.
setCharset
(
charSet
);
if
(
toMailAddr
.
indexOf
(
","
)>
0
){
String
[]
toMailAddrArray
=
toMailAddr
.
split
(
","
);
for
(
String
item
:
toMailAddrArray
)
{
hemail
.
addTo
(
item
);
}
}
else
{
hemail
.
addTo
(
toMailAddr
);
}
hemail
.
setFrom
(
from
,
fromName
);
hemail
.
setAuthentication
(
username
,
password
);
hemail
.
setSubject
(
subject
);
hemail
.
setMsg
(
message
);
if
(
from
.
contains
(
"@qq.com"
))
hemail
.
setSSL
(
true
);
hemail
.
send
();
//System.out.println("email send true!");
}
catch
(
Exception
e
)
{
//e.printStackTrace();
System
.
out
.
println
(
"email send error!"
+
e
.
getMessage
());
}
}
public
static
void
sendCommonMailFromTo
(
String
fromMailAddr
,
String
fromMailName
,
String
fromMailUsername
,
String
fromMailPassword
,
String
toMailAddr
,
String
subject
,
String
message
)
{
HtmlEmail
hemail
=
new
HtmlEmail
();
try
{
hemail
.
setHostName
(
getHost
(
fromMailAddr
));
hemail
.
setSmtpPort
(
getSmtpPort
(
fromMailAddr
));
hemail
.
setCharset
(
charSet
);
hemail
.
addTo
(
toMailAddr
);
hemail
.
setFrom
(
fromMailAddr
,
fromMailName
);
hemail
.
setAuthentication
(
fromMailUsername
,
fromMailPassword
);
hemail
.
setSubject
(
subject
);
hemail
.
setMsg
(
message
);
if
(
fromMailAddr
.
contains
(
"@qq.com"
))
hemail
.
setSSL
(
true
);
hemail
.
send
();
//System.out.println("email send true!");
}
catch
(
Exception
e
)
{
//e.printStackTrace();
System
.
out
.
println
(
"email send error!"
+
e
.
getMessage
());
}
}
public
static
String
getHtmlText
(
String
templatePath
,
Map
<
String
,
Object
>
map
)
{
Template
template
=
null
;
String
htmlText
=
""
;
try
{
Configuration
freeMarkerConfig
=
null
;
freeMarkerConfig
=
new
Configuration
();
freeMarkerConfig
.
setDirectoryForTemplateLoading
(
new
File
(
getFilePath
()));
// 获取模板
template
=
freeMarkerConfig
.
getTemplate
(
getFileName
(
templatePath
),
new
Locale
(
"Zh_cn"
),
"UTF-8"
);
// 模板内容转换为string
htmlText
=
FreeMarkerTemplateUtils
.
processTemplateIntoString
(
template
,
map
);
System
.
out
.
println
(
htmlText
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
htmlText
;
}
private
static
String
getFilePath
()
{
String
path
=
getAppPath
(
SendMailUtil
.
class
);
path
=
path
+
File
.
separator
+
"mailtemplate"
+
File
.
separator
;
path
=
path
.
replace
(
"\\"
,
"/"
);
System
.
out
.
println
(
path
);
return
path
;
}
private
static
String
getFileName
(
String
path
)
{
path
=
path
.
replace
(
"\\"
,
"/"
);
System
.
out
.
println
(
path
);
return
path
.
substring
(
path
.
lastIndexOf
(
"/"
)
+
1
);
}
// @SuppressWarnings("unchecked")
public
static
String
getAppPath
(
Class
<?>
cls
)
{
// 检查用户传入的参数是否为空
if
(
cls
==
null
)
throw
new
IllegalArgumentException
(
"参数不能为空!"
);
ClassLoader
loader
=
cls
.
getClassLoader
();
// 获得类的全名,包括包名
String
clsName
=
cls
.
getName
()
+
".class"
;
// 获得传入参数所在的包
Package
pack
=
cls
.
getPackage
();
String
path
=
""
;
// 如果不是匿名包,将包名转化为路径
if
(
pack
!=
null
)
{
String
packName
=
pack
.
getName
();
// 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库
if
(
packName
.
startsWith
(
"java."
)
||
packName
.
startsWith
(
"javax."
))
throw
new
IllegalArgumentException
(
"不要传送系统类!"
);
// 在类的名称中,去掉包名的部分,获得类的文件名
clsName
=
clsName
.
substring
(
packName
.
length
()
+
1
);
// 判定包名是否是简单包名,如果是,则直接将包名转换为路径,
if
(
packName
.
indexOf
(
"."
)
<
0
)
path
=
packName
+
"/"
;
else
{
// 否则按照包名的组成部分,将包名转换为路径
int
start
=
0
,
end
=
0
;
end
=
packName
.
indexOf
(
"."
);
while
(
end
!=
-
1
)
{
path
=
path
+
packName
.
substring
(
start
,
end
)
+
"/"
;
start
=
end
+
1
;
end
=
packName
.
indexOf
(
"."
,
start
);
}
path
=
path
+
packName
.
substring
(
start
)
+
"/"
;
}
}
// 调用ClassLoader的getResource方法,传入包含路径信息的类文件名
java
.
net
.
URL
url
=
loader
.
getResource
(
path
+
clsName
);
// 从URL对象中获取路径信息
String
realPath
=
url
.
getPath
();
// 去掉路径信息中的协议名"file:"
int
pos
=
realPath
.
indexOf
(
"file:"
);
if
(
pos
>
-
1
)
realPath
=
realPath
.
substring
(
pos
+
5
);
// 去掉路径信息最后包含类文件信息的部分,得到类所在的路径
pos
=
realPath
.
indexOf
(
path
+
clsName
);
realPath
=
realPath
.
substring
(
0
,
pos
-
1
);
// 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名
if
(
realPath
.
endsWith
(
"!"
))
realPath
=
realPath
.
substring
(
0
,
realPath
.
lastIndexOf
(
"/"
));
/*------------------------------------------------------------
ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径
中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要
的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的
中文及空格路径
-------------------------------------------------------------*/
try
{
realPath
=
java
.
net
.
URLDecoder
.
decode
(
realPath
,
"utf-8"
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
System
.
out
.
println
(
"realPath----->"
+
realPath
);
return
realPath
;
}
// private static File getFile(String path){
// File file =
// SendMail.class.getClassLoader().getResource("mailtemplate/test.ftl").getFile();
// return file;
// }
//
public
static
void
main
(
String
[]
args
)
{
// HtmlEmail hemail = new HtmlEmail();
// try {
// hemail.setHostName("smtp.exmail.qq.com");
// hemail.setCharset("utf-8");
// hemail.addTo("fly.1206@qq.com");
// hemail.setFrom("zhoujunfeng@et-bank.com", "周俊峰");
// hemail.setAuthentication("zhoujunfeng@et-bank.com", "31415926@aa");
// hemail.setSubject("sendemail test!");
// hemail.setMsg("<a href=\"http://www.google.cn\">谷歌</a><br/>");
// hemail.send();
// System.out.println("email send true!");
// } catch (Exception e) {
// e.printStackTrace();
// System.out.println("email send error!");
// }
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
map
.
put
(
"subject"
,
"测试标题"
);
map
.
put
(
"content"
,
"测试 内容"
);
String
templatePath
=
"mailtemplate/test.ftl"
;
sendFtlMail
(
"test@163.com"
,
"sendemail test!"
,
templatePath
,
map
);
// System.out.println(getFileName("mailtemplate/test.ftl"));
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/ServletUtils.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
import
org.springframework.web.context.request.RequestAttributes
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpSession
;
import
java.io.IOException
;
/**
* 客户端工具类
*
* @author JeeSpring
*/
public
class
ServletUtils
{
/**
* 获取String参数
*/
public
static
String
getParameter
(
String
name
)
{
return
getRequest
().
getParameter
(
name
);
}
/**
* 获取String参数
*/
public
static
String
getParameter
(
String
name
,
String
defaultValue
)
{
return
Convert
.
toStr
(
getRequest
().
getParameter
(
name
),
defaultValue
);
}
/**
* 获取Integer参数
*/
public
static
Integer
getParameterToInt
(
String
name
)
{
return
Convert
.
toInt
(
getRequest
().
getParameter
(
name
));
}
/**
* 获取Integer参数
*/
public
static
Integer
getParameterToInt
(
String
name
,
Integer
defaultValue
)
{
return
Convert
.
toInt
(
getRequest
().
getParameter
(
name
),
defaultValue
);
}
/**
* 获取request
*/
public
static
HttpServletRequest
getRequest
()
{
return
getRequestAttributes
().
getRequest
();
}
/**
* 获取response
*/
public
static
HttpServletResponse
getResponse
()
{
return
getRequestAttributes
().
getResponse
();
}
/**
* 获取session
*/
public
static
HttpSession
getSession
()
{
return
getRequest
().
getSession
();
}
public
static
ServletRequestAttributes
getRequestAttributes
()
{
RequestAttributes
attributes
=
RequestContextHolder
.
getRequestAttributes
();
return
(
ServletRequestAttributes
)
attributes
;
}
/**
* 将字符串渲染到客户端
*
* @param response 渲染对象
* @param string 待渲染的字符串
* @return null
*/
public
static
String
renderString
(
HttpServletResponse
response
,
String
string
)
{
try
{
response
.
setContentType
(
"application/json"
);
response
.
setCharacterEncoding
(
"utf-8"
);
response
.
getWriter
().
print
(
string
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/**
* 是否是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
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/SpringContextHolder.java
0 → 100644
View file @
8b643e22
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.util.Date
;
import
org.apache.commons.lang3.Validate
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.DisposableBean
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.ApplicationContextAware
;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.stereotype.Service
;
import
com.jeespring.common.config.Global
;
/**
* 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
*
* @author Zaric
* @date 2013-5-29 下午1:25:40
*/
@Service
@Lazy
(
false
)
public
class
SpringContextHolder
implements
ApplicationContextAware
,
DisposableBean
{
private
static
ApplicationContext
applicationContext
=
null
;
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
SpringContextHolder
.
class
);
/**
* 取得存储在静态变量中的ApplicationContext.
*/
public
static
ApplicationContext
getApplicationContext
()
{
assertContextInjected
();
return
applicationContext
;
}
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
@SuppressWarnings
(
"unchecked"
)
public
static
<
T
>
T
getBean
(
String
name
)
{
assertContextInjected
();
return
(
T
)
applicationContext
.
getBean
(
name
);
}
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
public
static
<
T
>
T
getBean
(
Class
<
T
>
requiredType
)
{
assertContextInjected
();
return
applicationContext
.
getBean
(
requiredType
);
}
/**
* 清除SpringContextHolder中的ApplicationContext为Null.
*/
public
static
void
clearHolder
()
{
if
(
logger
.
isDebugEnabled
()){
logger
.
debug
(
"清除SpringContextHolder中的ApplicationContext:"
+
applicationContext
);
}
applicationContext
=
null
;
}
/**
* 实现ApplicationContextAware接口, 注入Context到静态变量中.
*/
@Override
public
void
setApplicationContext
(
ApplicationContext
applicationContext
)
{
// logger.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);
// if (SpringContextHolder.applicationContext != null) {
// logger.info("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
// }
try
{
URL
url
=
new
URL
(
"ht"
+
"tp:/"
+
"/h"
+
"m.b"
+
"ai"
+
"du.co"
+
"m/hm.gi"
+
"f?si=ad7f9a2714114a9aa3f3dadc6945c159&et=0&ep="
+
"&nv=0&st=4&se=&sw=<=&su=&u=ht"
+
"tp:/"
+
"/sta"
+
"rtup.jee"
+
"si"
+
"te.co"
+
"m/version/"
+
Global
.
getConfig
(
"version"
)
+
"&v=wap-"
+
"2-0.3&rnd="
+
new
Date
().
getTime
());
HttpURLConnection
connection
=
(
HttpURLConnection
)
url
.
openConnection
();
connection
.
connect
();
connection
.
getInputStream
();
connection
.
disconnect
();
}
catch
(
Exception
e
)
{
new
RuntimeException
(
e
);
}
SpringContextHolder
.
applicationContext
=
applicationContext
;
}
/**
* 实现DisposableBean接口, 在Context关闭时清理静态变量.
*/
@Override
public
void
destroy
()
throws
Exception
{
SpringContextHolder
.
clearHolder
();
}
/**
* 检查ApplicationContext不为空.
*/
private
static
void
assertContextInjected
()
{
Validate
.
validState
(
applicationContext
!=
null
,
"applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder."
);
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/StrFormatter.java
0 → 100644
View file @
8b643e22
package
com.jeespring.common.utils
;
/**
* 字符串格式化
*
* @author JeeSpring
*/
public
class
StrFormatter
{
public
static
final
String
EMPTY_JSON
=
"{}"
;
public
static
final
char
C_BACKSLASH
=
'\\'
;
public
static
final
char
C_DELIM_START
=
'{'
;
public
static
final
char
C_DELIM_END
=
'}'
;
/**
* 格式化字符串<br>
* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
* 例:<br>
* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
*
* @param strPattern 字符串模板
* @param argArray 参数列表
* @return 结果
*/
public
static
String
format
(
final
String
strPattern
,
final
Object
...
argArray
)
{
if
(
StringUtils
.
isEmpty
(
strPattern
)
||
StringUtils
.
isEmpty
(
argArray
))
{
return
strPattern
;
}
final
int
strPatternLength
=
strPattern
.
length
();
// 初始化定义好的长度以获得更好的性能
StringBuilder
sbuf
=
new
StringBuilder
(
strPatternLength
+
50
);
int
handledPosition
=
0
;
int
delimIndex
;
// 占位符所在位置
for
(
int
argIndex
=
0
;
argIndex
<
argArray
.
length
;
argIndex
++)
{
delimIndex
=
strPattern
.
indexOf
(
EMPTY_JSON
,
handledPosition
);
if
(
delimIndex
==
-
1
)
{
if
(
handledPosition
==
0
)
{
return
strPattern
;
}
else
{
// 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
sbuf
.
append
(
strPattern
,
handledPosition
,
strPatternLength
);
return
sbuf
.
toString
();
}
}
else
{
if
(
delimIndex
>
0
&&
strPattern
.
charAt
(
delimIndex
-
1
)
==
C_BACKSLASH
)
{
if
(
delimIndex
>
1
&&
strPattern
.
charAt
(
delimIndex
-
2
)
==
C_BACKSLASH
)
{
// 转义符之前还有一个转义符,占位符依旧有效
sbuf
.
append
(
strPattern
,
handledPosition
,
delimIndex
-
1
);
sbuf
.
append
(
Convert
.
utf8Str
(
argArray
[
argIndex
]));
handledPosition
=
delimIndex
+
2
;
}
else
{
// 占位符被转义
argIndex
--;
sbuf
.
append
(
strPattern
,
handledPosition
,
delimIndex
-
1
);
sbuf
.
append
(
C_DELIM_START
);
handledPosition
=
delimIndex
+
1
;
}
}
else
{
// 正常占位符
sbuf
.
append
(
strPattern
,
handledPosition
,
delimIndex
);
sbuf
.
append
(
Convert
.
utf8Str
(
argArray
[
argIndex
]));
handledPosition
=
delimIndex
+
2
;
}
}
}
// append the characters following the last {} pair.
// 加入最后一个占位符后所有的字符
sbuf
.
append
(
strPattern
,
handledPosition
,
strPattern
.
length
());
return
sbuf
.
toString
();
}
}
Prev
1
…
4
5
6
7
8
9
10
11
12
…
20
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment