* @author jinqingmo
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface FieldTypeAnnotation {
public String module() default "moduledesc";
public String value() default "classdesc";
}
/** 方法注解
* @author jinqingmo
*
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyAnnotationMethod {
public String desc() default "methoddesc";
}
新建一个全局拦截器,在intercept(Invocation inv)方法中
HttpServletRequest request = inv.getController().getRequest();
Class clz = inv.getController().getClass();
boolean clzHasNnno = clz.isAnnotationPresent(FieldTypeAnnotation.class);
if (clzHasNnno) {
FieldTypeAnnotation annotation = (FieldTypeAnnotation) clz.getAnnotation(FieldTypeAnnotation.class);
moduleDesc = annotation.module(); //类注解
classDesc = annotation.value();//类注解
}
取方法注解值
Method[] methods = clz.getDeclaredMethods();
for (Method methodtest : methods) {
boolean methodHasAnno = methodtest.isAnnotationPresent(MyAnnotationMethod.class);
if (methodHasAnno) {
MyAnnotationMethod methodAnno = methodtest.getAnnotation(MyAnnotationMethod.class);
if (methodtest.getName().equals(methodName)) {
methodDesc = methodAnno.desc();
}
}
}
/**
* 获取客户端IP地址
*
* @param request
* @return
*/
public static String getIpAddr(HttpServletRequest request) {
// String ip="";
// 1.首先考虑有反向代理的情况,如果有代理,通过“x-forwarded-for”获取真实ip地址
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/**
* 获取浏览器版本信息
*
* @param request
* @return
*/
public static String getBrowser(HttpServletRequest request) {
String browserDetails = request.getHeader("User-Agent");
String userAgent = browserDetails;
if(userAgent!=null) {
String user = userAgent.toLowerCase();
String browser = "";
if (user.contains("edge")) {
browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
} else if (user.contains("msie")) {
String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
} else if (user.contains("safari") && user.contains("version")) {
browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0] + "-"
+ (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
} else if (user.contains("opr") || user.contains("opera")) {
if (user.contains("opera")) {
browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0] + "-"
+ (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
} else if (user.contains("opr")) {
browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
.replace("OPR", "Opera");
}
} else if (user.contains("chrome")) {
browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
} else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1)
|| (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1)
|| (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1)) {
browser = "Netscape-?";
} else if (user.contains("firefox")) {
browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
} else if (user.contains("rv")) {
String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
} else {
browser = "UnKnown, More-Info: " + userAgent;
}
return browser;
}
return null;
}
/**
* 获取操作系统信息
*
* @param request
* @return
*/
public static String getOs(HttpServletRequest request) {
String browserDetails = request.getHeader("User-Agent");
String userAgent = browserDetails;
String os = "";
if (userAgent.toLowerCase().indexOf("windows") >= 0) {
os = "Windows";
} else if (userAgent.toLowerCase().indexOf("mac") >= 0) {
os = "Mac";
} else if (userAgent.toLowerCase().indexOf("x11") >= 0) {
os = "Unix";
} else if (userAgent.toLowerCase().indexOf("android") >= 0) {
os = "Android";
} else if (userAgent.toLowerCase().indexOf("iphone") >= 0) {
os = "IPhone";
} else {
os = "UnKnown, More-Info: " + userAgent;
}
return os;
}
1.java中元注解有四个:@Retention @Target @Document @Inherited;
1)@Retention:注解的保留位置(有三个值,枚举类型)
2)@Retention(RetentionPolicy.SOURCE)
//注解仅存在于源码中,在class字节码档中不包含
3) @Retention(RetentionPolicy.CLASS)
// 默认的保留策略,注解会在class字节码档中存在,但运行时无法获得。
4) @Retention(RetentionPolicy.RUNTIME)
// 注解会在class字节码档中存在,在运行时可以通过反射获取到。
2.@Target:注解的作用目标
@Target(ElementType.TYPE) //界面、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD)//方法
@Target(ElementType.PARAMETER)//方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE)///包
3. @Document:说明该注解将被包含在javadoc中
4. @Inherited:说明子类可以继承父类中的该注解
Annotation []aArray=Class.forName("Test").getMethod("info").getAnnotations(); //获取Class实例的方法1
for(Annotation an : aArray){
system.out.println(an);
}
建议定一个注解,将需要记录日志的地方通过注解表示,并且配置当前操作相关信息,比如:新增用户,删除用户,更新用户。
然后做一个拦截器或者AOP,读取拦截方法的日志注解,并且读取配置的注解信息,如果你要记录请求的详细信息,可以把所有的请求参数都保存到数据库,为了确保日志记录不印象正常的业务流程或者执行效率,可以考虑采取异步执行的方式(具体可以看看jdk的Executor),这样就可以在不印象正常业务的情况下记录日志。
获得客户端真实IP地址的方法一:
1. public String getRemortIP(HttpServletRequest request) {
2. if (request.getHeader("x-forwarded-for") == null) {
3. return request.getRemoteAddr();
4. }
5. return request.getHeader("x-forwarded-for");
6. }
获得客户端真实IP地址的方法二:
1. public String getIpAddr(HttpServletRequest request) {
2. String ip = request.getHeader("x-forwarded-for");
3. if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
4. ip = request.getHeader("Proxy-Client-IP");
5. }
6. if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
7. ip = request.getHeader("WL-Proxy-Client-IP");
8. }
9. if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
10. ip = request.getRemoteAddr();
11. }
12. return ip;
13. }
jfinal 获取服务器的IP和端口。
String serverIp =getRequest().getServerName();
Integer serverPort =getRequest().getServerPort();
一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double 等。
然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。
所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类Number 的子类。
xxxValue() 方法用于将 Number 对象转换为 xxx 数据类型的值并返回。相关的方法有:byteValue() ,doubleValue() ,floatValue(),intValue(),longValue(),shortValue()
null和""的区别
问题一:
null和""的区别
String s=null;
string.trim()就会抛出为空的exception
String s="";
string.trim()就不会抛,为什么?
答:NULL代表声明了一个空对象,根本就不是一个字符串。
""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。
NULL代表声明了一个空对象,对空对象做任何操作都不行的,除了=和==
""是一个字符串了,只是这个字符串里面没有内容了。