- 用MAVEN模板新建项目时,要添加:archetypeCatalog-internal,否则很慢; 
- GIT上新建项目:先在远程仓库建好项目,再checkout到本地编辑,然后提交; 
- 从Tomcat 5.5.15开始,放入到session中的对象必须实现java.io.Serializable接口; 
- <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>加入URL接口;拦截需要的URL在controller处理;
- 文本域中有空格:将其放在一行; 
- MAVEN仓库中可以直接下载JAR包;但是之后删除artifacts,用模块新建; 
- 如果用“.”作为分隔的话,必须是如下写法,String.split(“\.”),这样才能正确的分隔开,不能用String.split(“.”); 
- intellij web项目中的Facets 和 Artifacts有什么区别? 
 答:Facets表示某个module有的特征,比如web、strtus2、spring、hibernate等;
 Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;一个module有了Artifacts就可以部署到应用服务器中了!
- on update action:当发现更新时的操作;
 选择update classes and resources on frame deactivation: 当IDEA 切换时的操作 (比如缩下去 打开网页) 选择update classes and resources也就是 自动编译 自动部署的功能 很多人说Intellij IDEA 不能自动编译 就是这个这个地方没设置好
 On frame deactivation:在你失去焦点的时候自动编译。
 例如:修改某文件后你直接切换到了浏览器,或者点了下别的。只要当前的intellij idea 不是焦点就会激活自动编译并更新文件动作。也就是说不用手动按ctrl+F9了。
- 调试: - private static final Logger LOG = LoggerFactory.getLogger(OWLLogCreator.class);
- 使用AES加密时,当密钥大于128时,代码会抛出 - Java.security.InvalidKeyException: Illegal key size or default parameters。
 解决办法:
 去掉这种限制需要下载Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files.网址如下。
 下载包的readme.txt 有安装说明。就是替换${java_home}/jre/lib/security/ 下面的- local_policy.jar和US_export_policy.jar
- 导入新的SDK后,需要重置Artifacts; 
- JAVA解析JSON数据: 
- RSA非对称加密内容长度有限制,1024位key的最多只能加密127位数据,否则就会报错( - javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes)
- Data must not be longer than 117 bytes异常 RSA加密解密内容超长报错在使用 RSA加密解密内容时会出现这样的异常 :- Data must not be longer than 117 bytes。
 解决办法是:分段加密和分段解密- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14- // 加密时超过117字节就报错。为此采用分段加密的办法来加密 
 byte[] enBytes = null;
 for (int i = 0; i < data.length; i += 64) {
 // 注意要使用2的倍数,否则会出现加密后的内容再解密时为乱码
 byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i,i + 64));
 enBytes = ArrayUtils.addAll(enBytes, doFinal);
 }
 // 解密时超过128字节就报错。为此采用分段解密的办法来解密
 StringBuilder sb = new StringBuilder();
 for (int i = 0; i < data.length; i += 128) {
 byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i, i + 128));
 sb.append(new String(doFinal));
 }
- When you create cipher with default parameters, it defaults to “RSA/ECB/PKCS1Padding”. 
- RSA加解密: 
 1024位的证书,加密时最大支持117个字节,解密时为128;
 2048位的证书,加密时最大支持245个字节,解密时为256。
 加密时支持的最大字节数:证书位数/8 -11(比如:2048位的证书,支持的最大加密字节数:2048/8 - 11 = 245)
- 绕过P+U直接放行 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13- private void saveSession(String username,String password) { 
 User user = new User(username,password);
 List<Privilege> privileges = new ArrayList<>();
 privileges.add(Privilege.COMPANY_ADMIN);
 user.setPrivileges(privileges);
 IdsUserDetails userDetails = new IdsUserDetails(user);
 final UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
 SecurityContextHolder.getContext().setAuthentication(auth);
 SecurityContextImpl securityContext = new SecurityContextImpl();
 securityContext.setAuthentication(auth);
 SpringSecurityHolder.setSecurityContext(securityContext);
 }
- 遍历MAP - 1 
 2- for(Map.Entry<String, Object> entry:map.entrySet()){ 
 System.out.println(entry.getKey()+"--->"+entry.getValue());}
- 以下是Java 判断字符串是否为空的四种方法: 
 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低:- if(s == null ||"".equals(s));
 方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法:- if(s == null || s.length() <= 0);
 方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二.- if(s == null || s.isEmpty());
 方法四: 这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多:- f (s == null || s == "");
 注意:s == null 是有必要存在的.
 如果 String 类型为null, 而去进行 equals(String) 或 length() 等操作会抛出- java.lang.NullPointerException.
 并且s==null 的顺序必须出现在前面,不然同样会抛出- java.lang.NullPointerException.
 如下Java代码:- 1 
 2
 3
 4
 5- String str = null; 
 if(str.equals("") || str= == null){//会抛出异常
 System.out.println("success");
 }
 // "".equals(str);后置确保不会遇null报错;
- java中如何将对象转成json格式字符串: - 1 
 2
 3- Person person=new Person(); 
 Gson gson=new Gson();
 String json=gson.toJson(person);
