1、什么是Spring mvc?
Spring MVC: 它是属于Spring基本架构里面的一个组成部分,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面,所以我们在后期和 Spring 进行整合的时候,几乎不需要别的什么配置。
SpringMVC 是类似于 Struts2 的一个 MVC 框架,在实际开发中,接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示,但是上手难度却比 Struts2 简单多了。而且由于 Struts2 所暴露出来的安全问题,SpringMVC 已经成为了大多数企业优先选择的框架。
2、Spring MVC的组件:
1、 前端控制器 DispatcherServlet
作用: 接收请求、响应结果 相当于转发器
有了DispatcherServlet 就减少了其它组件之间的耦合度
2、 处理器映射器HandlerMapping
作用: 根据请求的URL来查找Handler
3、 处理器适配器HandlerAdapter
作用: 按照特定的规则(HandlerAdapter要求的规则)去执行Handler
注意:在编写Handler的时候要按照HandlerAdapter要求的规则去编写,这样适配器HandlerAdapter才可以正确的去执行Handler
4、 处理器Handler
5、 视图解析器 View Resolver
作用: 进行视图的解析 根据视图逻辑名解析成真正的视图(view)
6、 视图View
View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf。。。)
3、SpringMVC工作流程原理图:
SpringMVC流程:
1、 用户发送请求至前端控制器
DispatcherServlet
。2、
DispatcherServlet
收到请求调用HandlerMapping
处理器映射器。3、 处理器映射器
HandlerMapping
找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
。4、
DispatcherServlet
调用HandlerAdapter
处理器适配器。5、
HandlerAdapter
经过适配调用具体的处理器(Controller,也叫后端控制器)。6、 Controller执行完成返回
ModelAndView
。7、
HandlerAdapter
将controller执行结果ModelAndView
返回给DispatcherServlet
。8、
DispatcherServlet
将ModelAndView
传给ViewReslover
视图解析器。9、
ViewReslover
解析后返回具体View。10、
DispatcherServlet
根据View进行渲染视图(即将模型数据填充至视图中)。11、
DispatcherServlet
响应用户。
4、案例
1、导入相关jar包:
2、web.xml文件配置
<!-- Springmvc前端配置 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置Springmvc加载的配置文件(配置处理器映射器、适配器等)
如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3、创建配置文件spring-servlet.xml文件,名称可以自定义。并配置处理器和映射器。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 处理器映射器 将bean的name作为url进行查找 ,
需要在配置Handler时指定beanname(就是url) 所有的映射器都实现
HandlerMapping接口。
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- 配置 Controller适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
</beans>
4、创建自定义Controller
/**
* 自定义控制器
* 必须实现Controller接口
* @author 叶小陌
*
*/
public class UserController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("本方法被调用了...");
ModelAndView view = new ModelAndView();
view.setViewName("/index.jsp");
return view;
}
}
5、测试效果
------------------------------------------------华丽分割线------------------------------------------------
5、使用注解方式
1、修改配置文件开启注解
2、配置如下
在spring-servlet.xml文件中配置:
<!-- 开启自动包扫描 -->
<context:component-scan base-package="com.sxt.controller"/>
<!-- 开启使用注解方式 -->
<mvc:annotation-driven/>
3、Controller中使用注解:
@Controller
public class HelloController {
@RequestMapping("/h1")
@ResponseBody
public void hello(Integer id, String name, String address, String[] hobby) {
for (String string : hobby) {
System.out.println(string);
}
}
@RequestMapping("/h2")
@ResponseBody
public void user(User user) {
System.out.println(user);
}
}