开发中遇到的问题及解决方法

  1. 用MAVEN模板新建项目时,要添加:archetypeCatalog-internal,否则很慢;

  2. GIT上新建项目:先在远程仓库建好项目,再checkout到本地编辑,然后提交;

  3. 从Tomcat 5.5.15开始,放入到session中的对象必须实现java.io.Serializable接口;

  4. <intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>加入URL接口;拦截需要的URL在controller处理;

  5. 文本域中有空格:将其放在一行;

  6. MAVEN仓库中可以直接下载JAR包;但是之后删除artifacts,用模块新建;

  7. 如果用“.”作为分隔的话,必须是如下写法,String.split(“\.”),这样才能正确的分隔开,不能用String.split(“.”);

  8. intellij web项目中的Facets 和 Artifacts有什么区别?
    答:Facets表示某个module有的特征,比如web、strtus2、spring、hibernate等;
    Artifacts是maven中的一个概念,表示某个module要如何打包,例如war exploded、war、jar、ear等等这种打包形式;一个module有了Artifacts就可以部署到应用服务器中了!

  9. on update action :当发现更新时的操作;
    选择update classes and resources on frame deactivation: 当IDEA 切换时的操作 (比如缩下去 打开网页) 选择update classes and resources也就是 自动编译 自动部署的功能 很多人说Intellij IDEA 不能自动编译 就是这个这个地方没设置好
    On frame deactivation:在你失去焦点的时候自动编译。
    例如:修改某文件后你直接切换到了浏览器,或者点了下别的。只要当前的intellij idea 不是焦点就会激活自动编译并更新文件动作。也就是说不用手动按ctrl+F9了。

  10. 调试:
    private static final Logger LOG = LoggerFactory.getLogger(OWLLogCreator.class);

  11. 使用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

  12. 导入新的SDK后,需要重置Artifacts;

  13. JAVA解析JSON数据:

  14. RSA非对称加密内容长度有限制,1024位key的最多只能加密127位数据,否则就会报错(javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes)

  15. 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));
    }
  16. When you create cipher with default parameters, it defaults to “RSA/ECB/PKCS1Padding”.

  17. RSA加解密:
    1024位的证书,加密时最大支持117个字节,解密时为128;
    2048位的证书,加密时最大支持245个字节,解密时为256。
    加密时支持的最大字节数:证书位数/8 -11(比如:2048位的证书,支持的最大加密字节数:2048/8 - 11 = 245)

  1. 绕过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);
    }
  2. 遍历MAP

    1
    2
    for(Map.Entry<String, Object> entry:map.entrySet()){
    System.out.println(entry.getKey()+"--->"+entry.getValue());}
  3. 以下是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报错;
  4. java中如何将对象转成json格式字符串:

    1
    2
    3
    Person person=new Person();
    Gson gson=new Gson();
    String json=gson.toJson(person);
  5. dos命令目录中不能有空格:在带有空格的参数开始和结尾 加上””双引号。

  6. 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的时候,会自动去找对应的文件
  7. @ResponseBody:
    作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
    使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

  8. java中如何忽略字符串中的转义字符:
    String s2 = StringEscapeUtils.unescapeJava(s);

  9. @Autowired不用写配置文件完成层与层之间的调用;

  10. 解决多个controller的路径问题:
    ${pageContext.request.contextPath} JSP取得绝对路径
    <c:set var="contextPath" value="${pageContext.request.contextPath}" scope="application"/>

  11. 版本号等常量值可以写一个接口,便于修改;

  12. 在 WEB.XML配置<mime-mapping>实现浏览器根据文件类型自动打开。我们用浏览器打开文件的时候会发现如果是doc文件, 会用记事本打开,出现乱码, 但是如果在web.xml里面配置了类型,浏览器就会根据配置的类型自动调用相应的程序打。

  13. Spring-mvc Unable to find a default provider
    原因:在Spring-mvc.xml配置文件中使用了 “ mvc:annotation-driven “,而这个需要一个关于hibernate的jar包,在项目中引入 hibernate-validator-4.3.1.Final.jar 这个包之后,就可以正常启动了。

  14. IDEA每次新项目要在setting中把maven本地路径打钩;

  15. 转发和重定向的区别
    区别一:
      重定向时浏览器上的网址改变
      转发是浏览器上的网址不变
    区别二:
      重定向实际上产生了两次请求
    转发只有一次请求

  16. JAVA中接口中的接口方法默认是public的;

  17. LOG4J添加发送邮件功能时,遇到NoClassDefFoundError: javax/mail/MessagingException,原因是tomcat没有mail.jar包,引入即可;

  18. controller是按照顺序匹配的么?controller匹配URL规则是先按照最精确的匹配,然后按照通配符等;

  19. decorators.xml文件中标签配置:

    1
    2
    3
    <excludes>
    <pattern>/order/httplist*</pattern>
    </excludes>

表明以/order/httplist为前缀的页面不会被模板页decorate,

1. 例如,如果Controller中有一方法:
1
2
3
4
@RequestMapping(value = "/order/httplist")
public String httplist(Model model,@ModelAttribute("req") OrderReq
req,HttpServletRequest request){
}

则在响应form表单的httplist–action时,httplist.jsp页面不会被模板页decorate

2. 另外,如果直接通过

document.getElementById(“innerFrame”).src=targetEndpoint+”list?
province=”+outProvince+”&carrier=”+outCarrier;跳转到httplist.jsp页面,
则同样地,httplist.jsp页面也不会被模板页decorate.

  1. /这里面,BindResult result必须紧跟着前面的@ModelAttribute, 否则会出错

  2. Uncaught ReferenceError: $ is not defined:没有引入jQuery;

  3. 圈复杂度可以通过程序控制流图计算,公式为:V(G) = e + 2 - n
      e : 控制流图中边的数量
      n : 控制流图中节点的数量(包括起点和终点;所有终点只计算一次,多个return和throw算作一个节点)

  4. 窜数据:Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。变量的作用域,一共4种。pageScope: 表示变量只能在本页面使用。requestScope:表示变量能在本次请求中使用。sessionScope:表示变量能在本次会话中使用。applicationScope:表示变量能在整个应用程序中使用。

  5. @ModelAttribute注释的方法会在此controller每个方法执行前被执行

  6. 如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,否则就应该是非静态。因此像工具类,一般都是静态的。

  7. 根据设计原则,类与类之间的关系,最好是你不认识我,我不认识你,解耦~
    直接用静态,则破坏了这个原则~ ,另外是推荐使用接口编程的~

  8. 代码混乱->生产力下降->管理层增加更多人->新人对系统并不了解;

  9. 工具类Util应该是抽象的,私有的构造方法(不能new);

  10. 理论上, 任何的public的方法都要有测试;