了解Spring MVC及其特点
掌握Spring MVC入门程序的编写
熟悉Spring MVC的工作原理及执行流程
在JavaEE开发中,系统经典的三层架构包括表现层、业务层和持久层。三层架构中,每一层各司其职,表现层(Web层)负责接收客户端请求,并向客户端响应结果;业务层(Service层)负责业务逻辑处理,和项目需求息息相关;持久层(Dao层)负责和数据库交互,对数据库表进行增删改查。
Spring MVC作用于三层架构中的表现层,用于接收客户端的请求并进行响应。SpringMVC中包含了控制器和视图,控制器接收到客户端的请求后对请求数据进行解析和封装,接着将请求交给业务层处理。业务层会对请求进行处理,最后将处理结果返回给表现层。表现层接收到业务层的处理结果后,再由视图对处理结果进行渲染,渲染完成后响应给客户端。
(1)Spring MVC是Spring框架的后续产品,可以方便地使用Spring框架所提供的其他功能。
(2)Spring MVC使用简单,很容易设计出干净简洁的Web层。
(3)Spring MVC支持各种请求资源的映射策略。
(4)Spring MVC具有非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API。
(5)Spring MVC支持国际化,可以根据用户区域显示多国语言。
(6)Spring MVC支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。
(7)Spring MVC灵活性强,易扩展。
创建项目:在IDEA中,创建一个名称为chapter10的Maven Web项目。
单击IDEA工具栏中的File→“Project Structure…”选项,弹出Project Structure对话框。
在Modules的设置界面中,单击界面上方的“+”图标,弹出Add下拉菜单。
在Modules的设置界面中,单击界面上方的“+”图标,弹出Add下拉菜单。
在Add下拉菜单中,单击“Web”选项进入Web Module的设置界面。
在Web Module的设置界面中,单击Deployment Descriptors右侧铅笔图样的编辑按钮,弹出Deployment Descriptors Location对话框。
在Deployment Descriptors Location对话框中,“Web Module Deployment Descriptor(web.xml):”输入框中可以设置项目web.xml文件的路径。将路径中项目名称后的路径修改为“src\main\webapp\WEB-INF\web.xml”,然后单击“OK”按钮完成web.xml的路径的设置。单击“OK”按钮系统会回步骤4所示的设置界面,在步骤4中单击Web Resource Directories右侧铅笔图样的编辑按钮,弹出Web Resource Directory Path话框。
引入Maven依赖:项目创建完成后,为保障项目的正常运行,需要导入项目所需的依赖到项目的pom.xml文件中。
<!– 这里只展示了其中一个JAR包-->
<!--Spring核心类-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
需要注意的是,要在IDEA中使用插件运行Maven项目,除了需要在pom.xml文件中配置对应的插件外,还需要在IDEA中进行项目运行的相关配置。
单击IDEA工具栏中的“Run”→“Edit Configurations…”选项,弹出Run/Debug Configurations对话框。
在Run/Debug Configurations对话框中,单击左上角的“+”按钮,弹出Add New Configurations菜单列表。
在Add New Configurations菜单列表中,单击左侧菜单中的“Maven”选项,进入Maven指令的配置界面。
配置前端控制器:在项目的web.xml文件中进行Spring MVC前端控制器的配置。
<servlet> <servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 配置初始化参数,读取Spring MVC的配置文件 --><init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置处理器映射信息和视图解析器:创建Spring MVC的配置文件spring-mvc.xml,用于配置处理器映射信息和视图解析器。
<!-- 配置 Spring MVC要扫描的包 -->
<context:component-scan basepackage="com.itheima.controller"/>
<!-- 配置视图解析器 -->
<bean class=
"org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
创建处理器:创建处理器FirstController类,用于处理客户端的请求并指定响应时转跳的页面。
//设置当前类为处理器类
@Controller
public class FirstController {
// 设定当前方法的访问映射地址
@RequestMapping("/firstController")
// 设置当前方法返回值类型为String,用于指定请求完成后跳转的页面
public String sayHello() {
System.out.println("访问到FirstController!");
// 设定具体跳转的页面
return "success"; }
}
创建视图(View)页面:创建名称为page的文件夹,并在page文件夹下创建名称为success的jsp文件,用于对客户端请求进行处理后的视图展示。
<html>
<body>
<h2>Spring MVC FirstController!h2>
body>
html>
启动项目,测试应用:项目启动成功后,在浏览器中对处理器进行请求访问,访问地址http://localhost:8080/chapter10/firstController,访问后,IDEA控制台打印信息“访问到FirstController!”,并且浏览器跳转到success.jsp页面中,页面内容如下所示。
项目最终目录和文件组成
处理器映射器可以理解为一个Map
,HandlerMapping负责根据用户请求的URL找到Handler(处理器),Spring
MVC提供了不同的映射器来实现不同的映射方式。
处理器适配器作用是根据处理器映射器找到的处理器 Handler 信息,去执行相关的 Handler。不同的处理器映射器映射出来的Handler对象是不一样的,不同的映射由不同的适配器来负责解析。
视图解析器进行视图解析,首先将逻辑视图名解析成物理视图名,即具体的页面地址,再生成View视图对象返回。
(1)用户通过浏览器向服务器发送请求,请求会被Spring MVC的前端控制器DispatcherServlet拦截。
(2)DispatcherServlet拦截到请求后,会调用HandlerMapping(处理器映射器)。
(3)处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
(4)DispatcherServlet会通过返回信息选择合适的HandlerAdapter(处理器适配器)。
(5) HandlerAdapter会调用并执行Handler(处理器),这里的处理器指的就是程序中编写的Controller类,也被称之为后端控制器。
(6)Controller执行完成后,会返回一个ModelAndView对象,该对象中会包含视图名或包含模型和视图名。
(7)HandlerAdapter将ModelAndView对象返回给DispatcherServlet。
(8)前端控制器请求视图解析器根据逻辑视图名解析真正的视图。
(9)ViewResolver解析后,会向DispatcherServlet中返回具体的View(视图)。
(10)DispatcherServlet对View进行渲染(即将模型数据填充至视图中)。
(11)前端控制器向用户响应结果。
在上述执行过程中,DispatcherServlet、HandlerMapping、HandlerAdapter和ViewResolver对象的工作是在框架内部执行的,开发人员只需要配置DispatcherServlet,完成Controller中的业务处理并在视图中(View)中展示相应信息。