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
JeeSpringCloudV3.0
Commits
d5ba54ba
Commit
d5ba54ba
authored
Nov 12, 2018
by
Huang
Browse files
no commit message
parent
da9d3b1b
Changes
399
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
20 of 399+
files are displayed.
Plain diff
Email patch
JeeSpringCloud/src/main/java/com/jeespring/common/utils/ObjectUtils.java
0 → 100644
View file @
d5ba54ba
/**
* 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 @
d5ba54ba
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
;
}
@Override
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
();
}
@Override
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
();
}
@Override
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
);
}
@Override
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
;
}
@Override
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 @
d5ba54ba
/**
* 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 @
d5ba54ba
/**
* 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 @
d5ba54ba
/**
* Copyright © 2012-2016 <a href="https://gitee.com/JeeHuangBingGui/jeeSpringCloud">JeeSpring</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 @
d5ba54ba
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 @
d5ba54ba
/**
* 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 @
d5ba54ba
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
();
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/StreamUtils.java
0 → 100644
View file @
d5ba54ba
/**
* 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.File
;
import
java.io.FileInputStream
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.UnsupportedEncodingException
;
/**
*
* @author Andy.Chen
* @mail Chenjunjun.ZJ@gmail.com
*
*/
public
class
StreamUtils
{
final
static
int
BUFFER_SIZE
=
4096
;
/**
* 将InputStream转换成String
*
* @param in
* InputStream
* @return String
* @throws Exception
*
*/
public
static
String
InputStreamTOString
(
InputStream
in
)
{
ByteArrayOutputStream
outStream
=
new
ByteArrayOutputStream
();
byte
[]
data
=
new
byte
[
BUFFER_SIZE
];
String
string
=
null
;
int
count
=
0
;
try
{
while
((
count
=
in
.
read
(
data
,
0
,
BUFFER_SIZE
))
!=
-
1
)
{
outStream
.
write
(
data
,
0
,
count
);
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
data
=
null
;
try
{
string
=
new
String
(
outStream
.
toByteArray
(),
"UTF-8"
);
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
return
string
;
}
/**
* 将InputStream转换成某种字符编码的String
*
* @param in
* @param encoding
* @return
* @throws Exception
*/
public
static
String
InputStreamTOString
(
InputStream
in
,
String
encoding
)
{
String
string
=
null
;
ByteArrayOutputStream
outStream
=
new
ByteArrayOutputStream
();
byte
[]
data
=
new
byte
[
BUFFER_SIZE
];
int
count
=
-
1
;
try
{
while
((
count
=
in
.
read
(
data
,
0
,
BUFFER_SIZE
))
!=
-
1
)
{
outStream
.
write
(
data
,
0
,
count
);
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
data
=
null
;
try
{
string
=
new
String
(
outStream
.
toByteArray
(),
encoding
);
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
return
string
;
}
/**
* 将String转换成InputStream
*
* @param in
* @return
* @throws Exception
*/
public
static
InputStream
StringTOInputStream
(
String
in
)
throws
Exception
{
ByteArrayInputStream
is
=
new
ByteArrayInputStream
(
in
.
getBytes
(
"UTF-8"
));
return
is
;
}
/**
* 将String转换成InputStream
*
* @param in
* @return
* @throws Exception
*/
public
static
byte
[]
StringTObyte
(
String
in
)
{
byte
[]
bytes
=
null
;
try
{
bytes
=
InputStreamTOByte
(
StringTOInputStream
(
in
));
}
catch
(
IOException
e
)
{
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
bytes
;
}
/**
* 将InputStream转换成byte数组
*
* @param in
* InputStream
* @return byte[]
* @throws IOException
*/
public
static
byte
[]
InputStreamTOByte
(
InputStream
in
)
throws
IOException
{
ByteArrayOutputStream
outStream
=
new
ByteArrayOutputStream
();
byte
[]
data
=
new
byte
[
BUFFER_SIZE
];
int
count
=
-
1
;
while
((
count
=
in
.
read
(
data
,
0
,
BUFFER_SIZE
))
!=
-
1
)
{
outStream
.
write
(
data
,
0
,
count
);
}
data
=
null
;
return
outStream
.
toByteArray
();
}
/**
* 将byte数组转换成InputStream
*
* @param in
* @return
* @throws Exception
*/
public
static
InputStream
byteTOInputStream
(
byte
[]
in
)
throws
Exception
{
ByteArrayInputStream
is
=
new
ByteArrayInputStream
(
in
);
return
is
;
}
/**
* 将byte数组转换成String
*
* @param in
* @return
* @throws Exception
*/
public
static
String
byteTOString
(
byte
[]
in
)
{
String
result
=
null
;
InputStream
is
=
null
;
try
{
is
=
byteTOInputStream
(
in
);
result
=
InputStreamTOString
(
is
,
"UTF-8"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
result
;
}
/**
* 将byte数组转换成String
*
* @param in
* @return
* @throws Exception
*/
public
static
String
getString
(
String
in
)
{
String
is
=
null
;
try
{
is
=
byteTOString
(
StringTObyte
(
in
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
is
;
}
// InputStream 转换成byte[]
public
byte
[]
getBytes
(
InputStream
is
)
throws
IOException
{
ByteArrayOutputStream
baos
=
new
ByteArrayOutputStream
();
byte
[]
b
=
new
byte
[
BUFFER_SIZE
];
int
len
=
0
;
while
((
len
=
is
.
read
(
b
,
0
,
BUFFER_SIZE
))
!=
-
1
)
{
baos
.
write
(
b
,
0
,
len
);
}
baos
.
flush
();
byte
[]
bytes
=
baos
.
toByteArray
();
System
.
out
.
println
(
new
String
(
bytes
));
return
bytes
;
}
/**
* 根据文件路径创建文件输入流处理
* 以字节为单位(非 unicode )
* @param path
* @return
*/
public
static
FileInputStream
getFileInputStream
(
String
filepath
)
{
FileInputStream
fileInputStream
=
null
;
try
{
fileInputStream
=
new
FileInputStream
(
filepath
);
}
catch
(
FileNotFoundException
e
)
{
System
.
out
.
print
(
"错误信息:文件不存在"
);
e
.
printStackTrace
();
}
return
fileInputStream
;
}
/**
* 根据文件对象创建文件输入流处理
* 以字节为单位(非 unicode )
* @param path
* @return
*/
public
static
FileInputStream
getFileInputStream
(
File
file
)
{
FileInputStream
fileInputStream
=
null
;
try
{
fileInputStream
=
new
FileInputStream
(
file
);
}
catch
(
FileNotFoundException
e
)
{
System
.
out
.
print
(
"错误信息:文件不存在"
);
e
.
printStackTrace
();
}
return
fileInputStream
;
}
/**
* 根据文件对象创建文件输出流处理
* 以字节为单位(非 unicode )
* @param file
* @param append true:文件以追加方式打开,false:则覆盖原文件的内容
* @return
*/
public
static
FileOutputStream
getFileOutputStream
(
File
file
,
boolean
append
)
{
FileOutputStream
fileOutputStream
=
null
;
try
{
fileOutputStream
=
new
FileOutputStream
(
file
,
append
);
}
catch
(
FileNotFoundException
e
)
{
System
.
out
.
print
(
"错误信息:文件不存在"
);
e
.
printStackTrace
();
}
return
fileOutputStream
;
}
/**
* 根据文件路径创建文件输出流处理
* 以字节为单位(非 unicode )
* @param path
* @param append true:文件以追加方式打开,false:则覆盖原文件的内容
* @return
*/
public
static
FileOutputStream
getFileOutputStream
(
String
filepath
,
boolean
append
)
{
FileOutputStream
fileOutputStream
=
null
;
try
{
fileOutputStream
=
new
FileOutputStream
(
filepath
,
append
);
}
catch
(
FileNotFoundException
e
)
{
System
.
out
.
print
(
"错误信息:文件不存在"
);
e
.
printStackTrace
();
}
return
fileOutputStream
;
}
public
static
File
getFile
(
String
filepath
)
{
return
new
File
(
filepath
);
}
public
static
ByteArrayOutputStream
getByteArrayOutputStream
()
{
return
new
ByteArrayOutputStream
();
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/StringUtils.java
0 → 100644
View file @
d5ba54ba
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.io.UnsupportedEncodingException
;
import
java.util.List
;
import
java.util.Locale
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
javax.servlet.http.HttpServletRequest
;
import
org.apache.commons.lang3.BooleanUtils
;
import
org.apache.commons.lang3.StringEscapeUtils
;
import
org.apache.commons.lang3.text.StrBuilder
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
org.springframework.web.servlet.LocaleResolver
;
import
com.google.common.collect.Lists
;
/**
* 字符串工具类, 继承org.apache.commons.lang3.StringUtils类
* @author 黄炳桂 516821420@qq.com
* @version 2013-05-22
*/
public
class
StringUtils
extends
org
.
apache
.
commons
.
lang3
.
StringUtils
{
private
static
final
char
SEPARATOR
=
'_'
;
private
static
final
String
CHARSET_NAME
=
"UTF-8"
;
/** 空字符串 */
private
static
final
String
NULLSTR
=
""
;
/**
* 转换为字节数组
* @param str
* @return
*/
public
static
byte
[]
getBytes
(
String
str
){
if
(
str
!=
null
){
try
{
return
str
.
getBytes
(
CHARSET_NAME
);
}
catch
(
UnsupportedEncodingException
e
)
{
return
null
;
}
}
else
{
return
null
;
}
}
/**
* 转换为Boolean类型
* 'true', 'on', 'y', 't', 'yes' or '1' (case insensitive) will return true. Otherwise, false is returned.
*/
public
static
Boolean
toBoolean
(
final
Object
val
){
if
(
val
==
null
){
return
false
;
}
return
BooleanUtils
.
toBoolean
(
val
.
toString
())
||
"1"
.
equals
(
val
.
toString
());
}
/**
* 转换为字节数组
* @param str
* @return
*/
public
static
String
toString
(
byte
[]
bytes
){
try
{
return
new
String
(
bytes
,
CHARSET_NAME
);
}
catch
(
UnsupportedEncodingException
e
)
{
return
EMPTY
;
}
}
/**
* 如果对象为空,则使用defaultVal值
* see: ObjectUtils.toString(obj, defaultVal)
* @param obj
* @param defaultVal
* @return
*/
public
static
String
toString
(
final
Object
obj
,
final
String
defaultVal
)
{
return
obj
==
null
?
defaultVal
:
obj
.
toString
();
}
/**
* 是否包含字符串
* @param str 验证字符串
* @param strs 字符串组
* @return 包含返回true
*/
public
static
boolean
inString
(
String
str
,
String
...
strs
){
if
(
str
!=
null
){
for
(
String
s
:
strs
){
if
(
str
.
equals
(
trim
(
s
))){
return
true
;
}
}
}
return
false
;
}
/**
* 替换掉HTML标签方法
*/
public
static
String
replaceHtml
(
String
html
)
{
if
(
isBlank
(
html
)){
return
""
;
}
String
regEx
=
"<.+?>"
;
Pattern
p
=
Pattern
.
compile
(
regEx
);
Matcher
m
=
p
.
matcher
(
html
);
String
s
=
m
.
replaceAll
(
""
);
return
s
;
}
/**
* 替换为手机识别的HTML,去掉样式及属性,保留回车。
* @param html
* @return
*/
public
static
String
replaceMobileHtml
(
String
html
){
if
(
html
==
null
){
return
""
;
}
return
html
.
replaceAll
(
"<([a-z]+?)\\s+?.*?>"
,
"<$1>"
);
}
/**
* 替换为手机识别的HTML,去掉样式及属性,保留回车。
* @param txt
* @return
*/
public
static
String
toHtml
(
String
txt
){
if
(
txt
==
null
){
return
""
;
}
return
replace
(
replace
(
Encodes
.
escapeHtml
(
txt
),
"\n"
,
"<br/>"
),
"\t"
,
" "
);
}
/**
* 缩略字符串(不区分中英文字符)
* @param str 目标字符串
* @param length 截取长度
* @return
*/
public
static
String
abbr
(
String
str
,
int
length
)
{
if
(
str
==
null
)
{
return
""
;
}
try
{
StringBuilder
sb
=
new
StringBuilder
();
int
currentLength
=
0
;
for
(
char
c
:
replaceHtml
(
StringEscapeUtils
.
unescapeHtml4
(
str
)).
toCharArray
())
{
currentLength
+=
String
.
valueOf
(
c
).
getBytes
(
"GBK"
).
length
;
if
(
currentLength
<=
length
-
3
)
{
sb
.
append
(
c
);
}
else
{
sb
.
append
(
"..."
);
break
;
}
}
return
sb
.
toString
();
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
return
""
;
}
public
static
String
abbr2
(
String
param
,
int
length
)
{
if
(
param
==
null
)
{
return
""
;
}
StringBuffer
result
=
new
StringBuffer
();
int
n
=
0
;
char
temp
;
boolean
isCode
=
false
;
// 是不是HTML代码
boolean
isHTML
=
false
;
// 是不是HTML特殊字符,如
for
(
int
i
=
0
;
i
<
param
.
length
();
i
++)
{
temp
=
param
.
charAt
(
i
);
if
(
temp
==
'<'
)
{
isCode
=
true
;
}
else
if
(
temp
==
'&'
)
{
isHTML
=
true
;
}
else
if
(
temp
==
'>'
&&
isCode
)
{
n
=
n
-
1
;
isCode
=
false
;
}
else
if
(
temp
==
';'
&&
isHTML
)
{
isHTML
=
false
;
}
try
{
if
(!
isCode
&&
!
isHTML
)
{
n
+=
String
.
valueOf
(
temp
).
getBytes
(
"GBK"
).
length
;
}
}
catch
(
UnsupportedEncodingException
e
)
{
e
.
printStackTrace
();
}
if
(
n
<=
length
-
3
)
{
result
.
append
(
temp
);
}
else
{
result
.
append
(
"..."
);
break
;
}
}
// 取出截取字符串中的HTML标记
String
temp_result
=
result
.
toString
().
replaceAll
(
"(>)[^<>]*(<?)"
,
"$1$2"
);
// 去掉不需要结素标记的HTML标记
temp_result
=
temp_result
.
replaceAll
(
"</?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>"
,
""
);
// 去掉成对的HTML标记
temp_result
=
temp_result
.
replaceAll
(
"<([a-zA-Z]+)[^<>]*>(.*?)</\\1>"
,
"$2"
);
// 用正则表达式取出标记
Pattern
p
=
Pattern
.
compile
(
"<([a-zA-Z]+)[^<>]*>"
);
Matcher
m
=
p
.
matcher
(
temp_result
);
List
<
String
>
endHTML
=
Lists
.
newArrayList
();
while
(
m
.
find
())
{
endHTML
.
add
(
m
.
group
(
1
));
}
// 补全不成对的HTML标记
for
(
int
i
=
endHTML
.
size
()
-
1
;
i
>=
0
;
i
--)
{
result
.
append
(
"</"
);
result
.
append
(
endHTML
.
get
(
i
));
result
.
append
(
">"
);
}
return
result
.
toString
();
}
/**
* 转换为Double类型
*/
public
static
Double
toDouble
(
Object
val
){
if
(
val
==
null
){
return
0
D
;
}
try
{
return
Double
.
valueOf
(
trim
(
val
.
toString
()));
}
catch
(
Exception
e
)
{
return
0
D
;
}
}
/**
* 转换为Float类型
*/
public
static
Float
toFloat
(
Object
val
){
return
toDouble
(
val
).
floatValue
();
}
/**
* 转换为Long类型
*/
public
static
Long
toLong
(
Object
val
){
return
toDouble
(
val
).
longValue
();
}
/**
* 转换为Integer类型
*/
public
static
Integer
toInteger
(
Object
val
){
return
toLong
(
val
).
intValue
();
}
/**
* 获得i18n字符串
*/
public
static
String
getMessage
(
String
code
,
Object
[]
args
)
{
LocaleResolver
localLocaleResolver
=
(
LocaleResolver
)
SpringContextHolder
.
getBean
(
LocaleResolver
.
class
);
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
Locale
localLocale
=
localLocaleResolver
.
resolveLocale
(
request
);
return
SpringContextHolder
.
getApplicationContext
().
getMessage
(
code
,
args
,
localLocale
);
}
/**
* 获得用户远程地址
*/
public
static
String
getRemoteAddr
(
HttpServletRequest
request
){
String
remoteAddr
=
request
.
getHeader
(
"X-Real-IP"
);
if
(
isNotBlank
(
remoteAddr
))
{
remoteAddr
=
request
.
getHeader
(
"X-Forwarded-For"
);
}
else
if
(
isNotBlank
(
remoteAddr
))
{
remoteAddr
=
request
.
getHeader
(
"Proxy-Client-IP"
);
}
else
if
(
isNotBlank
(
remoteAddr
))
{
remoteAddr
=
request
.
getHeader
(
"WL-Proxy-Client-IP"
);
}
return
remoteAddr
!=
null
?
remoteAddr
:
request
.
getRemoteAddr
();
}
/**
* 驼峰命名法工具
* @return
* toCamelCase("hello_world") == "helloWorld"
* toCapitalizeCamelCase("hello_world") == "HelloWorld"
* toUnderScoreCase("helloWorld") = "hello_world"
*/
public
static
String
toCamelCase
(
String
s
)
{
if
(
s
==
null
)
{
return
null
;
}
s
=
s
.
toLowerCase
();
StringBuilder
sb
=
new
StringBuilder
(
s
.
length
());
boolean
upperCase
=
false
;
for
(
int
i
=
0
;
i
<
s
.
length
();
i
++)
{
char
c
=
s
.
charAt
(
i
);
if
(
c
==
SEPARATOR
)
{
upperCase
=
true
;
}
else
if
(
upperCase
)
{
sb
.
append
(
Character
.
toUpperCase
(
c
));
upperCase
=
false
;
}
else
{
sb
.
append
(
c
);
}
}
return
sb
.
toString
();
}
/**
* 驼峰命名法工具
* @return
* toCamelCase("hello_world") == "helloWorld"
* toCapitalizeCamelCase("hello_world") == "HelloWorld"
* toUnderScoreCase("helloWorld") = "hello_world"
*/
public
static
String
toCapitalizeCamelCase
(
String
s
)
{
if
(
s
==
null
)
{
return
null
;
}
s
=
toCamelCase
(
s
);
return
s
.
substring
(
0
,
1
).
toUpperCase
()
+
s
.
substring
(
1
);
}
/**
* 转换为JS获取对象值,生成三目运算返回结果
* @param objectString 对象串
* 例如:row.user.id
* 返回:!row?'':!row.user?'':!row.user.id?'':row.user.id
*/
public
static
String
jsGetVal
(
String
objectString
){
StringBuilder
result
=
new
StringBuilder
();
StringBuilder
val
=
new
StringBuilder
();
String
[]
vals
=
split
(
objectString
,
"."
);
for
(
int
i
=
0
;
i
<
vals
.
length
;
i
++){
val
.
append
(
"."
+
vals
[
i
]);
result
.
append
(
"!"
+(
val
.
substring
(
1
))+
"?'':"
);
}
result
.
append
(
val
.
substring
(
1
));
return
result
.
toString
();
}
/**
* * 判断一个字符串是否为空串
*
* @param str String
* @return true:为空 false:非空
*/
public
static
boolean
isEmpty
(
String
str
)
{
return
isNull
(
str
)
||
NULLSTR
.
equals
(
str
.
trim
());
}
/**
* * 判断一个字符串是否为非空串
*
* @param str String
* @return true:非空串 false:空串
*/
public
static
boolean
isNotEmpty
(
String
str
)
{
return
!
isEmpty
(
str
);
}
/**
* * 判断一个对象是否为空
*
* @param object Object
* @return true:为空 false:非空
*/
public
static
boolean
isNull
(
Object
object
)
{
return
object
==
null
;
}
/**
* * 判断一个对象是否非空
*
* @param object Object
* @return true:非空 false:空
*/
public
static
boolean
isNotNull
(
Object
object
)
{
return
!
isNull
(
object
);
}
/**
* 去空格
*/
public
static
String
trim
(
String
str
)
{
return
(
str
==
null
?
""
:
str
.
trim
());
}
/**
* 截取字符串
*
* @param str 字符串
* @param start 开始
* @return 结果
*/
public
static
String
substring
(
final
String
str
,
int
start
)
{
if
(
str
==
null
)
{
return
NULLSTR
;
}
if
(
start
<
0
)
{
start
=
str
.
length
()
+
start
;
}
if
(
start
<
0
)
{
start
=
0
;
}
if
(
start
>
str
.
length
())
{
return
NULLSTR
;
}
return
str
.
substring
(
start
);
}
/**
* 截取字符串
*
* @param str 字符串
* @param start 开始
* @param end 结束
* @return 结果
*/
public
static
String
substring
(
final
String
str
,
int
start
,
int
end
)
{
if
(
str
==
null
)
{
return
NULLSTR
;
}
if
(
end
<
0
)
{
end
=
str
.
length
()
+
end
;
}
if
(
start
<
0
)
{
start
=
str
.
length
()
+
start
;
}
if
(
end
>
str
.
length
())
{
end
=
str
.
length
();
}
if
(
start
>
end
)
{
return
NULLSTR
;
}
if
(
start
<
0
)
{
start
=
0
;
}
if
(
end
<
0
)
{
end
=
0
;
}
return
str
.
substring
(
start
,
end
);
}
/**
* * 判断一个对象数组是否为空
*
* @param objects 要判断的对象数组
** @return true:为空 false:非空
*/
public
static
boolean
isEmpty
(
Object
[]
objects
)
{
return
isNull
(
objects
)
||
(
objects
.
length
==
0
);
}
/**
* 格式化文本, {} 表示占位符<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 template 文本模板,被替换的部分用 {} 表示
* @param params 参数值
* @return 格式化后的文本
*/
public
static
String
format
(
String
template
,
Object
...
params
)
{
if
(
isEmpty
(
params
)
||
isEmpty
(
template
))
{
return
template
;
}
return
StrFormatter
.
format
(
template
,
params
);
}
/**
* 驼峰首字符小写
*/
public
static
String
uncapitalize
(
String
str
)
{
int
strLen
;
if
(
str
==
null
||
(
strLen
=
str
.
length
())
==
0
)
{
return
str
;
}
return
new
StrBuilder
(
strLen
).
append
(
Character
.
toLowerCase
(
str
.
charAt
(
0
))).
append
(
str
.
substring
(
1
)).
toString
();
}
/**
* 下划线转驼峰命名
*/
public
static
String
toUnderScoreCase
(
String
s
)
{
if
(
s
==
null
)
{
return
null
;
}
StringBuilder
sb
=
new
StringBuilder
();
boolean
upperCase
=
false
;
for
(
int
i
=
0
;
i
<
s
.
length
();
i
++)
{
char
c
=
s
.
charAt
(
i
);
boolean
nextUpperCase
=
true
;
if
(
i
<
(
s
.
length
()
-
1
))
{
nextUpperCase
=
Character
.
isUpperCase
(
s
.
charAt
(
i
+
1
));
}
if
((
i
>
0
)
&&
Character
.
isUpperCase
(
c
))
{
if
(!
upperCase
||
!
nextUpperCase
)
{
sb
.
append
(
SEPARATOR
);
}
upperCase
=
true
;
}
else
{
upperCase
=
false
;
}
sb
.
append
(
Character
.
toLowerCase
(
c
));
}
return
sb
.
toString
();
}
/**
* 是否包含字符串
*
* @param str 验证字符串
* @param strs 字符串组
* @return 包含返回true
*/
public
static
boolean
inStringIgnoreCase
(
String
str
,
String
...
strs
)
{
if
(
str
!=
null
&&
strs
!=
null
)
{
for
(
String
s
:
strs
)
{
if
(
str
.
equalsIgnoreCase
(
trim
(
s
)))
{
return
true
;
}
}
}
return
false
;
}
/**
* 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
*
* @param name 转换前的下划线大写方式命名的字符串
* @return 转换后的驼峰式命名的字符串
*/
public
static
String
convertToCamelCase
(
String
name
)
{
StringBuilder
result
=
new
StringBuilder
();
// 快速检查
if
(
name
==
null
||
name
.
isEmpty
())
{
// 没必要转换
return
""
;
}
else
if
(!
name
.
contains
(
"_"
))
{
// 不含下划线,仅将首字母大写
return
name
.
substring
(
0
,
1
).
toUpperCase
()
+
name
.
substring
(
1
);
}
// 用下划线将原始字符串分割
String
[]
camels
=
name
.
split
(
"_"
);
for
(
String
camel
:
camels
)
{
// 跳过原始字符串中开头、结尾的下换线或双重下划线
if
(
camel
.
isEmpty
())
{
continue
;
}
// 首字母大写
result
.
append
(
camel
.
substring
(
0
,
1
).
toUpperCase
());
result
.
append
(
camel
.
substring
(
1
).
toLowerCase
());
}
return
result
.
toString
();
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/SystemPath.java
0 → 100644
View file @
d5ba54ba
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
/**
* @author wanye
* @date Dec 14, 2008
* @version v 1.0
* @description 得到当前应用的系统路径
*/
public
class
SystemPath
{
public
static
String
getSysPath
()
{
String
path
=
Thread
.
currentThread
().
getContextClassLoader
()
.
getResource
(
""
).
toString
();
String
temp
=
path
.
replaceFirst
(
"file:/"
,
""
).
replaceFirst
(
"WEB-INF/classes/"
,
""
);
String
separator
=
System
.
getProperty
(
"file.separator"
);
String
resultPath
=
temp
.
replaceAll
(
"/"
,
separator
+
separator
);
return
resultPath
;
}
public
static
String
getClassPath
()
{
String
path
=
Thread
.
currentThread
().
getContextClassLoader
()
.
getResource
(
""
).
toString
();
String
temp
=
path
.
replaceFirst
(
"file:/"
,
""
);
String
separator
=
System
.
getProperty
(
"file.separator"
);
String
resultPath
=
temp
.
replaceAll
(
"/"
,
separator
+
separator
);
return
resultPath
;
}
public
static
String
getSystempPath
()
{
return
System
.
getProperty
(
"java.io.tmpdir"
);
}
public
static
String
getSeparator
()
{
return
System
.
getProperty
(
"file.separator"
);
}
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
getSysPath
());
System
.
out
.
println
(
System
.
getProperty
(
"java.io.tmpdir"
));
System
.
out
.
println
(
getSeparator
());
System
.
out
.
println
(
getClassPath
());
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/Threads.java
0 → 100644
View file @
d5ba54ba
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package
com.jeespring.common.utils
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.TimeUnit
;
/**
* 线程相关工具类.
* @author calvin
* @version 2013-01-15
*/
public
class
Threads
{
/**
* sleep等待,单位为毫秒,忽略InterruptedException.
*/
public
static
void
sleep
(
long
millis
)
{
try
{
Thread
.
sleep
(
millis
);
}
catch
(
InterruptedException
e
)
{
// Ignore.
return
;
}
}
/**
* sleep等待,忽略InterruptedException.
*/
public
static
void
sleep
(
long
duration
,
TimeUnit
unit
)
{
try
{
Thread
.
sleep
(
unit
.
toMillis
(
duration
));
}
catch
(
InterruptedException
e
)
{
// Ignore.
return
;
}
}
/**
* 按照ExecutorService JavaDoc示例代码编写的Graceful Shutdown方法.
* 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
* 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
* 如果仍人超時,則強制退出.
* 另对在shutdown时线程本身被调用中断做了处理.
*/
public
static
void
gracefulShutdown
(
ExecutorService
pool
,
int
shutdownTimeout
,
int
shutdownNowTimeout
,
TimeUnit
timeUnit
)
{
pool
.
shutdown
();
// Disable new tasks from being submitted
try
{
// Wait a while for existing tasks to terminate
if
(!
pool
.
awaitTermination
(
shutdownTimeout
,
timeUnit
))
{
pool
.
shutdownNow
();
// Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if
(!
pool
.
awaitTermination
(
shutdownNowTimeout
,
timeUnit
))
{
System
.
err
.
println
(
"Pool did not terminated"
);
}
}
}
catch
(
InterruptedException
ie
)
{
// (Re-)Cancel if current thread also interrupted
pool
.
shutdownNow
();
// Preserve interrupt status
Thread
.
currentThread
().
interrupt
();
}
}
/**
* 直接调用shutdownNow的方法, 有timeout控制.取消在workQueue中Pending的任务,并中断所有阻塞函数.
*/
public
static
void
normalShutdown
(
ExecutorService
pool
,
int
timeout
,
TimeUnit
timeUnit
)
{
try
{
pool
.
shutdownNow
();
if
(!
pool
.
awaitTermination
(
timeout
,
timeUnit
))
{
System
.
err
.
println
(
"Pool did not terminated"
);
}
}
catch
(
InterruptedException
ie
)
{
Thread
.
currentThread
().
interrupt
();
}
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/TimeUtils.java
0 → 100644
View file @
d5ba54ba
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
java.util.Arrays
;
import
java.util.Date
;
import
org.apache.commons.lang3.time.DateFormatUtils
;
/**
* 时间计算工具类
* @author 黄炳桂 516821420@qq.com
* @version 2013-11-03
*/
public
class
TimeUtils
{
public
static
String
toTimeString
(
long
time
)
{
TimeUtils
t
=
new
TimeUtils
(
time
);
int
day
=
t
.
get
(
TimeUtils
.
DAY
);
int
hour
=
t
.
get
(
TimeUtils
.
HOUR
);
int
minute
=
t
.
get
(
TimeUtils
.
MINUTE
);
int
second
=
t
.
get
(
TimeUtils
.
SECOND
);
StringBuilder
sb
=
new
StringBuilder
();
if
(
day
>
0
){
sb
.
append
(
day
).
append
(
"天"
);
}
if
(
hour
>
0
){
sb
.
append
(
hour
).
append
(
"时"
);
}
if
(
minute
>
0
){
sb
.
append
(
minute
).
append
(
"分"
);
}
if
(
second
>
0
){
sb
.
append
(
second
).
append
(
"秒"
);
}
return
sb
.
toString
();
}
/**
* 时间字段常量,表示“秒”
*/
public
final
static
int
SECOND
=
0
;
/**
* 时间字段常量,表示“分”
*/
public
final
static
int
MINUTE
=
1
;
/**
* 时间字段常量,表示“时”
*/
public
final
static
int
HOUR
=
2
;
/**
* 时间字段常量,表示“天”
*/
public
final
static
int
DAY
=
3
;
/**
* 各常量允许的最大值
*/
private
final
int
[]
maxFields
=
{
59
,
59
,
23
,
Integer
.
MAX_VALUE
-
1
};
/**
* 各常量允许的最小值
*/
private
final
int
[]
minFields
=
{
0
,
0
,
0
,
Integer
.
MIN_VALUE
};
/**
* 默认的字符串格式时间分隔符
*/
private
String
timeSeparator
=
":"
;
/**
* 时间数据容器
*/
private
int
[]
fields
=
new
int
[
4
];
/**
* 无参构造,将各字段置为 0
*/
public
TimeUtils
()
{
this
(
0
,
0
,
0
,
0
);
}
/**
* 使用时、分构造一个时间
* @param hour 小时
* @param minute 分钟
*/
public
TimeUtils
(
int
hour
,
int
minute
)
{
this
(
0
,
hour
,
minute
,
0
);
}
/**
* 使用时、分、秒构造一个时间
* @param hour 小时
* @param minute 分钟
* @param second 秒
*/
public
TimeUtils
(
int
hour
,
int
minute
,
int
second
)
{
this
(
0
,
hour
,
minute
,
second
);
}
/**
* 使用一个字符串构造时间<br/>
* Time time = new Time("14:22:23");
* @param time 字符串格式的时间,默认采用“:”作为分隔符
*/
public
TimeUtils
(
String
time
)
{
this
(
time
,
null
);
// System.out.println(time);
}
/**
* 使用时间毫秒构建时间
* @param time
*/
public
TimeUtils
(
long
time
){
this
(
new
Date
(
time
));
}
/**
* 使用日期对象构造时间
* @param date
*/
public
TimeUtils
(
Date
date
){
this
(
DateFormatUtils
.
formatUTC
(
date
,
"HH:mm:ss"
));
}
/**
* 使用天、时、分、秒构造时间,进行全字符的构造
* @param day 天
* @param hour 时
* @param minute 分
* @param second 秒
*/
public
TimeUtils
(
int
day
,
int
hour
,
int
minute
,
int
second
)
{
initialize
(
day
,
hour
,
minute
,
second
);
}
/**
* 使用一个字符串构造时间,指定分隔符<br/>
* Time time = new Time("14-22-23", "-");
* @param time 字符串格式的时间
*/
public
TimeUtils
(
String
time
,
String
timeSeparator
)
{
if
(
timeSeparator
!=
null
)
{
setTimeSeparator
(
timeSeparator
);
}
parseTime
(
time
);
}
/**
* 设置时间字段的值
* @param field 时间字段常量
* @param value 时间字段的值
*/
public
void
set
(
int
field
,
int
value
)
{
if
(
value
<
minFields
[
field
])
{
throw
new
IllegalArgumentException
(
value
+
", time value must be positive."
);
}
fields
[
field
]
=
value
%
(
maxFields
[
field
]
+
1
);
// 进行进位计算
int
carry
=
value
/
(
maxFields
[
field
]
+
1
);
if
(
carry
>
0
)
{
int
upFieldValue
=
get
(
field
+
1
);
set
(
field
+
1
,
upFieldValue
+
carry
);
}
}
/**
* 获得时间字段的值
* @param field 时间字段常量
* @return 该时间字段的值
*/
public
int
get
(
int
field
)
{
if
(
field
<
0
||
field
>
fields
.
length
-
1
)
{
throw
new
IllegalArgumentException
(
field
+
", field value is error."
);
}
return
fields
[
field
];
}
/**
* 将时间进行“加”运算,即加上一个时间
* @param time 需要加的时间
* @return 运算后的时间
*/
public
TimeUtils
addTime
(
TimeUtils
time
)
{
TimeUtils
result
=
new
TimeUtils
();
int
up
=
0
;
// 进位标志
for
(
int
i
=
0
;
i
<
fields
.
length
;
i
++)
{
int
sum
=
fields
[
i
]
+
time
.
fields
[
i
]
+
up
;
up
=
sum
/
(
maxFields
[
i
]
+
1
);
result
.
fields
[
i
]
=
sum
%
(
maxFields
[
i
]
+
1
);
}
return
result
;
}
/**
* 将时间进行“减”运算,即减去一个时间
* @param time 需要减的时间
* @return 运算后的时间
*/
public
TimeUtils
subtractTime
(
TimeUtils
time
)
{
TimeUtils
result
=
new
TimeUtils
();
int
down
=
0
;
// 退位标志
for
(
int
i
=
0
,
k
=
fields
.
length
-
1
;
i
<
k
;
i
++)
{
int
difference
=
fields
[
i
]
+
down
;
if
(
difference
>=
time
.
fields
[
i
])
{
difference
-=
time
.
fields
[
i
];
down
=
0
;
}
else
{
difference
+=
maxFields
[
i
]
+
1
-
time
.
fields
[
i
];
down
=
-
1
;
}
result
.
fields
[
i
]
=
difference
;
}
result
.
fields
[
DAY
]
=
fields
[
DAY
]
-
time
.
fields
[
DAY
]
+
down
;
return
result
;
}
/**
* 获得时间字段的分隔符
* @return
*/
public
String
getTimeSeparator
()
{
return
timeSeparator
;
}
/**
* 设置时间字段的分隔符(用于字符串格式的时间)
* @param timeSeparator 分隔符字符串
*/
public
void
setTimeSeparator
(
String
timeSeparator
)
{
this
.
timeSeparator
=
timeSeparator
;
}
private
void
initialize
(
int
day
,
int
hour
,
int
minute
,
int
second
)
{
set
(
DAY
,
day
);
set
(
HOUR
,
hour
);
set
(
MINUTE
,
minute
);
set
(
SECOND
,
second
);
}
private
void
parseTime
(
String
time
)
{
if
(
time
==
null
)
{
initialize
(
0
,
0
,
0
,
0
);
return
;
}
String
t
=
time
;
int
field
=
DAY
;
set
(
field
--,
0
);
int
p
=
-
1
;
while
((
p
=
t
.
indexOf
(
timeSeparator
))
>
-
1
)
{
parseTimeField
(
time
,
t
.
substring
(
0
,
p
),
field
--);
t
=
t
.
substring
(
p
+
timeSeparator
.
length
());
}
parseTimeField
(
time
,
t
,
field
--);
}
private
void
parseTimeField
(
String
time
,
String
t
,
int
field
)
{
if
(
field
<
SECOND
||
t
.
length
()
<
1
)
{
parseTimeException
(
time
);
}
char
[]
chs
=
t
.
toCharArray
();
int
n
=
0
;
for
(
int
i
=
0
;
i
<
chs
.
length
;
i
++)
{
if
(
chs
[
i
]
<=
' '
)
{
continue
;
}
if
(
chs
[
i
]
>=
'0'
&&
chs
[
i
]
<=
'9'
)
{
n
=
n
*
10
+
chs
[
i
]
-
'0'
;
continue
;
}
parseTimeException
(
time
);
}
set
(
field
,
n
);
}
private
void
parseTimeException
(
String
time
)
{
throw
new
IllegalArgumentException
(
time
+
", time format error, HH"
+
this
.
timeSeparator
+
"mm"
+
this
.
timeSeparator
+
"ss"
);
}
@Override
public
String
toString
()
{
StringBuilder
sb
=
new
StringBuilder
(
16
);
sb
.
append
(
fields
[
DAY
]).
append
(
','
).
append
(
' '
);
buildString
(
sb
,
HOUR
).
append
(
timeSeparator
);
buildString
(
sb
,
MINUTE
).
append
(
timeSeparator
);
buildString
(
sb
,
SECOND
);
return
sb
.
toString
();
}
private
StringBuilder
buildString
(
StringBuilder
sb
,
int
field
)
{
if
(
fields
[
field
]
<
10
)
{
sb
.
append
(
'0'
);
}
return
sb
.
append
(
fields
[
field
]);
}
@Override
public
int
hashCode
()
{
final
int
PRIME
=
31
;
int
result
=
1
;
result
=
PRIME
*
result
+
Arrays
.
hashCode
(
fields
);
return
result
;
}
@Override
public
boolean
equals
(
Object
obj
)
{
if
(
this
==
obj
)
{
return
true
;
}
if
(
obj
==
null
)
{
return
false
;
}
if
(
getClass
()
!=
obj
.
getClass
())
{
return
false
;
}
final
TimeUtils
other
=
(
TimeUtils
)
obj
;
if
(!
Arrays
.
equals
(
fields
,
other
.
fields
))
{
return
false
;
}
return
true
;
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/UploadUtils.java
0 → 100644
View file @
d5ba54ba
package
com.jeespring.common.utils
;
import
java.io.File
;
import
java.io.IOException
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Random
;
import
javax.servlet.http.HttpServletRequest
;
import
org.apache.commons.fileupload.FileItem
;
import
org.apache.commons.fileupload.FileUploadException
;
import
org.apache.commons.fileupload.disk.DiskFileItemFactory
;
import
org.apache.commons.fileupload.servlet.ServletFileUpload
;
/**
* 文件上传工具类
*
* @author yangdc
* @date Apr 18, 2012
*
* <pre>
* </pre>
*/
public
class
UploadUtils
{
/**
* 表单字段常量
*/
public
static
final
String
FORM_FIELDS
=
"form_fields"
;
/**
* 文件域常量
*/
public
static
final
String
FILE_FIELDS
=
"file_fields"
;
// 最大文件大小
private
long
maxSize
=
1000000
;
// 定义允许上传的文件扩展名
private
Map
<
String
,
String
>
extMap
=
new
HashMap
<
String
,
String
>();
// 文件保存目录相对路径
private
String
basePath
=
"upload"
;
// 文件的目录名
private
String
dirName
=
"images"
;
// 上传临时路径
private
static
final
String
TEMP_PATH
=
"/temp"
;
private
String
tempPath
=
basePath
+
TEMP_PATH
;
// 若不指定则文件名默认为 yyyyMMddHHmmss_xyz
private
String
fileName
;
// 文件保存目录路径
private
String
savePath
;
// 文件保存目录url
private
String
saveUrl
;
// 文件最终的url包括文件名
private
String
fileUrl
;
public
UploadUtils
()
{
// 其中images,flashs,medias,files,对应文件夹名称,对应dirName
// key文件夹名称
// value该文件夹内可以上传文件的后缀名
extMap
.
put
(
"images"
,
"gif,jpg,jpeg,png,bmp"
);
extMap
.
put
(
"flashs"
,
"swf,flv"
);
extMap
.
put
(
"medias"
,
"swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb"
);
extMap
.
put
(
"files"
,
"doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2"
);
}
/**
* 文件上传
*
* @param request
* @return infos info[0] 验证文件域返回错误信息 info[1] 上传文件错误信息 info[2] savePath info[3] saveUrl info[4] fileUrl
*/
@SuppressWarnings
(
"unchecked"
)
public
String
[]
uploadFile
(
HttpServletRequest
request
)
{
String
[]
infos
=
new
String
[
5
];
// 验证
infos
[
0
]
=
this
.
validateFields
(
request
);
// 初始化表单元素
Map
<
String
,
Object
>
fieldsMap
=
new
HashMap
<
String
,
Object
>();
if
(
"true"
.
equals
(
infos
[
0
]))
{
fieldsMap
=
this
.
initFields
(
request
);
}
// 上传
List
<
FileItem
>
fiList
=
(
List
<
FileItem
>)
fieldsMap
.
get
(
UploadUtils
.
FILE_FIELDS
);
if
(
fiList
!=
null
)
{
for
(
FileItem
item
:
fiList
)
{
infos
[
1
]
=
this
.
saveFile
(
item
);
}
infos
[
2
]
=
savePath
;
infos
[
3
]
=
saveUrl
;
infos
[
4
]
=
fileUrl
;
}
return
infos
;
}
/**
* 上传验证,并初始化文件目录
*
* @param request
*/
private
String
validateFields
(
HttpServletRequest
request
)
{
String
errorInfo
=
"true"
;
// boolean errorFlag = true;
// 获取内容类型
String
contentType
=
request
.
getContentType
();
int
contentLength
=
request
.
getContentLength
();
// 文件保存目录路径
savePath
=
request
.
getSession
().
getServletContext
().
getRealPath
(
"/"
)
+
basePath
+
"/"
;
// 文件保存目录URL
saveUrl
=
request
.
getContextPath
()
+
"/"
+
basePath
+
"/"
;
File
uploadDir
=
new
File
(
savePath
);
if
(
contentType
==
null
||
!
contentType
.
startsWith
(
"multipart"
))
{
// TODO
System
.
out
.
println
(
"请求不包含multipart/form-data流"
);
errorInfo
=
"请求不包含multipart/form-data流"
;
}
else
if
(
maxSize
<
contentLength
)
{
// TODO
System
.
out
.
println
(
"上传文件大小超出文件最大大小"
);
errorInfo
=
"上传文件大小超出文件最大大小["
+
maxSize
+
"]"
;
}
else
if
(!
ServletFileUpload
.
isMultipartContent
(
request
))
{
// TODO
errorInfo
=
"请选择文件"
;
}
else
if
(!
uploadDir
.
isDirectory
())
{
// 检查目录
// TODO
errorInfo
=
"上传目录["
+
savePath
+
"]不存在"
;
}
else
if
(!
uploadDir
.
canWrite
())
{
// TODO
errorInfo
=
"上传目录["
+
savePath
+
"]没有写权限"
;
}
else
if
(!
extMap
.
containsKey
(
dirName
))
{
// TODO
errorInfo
=
"目录名不正确"
;
}
else
{
// .../basePath/dirName/
// 创建文件夹
savePath
+=
dirName
+
"/"
;
saveUrl
+=
dirName
+
"/"
;
File
saveDirFile
=
new
File
(
savePath
);
if
(!
saveDirFile
.
exists
())
{
saveDirFile
.
mkdirs
();
}
// .../basePath/dirName/yyyyMMdd/
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyyMMdd"
);
String
ymd
=
sdf
.
format
(
new
Date
());
savePath
+=
ymd
+
"/"
;
saveUrl
+=
ymd
+
"/"
;
File
dirFile
=
new
File
(
savePath
);
if
(!
dirFile
.
exists
())
{
dirFile
.
mkdirs
();
}
// 获取上传临时路径
tempPath
=
request
.
getSession
().
getServletContext
().
getRealPath
(
"/"
)
+
tempPath
+
"/"
;
File
file
=
new
File
(
tempPath
);
if
(!
file
.
exists
())
{
file
.
mkdirs
();
}
}
return
errorInfo
;
}
/**
* 处理上传内容
*
* @param request
* @param maxSize
* @return
*/
// @SuppressWarnings("unchecked")
private
Map
<
String
,
Object
>
initFields
(
HttpServletRequest
request
)
{
// 存储表单字段和非表单字段
Map
<
String
,
Object
>
map
=
new
HashMap
<
String
,
Object
>();
// 第一步:判断request
boolean
isMultipart
=
ServletFileUpload
.
isMultipartContent
(
request
);
// 第二步:解析request
if
(
isMultipart
)
{
// Create a factory for disk-based file items
DiskFileItemFactory
factory
=
new
DiskFileItemFactory
();
// 阀值,超过这个值才会写到临时目录,否则在内存中
factory
.
setSizeThreshold
(
1024
*
1024
*
10
);
factory
.
setRepository
(
new
File
(
tempPath
));
// Create a new file upload handler
ServletFileUpload
upload
=
new
ServletFileUpload
(
factory
);
upload
.
setHeaderEncoding
(
"UTF-8"
);
// 最大上传限制
upload
.
setSizeMax
(
maxSize
);
/* FileItem */
List
<
FileItem
>
items
=
null
;
// Parse the request
try
{
items
=
upload
.
parseRequest
(
request
);
}
catch
(
FileUploadException
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
();
}
// 第3步:处理uploaded items
if
(
items
!=
null
&&
items
.
size
()
>
0
)
{
Iterator
<
FileItem
>
iter
=
items
.
iterator
();
// 文件域对象
List
<
FileItem
>
list
=
new
ArrayList
<
FileItem
>();
// 表单字段
Map
<
String
,
String
>
fields
=
new
HashMap
<
String
,
String
>();
while
(
iter
.
hasNext
())
{
FileItem
item
=
iter
.
next
();
// 处理所有表单元素和文件域表单元素
if
(
item
.
isFormField
())
{
// 表单元素
String
name
=
item
.
getFieldName
();
String
value
=
item
.
getString
();
fields
.
put
(
name
,
value
);
}
else
{
// 文件域表单元素
list
.
add
(
item
);
}
}
map
.
put
(
FORM_FIELDS
,
fields
);
map
.
put
(
FILE_FIELDS
,
list
);
}
}
return
map
;
}
/**
* 保存文件
*
* @param obj
* 要上传的文件域
* @param file
* @return
*/
private
String
saveFile
(
FileItem
item
)
{
String
error
=
"true"
;
String
fileName
=
item
.
getName
();
String
fileExt
=
fileName
.
substring
(
fileName
.
lastIndexOf
(
"."
)
+
1
).
toLowerCase
();
if
(
item
.
getSize
()
>
maxSize
)
{
// 检查文件大小
// TODO
error
=
"上传文件大小超过限制"
;
}
else
if
(!
Arrays
.<
String
>
asList
(
extMap
.
get
(
dirName
).
split
(
","
)).
contains
(
fileExt
))
{
// 检查扩展名
error
=
"上传文件扩展名是不允许的扩展名。\n只允许"
+
extMap
.
get
(
dirName
)
+
"格式。"
;
}
else
{
String
newFileName
;
if
(
""
.
equals
(
fileName
.
trim
()))
{
SimpleDateFormat
df
=
new
SimpleDateFormat
(
"yyyyMMddHHmmss"
);
newFileName
=
df
.
format
(
new
Date
())
+
"_"
+
new
Random
().
nextInt
(
1000
)
+
"."
+
fileExt
;
}
else
{
newFileName
=
fileName
+
"."
+
fileExt
;
}
// .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx
fileUrl
=
saveUrl
+
newFileName
;
try
{
File
uploadedFile
=
new
File
(
savePath
,
newFileName
);
item
.
write
(
uploadedFile
);
/*
* FileOutputStream fos = new FileOutputStream(uploadFile); // 文件全在内存中 if (item.isInMemory()) { fos.write(item.get()); } else { InputStream is = item.getInputStream(); byte[] buffer =
* new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } is.close(); } fos.close(); item.delete();
*/
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
System
.
out
.
println
(
"上传失败了!!!"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
return
error
;
}
/** **********************get/set方法********************************* */
public
String
getSavePath
()
{
return
savePath
;
}
public
String
getSaveUrl
()
{
return
saveUrl
;
}
public
long
getMaxSize
()
{
return
maxSize
;
}
public
void
setMaxSize
(
long
maxSize
)
{
this
.
maxSize
=
maxSize
;
}
public
Map
<
String
,
String
>
getExtMap
()
{
return
extMap
;
}
public
void
setExtMap
(
Map
<
String
,
String
>
extMap
)
{
this
.
extMap
=
extMap
;
}
public
String
getBasePath
()
{
return
basePath
;
}
public
void
setBasePath
(
String
basePath
)
{
this
.
basePath
=
basePath
;
tempPath
=
basePath
+
TEMP_PATH
;
}
public
String
getDirName
()
{
return
dirName
;
}
public
void
setDirName
(
String
dirName
)
{
this
.
dirName
=
dirName
;
}
public
String
getTempPath
()
{
return
tempPath
;
}
public
void
setTempPath
(
String
tempPath
)
{
this
.
tempPath
=
tempPath
;
}
public
String
getFileUrl
()
{
return
fileUrl
;
}
public
String
getFileName
()
{
return
fileName
;
}
public
void
setFileName
(
String
fileName
)
{
this
.
fileName
=
fileName
;
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/UserAgentUtils.java
0 → 100644
View file @
d5ba54ba
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils
;
import
javax.servlet.http.HttpServletRequest
;
import
eu.bitwalker.useragentutils.Browser
;
import
eu.bitwalker.useragentutils.DeviceType
;
import
eu.bitwalker.useragentutils.UserAgent
;
/**
* 用户代理字符串识别工具
* @author 黄炳桂 516821420@qq.com
* @version 2014-6-13
*/
public
class
UserAgentUtils
{
/**
* 获取用户代理对象
* @param request
* @return
*/
public
static
UserAgent
getUserAgent
(
HttpServletRequest
request
){
return
UserAgent
.
parseUserAgentString
(
request
.
getHeader
(
"User-Agent"
));
}
/**
* 获取设备类型
* @param request
* @return
*/
public
static
DeviceType
getDeviceType
(
HttpServletRequest
request
){
return
getUserAgent
(
request
).
getOperatingSystem
().
getDeviceType
();
}
/**
* 是否是PC
* @param request
* @return
*/
public
static
boolean
isComputer
(
HttpServletRequest
request
){
return
DeviceType
.
COMPUTER
.
equals
(
getDeviceType
(
request
));
}
/**
* 是否是手机
* @param request
* @return
*/
public
static
boolean
isMobile
(
HttpServletRequest
request
){
return
DeviceType
.
MOBILE
.
equals
(
getDeviceType
(
request
));
}
/**
* 是否是平板
* @param request
* @return
*/
public
static
boolean
isTablet
(
HttpServletRequest
request
){
return
DeviceType
.
TABLET
.
equals
(
getDeviceType
(
request
));
}
/**
* 是否是手机和平板
* @param request
* @return
*/
public
static
boolean
isMobileOrTablet
(
HttpServletRequest
request
){
DeviceType
deviceType
=
getDeviceType
(
request
);
return
DeviceType
.
MOBILE
.
equals
(
deviceType
)
||
DeviceType
.
TABLET
.
equals
(
deviceType
);
}
/**
* 获取浏览类型
* @param request
* @return
*/
public
static
Browser
getBrowser
(
HttpServletRequest
request
){
return
getUserAgent
(
request
).
getBrowser
();
}
/**
* 是否IE版本是否小于等于IE8
* @param request
* @return
*/
public
static
boolean
isLteIE8
(
HttpServletRequest
request
){
Browser
browser
=
getBrowser
(
request
);
return
Browser
.
IE5
.
equals
(
browser
)
||
Browser
.
IE6
.
equals
(
browser
)
||
Browser
.
IE7
.
equals
(
browser
)
||
Browser
.
IE8
.
equals
(
browser
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/WorkDayUtils.java
0 → 100644
View file @
d5ba54ba
package
com.jeespring.common.utils
;
import
java.text.SimpleDateFormat
;
import
java.util.Calendar
;
import
java.util.Date
;
public
class
WorkDayUtils
{
public
static
void
main
(
String
[]
args
)
{
try
{
String
strDateStart
=
"2013-08-01"
;
String
strDateEnd
=
"2014-08-31"
;
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
Date
date_start
=
sdf
.
parse
(
strDateStart
);
Date
date_end
=
sdf
.
parse
(
strDateEnd
);
WorkDayUtils
app
=
new
WorkDayUtils
();
Calendar
cal_start
=
Calendar
.
getInstance
();
Calendar
cal_end
=
Calendar
.
getInstance
();
cal_start
.
setTime
(
date_start
);
cal_end
.
setTime
(
date_end
);
System
.
out
.
println
(
"开始日:"
+
cal_start
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
cal_start
.
get
(
Calendar
.
MONTH
)
+
1
)
+
"-"
+
cal_start
.
get
(
Calendar
.
DAY_OF_MONTH
)
+
" "
+
app
.
getChineseWeek
(
cal_start
));
System
.
out
.
println
(
"结束日:"
+
cal_end
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
cal_end
.
get
(
Calendar
.
MONTH
)
+
1
)
+
"-"
+
cal_end
.
get
(
Calendar
.
DAY_OF_MONTH
)
+
" "
+
app
.
getChineseWeek
(
cal_end
));
System
.
out
.
println
(
"工作日:"
+
app
.
getWorkingDay
(
cal_start
,
cal_end
));
System
.
out
.
println
(
"休息日:"
+
app
.
getHolidays
(
cal_start
,
cal_end
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 获取日期之间的天数
* @param d1
* @param d2
* @return
*/
public
int
getDaysBetween
(
Calendar
d1
,
Calendar
d2
)
{
if
(
d1
.
after
(
d2
))
{
// swap dates so that d1 is start and d2 is end
Calendar
swap
=
d1
;
d1
=
d2
;
d2
=
swap
;
}
int
days
=
d2
.
get
(
Calendar
.
DAY_OF_YEAR
)
-
d1
.
get
(
Calendar
.
DAY_OF_YEAR
);
int
y2
=
d2
.
get
(
Calendar
.
YEAR
);
if
(
d1
.
get
(
Calendar
.
YEAR
)
!=
y2
)
{
d1
=
(
Calendar
)
d1
.
clone
();
do
{
days
+=
d1
.
getActualMaximum
(
Calendar
.
DAY_OF_YEAR
);
d1
.
add
(
Calendar
.
YEAR
,
1
);
}
while
(
d1
.
get
(
Calendar
.
YEAR
)
!=
y2
);
}
return
days
;
}
/**
* 获取工作日
* @param d1
* @param d2
* @return
*/
public
int
getWorkingDay
(
Calendar
d1
,
Calendar
d2
)
{
int
result
=
-
1
;
if
(
d1
.
after
(
d2
))
{
// swap dates so that d1 is start and d2 is end
Calendar
swap
=
d1
;
d1
=
d2
;
d2
=
swap
;
}
// int betweendays = getDaysBetween(d1, d2);
// int charge_date = 0;
int
charge_start_date
=
0
;
// 开始日期的日期偏移量
int
charge_end_date
=
0
;
// 结束日期的日期偏移量
// 日期不在同一个日期内
int
stmp
;
int
etmp
;
stmp
=
7
-
d1
.
get
(
Calendar
.
DAY_OF_WEEK
);
etmp
=
7
-
d2
.
get
(
Calendar
.
DAY_OF_WEEK
);
if
(
stmp
!=
0
&&
stmp
!=
6
)
{
// 开始日期为星期六和星期日时偏移量为0
charge_start_date
=
stmp
-
1
;
}
if
(
etmp
!=
0
&&
etmp
!=
6
)
{
// 结束日期为星期六和星期日时偏移量为0
charge_end_date
=
etmp
-
1
;
}
// }
result
=
(
getDaysBetween
(
this
.
getNextMonday
(
d1
),
this
.
getNextMonday
(
d2
))
/
7
)
*
5
+
charge_start_date
-
charge_end_date
;
// System.out.println("charge_start_date>" + charge_start_date);
// System.out.println("charge_end_date>" + charge_end_date);
// System.out.println("between day is-->" + betweendays);
return
result
;
}
/**
* 获取中文日期
* @param date
* @return
*/
public
String
getChineseWeek
(
Calendar
date
)
{
final
String
[]
dayNames
=
{
"星期日"
,
"星期一"
,
"星期二"
,
"星期三"
,
"星期四"
,
"星期五"
,
"星期六"
};
int
dayOfWeek
=
date
.
get
(
Calendar
.
DAY_OF_WEEK
);
// System.out.println(dayNames[dayOfWeek - 1]);
return
dayNames
[
dayOfWeek
-
1
];
}
/**
* 获得日期的下一个星期一的日期
* @param date
* @return
*/
public
Calendar
getNextMonday
(
Calendar
date
)
{
Calendar
result
=
null
;
result
=
date
;
do
{
result
=
(
Calendar
)
result
.
clone
();
result
.
add
(
Calendar
.
DATE
,
1
);
}
while
(
result
.
get
(
Calendar
.
DAY_OF_WEEK
)
!=
2
);
return
result
;
}
/**
* 获取休息日
* @param d1
* @param d2
* @return
*/
public
int
getHolidays
(
Calendar
d1
,
Calendar
d2
)
{
return
this
.
getDaysBetween
(
d1
,
d2
)
-
this
.
getWorkingDay
(
d1
,
d2
);
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/ZxingHandler.java
0 → 100644
View file @
d5ba54ba
package
com.jeespring.common.utils
;
import
java.awt.image.BufferedImage
;
import
java.io.File
;
import
java.util.Hashtable
;
import
javax.imageio.ImageIO
;
import
com.google.zxing.BarcodeFormat
;
import
com.google.zxing.BinaryBitmap
;
import
com.google.zxing.DecodeHintType
;
import
com.google.zxing.EncodeHintType
;
import
com.google.zxing.LuminanceSource
;
import
com.google.zxing.MultiFormatReader
;
import
com.google.zxing.MultiFormatWriter
;
import
com.google.zxing.Result
;
import
com.google.zxing.client.j2se.BufferedImageLuminanceSource
;
import
com.google.zxing.client.j2se.MatrixToImageWriter
;
import
com.google.zxing.common.BitMatrix
;
import
com.google.zxing.common.HybridBinarizer
;
import
com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
;
/**
* 条形码和二维码编码解码
*
* @author JeeSpring
* @version 2014-02-28
*/
public
class
ZxingHandler
{
/**
* 条形码编码
*
* @param contents
* @param width
* @param height
* @param imgPath
*/
public
static
void
encode
(
String
contents
,
int
width
,
int
height
,
String
imgPath
)
{
int
codeWidth
=
3
+
// start guard
(
7
*
6
)
+
// left bars
5
+
// middle guard
(
7
*
6
)
+
// right bars
3
;
// end guard
codeWidth
=
Math
.
max
(
codeWidth
,
width
);
try
{
BitMatrix
bitMatrix
=
new
MultiFormatWriter
().
encode
(
contents
,
BarcodeFormat
.
EAN_13
,
codeWidth
,
height
,
null
);
MatrixToImageWriter
.
writeToFile
(
bitMatrix
,
"png"
,
new
File
(
imgPath
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 条形码解码
*
* @param imgPath
* @return String
*/
public
static
String
decode
(
String
imgPath
)
{
BufferedImage
image
=
null
;
Result
result
=
null
;
try
{
image
=
ImageIO
.
read
(
new
File
(
imgPath
));
if
(
image
==
null
)
{
System
.
out
.
println
(
"the decode image may be not exit."
);
}
LuminanceSource
source
=
new
BufferedImageLuminanceSource
(
image
);
BinaryBitmap
bitmap
=
new
BinaryBitmap
(
new
HybridBinarizer
(
source
));
result
=
new
MultiFormatReader
().
decode
(
bitmap
,
null
);
return
result
.
getText
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/**
* 二维码编码
*
* @param contents
* @param width
* @param height
* @param imgPath
*/
public
static
void
encode2
(
String
contents
,
int
width
,
int
height
,
String
imgPath
)
{
Hashtable
<
EncodeHintType
,
Object
>
hints
=
new
Hashtable
<
EncodeHintType
,
Object
>();
// 指定纠错等级
hints
.
put
(
EncodeHintType
.
ERROR_CORRECTION
,
ErrorCorrectionLevel
.
L
);
// 指定编码格式
hints
.
put
(
EncodeHintType
.
CHARACTER_SET
,
"GBK"
);
try
{
BitMatrix
bitMatrix
=
new
MultiFormatWriter
().
encode
(
contents
,
BarcodeFormat
.
QR_CODE
,
width
,
height
,
hints
);
MatrixToImageWriter
.
writeToFile
(
bitMatrix
,
"png"
,
new
File
(
imgPath
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 二维码解码
*
* @param imgPath
* @return String
*/
public
static
String
decode2
(
String
imgPath
)
{
BufferedImage
image
=
null
;
Result
result
=
null
;
try
{
image
=
ImageIO
.
read
(
new
File
(
imgPath
));
if
(
image
==
null
)
{
System
.
out
.
println
(
"the decode image may be not exit."
);
}
LuminanceSource
source
=
new
BufferedImageLuminanceSource
(
image
);
BinaryBitmap
bitmap
=
new
BinaryBitmap
(
new
HybridBinarizer
(
source
));
Hashtable
<
DecodeHintType
,
Object
>
hints
=
new
Hashtable
<
DecodeHintType
,
Object
>();
hints
.
put
(
DecodeHintType
.
CHARACTER_SET
,
"GBK"
);
result
=
new
MultiFormatReader
().
decode
(
bitmap
,
hints
);
return
result
.
getText
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
null
;
}
/**
* @param args
*/
public
static
void
main
(
String
[]
args
)
{
// 条形码
String
imgPath
=
"target\\zxing_EAN13.png"
;
String
contents
=
"6923450657713"
;
int
width
=
105
,
height
=
50
;
ZxingHandler
.
encode
(
contents
,
width
,
height
,
imgPath
);
System
.
out
.
println
(
"finished zxing EAN-13 encode."
);
String
decodeContent
=
ZxingHandler
.
decode
(
imgPath
);
System
.
out
.
println
(
"解码内容如下:"
+
decodeContent
);
System
.
out
.
println
(
"finished zxing EAN-13 decode."
);
// 二维码
String
imgPath2
=
"target\\zxing.png"
;
String
contents2
=
"Hello Gem, welcome to Zxing!"
+
"\nBlog [ http://thinkgem.iteye.com ]"
+
"\nEMail [ thinkgem@163.com ]"
;
int
width2
=
300
,
height2
=
300
;
ZxingHandler
.
encode2
(
contents2
,
width2
,
height2
,
imgPath2
);
System
.
out
.
println
(
"finished zxing encode."
);
String
decodeContent2
=
ZxingHandler
.
decode2
(
imgPath2
);
System
.
out
.
println
(
"解码内容如下:"
+
decodeContent2
);
System
.
out
.
println
(
"finished zxing decode."
);
}
}
\ No newline at end of file
JeeSpringCloud/src/main/java/com/jeespring/common/utils/bean/BeanUtils.java
0 → 100644
View file @
d5ba54ba
package
com.jeespring.common.utils.bean
;
import
java.lang.reflect.Method
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
/**
* Bean 工具类
*
* @author JeeSpring
*/
public
class
BeanUtils
{
/** Bean方法名中属性名开始的下标 */
private
static
final
int
BEAN_METHOD_PROP_INDEX
=
3
;
/** * 匹配getter方法的正则表达式 */
private
static
final
Pattern
GET_PATTERN
=
Pattern
.
compile
(
"get(\\p{javaUpperCase}\\w*)"
);
/** * 匹配setter方法的正则表达式 */
private
static
final
Pattern
SET_PATTERN
=
Pattern
.
compile
(
"set(\\p{javaUpperCase}\\w*)"
);
/**
* Bean属性复制工具方法。
*
* @param dest 目标对象
* @param src 源对象
*/
public
static
void
copyBeanProp
(
Object
dest
,
Object
src
)
{
List
<
Method
>
destSetters
=
getSetterMethods
(
dest
);
List
<
Method
>
srcGetters
=
getGetterMethods
(
src
);
try
{
for
(
Method
setter
:
destSetters
)
{
for
(
Method
getter
:
srcGetters
)
{
if
(
isMethodPropEquals
(
setter
.
getName
(),
getter
.
getName
())
&&
setter
.
getParameterTypes
()[
0
].
equals
(
getter
.
getReturnType
()))
{
setter
.
invoke
(
dest
,
getter
.
invoke
(
src
));
}
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
/**
* 获取对象的setter方法。
*
* @param obj 对象
* @return 对象的setter方法列表
*/
public
static
List
<
Method
>
getSetterMethods
(
Object
obj
)
{
// setter方法列表
List
<
Method
>
setterMethods
=
new
ArrayList
<
Method
>();
// 获取所有方法
Method
[]
methods
=
obj
.
getClass
().
getMethods
();
// 查找setter方法
for
(
Method
method
:
methods
)
{
Matcher
m
=
SET_PATTERN
.
matcher
(
method
.
getName
());
if
(
m
.
matches
()
&&
(
method
.
getParameterTypes
().
length
==
1
))
{
setterMethods
.
add
(
method
);
}
}
// 返回setter方法列表
return
setterMethods
;
}
/**
* 获取对象的getter方法。
*
* @param obj 对象
* @return 对象的getter方法列表
*/
public
static
List
<
Method
>
getGetterMethods
(
Object
obj
)
{
// getter方法列表
List
<
Method
>
getterMethods
=
new
ArrayList
<
Method
>();
// 获取所有方法
Method
[]
methods
=
obj
.
getClass
().
getMethods
();
// 查找getter方法
for
(
Method
method
:
methods
)
{
Matcher
m
=
GET_PATTERN
.
matcher
(
method
.
getName
());
if
(
m
.
matches
()
&&
(
method
.
getParameterTypes
().
length
==
0
))
{
getterMethods
.
add
(
method
);
}
}
// 返回getter方法列表
return
getterMethods
;
}
/**
* 检查Bean方法名中的属性名是否相等。<br>
* 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
*
* @param m1 方法名1
* @param m2 方法名2
* @return 属性名一样返回true,否则返回false
*/
public
static
boolean
isMethodPropEquals
(
String
m1
,
String
m2
)
{
return
m1
.
substring
(
BEAN_METHOD_PROP_INDEX
).
equals
(
m2
.
substring
(
BEAN_METHOD_PROP_INDEX
));
}
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/ExportExcel.java
0 → 100644
View file @
d5ba54ba
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Method
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.servlet.http.HttpServletResponse
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.ss.usermodel.Cell
;
import
org.apache.poi.ss.usermodel.CellStyle
;
import
org.apache.poi.ss.usermodel.Comment
;
import
org.apache.poi.ss.usermodel.Font
;
import
org.apache.poi.ss.usermodel.IndexedColors
;
import
org.apache.poi.ss.usermodel.Row
;
import
org.apache.poi.ss.usermodel.Sheet
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.apache.poi.ss.util.CellRangeAddress
;
import
org.apache.poi.xssf.streaming.SXSSFWorkbook
;
import
org.apache.poi.xssf.usermodel.XSSFClientAnchor
;
import
org.apache.poi.xssf.usermodel.XSSFRichTextString
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.google.common.collect.Lists
;
import
com.jeespring.common.utils.Encodes
;
import
com.jeespring.common.utils.Reflections
;
import
com.jeespring.common.utils.excel.annotation.ExcelField
;
import
com.jeespring.modules.sys.utils.DictUtils
;
/**
* 导出Excel文件(导出“XLSX”格式,支持大数据量导出 @see org.apache.poi.ss.SpreadsheetVersion)
* @author 黄炳桂 516821420@qq.com
* @version 2013-04-21
*/
public
class
ExportExcel
{
private
static
Logger
log
=
LoggerFactory
.
getLogger
(
ExportExcel
.
class
);
/**
* 工作薄对象
*/
private
SXSSFWorkbook
wb
;
/**
* 工作表对象
*/
private
Sheet
sheet
;
/**
* 样式列表
*/
private
Map
<
String
,
CellStyle
>
styles
;
/**
* 当前行号
*/
private
int
rownum
;
/**
* 注解列表(Object[]{ ExcelField, Field/Method })
*/
List
<
Object
[]>
annotationList
=
Lists
.
newArrayList
();
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param cls 实体对象,通过annotation.ExportField获取标题
*/
public
ExportExcel
(
String
title
,
Class
<?>
cls
){
this
(
title
,
cls
,
1
);
}
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param cls 实体对象,通过annotation.ExportField获取标题
* @param type 导出类型(1:导出数据;2:导出模板)
* @param groups 导入分组
*/
public
ExportExcel
(
String
title
,
Class
<?>
cls
,
int
type
,
int
...
groups
){
// Get annotation field
Field
[]
fs
=
cls
.
getDeclaredFields
();
for
(
Field
f
:
fs
){
ExcelField
ef
=
f
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
type
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
}
}
}
// Get annotation method
Method
[]
ms
=
cls
.
getDeclaredMethods
();
for
(
Method
m
:
ms
){
ExcelField
ef
=
m
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
type
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
}
}
}
// Field sorting
Collections
.
sort
(
annotationList
,
new
Comparator
<
Object
[]>()
{
@Override
public
int
compare
(
Object
[]
o1
,
Object
[]
o2
)
{
return
new
Integer
(((
ExcelField
)
o1
[
0
]).
sort
()).
compareTo
(
new
Integer
(((
ExcelField
)
o2
[
0
]).
sort
()));
};
});
// Initialize
List
<
String
>
headerList
=
Lists
.
newArrayList
();
for
(
Object
[]
os
:
annotationList
){
String
t
=
((
ExcelField
)
os
[
0
]).
title
();
// 如果是导出,则去掉注释
if
(
type
==
1
){
String
[]
ss
=
StringUtils
.
split
(
t
,
"**"
,
2
);
if
(
ss
.
length
==
2
){
t
=
ss
[
0
];
}
}
headerList
.
add
(
t
);
}
initialize
(
title
,
headerList
);
}
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param headers 表头数组
*/
public
ExportExcel
(
String
title
,
String
[]
headers
)
{
initialize
(
title
,
Lists
.
newArrayList
(
headers
));
}
/**
* 构造函数
* @param title 表格标题,传“空值”,表示无标题
* @param headerList 表头列表
*/
public
ExportExcel
(
String
title
,
List
<
String
>
headerList
)
{
initialize
(
title
,
headerList
);
}
/**
* 初始化函数
* @param title 表格标题,传“空值”,表示无标题
* @param headerList 表头列表
*/
private
void
initialize
(
String
title
,
List
<
String
>
headerList
)
{
this
.
wb
=
new
SXSSFWorkbook
(
500
);
this
.
sheet
=
wb
.
createSheet
(
"Export"
);
this
.
styles
=
createStyles
(
wb
);
// Create title
if
(
StringUtils
.
isNotBlank
(
title
)){
Row
titleRow
=
sheet
.
createRow
(
rownum
++);
titleRow
.
setHeightInPoints
(
30
);
Cell
titleCell
=
titleRow
.
createCell
(
0
);
titleCell
.
setCellStyle
(
styles
.
get
(
"title"
));
titleCell
.
setCellValue
(
title
);
sheet
.
addMergedRegion
(
new
CellRangeAddress
(
titleRow
.
getRowNum
(),
titleRow
.
getRowNum
(),
titleRow
.
getRowNum
(),
headerList
.
size
()-
1
));
}
// Create header
if
(
headerList
==
null
){
throw
new
RuntimeException
(
"headerList not null!"
);
}
Row
headerRow
=
sheet
.
createRow
(
rownum
++);
headerRow
.
setHeightInPoints
(
16
);
for
(
int
i
=
0
;
i
<
headerList
.
size
();
i
++)
{
Cell
cell
=
headerRow
.
createCell
(
i
);
cell
.
setCellStyle
(
styles
.
get
(
"header"
));
String
[]
ss
=
StringUtils
.
split
(
headerList
.
get
(
i
),
"**"
,
2
);
if
(
ss
.
length
==
2
){
cell
.
setCellValue
(
ss
[
0
]);
Comment
comment
=
this
.
sheet
.
createDrawingPatriarch
().
createCellComment
(
new
XSSFClientAnchor
(
0
,
0
,
0
,
0
,
(
short
)
3
,
3
,
(
short
)
5
,
6
));
comment
.
setString
(
new
XSSFRichTextString
(
ss
[
1
]));
cell
.
setCellComment
(
comment
);
}
else
{
cell
.
setCellValue
(
headerList
.
get
(
i
));
}
sheet
.
autoSizeColumn
(
i
);
}
for
(
int
i
=
0
;
i
<
headerList
.
size
();
i
++)
{
int
colWidth
=
sheet
.
getColumnWidth
(
i
)*
2
;
sheet
.
setColumnWidth
(
i
,
colWidth
<
3000
?
3000
:
colWidth
);
}
log
.
debug
(
"Initialize success."
);
}
/**
* 创建表格样式
* @param wb 工作薄对象
* @return 样式列表
*/
private
Map
<
String
,
CellStyle
>
createStyles
(
Workbook
wb
)
{
Map
<
String
,
CellStyle
>
styles
=
new
HashMap
<
String
,
CellStyle
>();
CellStyle
style
=
wb
.
createCellStyle
();
style
.
setAlignment
(
CellStyle
.
ALIGN_CENTER
);
style
.
setVerticalAlignment
(
CellStyle
.
VERTICAL_CENTER
);
Font
titleFont
=
wb
.
createFont
();
titleFont
.
setFontName
(
"Arial"
);
titleFont
.
setFontHeightInPoints
((
short
)
16
);
titleFont
.
setBoldweight
(
Font
.
BOLDWEIGHT_BOLD
);
style
.
setFont
(
titleFont
);
styles
.
put
(
"title"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
setVerticalAlignment
(
CellStyle
.
VERTICAL_CENTER
);
style
.
setBorderRight
(
CellStyle
.
BORDER_THIN
);
style
.
setRightBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderLeft
(
CellStyle
.
BORDER_THIN
);
style
.
setLeftBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderTop
(
CellStyle
.
BORDER_THIN
);
style
.
setTopBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setBorderBottom
(
CellStyle
.
BORDER_THIN
);
style
.
setBottomBorderColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
Font
dataFont
=
wb
.
createFont
();
dataFont
.
setFontName
(
"Arial"
);
dataFont
.
setFontHeightInPoints
((
short
)
10
);
style
.
setFont
(
dataFont
);
styles
.
put
(
"data"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
CellStyle
.
ALIGN_LEFT
);
styles
.
put
(
"data1"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
CellStyle
.
ALIGN_CENTER
);
styles
.
put
(
"data2"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
style
.
setAlignment
(
CellStyle
.
ALIGN_RIGHT
);
styles
.
put
(
"data3"
,
style
);
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
));
// style.setWrapText(true);
style
.
setAlignment
(
CellStyle
.
ALIGN_CENTER
);
style
.
setFillForegroundColor
(
IndexedColors
.
GREY_50_PERCENT
.
getIndex
());
style
.
setFillPattern
(
CellStyle
.
SOLID_FOREGROUND
);
Font
headerFont
=
wb
.
createFont
();
headerFont
.
setFontName
(
"Arial"
);
headerFont
.
setFontHeightInPoints
((
short
)
10
);
headerFont
.
setBoldweight
(
Font
.
BOLDWEIGHT_BOLD
);
headerFont
.
setColor
(
IndexedColors
.
WHITE
.
getIndex
());
style
.
setFont
(
headerFont
);
styles
.
put
(
"header"
,
style
);
return
styles
;
}
/**
* 添加一行
* @return 行对象
*/
public
Row
addRow
(){
return
sheet
.
createRow
(
rownum
++);
}
/**
* 添加一个单元格
* @param row 添加的行
* @param column 添加列号
* @param val 添加值
* @return 单元格对象
*/
public
Cell
addCell
(
Row
row
,
int
column
,
Object
val
){
return
this
.
addCell
(
row
,
column
,
val
,
0
,
Class
.
class
);
}
/**
* 添加一个单元格
* @param row 添加的行
* @param column 添加列号
* @param val 添加值
* @param align 对齐方式(1:靠左;2:居中;3:靠右)
* @return 单元格对象
*/
public
Cell
addCell
(
Row
row
,
int
column
,
Object
val
,
int
align
,
Class
<?>
fieldType
){
Cell
cell
=
row
.
createCell
(
column
);
String
cellFormatString
=
"@"
;
try
{
if
(
val
==
null
){
cell
.
setCellValue
(
""
);
}
else
if
(
fieldType
!=
Class
.
class
){
cell
.
setCellValue
((
String
)
fieldType
.
getMethod
(
"setValue"
,
Object
.
class
).
invoke
(
null
,
val
));
}
else
{
if
(
val
instanceof
String
)
{
cell
.
setCellValue
((
String
)
val
);
}
else
if
(
val
instanceof
Integer
)
{
cell
.
setCellValue
((
Integer
)
val
);
cellFormatString
=
"0"
;
}
else
if
(
val
instanceof
Long
)
{
cell
.
setCellValue
((
Long
)
val
);
cellFormatString
=
"0"
;
}
else
if
(
val
instanceof
Double
)
{
cell
.
setCellValue
((
Double
)
val
);
cellFormatString
=
"0.00"
;
}
else
if
(
val
instanceof
Float
)
{
cell
.
setCellValue
((
Float
)
val
);
cellFormatString
=
"0.00"
;
}
else
if
(
val
instanceof
Date
)
{
cell
.
setCellValue
((
Date
)
val
);
cellFormatString
=
"yyyy-MM-dd HH:mm"
;
}
else
{
cell
.
setCellValue
((
String
)
Class
.
forName
(
this
.
getClass
().
getName
().
replaceAll
(
this
.
getClass
().
getSimpleName
(),
"fieldtype."
+
val
.
getClass
().
getSimpleName
()+
"Type"
)).
getMethod
(
"setValue"
,
Object
.
class
).
invoke
(
null
,
val
));
}
}
if
(
val
!=
null
){
CellStyle
style
=
styles
.
get
(
"data_column_"
+
column
);
if
(
style
==
null
){
style
=
wb
.
createCellStyle
();
style
.
cloneStyleFrom
(
styles
.
get
(
"data"
+(
align
>=
1
&&
align
<=
3
?
align:
""
)));
style
.
setDataFormat
(
wb
.
createDataFormat
().
getFormat
(
cellFormatString
));
styles
.
put
(
"data_column_"
+
column
,
style
);
}
cell
.
setCellStyle
(
style
);
}
}
catch
(
Exception
ex
)
{
log
.
info
(
"Set cell value ["
+
row
.
getRowNum
()+
","
+
column
+
"] error: "
+
ex
.
toString
());
cell
.
setCellValue
(
val
.
toString
());
}
return
cell
;
}
/**
* 添加数据(通过annotation.ExportField添加数据)
* @return list 数据列表
*/
public
<
E
>
ExportExcel
setDataList
(
List
<
E
>
list
){
for
(
E
e
:
list
){
int
colunm
=
0
;
Row
row
=
this
.
addRow
();
StringBuilder
sb
=
new
StringBuilder
();
for
(
Object
[]
os
:
annotationList
){
ExcelField
ef
=
(
ExcelField
)
os
[
0
];
Object
val
=
null
;
// Get entity value
try
{
if
(
StringUtils
.
isNotBlank
(
ef
.
value
())){
val
=
Reflections
.
invokeGetter
(
e
,
ef
.
value
());
}
else
{
if
(
os
[
1
]
instanceof
Field
){
val
=
Reflections
.
invokeGetter
(
e
,
((
Field
)
os
[
1
]).
getName
());
}
else
if
(
os
[
1
]
instanceof
Method
){
val
=
Reflections
.
invokeMethod
(
e
,
((
Method
)
os
[
1
]).
getName
(),
new
Class
[]
{},
new
Object
[]
{});
}
}
// If is dict, get dict label
if
(
StringUtils
.
isNotBlank
(
ef
.
dictType
())){
val
=
DictUtils
.
getDictLabel
(
val
==
null
?
""
:
val
.
toString
(),
ef
.
dictType
(),
""
);
}
}
catch
(
Exception
ex
)
{
// Failure to ignore
log
.
info
(
ex
.
toString
());
val
=
""
;
}
this
.
addCell
(
row
,
colunm
++,
val
,
ef
.
align
(),
ef
.
fieldType
());
sb
.
append
(
val
+
", "
);
}
log
.
debug
(
"Write success: ["
+
row
.
getRowNum
()+
"] "
+
sb
.
toString
());
}
return
this
;
}
/**
* 输出数据流
* @param os 输出数据流
*/
public
ExportExcel
write
(
OutputStream
os
)
throws
IOException
{
wb
.
write
(
os
);
return
this
;
}
/**
* 输出到客户端
* @param fileName 输出文件名
*/
public
ExportExcel
write
(
HttpServletResponse
response
,
String
fileName
)
throws
IOException
{
response
.
reset
();
response
.
setContentType
(
"application/octet-stream; charset=utf-8"
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment; filename="
+
Encodes
.
urlEncode
(
fileName
));
write
(
response
.
getOutputStream
());
return
this
;
}
/**
* 输出到文件
* @param fileName 输出文件名
*/
public
ExportExcel
writeFile
(
String
name
)
throws
FileNotFoundException
,
IOException
{
FileOutputStream
os
=
new
FileOutputStream
(
name
);
this
.
write
(
os
);
return
this
;
}
/**
* 清理临时文件
*/
public
ExportExcel
dispose
(){
wb
.
dispose
();
return
this
;
}
// /**
// * 导出测试
// */
// public static void main(String[] args) throws Throwable {
//
// List<String> headerList = Lists.newArrayList();
// for (int i = 1; i <= 10; i++) {
// headerList.add("表头"+i);
// }
//
// List<String> dataRowList = Lists.newArrayList();
// for (int i = 1; i <= headerList.size(); i++) {
// dataRowList.add("数据"+i);
// }
//
// List<List<String>> dataList = Lists.newArrayList();
// for (int i = 1; i <=1000000; i++) {
// dataList.add(dataRowList);
// }
//
// ExportExcel ee = new ExportExcel("表格标题", headerList);
//
// for (int i = 0; i < dataList.size(); i++) {
// Row row = ee.addRow();
// for (int j = 0; j < dataList.get(i).size(); j++) {
// ee.addCell(row, j, dataList.get(i).get(j));
// }
// }
//
// ee.writeFile("target/export.xlsx");
//
// ee.dispose();
//
// log.debug("Export success.");
//
// }
}
JeeSpringCloud/src/main/java/com/jeespring/common/utils/excel/ImportExcel.java
0 → 100644
View file @
d5ba54ba
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.utils.excel
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.lang.reflect.Field
;
import
java.lang.reflect.Method
;
import
java.util.Collections
;
import
java.util.Comparator
;
import
java.util.Date
;
import
java.util.List
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.hssf.usermodel.HSSFWorkbook
;
import
org.apache.poi.openxml4j.exceptions.InvalidFormatException
;
import
org.apache.poi.ss.usermodel.Cell
;
import
org.apache.poi.ss.usermodel.DateUtil
;
import
org.apache.poi.ss.usermodel.Row
;
import
org.apache.poi.ss.usermodel.Sheet
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.apache.poi.xssf.usermodel.XSSFWorkbook
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.web.multipart.MultipartFile
;
import
com.google.common.collect.Lists
;
import
com.jeespring.common.utils.Reflections
;
import
com.jeespring.common.utils.excel.annotation.ExcelField
;
import
com.jeespring.modules.sys.utils.DictUtils
;
/**
* 导入Excel文件(支持“XLS”和“XLSX”格式)
* @author 黄炳桂 516821420@qq.com
* @version 2013-03-10
*/
public
class
ImportExcel
{
private
static
Logger
log
=
LoggerFactory
.
getLogger
(
ImportExcel
.
class
);
/**
* 工作薄对象
*/
private
Workbook
wb
;
/**
* 工作表对象
*/
private
Sheet
sheet
;
/**
* 标题行号
*/
private
int
headerNum
;
/**
* 构造函数
* @param path 导入文件,读取第一个工作表
* @param headerNum 标题行号,数据行号=标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
String
fileName
,
int
headerNum
)
throws
InvalidFormatException
,
IOException
{
this
(
new
File
(
fileName
),
headerNum
);
}
/**
* 构造函数
* @param path 导入文件对象,读取第一个工作表
* @param headerNum 标题行号,数据行号=标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
File
file
,
int
headerNum
)
throws
InvalidFormatException
,
IOException
{
this
(
file
,
headerNum
,
0
);
}
/**
* 构造函数
* @param path 导入文件
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
String
fileName
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
this
(
new
File
(
fileName
),
headerNum
,
sheetIndex
);
}
/**
* 构造函数
* @param path 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
File
file
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
this
(
file
.
getName
(),
new
FileInputStream
(
file
),
headerNum
,
sheetIndex
);
}
/**
* 构造函数
* @param file 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
MultipartFile
multipartFile
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
this
(
multipartFile
.
getOriginalFilename
(),
multipartFile
.
getInputStream
(),
headerNum
,
sheetIndex
);
}
/**
* 构造函数
* @param path 导入文件对象
* @param headerNum 标题行号,数据行号=标题行号+1
* @param sheetIndex 工作表编号
* @throws InvalidFormatException
* @throws IOException
*/
public
ImportExcel
(
String
fileName
,
InputStream
is
,
int
headerNum
,
int
sheetIndex
)
throws
InvalidFormatException
,
IOException
{
if
(
StringUtils
.
isBlank
(
fileName
)){
throw
new
RuntimeException
(
"导入文档为空!"
);
}
else
if
(
fileName
.
toLowerCase
().
endsWith
(
"xls"
)){
this
.
wb
=
new
HSSFWorkbook
(
is
);
}
else
if
(
fileName
.
toLowerCase
().
endsWith
(
"xlsx"
)){
this
.
wb
=
new
XSSFWorkbook
(
is
);
}
else
{
throw
new
RuntimeException
(
"文档格式不正确!"
);
}
if
(
this
.
wb
.
getNumberOfSheets
()<
sheetIndex
){
throw
new
RuntimeException
(
"文档中没有工作表!"
);
}
this
.
sheet
=
this
.
wb
.
getSheetAt
(
sheetIndex
);
this
.
headerNum
=
headerNum
;
log
.
debug
(
"Initialize success."
);
}
/**
* 获取行对象
* @param rownum
* @return
*/
public
Row
getRow
(
int
rownum
){
return
this
.
sheet
.
getRow
(
rownum
);
}
/**
* 获取数据行号
* @return
*/
public
int
getDataRowNum
(){
return
headerNum
+
1
;
}
/**
* 获取最后一个数据行号
* @return
*/
public
int
getLastDataRowNum
(){
return
this
.
sheet
.
getLastRowNum
()+
headerNum
;
}
/**
* 获取最后一个列号
* @return
*/
public
int
getLastCellNum
(){
return
this
.
getRow
(
headerNum
).
getLastCellNum
();
}
/**
* 获取单元格值
* @param row 获取的行
* @param column 获取单元格列号
* @return 单元格值
*/
public
Object
getCellValue
(
Row
row
,
int
column
){
Object
val
=
""
;
try
{
Cell
cell
=
row
.
getCell
(
column
);
if
(
cell
!=
null
){
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_NUMERIC
){
val
=
cell
.
getNumericCellValue
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_STRING
){
val
=
cell
.
getStringCellValue
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_FORMULA
){
val
=
cell
.
getCellFormula
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_BOOLEAN
){
val
=
cell
.
getBooleanCellValue
();
}
else
if
(
cell
.
getCellType
()
==
Cell
.
CELL_TYPE_ERROR
){
val
=
cell
.
getErrorCellValue
();
}
}
}
catch
(
Exception
e
)
{
return
val
;
}
return
val
;
}
/**
* 获取导入数据列表
* @param cls 导入对象类型
* @param groups 导入分组
*/
public
<
E
>
List
<
E
>
getDataList
(
Class
<
E
>
cls
,
int
...
groups
)
throws
InstantiationException
,
IllegalAccessException
{
List
<
Object
[]>
annotationList
=
Lists
.
newArrayList
();
// Get annotation field
Field
[]
fs
=
cls
.
getDeclaredFields
();
for
(
Field
f
:
fs
){
ExcelField
ef
=
f
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
2
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
f
});
}
}
}
// Get annotation method
Method
[]
ms
=
cls
.
getDeclaredMethods
();
for
(
Method
m
:
ms
){
ExcelField
ef
=
m
.
getAnnotation
(
ExcelField
.
class
);
if
(
ef
!=
null
&&
(
ef
.
type
()==
0
||
ef
.
type
()==
2
)){
if
(
groups
!=
null
&&
groups
.
length
>
0
){
boolean
inGroup
=
false
;
for
(
int
g
:
groups
){
if
(
inGroup
){
break
;
}
for
(
int
efg
:
ef
.
groups
()){
if
(
g
==
efg
){
inGroup
=
true
;
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
break
;
}
}
}
}
else
{
annotationList
.
add
(
new
Object
[]{
ef
,
m
});
}
}
}
// Field sorting
Collections
.
sort
(
annotationList
,
new
Comparator
<
Object
[]>()
{
@Override
public
int
compare
(
Object
[]
o1
,
Object
[]
o2
)
{
return
new
Integer
(((
ExcelField
)
o1
[
0
]).
sort
()).
compareTo
(
new
Integer
(((
ExcelField
)
o2
[
0
]).
sort
()));
};
});
//log.debug("Import column count:"+annotationList.size());
// Get excel data
List
<
E
>
dataList
=
Lists
.
newArrayList
();
for
(
int
i
=
this
.
getDataRowNum
();
i
<
this
.
getLastDataRowNum
();
i
++)
{
E
e
=
cls
.
newInstance
();
int
column
=
0
;
Row
row
=
this
.
getRow
(
i
);
StringBuilder
sb
=
new
StringBuilder
();
for
(
Object
[]
os
:
annotationList
){
Object
val
=
this
.
getCellValue
(
row
,
column
++);
if
(
val
!=
null
){
ExcelField
ef
=
(
ExcelField
)
os
[
0
];
// If is dict type, get dict value
if
(
StringUtils
.
isNotBlank
(
ef
.
dictType
())){
val
=
DictUtils
.
getDictValue
(
val
.
toString
(),
ef
.
dictType
(),
""
);
//log.debug("Dictionary type value: ["+i+","+colunm+"] " + val);
}
// Get param type and type cast
Class
<?>
valType
=
Class
.
class
;
if
(
os
[
1
]
instanceof
Field
){
valType
=
((
Field
)
os
[
1
]).
getType
();
}
else
if
(
os
[
1
]
instanceof
Method
){
Method
method
=
((
Method
)
os
[
1
]);
if
(
"get"
.
equals
(
method
.
getName
().
substring
(
0
,
3
))){
valType
=
method
.
getReturnType
();
}
else
if
(
"set"
.
equals
(
method
.
getName
().
substring
(
0
,
3
))){
valType
=
((
Method
)
os
[
1
]).
getParameterTypes
()[
0
];
}
}
//log.debug("Import value type: ["+i+","+column+"] " + valType);
try
{
if
(
valType
==
String
.
class
){
String
s
=
String
.
valueOf
(
val
.
toString
());
if
(
StringUtils
.
endsWith
(
s
,
".0"
)){
val
=
StringUtils
.
substringBefore
(
s
,
".0"
);
}
else
{
val
=
String
.
valueOf
(
val
.
toString
());
}
}
else
if
(
valType
==
Integer
.
class
){
val
=
Double
.
valueOf
(
val
.
toString
()).
intValue
();
}
else
if
(
valType
==
Long
.
class
){
val
=
Double
.
valueOf
(
val
.
toString
()).
longValue
();
}
else
if
(
valType
==
Double
.
class
){
val
=
Double
.
valueOf
(
val
.
toString
());
}
else
if
(
valType
==
Float
.
class
){
val
=
Float
.
valueOf
(
val
.
toString
());
}
else
if
(
valType
==
Date
.
class
){
val
=
DateUtil
.
getJavaDate
((
Double
)
val
);
}
else
{
if
(
ef
.
fieldType
()
!=
Class
.
class
){
val
=
ef
.
fieldType
().
getMethod
(
"getValue"
,
String
.
class
).
invoke
(
null
,
val
.
toString
());
}
else
{
val
=
Class
.
forName
(
this
.
getClass
().
getName
().
replaceAll
(
this
.
getClass
().
getSimpleName
(),
"fieldtype."
+
valType
.
getSimpleName
()+
"Type"
)).
getMethod
(
"getValue"
,
String
.
class
).
invoke
(
null
,
val
.
toString
());
}
}
}
catch
(
Exception
ex
)
{
log
.
info
(
"Get cell value ["
+
i
+
","
+
column
+
"] error: "
+
ex
.
toString
());
val
=
null
;
}
// set entity value
if
(
os
[
1
]
instanceof
Field
){
Reflections
.
invokeSetter
(
e
,
((
Field
)
os
[
1
]).
getName
(),
val
);
}
else
if
(
os
[
1
]
instanceof
Method
){
String
mthodName
=
((
Method
)
os
[
1
]).
getName
();
if
(
"get"
.
equals
(
mthodName
.
substring
(
0
,
3
))){
mthodName
=
"set"
+
StringUtils
.
substringAfter
(
mthodName
,
"get"
);
}
Reflections
.
invokeMethod
(
e
,
mthodName
,
new
Class
[]
{
valType
},
new
Object
[]
{
val
});
}
}
sb
.
append
(
val
+
", "
);
}
dataList
.
add
(
e
);
log
.
debug
(
"Read success: ["
+
i
+
"] "
+
sb
.
toString
());
}
return
dataList
;
}
// /**
// * 导入测试
// */
// public static void main(String[] args) throws Throwable {
//
// ImportExcel ei = new ImportExcel("target/export.xlsx", 1);
//
// for (int i = ei.getDataRowNum(); i < ei.getLastDataRowNum(); i++) {
// Row row = ei.getRow(i);
// for (int j = 0; j < ei.getLastCellNum(); j++) {
// Object val = ei.getCellValue(row, j);
// System.out.print(val+", ");
// }
// System.out.print("\n");
// }
//
// }
}
Prev
1
…
5
6
7
8
9
10
11
12
13
…
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