1. Spring MVC概述
Spring MVC框架是一个开源的Java平台,为开发强大的基于Java的Web应用程序提供全面的基础架构支持非常容易和非常快速。
Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。
- 模型(Model) 封装了应用程序数据,通常它们将由POJO类组成。
- 视图(View) 负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。
- 控制器(Controller) 负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
1.1 Spring MVC生命周期
spring mvc框架是围绕DispatcherServlet设计的,它处理所有的HTTP请求和响应。请求处理工作流如下图所示:
- 在接收到 Request 请求后,DispatcherServlet 会查询到 HandlerMapping
以调用相应的 controller - controller 接受请求,并根据 get 或 post 调用相应的服务方法,方法基于模型数据,将视图返回给 DispatcherServlet
- DispatcherServlet 将从 view Resolver 中获取视图
- 当视图完成,DispatcherServlet 将模型数据传递到最终的视图,并展示在浏览器上
2. Spring MVC - Hello World示例
创建一个动态web项目,项目结构如下:
2.1 必需的配置
web.xml
需要通过使用web.xml文件中的URL映射来映射希望DispatcherServlet处理的请求。 下面是一个示例来显示HelloWeb DispatcherServlet示例的声明和映射:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring MVC Application</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>
DispatcherServlet 默认会找WebContent/WEB-INF目录中名为[servlet-name]-servlet.xml的文件加载应用程序上下文。
如果不想使用默认文件名为[servlet-name]-servlet.xml和默认位置为WebContent/WEB-INF,可以通过在web.xml文件中添加servlet侦听器ContextLoaderListener来自定义此文件名和位置 如下:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring MVC Application</display-name>
<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>
<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>
HelloWeb-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.my" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
- <context:component-scan base-package="***" /> 用于扫描文件
- InternalResourceViewResolver 定义解析视图名称的规则
2.2 定义控制器
HelloController.java
package com.my.springmvc;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller // @Controller表示当前类充当控制器角色
@RequestMapping("/hello") // @RequestMapping用于将URL映射到整个类或方法
public class HelloController {
//value = "/pringHello" 将URL映射到方法,method = RequestMethod.GET 用于声明处理HTTP GET请求
@RequestMapping(value = "/pringHello",method = RequestMethod.GET)
public String pringHello(ModelMap model) {
// 创建模型,添加属性为 message
model.addAttribute("message", "Hello Spring MVC Framework!");
//返回页面文件名,ViewResolver会根据配置跳转到对应的jsp页面
return "hello";
}
}
2.3 创建JSP视图
hello.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h2>Hello, ${message}</h2>
</body>
</html>
这里 ${message} 是在 Controller 中设置的属性。可以在视图中显示多个属性。
3. 启动服务
启动tomcat服务,成功日志如下:
浏览器访问:http://localhost:8080/HelloWeb/hello/pringHello