- dos命令目录中不能有空格:在带有空格的参数开始和结尾 加上””双引号。 
- HTML界面转JSP文件后CSS等不显示,因为资源被拦截,需要改配置: - 1 
 2
 3
 4
 5
 6- 1、 <mvc:resources>的理解使用 
 (1)web.xml配置
 1 <servlet> 2 <servlet-name>springMVC</servlet-name> 3 <servletclass>org.springframework.web.servlet.DispatcherServle</servlet-class> 4 <load-on-startup>1</load-on-startup> 5 </servlet> 6 <servlet-mapping> 7 <servlet-name>springMVC</servlet-name> 8 <url-pattern>/</url-pattern> 9 </servlet-mapping>
 这里设置了spring的拦截请求为/,并且会自动在web-inf下面扫描一个名为"springMVC-servlet.xml"的文件,由这个类org.springframework.web.servlet.DispatcherServlet去加载,当然也可以手动配置到listener中。
 (2)由于你拦截了所有请求,所以会影响到静态资源的获取,有两种方法。
 一,仍然拦截所有请求,<mvc:resources location="/WEB-INF/js/" mapping="/javascript/**" />然后设置标签映射,当你要引用/WEB-INF/js/文件夹下的文件时,可以直接引用/javascript/**.js,这样就会去location里面去找,大概原理就是spring在遇到这个标签,会把本地资源拦截并映射到mapping目录下,当你引用mapping的时候,会自动去找对应的文件
- @ResponseBody: 
 作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
 使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
- java中如何忽略字符串中的转义字符: - String s2 = StringEscapeUtils.unescapeJava(s);
- @Autowired不用写配置文件完成层与层之间的调用; 
- 解决多个controller的路径问题: - ${pageContext.request.contextPath} JSP取得绝对路径- <c:set var="contextPath" value="${pageContext.request.contextPath}" scope="application"/>
- 版本号等常量值可以写一个接口,便于修改; 
- 在 WEB.XML配置 - <mime-mapping>实现浏览器根据文件类型自动打开。我们用浏览器打开文件的时候会发现如果是doc文件, 会用记事本打开,出现乱码, 但是如果在web.xml里面配置了类型,浏览器就会根据配置的类型自动调用相应的程序打。
- Spring-mvc Unable to find a default provider
 原因:在Spring-mvc.xml配置文件中使用了 “ mvc:annotation-driven “,而这个需要一个关于hibernate的jar包,在项目中引入 hibernate-validator-4.3.1.Final.jar 这个包之后,就可以正常启动了。
- IDEA每次新项目要在setting中把maven本地路径打钩; 
- 转发和重定向的区别 
 区别一:
 重定向时浏览器上的网址改变
 转发是浏览器上的网址不变
 区别二:
 重定向实际上产生了两次请求
 转发只有一次请求
- JAVA中接口中的接口方法默认是public的; 
- LOG4J添加发送邮件功能时,遇到NoClassDefFoundError: javax/mail/MessagingException,原因是tomcat没有mail.jar包,引入即可; 
- controller是按照顺序匹配的么?controller匹配URL规则是先按照最精确的匹配,然后按照通配符等; 
- decorators.xml文件中标签配置: - 1 
 2
 3- <excludes> 
 <pattern>/order/httplist*</pattern>
 </excludes>
表明以/order/httplist为前缀的页面不会被模板页decorate,
1. 例如,如果Controller中有一方法:
| 1 | @RequestMapping(value = "/order/httplist") | 
则在响应form表单的httplist–action时,httplist.jsp页面不会被模板页decorate
2. 另外,如果直接通过
document.getElementById(“innerFrame”).src=targetEndpoint+”list?
province=”+outProvince+”&carrier=”+outCarrier;跳转到httplist.jsp页面,
则同样地,httplist.jsp页面也不会被模板页decorate.
- /这里面,BindResult result必须紧跟着前面的@ModelAttribute, 否则会出错
- Uncaught ReferenceError: $ is not defined:没有引入jQuery; 
- 圈复杂度可以通过程序控制流图计算,公式为:V(G) = e + 2 - n 
 e : 控制流图中边的数量
 n : 控制流图中节点的数量(包括起点和终点;所有终点只计算一次,多个return和throw算作一个节点)
- 窜数据:Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。变量的作用域,一共4种。pageScope: 表示变量只能在本页面使用。requestScope:表示变量能在本次请求中使用。sessionScope:表示变量能在本次会话中使用。applicationScope:表示变量能在整个应用程序中使用。 
- @ModelAttribute注释的方法会在此controller每个方法执行前被执行 
- 如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,否则就应该是非静态。因此像工具类,一般都是静态的。 
- 根据设计原则,类与类之间的关系,最好是你不认识我,我不认识你,解耦~ 
 直接用静态,则破坏了这个原则~ ,另外是推荐使用接口编程的~
- 代码混乱->生产力下降->管理层增加更多人->新人对系统并不了解; 
- 工具类Util应该是抽象的,私有的构造方法(不能new); 
- 理论上, 任何的public的方法都要有测试; 
 
        