Spring Web模型 - 视图 - 控制器(MVC)框架是围绕DispatcherServlet
设计的,它处理所有的HTTP请求和响应。 Spring Web MVC DispatcherServlet的请求处理工作流如下图所示:
以下是对应于到DispatcherServlet
的传入HTTP请求的事件顺序:
- 在接收到HTTP请求后,
DispatcherServlet
会查询HandlerMapping
以调用相应的Controller
。 Controller
接受请求并根据使用的GET
或POST
方法调用相应的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet
。DispatcherServlet
将从ViewResolver
获取请求的定义视图。- 当视图完成,
DispatcherServlet
将模型数据传递到最终的视图,并在浏览器上呈现。
所有上述组件,即: HandlerMapping
,Controller
和ViewResolver
是WebApplicationContext
的一部分,它是普通ApplicationContext
的扩展,带有Web应用程序所需的一些额外功能。
必要的配置web.xml
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>springmvc</display-name>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
SpringMVC的配置HelloWeb-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:p="http://www.springframework.org/schema/p"
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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.xiaosousou" />
<!-- 声明前缀/WEB-INF、后缀.jsp -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 声明静态资源 -->
<mvc:resources mapping="/pages/**" location="/WEB-INF/pages/" />
<mvc:annotation-driven/>
</beans>
HelloWeb-servlet说明
[servlet-name]-servlet.xml
文件将用于创建定义的bean
,它会覆盖在全局范围中使用相同名称定义的任何bean
的定义。
<context:component-scan ...>
标签将用于激活Spring MVC
注释扫描功能,允许使用@Controller
和@RequestMapping
等注释。
InternalResourceViewResolver
将定义用于解析视图名称的规则。根据上面定义的规则,hello
的逻辑视图将委托给位于/WEB-INF/jsp/hello.jsp
这个视图来实现。
如果不想使用默认文件名为[servlet-name]-servlet.xml
和默认位置为WebContent/WEB-INF
,可以通过在web.xml
文件中添加servlet
侦听器ContextLoaderListener
来自定义此文件名和位置
<!-- 自定义路径 -->
<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>
@Controller
注释将类定义为Spring MVC
控制器。这里@RequestMapping
的第一个用法表示此控制器上的所有处理方法都与/hello
路径相关。 下一个注释@RequestMapping(method = RequestMethod.GET)
用于声明printHello()
方法作为控制器的默认服务方法来处理HTTP GET请求。可以定义另一个方法来处理同一URL
的任何POST请求。
@Controller
public class HelloController{
//声明此方法与/hello路径相关联,method = RequestMethod.GET说明此方法是get方法
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
JSP视图
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
这里${message}
是在Controller
中设置的属性。可以在视图中显示多个属性。