Spring 的两大核心机制是 IoC(控制反转)和 AOP(面向切面编程),这两大核心机制也是 Java 设计模式的典型代表,其中 IoC 是工厂模式,AOP 是代理模式。
在 spring.xml 中,通过 ref 属性将其他 bean 赋给当前 bean 对象,这种方式叫做依赖注入(DI),是 Spring 非常重要的机制,DI 是将不同对象进行关联的一种方式,是 IoC 的具体实现方式,通常 DI 和 IoC 是紧密结合在一起的,因此一般说的 IoC 包括 DI。
集合属性通过 list 标签和 ref 标签完成注入,ref 的 bean 属性指向需要注入的 bean 对象。
IoC 中可以给类添加的注解有 4 种:@Controller、@Service、@Repository、@Component。在实际开发中,我们使用 @Controller、@Service、@Repository 分别表示 Controller 层、Service 层、DAO 层。
springmvc工作流程
(1)客户端请求被 DispatcherServlet(前端控制器)接收。
(2)根据 Handler Mapping 映射到 Handler。
(3)生成 Handler 和 HandlerInterceptor(如果有则生成)。
(4)Handler 和 HandlerInterceptor 以 HandlerExecutionChain 的形式一并返回给 DispatcherServlet。
(5)DispatcherServlet 通过 HandlerAdapter 调用 Handler 的方法做业务逻辑处理。
(6)返回一个 ModelAndView 对象给 DispatcherServlet。
(7)DispatcherServlet 将获取的 ModelAndView 对象传给 ViewResolver 视图解析器,将逻辑视图解析成物理视图 View。
(8)ViewResolver 返回一个 View 给 DispatcherServlet。
(9)DispatcherServlet 根据 View 进行视图渲染(将模型数据填充到视图中)。
(10)DispatcherServlet 将渲染后的视图响应给客户端。
springmvc工作流程.png
Spring MVC 通过 @RequestMapping 注解将 URL 请求与业务方法进行映射,在控制器的类定义处以及方法定义处都可添加 @RequestMapping,在类定义处添加 @RequestMapping 注解,相当于多了一层访问路径。
@RequestMapping(value="/postTest",method=RequestMethod.POST)
public String postTest()
参数绑定,给参数列表添加 @RequestParam 注解。
@RequestMapping(value="paramsBind")
public String paramsBind(@RequestParam("name") String name,@RequestParam("id") int id)
Spring MVC 也支持 RESTful 风格的 URL 参数获取,将参数列表的注解改为 @PathVariable("name") 即可。
@RequestMapping(value="rest/{name}")
public String restTest(@PathVariable("name") String name)
Spring MVC 通过@CookieValue可以直接在业务方法中获取 Cookie 的值。
@RequestMapping("/cookieTest")
public String getCookie(@CookieValue(value="JSESSIONID") String sessionId)
Spring MVC 会根据请求参数名和 POJO 属性名进行匹配,自动为该对象填充属性值,并且支持属性级联。
Spring MVC 解决中文乱码很简单,在 web.xml 中添加过滤器即可。
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring MVC 默认以转发的形式响应 JSP,也可以手动进行修改,重定向:
@RequestMapping("redirectTest")
public String redirectTest(){
return "redirect:/index.jsp";
}
转发:
@RequestMapping("forwardTest")
public String forwardTest(){
return "forward:/index.jsp";
}
@ResponseBody 注解
将业务方法返回的对象,通过 HttpMessageConverter 接口转为指定格式的数据,JSON、XML等,直接返回字符串到客户端,不需要返回 jsp 页面。
处理 @ResponseBody 中文乱码:在 springmvc.xml 中配置消息转换器。
<mvc:annotation-driven >
<!-- 消息转换器 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
@RequestBody 注解
读取 HTTP 请求参数,通过 Spring MVC 提供的 HttpMessageConverter 接口将读取的参数转为 JSON、XML 格式的数据,绑定到业务方法的形参。
阿里的FastJson 的优势在于如果属性为空就不会将其转化为 JSON,数据会简洁很多。
如何使用 FastJson
(1)在 pom.xml 中添加 FastJson 依赖。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
(2)在 springmvc.xml 中配置 FastJson。
<mvc:annotation-driven >
<!-- 消息转换器 -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
</bean>
<!-- 阿里 fastjson -->
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"/>
</mvc:message-converters>
</mvc:annotation-driven>
网友评论