博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring那些不得不知的细节
阅读量:7305 次
发布时间:2019-06-30

本文共 6530 字,大约阅读时间需要 21 分钟。

1、SpringMVC拦截器的url-pattern和RequestMapping

案例:

1 url-pattern为/rest/*2 3 http请求为:/rest/query/id4 5 那么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,转换器是为了保证编码问题

1 
2
3
4
5
6
7
application/json;charset=UTF-8
8
text/html;charset=UTF-8
9
10
11
12
13

 3、web中url-pattern中的 / 与 /* 的问题

解:首先大家都知道"/*"可以匹配所有url,包括带扩展名的,一般只用在过滤器上。

而"/"很多人理解成不能拦截带扩展名的,这种理解是错误的!它其实也能拦截“.js”,“.css”,".png"等静态资源的访问。

看官方文档可知,它是tomcat的默认servlet,当其他的url-pattern匹配不上时都会走这个servlet。它除了能够处理静态资源还能够处理HTTP缓存请求,媒体(音频/视频)数据流和文件下载简历。所以如果我们的项目中配置了"/",会覆盖掉tomcat中的default servlet。

tomcat服务器的web.xml配置:

所以当springMVC的前端控制器配置为“/”时,需要在主配置文件中配置放行静态资源。

4、Spring提供了对properties文件读取的支持

配置文件加载属性文件:

配置文件中使用:${propertyName}

1 
2
4
5
6
7
8
9
10

Java程序中使用:Spring注解自动注入

1     @Value("${REDIS_KEY_CONTENT}")2     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

配置如下即可解决

<
text/html;charset=UTF-8

也可以这样,估计是内部自动转换的吧

 8、在Spring启动后执行立马执行某项任务,比如定时任务。

类似于在系统启动时做操作一样,只不过一个是ServletContextListener,而监听Spring的是InitializingBean

1 /** 2  * @Describtion: (执行任务调度). 
3 * @date: 2018年6月9日 下午12:46:45
4 * @author Beats
5 * @version v1.0
6 * @since JDK 1.8 7 */ 8 @Component 9 public class SpringContextLisener implements InitializingBean {10 11 @Autowired ExamStatusScanner examStatusScanner;12 13 @Override14 public void afterPropertiesSet() throws Exception {15 //启动16 examStatusScanner.run();17 }18 }

9、配置在spring项目中随时随地获取已经注册好的Bean。

某些情况下,一个类内部需要的对象无法通过正常方式注入进去,比如Quartz通过反射加载job,此时job内就无法使用注解注入。

例外情况代码:

此时就无法通过xml或者注解来注入了

解决方案,手动注入,自定义SpringUtil

1、创建SpringUtil,该类继承ApplicationContextAware

1 public class SpringUtil implements ApplicationContextAware { 2  3     private static ApplicationContext ac; 4  5     @Override 6     public void setApplicationContext(ApplicationContext arg0) throws BeansException { 7         ac = arg0; 8     } 9     10     public static ApplicationContext getApplicationContext() {11         return ac;12     }13     14     /**15      * 获取对象16      * @param name17      * @return Object 一个以所给名字注册的bean的实例18      * @throws BeansException19      */20     public static Object getBean(String beanName) {21         Object obj = null;22         obj = ac.getBean(beanName);23         return obj;24     }25     26     /**27      * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)28      * @param name       bean注册名29      * @param requiredType 返回对象类型30      * @return Object 返回requiredType类型对象31      * @throws BeansException32      */33     public static 
T getBean(String beanName, Class
type) {34 T obj = null;35 obj = ac.getBean(beanName, type);36 return obj;37 }38 39 /**40 * 如果BeanFactory包含所给名称匹配的bean返回true41 * @param name42 * @return boolean43 */44 public static boolean containsBean(String name) {45 return ac.containsBean(name);46 }47 48 /**49 * 判断注册的bean是singleton还是prototype。50 * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)51 * @param name52 * @return boolean53 * @throws NoSuchBeanDefinitionException54 */55 public static boolean isSingleton(String name) {56 return ac.isSingleton(name);57 }58 59 /**60 * @param name61 * @return Class 注册对象的类型62 * @throws NoSuchBeanDefinitionException63 */64 public static Class
getType(String name) {65 return ac.getType(name);66 }67 }

2、在Spring中注册他,单例模式

1     
2

之后就可以随时调用。

10、随时随地获取Spring的配置文件键值对

都知道在spring中可以通过@Value来自动注入资源文件中的键值对信息,但是SpringMVC是无法读取到Spring的资源文件的。

所以,可以自定义一个工具类,随时随地获取资源文件信息,并且不用写注解。

1、创建工具类,继承PropertyPlaceholderConfigurer

1 public class PropertyUtil extends PropertyPlaceholderConfigurer { 2     private static Map
propertyMap; 3 4 @Override 5 protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException { 6 super.processProperties(beanFactoryToProcess, props); 7 propertyMap = new HashMap
(); 8 for (Object key : props.keySet()) { 9 String keyStr = key.toString();10 String value = props.getProperty(keyStr);11 propertyMap.put(keyStr, value);12 }13 }14 15 //static method for accessing context properties16 public static String getProperty(String name) {17 return propertyMap.get(name);18 }19 }

2、在配置文件中注册

是不是很熟悉,跟context:property-placeholder 加载配置文件一样吧

1     
2
3
4
5

3、使用:PropertyUtil.getProperty(propName)即可

11、AOP拦截控制器

将AOP配置在SpringMVC中即可,因为父子容器关系。

12、AOP中获取request和response

1、自动注入

1     @Autowired2     private HttpServletRequest request;3 4     @Autowired5     private HttpServletResponse response;

2、配置监听器

1     
2
org.springframework.web.context.request.RequestContextListener
3

 

转载于:https://www.cnblogs.com/webyyq/p/8886033.html

你可能感兴趣的文章
Elasticsearch 参考指南(安装)
查看>>
JVM 学习之垃圾回收
查看>>
「玩物志」来自 Jigsaw 的 Outline
查看>>
我们和优秀工程师的差距在哪儿
查看>>
看吧,这就是现代化 PHP 该有的样子
查看>>
【377天】跃迁之路——程序员高效学习方法论探索系列(实验阶段135-2018.02.17)...
查看>>
Vue中如果服务器被限定了host如何用axois进行跨域请求?
查看>>
M - 阿牛的EOF牛肉串 (递推式子的应用)
查看>>
阿里egg.js初体验(一)
查看>>
4. 使用开发工具 IDEA 【连载 4】
查看>>
状态管理从0开始[后续更新]
查看>>
前端每周清单第 42 期:V8 的执行流与优化,Pinterest 的 PWA 实践
查看>>
前端性能优化之gzip
查看>>
前端性能优化
查看>>
JS 外观模式
查看>>
css去除inline-block间隙
查看>>
Linux初级命令
查看>>
Just for fun——分解一个正整数的质因数
查看>>
ZABBIX部署
查看>>
Http请求数据格式
查看>>