3.1 Spring MVC的功能和优点
1.Spring MVC是一个分层的java Web开发框架。有三层模型层(Model)是应用程序所使用的特定域信息的表现形式、视图(View)域模型的表现形式、控制层(Controller)解释用户的输入并转化成模型,然后将转换后的结果显示给用户。
2、Spring MVC是一个基于动作的MVC框架。该框架突出了http协议的请求/相应特性、在该框架中用户的每一个请求都声明的一个需要执行的动作。而这主要通过将每个请求的URL映射到一个可执行的方法来实现,同时也将请求的参数映射到对应的方法的参数。
3、Spring MVC 是Spring的一个子项目
4、Spring MVC提供了一个绑定的机制,通过该机制可以通过用户的请求中提取数据,然后将数据转换成预定义的数据格式,最后映射到一个模型类,而创建一个对象。
5、Spring MVC 是视图不可知的,可以使用其他视图技术,这就是为什么Spring MVC引入了模型体系结构,避免直接使用Http Servlet请求来防止将自身的直接绑定到这些请求的原因。 Spring MVC还是非侵入性的,因为业务逻辑代码与框架本身是分离的。
6、Spring MVC提供了一种测试组件的简单方法。
MVC模式主要流程图
3.2 使用Dispatcher Servlet 机制
Dispatcher Servlet 是Spring MVC的核心,他是主要的Servlet,负责处理请求,并将请求调度到合适的通道。
Spring MVC采用了一种前端控制模式(front controller parttern),该模式提供了一个入口来处理Web应用程序的所有请求。
图显示该流程。
Dispatcher Servlet配合使用处理器映射(handler mappings)和视图解析器(view resolver)来确定根据用户请求执行那个业务逻辑,以及处理完成之后返回的内容。处理器映射对象实现了HandlerMapping接口,这些对象在映射和处理器对象之间提供了桥梁。视图实现了ViewResolver接口,这些对象根据名称解析不同的视图。
执行过程:
1、发出http请求,Dispatcher Servlet 通过与处理器映射来交流确定执行那个控制器。然后Dispatcher Servlet通过处理器的适配器调用实际的处理器方法,转发请求,并且期待返回模型和视图。
2、调用容器内的处理器的方法来处理业务逻辑,该方法首先设置模型数据,然后向Dispatcher Servlet返回视图名称,而视图将作为响应显示给用户。
3、Dispatcher Servlet集成视图解析器并根据解析器配置确定合适的视图。
4、Dispatcher Servlet将模型传递给视图。
3.2.1 定义Servlet
web.xml文件的配置
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.mvc</url-pattern>
</servlet-mapping>
</web-app>
url-pattern定义:充当官网,任何以.mvc扩展的url都必须发送到自身。
Servlet 默认在WEB-INF文件夹下查找名为{Servlet-name}-servlet.xml文件。
{Servlet-name}-servlet.xml文件配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="com.tzg.ch303" />
<context:annotation-config />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
其中base-package为所需扫描的包。
3.3创建第一个Spring MVC应用程序
1、添加依赖项
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
2、web.xml配置
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.mvc</url-pattern>
</servlet-mapping>
3、springmvc-servlet.xml配置
<context:component-scan base-package="com.tzg.ch301" />
<context:annotation-config />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
4、创建一个简单的控制器
@Controller
public class HelloReaderController {
@RequestMapping(value="/hello")
public ModelAndView sayHello(){
ModelAndView mv=new ModelAndView();
mv.addObject("message", "hello reader");
mv.setViewName("helloReader");
return mv;
}
}
@RequestMapping:处理器映射请求的URL与使用@RequestMapping注解的处理器方法相匹配,并且将请求路径与该注解的value特性相比较。@RequestMapping注解的值将被解析和储存,当Dispatcher Servlet 处理该请求时访问这些值。
过程:首先创建ModelAndView类的一个实例,并使用键(message)设置将要传递给视图的对象,然后设置视图的名称(helloReader)。最后将视图返回给Servlet 解析并显示给用户。
5、helloReader.jsp
<body>
${message}
</body>
6、启动文件index.jsp
<% response.sendRedirect("hello.mvc"); %>
7、文件结构