Spring那些不得不知的细节
1、SpringMVC拦截器的url-pattern和RequestMapping
案例:
url-pattern为/rest/* http请求为:/rest/query/id 那么requestMapping为:/query/id
2、post请求方式对MVC控制器的影响
Post请求的四种ContentType:
application/x-www-form-urlencoded 常规表单方式提交
multipart/form-data 带文件上传的表单
application/json Json格式文本
text/xml 一般文本,例如webservice
默认情况下大家接收参数用一个pojo,但是它只能接收get请求和post请求的application/x-www-form-urlencoded形式
如果使用json请求,那么请在参数前面加上@RequestBody
如果文件上传,请加上@MultiparyFile
附:json解析配置(jakson2.x)<mvc:annotation-driven>自动注入jakson的bean,转换器是为了保证编码问题
<!-- 处理请求返回json字符串的中文乱码问题 以及映射器、适配器和试图解析器的自动配置-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
3、web中url-pattern中的 / 与 /* 的问题
解:首先大家都知道"/*"可以匹配所有url,包括带扩展名的,一般只用在过滤器上。
而"/"很多人理解成不能拦截带扩展名的,这种理解是错误的!它其实也能拦截“.js”,“.css”,".png"等静态资源的访问。
看官方文档可知,它是tomcat的默认servlet,当其他的url-pattern匹配不上时都会走这个servlet。它除了能够处理静态资源还能够处理HTTP缓存请求,媒体(音频/视频)数据流和文件下载简历。所以如果我们的项目中配置了"/",会覆盖掉tomcat中的default servlet。
tomcat服务器的web.xml配置:
所以当springMVC的前端控制器配置为“/”时,需要在主配置文件中配置放行静态资源。
4、Spring提供了对properties文件读取的支持
配置文件加载属性文件:
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:resource/*.properties" />
配置文件中使用:${propertyName}
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="driverClassName" value="${jdbc.driver}" />
<property name="maxActive" value="10" />
<property name="minIdle" value="5" />
</bean>
Java程序中使用:Spring注解自动注入
@Value("${REDIS_KEY_CONTENT}")
private String REDIS_KEY_CONTENT;
5、Spring提供的md5加密,以后再也不用手写了
6、Spring的IOC容器
1)如果用了SpringMVC,并且容器分别由spring和springMVC管理,那么存在两个容器,MVC容器可以访问spring的,反之不可以。
2)MVC容器只能访问父容器的bean,不能访问properties属性。如图
7、SpringMVC中@ResponseBody返回中文乱码问题
默认处理:不经过视图解析器,而是经过转换器转换后直接输出(加<mvc:annotation-driven />)
如果遇到Object对象,默认会采用MappingJackson2HttpMessageConverter(这是jakson2.x的),而且编码自动是UTF-8,所以一般不用配置
如果遇到String对象,默认会采用StringHttpMessageConverter进行解析,但是默认编码是ISO8859-1
配置如下即可解决
<!-- 处理请求返回json字符串的中文乱码问题 以及映射器、适配器和试图解析器的自动配置 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
也可以这样,估计是内部自动转换的吧
<!-- 处理请求返回json字符串的中文乱码问题 以及映射器、适配器和试图解析器的自动配置 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
8、在Spring启动后执行立马执行某项任务,比如定时任务。
类似于在系统启动时做操作一样,只不过一个是ServletContextListener,而监听Spring的是InitializingBean
/**
* @Describtion: (执行任务调度). <br/>
* @date: 2018年6月9日 下午12:46:45 <br/>
* @author Beats <br/>
* @version v1.0 <br/>
* @since JDK 1.8
*/
@Component
public class SpringContextLisener implements InitializingBean { @Autowired ExamStatusScanner examStatusScanner; @Override
public void afterPropertiesSet() throws Exception {
//启动
examStatusScanner.run();
}
}
9、配置在spring项目中随时随地获取已经注册好的Bean。
某些情况下,一个类内部需要的对象无法通过正常方式注入进去,比如Quartz通过反射加载job,此时job内就无法使用注解注入。
例外情况代码:
此时就无法通过xml或者注解来注入了
解决方案,手动注入,自定义SpringUtil
1、创建SpringUtil,该类继承ApplicationContextAware
public class SpringUtil implements ApplicationContextAware { private static ApplicationContext ac; @Override
public void setApplicationContext(ApplicationContext arg0) throws BeansException {
ac = arg0;
} public static ApplicationContext getApplicationContext() {
return ac;
} /**
* 获取对象
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static Object getBean(String beanName) {
Object obj = null;
obj = ac.getBean(beanName);
return obj;
} /**
* 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
* @param name bean注册名
* @param requiredType 返回对象类型
* @return Object 返回requiredType类型对象
* @throws BeansException
*/
public static <T> T getBean(String beanName, Class<T> type) {
T obj = null;
obj = ac.getBean(beanName, type);
return obj;
} /**
* 如果BeanFactory包含所给名称匹配的bean返回true
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return ac.containsBean(name);
} /**
* 判断注册的bean是singleton还是prototype。
* 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
* @param name
* @return boolean
* @throws NoSuchBeanDefinitionException
*/
public static boolean isSingleton(String name) {
return ac.isSingleton(name);
} /**
* @param name
* @return Class 注册对象的类型
* @throws NoSuchBeanDefinitionException
*/
public static Class<?> getType(String name) {
return ac.getType(name);
}
}
2、在Spring中注册他,单例模式
<!-- springUtil的创建 ,实现ApplicationContextAware接口 -->
<bean id="springUtil" class="henu.util.SpringUtil" scope="singleton" />
之后就可以随时调用。
10、随时随地获取Spring的配置文件键值对
都知道在spring中可以通过@Value来自动注入资源文件中的键值对信息,但是SpringMVC是无法读取到Spring的资源文件的。
所以,可以自定义一个工具类,随时随地获取资源文件信息,并且不用写注解。
1、创建工具类,继承PropertyPlaceholderConfigurer
public class PropertyUtil extends PropertyPlaceholderConfigurer {
private static Map<String,String> propertyMap; @Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
super.processProperties(beanFactoryToProcess, props);
propertyMap = new HashMap<String, String>();
for (Object key : props.keySet()) {
String keyStr = key.toString();
String value = props.getProperty(keyStr);
propertyMap.put(keyStr, value);
}
} //static method for accessing context properties
public static String getProperty(String name) {
return propertyMap.get(name);
}
}
2、在配置文件中注册
是不是很熟悉,跟context:property-placeholder 加载配置文件一样吧
<!-- 自定义配置文件获取 -->
<bean id="propertyConfigurer" class="henu.util.PropertyUtil" scope="singleton">
<property name="location" value="classpath:res.properties"/>
<property name="fileEncoding" value="UTF-8"/>
</bean>
3、使用:PropertyUtil.getProperty(propName)即可
11、AOP拦截控制器
将AOP配置在SpringMVC中即可,因为父子容器关系。
12、AOP中获取request和response
1、自动注入
@Autowired
private HttpServletRequest request; @Autowired
private HttpServletResponse response;
2、配置监听器
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Spring那些不得不知的细节的更多相关文章
- spring对bean的管理细节
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring Boot 你所不知道的超级知识学习路线清单
因而 Spring Boot 应用本质上就是一个基于 Spring 框架的应用,它是 Spring 对“约定优先于配置”理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于 Spring 生态圈的 ...
- Java进阶知识17 Spring Bean对象的创建细节和创建方式
本文知识点(目录): 1.创建细节 1) 对象创建: 单例/多例 2) 什么时候创建? 3)是否延迟创建(懒加载) 4) 创建对象之后, ...
- Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...
- springaop——AspectJ不可不知的细节
springaop简介 springaop是spring对AOP技术的具体实现,它是spring框架的核心技术.springaop底层使用JDK动态代理或CGLIB动态代理技术实现. 应用场景: 在多 ...
- Android任务和返回栈完全解析,细数那些你所不知道的细节
附:Android task详解 出处:http://blog.csdn.net/guolin_blog/article/details/41087993 原文: http://developer. ...
- spring来了-03-bean创建细节
对象创建:单例/多例 [bean节点的属性scope] scope="singleton", 默认值,即默认是单例 [service/dao/工具类] scope=&qu ...
- Maven中央仓库——你可能不知道的细节
地址 —— 目前来说,http://repo1.maven.org/maven2/是真正的Maven中央仓库的地址,该地址内置在Maven的源码中,其它地址包括著名的ibiblio.org,都是镜像. ...
随机推荐
- Go中使用动态库C/C++库
转自:http://studygolang.com/articles/1441 最近需要做一些在go中使用动态C++库的工作,经常碰到找不到动态库路径这种情况,所以就花点时间,专门做一下实验来了解Go ...
- 一 Optional
从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException). 一: 创建Optional对象: ...
- jquery插件开发常用总结一
由于使用jquery插件后当form表单提交的时候,若发生错误,同时有验证错误文本时,即使用rules和message后,会自动生成一个label标签里面装有错误文件值. 我们可以替换它: 方式为:v ...
- SpringMvc之参数绑定注解详解之三
2. @RequestHeader.@CookieValue @RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上. 示例代码: 这是一个Request ...
- [poj1273]Drainage Ditches(最大流)
解题关键:最大流裸题 #include<cstdio> #include<cstring> #include<algorithm> #include<cstd ...
- Java泛型通配符以及限定
摘抄笔记 A:泛型的限定 /* * 将的酒店员工,厨师,服务员,经理,分别存储到3个集合中 * 定义方法,可以同时遍历3集合,遍历三个集合的同时,可以调用工作方法 */ import java.uti ...
- Spring IOC 巨多 非常 有用
关联文章: 关于Spring IOC (DI-依赖注入)你需要知道的一切 关于 Spring AOP (AspectJ) 你该知晓的一切 <Spring入门经典>这本书无论对于初学者或者有 ...
- 朴素贝叶斯算法分析及java 实现
1. 先引入一个简单的例子 出处:http://www.ruanyifeng.com/blog/2013/12/naive_bayes_classifier.html 一.病人分类的例子 让我从一个例 ...
- DNA甲基化及其测量方法(转)
转自声明的奥秘 www.lifeomics.com DNA甲基化与肿瘤发生: DNA甲基化水平和模式的改变是肿瘤发生的一个重要因素.这些变化包括CpG岛局部的高甲基化和基因组DNA低甲 ...
- 2. Web渗透测试中常见逻辑漏洞解析与实战
注:以下漏洞示例已由相关厂商修复,切勿非法测试! 0x01 漏洞挖掘 01 注册 注册中最常见的有两个,一个是恶意注册,另一个是账户遍历.一个好的注册界面应该是这样 或者这样的 而不是这样的 要么使 ...