用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
13private 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
2for(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
5String str = null;
if(str.equals("") || str= == null){//会抛出异常
System.out.println("success");
}
// "".equals(str);后置确保不会遇null报错;java中如何将对象转成json格式字符串:
1
2
3Person person=new Person();
Gson gson=new Gson();
String json=gson.toJson(person);dos命令目录中不能有空格:在带有空格的参数开始和结尾 加上””双引号。
HTML界面转JSP文件后CSS等不显示,因为资源被拦截,需要改配置:
1
2
3
4
5
61、 <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的方法都要有测试;