SpringMVC
1 介绍
SpringMVC是一个基于Java的、扩展性强的轻量级Web框架,它是Spring框架的一部分,用于构建Web应用程序。SpringMVC提供了一种松散耦合的设计方法,通过分离应用程序的不同组件(模型、视图和控制器)来提高可维护性和灵活性。
以下是SpringMVC的一些主要特点和概念:
-
模型-视图-控制器(MVC)架构: SpringMVC采用经典的MVC设计模式,将应用程序分为模型(Model,处理业务逻辑)、视图(View,负责展示数据)和控制器(Controller,或Handler,处理用户请求和返回响应)三个组件。
-
前端控制器(DispatcherServlet): SpringMVC采用前端控制器模式,所有的请求都由一个单一的控制器(DispatcherServlet)来处理,它负责将请求分发给合适的处理器(Handler)进行处理。
-
处理器映射器(HandlerMapping): 处理器映射器负责将请求映射到合适的处理器(Handler)上,根据请求的URL来确定使用哪个Handler处理请求。
-
处理器适配器(HandlerAdatper): 处理器适配器根据 Handler 规则执行不同类型的 Handler
-
视图解析器(ViewResolver): 视图解析器负责将逻辑视图名解析为具体的视图对象,这样控制器就可以返回逻辑视图名,而不需要关心具体的视图对象。
-
后端控制器(处理器 Handler):接收表单数据、超链接数据、调用service进行相关的操作
2 SpringMVC 工作流程
流程图:
SpringMVC 的工作流程步骤:
- 客户端发送请求给前端控制器(DispatcherServlet)。
- 前端控制器请求处理器映射器(HandlerMapping)获取 Handler(或Controller)。
- 处理器映射器(HandlerMapping)根据配置或注解给前端控制器返回 Handler。
- 前端控制器(DispatcherServlet)请求处理器适配器(HandlerAdatper)执行 Handler。
- 处理器适配器(HandlerAdatper)执行 Handler。
- Handler执行完后给处理器适配器(HandlerAdatper)返回 ModelAndView。
- 处理器适配器(HandlerAdatper)将 ModelAndView 返回给前端控制器(DispatcherServlet)。
- 前端控制器(DispatcherServlet)请求视图解析器(ViewResolver)解析 ModelAndView。
- 视图解析器(ViewResolver)将解析后的 View 返回给前端控制器(DispatcherServlet)。
- 前端控制器(DispatcherServlet)对 View 进行渲染,并且把 Model 数据转为响应。
- 前端控制器(DispatcherServlet)向客户端响应结果。
3 SpringMVC 开发步骤
- 项目准备
- 配置前端控制器(DispatcherServlet)
- 配置处理器适配器(HandlerAdatper)
- 开发Handler
- 视图编写
- 配置Handler
- 配置处理器映射器(HandlerMapping)
- 配置视图解析器(ViewResolver)
- 部署测试
4 案例
4.1 注解开发
1.web.xml 配置前端控制器
<!--配置前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
2.springmvc.xml 配置处理器适配器、处理器映射器以及视图解析器
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
<!--注解处理器适配器和处理器映射器-->
<!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>-->
<!--可替代上面注解处理器适配器和处理器映射器-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--扫描-->
<context:component-scan base-package="com.kdx.controller"></context:component-scan>
3.实体类Student
public class Student implements Serializable {
private Integer id;
private String name;
private String sex;
private Integer age;
public Student() {
}
public Student(Integer id, String name, String sex, Integer age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
4.开发Handler
@Controller
public class StudentController1 {
@RequestMapping("/queryStudent")
public ModelAndView handleRequest() throws Exception {
Student student1 = new Student(1,"kong","男",18);
Student student2 = new Student(2,"sun","男",18);
Student student3 = new Student(3,"wu","男",18);
List<Student> studentList = new ArrayList<>();
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("studentList",studentList);
modelAndView.setViewName("/WEB-INF/jsp/studentList.jsp");
return modelAndView;
}
}
5.开发视图
<c:forEach items="${requestScope.studentList}" var="s">
${s.id}
${s.name}
${s.sex}
${s.age}
<hr/>
</c:forEach>
6.部署测试
4.2 XML配置开发
更改 springmvc.xml
<!--配置处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--配置Handler-->
<bean name="/queryStudent.action" class="com.kdx.controller.StudentController"></bean>
<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
开发Handler:
public class StudentController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
Student student1 = new Student(1,"kong","男",18);
Student student2 = new Student(2,"sun","男",18);
Student student3 = new Student(3,"wu","男",18);
List<Student> studentList = new ArrayList<>();
studentList.add(student1);
studentList.add(student2);
studentList.add(student3);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("studentList",studentList);
modelAndView.setViewName("/WEB-INF/jsp/studentList.jsp");
return modelAndView;
}
}
部署测试: