Spring Web MVC 和 Spring MVC 是同一个东西。
Spring MVC框架提供MVC(模型-视图-控制器)架构,能够是应用程序在输入逻辑、输出逻辑、UI逻辑上分离。
Model:封装了应用程序数据,由POJO类组成 View:负责渲染模型数据,生成客户端浏览器可以解释的HTML输出 Controller:负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
一、DispatcherServlet组件类
MVC框架是围绕DispatcherServlet设计,该组件可以处理所有的HTTP请求和响应。
对于传入的HTTP请求的事件处理顺序:
- 在接收到HTTP请求后,DispatcherServlet会查询HandlerMapping以调用相应的Controller。
- Controller接受请求并根据使用的GET或POST方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
- DispatcherServlet将从ViewResolver获取请求的定义视图。
- 当视图完成,DispatcherServlet将模型数据传递到最终的视图,并在浏览器上呈现。
所有上述组件,即: HandlerMapping、Controller和ViewResolver是WebApplicationContext的一部分,它是普通ApplicationContext的扩展,带有Web应用程序所需的一些额外功能。
二、必要的配置
1、web.xml
需要通过web.xml 文件中的URL映射 来映射需要DispatcherServlet 处理的请求:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>SpringMvcV1</display-name>
<!-- 部署 DispatcherServlet -->
<!-- 部署 DispatcherServlet -->
<servlet>
<servlet-name>SpringMvcV1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet </servlet-class>
<!--
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMvcV1-servlet.xml</param-value>
</init-param>
-->
<!-- 表示容器再启动时立即加载servlet -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvcV1</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
在web.xml 中定义了DispatcherServlet 声明,初始化过程中会从 webapp/WEB-INF目录下读取[servlet-name]-servlet.xml的文件,用于加载应用程序上下文。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2、servlet.xml
InternalResourceViewResolver:定义解析视图名称的规则。
<?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-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--
<context:component-scan base-package="com.cimon.controller" />
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
-->
<!-- LoginController控制器类,映射到"/login"-->
<bean id="login" name="/login"
class="com.cimon.controller.LoginController"/>
<bean id="register" name="/register"
class="com.cimon.controller.RegisterController"/>
</beans>
3、定义控制器
DispatcherServlet 将请求委派给控制器执行。
@Controller:指示特定类充当控制器的角色。
@RequestMapping:用于将URL映射到整个类或特定处理程序方法。
@Controller
@RequestMapping("/hello")
public class HelloController{
@RequestMapping(method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
上面例子中:
@Controller注释将类定义为Spring MVC控制器。
@RequestMapping的第一个用法表示此控制器上的所有处理方法都与 /hello 路径相关。 @RequestMapping(method = RequestMethod.GET) 用于声明 printHello() 方法作为控制器的默认服务方法,用来处理 HTTP GET请求。可以定义另一个方法来处理同一 URL 的任何POST请求。
另一种写法,
@Controller
public class HelloController{
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
value 属性指示处理程序方法映射到的URL,method 属性定义处理HTTP GET请求的服务方法。关于以上定义的控制器,需要注意以下几点:
- 在服务方法中定义所需的业务逻辑。可以根据需要在此方法内调用其他方法。
- 基于定义的业务逻辑,将在此方法中创建一个模型。可以设置不同的模型属性,这些属性将被视图访问以呈现最终结果。此示例创建且有属性“message”的模型。
- 定义的服务方法可以返回一个String,它包含要用于渲染模型的视图的名称。此示例将“hello”返回为逻辑视图名称。
4、创建JSP视图
Spring MVC 支持许多类型的视图用于不同的表示技术。包括 :JSP、HTML、PDF、Excel工作表、XML、Velocity模板、XSLT、JSON、Atom 和 RSS 源 等。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h2>Hello, ${message}</h2>
</body>
</html>