Bug日记

Bug日记

1. Spring-MVC中ContextLoaderListener的配置

    <!--项目启动按照配置文件指定的位置创建容器,项目卸载,销毁容器  --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!--监听项目的创建和销毁,依据此来创建和销毁ioc容器--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!--前端控制器--><servlet><servlet-name>spring-mvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:META-INF/springmvc/**/springmvc-*.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>spring-mvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--注意事项-->
<!--存在两个contextConfigLocation,一个是给ContextLoadrListener,一个是给DispatcherServlet。都是用于加载上下文,一个是spring的,一个是springMVC的,其中ContextLoadrListener先加载,然后才是DispatcherServlet。区别:
DispatcherServlet一般会加载MVC相关的bean配置管理(如: ViewResolver, Controller,MultipartResolver, ExceptionHandler, etc.)ContextLoaderListener一般会加载整个Spring容器相关的bean配置管理(如: Log, Service, Dao, PropertiesLoader, etc.)注意点:也就是如果我把@Controller的注解放到ContextLoadrListener中的配置文件去加载是不可以的,DispatcherServlet到时对这个controller会无感知。DispatcherServlet的上下文仅仅是Spring MVC的上下文, 而ContextLoaderListener的上下文则对整个Spring都有效. 也就是DispatcherServlet可以使用spring的上下文,但是spring不能使用DispatcherServlet的上下文。一般Spring web项目中同时会使用这两种上下文
-->

2. Spring-MVC与Spring原来是两个容器

use-default-filters属性的默认值为true,即使用默认的Filter进行包扫描,而默认的Filter对标有@Service,@Controller和@Repository 的注解的类进行扫描,因为前面说过,我们希望SpringMVC只来控制网站的跳转逻辑,所以我们只希望SpringMVC的配置扫描@Controllerce注解标注的类,不希望它扫描其余注解标注的类,所以设置了use-default-filters为false,并使用context:include-filter子标签设置其只扫描带有@Controller注解标注的类。而 Spring 就不同了,我们希望 Spring 只不扫描带有 @Controller 注解标注的类,而扫描其他注解标注的类,而这时建立在使用默认的 Filter 进行扫描的基础上,设置了 context:exclude-filter 标签,不扫描 @Controller 注解标注的类,所以不应该设置 use-default-filters 为 false,所以这就解释了为什么一开始启动 Tomcat 时报了一个找不到 Service 的错误。在使用 use-default-filters 属性时要分清楚需要扫描哪些包,是不是需要使用默认的 Filter 进行扫描。即 use-default-filters="false" 需要和 context:include-filter 一起使用,而不能和 context:exclude-filter 属性一起使用。

关于fastjson我想说

  • 在使用fastjson封装对象时,必须提供getter和setter方法
  • 注意fastjson的版本,报错’Content-Type’ cannot contain wildcard type ‘*’

我真的不懂@RequestMapping与@ResponseMapping

  • @ResponseBody将controller层中的方法的返回值对象转换成为json格式, 然后将其写入到HttpServletResponse响应体中,使用此注解此次请求将不再走视图处理器,而是直接将此响应结果写入到输入流中,其效果等同于使用response对象输出指定格式的数据。
  • 若方法使用了@ResponseBody注解,则SpringMVC会将返回值转化为json字符串并写给浏览器,所以当加了@ResponseBody注解后,可以不加produces。但是必须存在一个转化类,默认是jackson,可以在spring-mvc进行适配,此外@RequestMapping可自动封装bean对象,需要保证属性名相同,若封装不匹配则为null