- Spring 核心基础
- Spring - 首页
- Spring - 概述
- Spring - 架构
- Spring - 环境搭建
- Spring - Hello World 示例
- Spring - IoC 容器
- Spring - Bean 定义
- Spring - Bean 作用域
- Spring - Bean 生命周期
- Spring - Bean 后置处理器
- Spring - Bean 定义继承
- Spring - 依赖注入
- Spring - 注入内部 Bean
- Spring - 注入集合
- Spring - Bean 自动装配
- 基于注解的配置
- Spring - 基于 Java 的配置
- Spring - Spring 中的事件处理
- Spring - Spring 中的自定义事件
- Spring - 使用 Spring 框架进行 AOP
- Spring - JDBC 框架
- Spring - 事务管理
- Spring - Web MVC 框架
- Spring - 使用 Log4J 进行日志记录
- Spring 问题与解答
- Spring - 问题与解答
- Spring 有用资源
- Spring - 快速指南
- Spring - 有用资源
- Spring - 讨论
Spring - MVC 框架
Spring Web MVC 框架提供模型-视图-控制器 (MVC) 架构和可用于开发灵活且松耦合 Web 应用程序的现成组件。MVC 模式导致分离应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑),同时提供这些元素之间的松耦合。
模型封装应用程序数据,通常由 POJO 组成。
视图负责呈现模型数据,通常生成客户端浏览器可以解释的 HTML 输出。
控制器负责处理用户请求并构建适当的模型,并将其传递给视图进行呈现。
DispatcherServlet
Spring Web 模型-视图-控制器 (MVC) 框架围绕一个DispatcherServlet 设计,该DispatcherServlet 处理所有 HTTP 请求和响应。下图说明了 Spring Web MVC DispatcherServlet 的请求处理工作流程:
以下是对应于传入 HTTP 请求到DispatcherServlet 的事件序列:
在收到 HTTP 请求后,DispatcherServlet 会咨询HandlerMapping 以调用相应的Controller。
Controller 获取请求并根据使用的 GET 或 POST 方法调用相应的服务方法。服务方法将根据定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
DispatcherServlet 将借助ViewResolver 获取请求的定义视图。
一旦视图确定,DispatcherServlet 将模型数据传递给视图,最终在浏览器上呈现。
所有上述组件,即 HandlerMapping、Controller 和 ViewResolver 都是WebApplicationContext 的一部分,WebApplicationContext 是普通ApplicationContext 的扩展,具有一些 Web 应用程序所需的其他功能。
所需配置
您需要使用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>*.jsp</url-pattern> </servlet-mapping> </web-app>
web.xml 文件将保存在 Web 应用程序的 WebContent/WEB-INF 目录中。在HelloWeb DispatcherServlet 初始化时,框架将尝试从应用程序 WebContent/WEB-INF 目录中名为[servlet-name]-servlet.xml 的文件中加载应用程序上下文。在本例中,我们的文件将为HelloWebservlet.xml。
接下来,<servlet-mapping> 标签指示哪些 URL 将由哪个 DispatcherServlet 处理。此处,所有以.jsp 结尾的 HTTP 请求都将由HelloWeb DispatcherServlet 处理。
如果您不想使用[servlet-name]-servlet.xml 作为默认文件名,也不想使用WebContent/WEB-INF 作为默认位置,您可以通过在 web.xml 文件中添加 servlet 监听器ContextLoaderListener 来自定义此文件名和位置,如下所示:
<web-app...> <!-------- DispatcherServlet definition goes here-----> .... <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> </web-app>
现在,让我们检查HelloWeb-servlet.xml 文件所需的配置,该文件位于您的 Web 应用程序的WebContent/WEB-INF 目录中:
<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.tutorialspoint" /> <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name = "prefix" value = "/WEB-INF/jsp/" /> <property name = "suffix" value = ".jsp" /> </bean> </beans>
以下是关于HelloWeb-servlet.xml 文件的重要说明:
[servlet-name]-servlet.xml 文件将用于创建定义的 bean,覆盖全局范围内任何具有相同名称的 bean 的定义。
<context:component-scan...> 标签将用于激活 Spring MVC 注解扫描功能,该功能允许使用 @Controller 和 @RequestMapping 等注解。
InternalResourceViewResolver 将定义用于解析视图名称的规则。根据上述定义的规则,名为hello 的逻辑视图将委托给位于/WEB-INF/jsp/hello.jsp 的视图实现。
以下部分将向您展示如何创建实际组件,即控制器、模型和视图。
定义控制器
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 请求。
您可以以另一种形式编写上述控制器,您可以在其中添加其他属性到@RequestMapping 中,如下所示:
@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 请求。关于上面定义的控制器的以下要点需要注意:
您将在服务方法中定义所需的业务逻辑。您可以根据需要在此方法内调用另一个方法。
根据定义的业务逻辑,您将在此方法中创建模型。您可以使用 setter 设置不同的模型属性,这些属性将被视图访问以呈现最终结果。此示例使用其属性“message”创建模型。
定义的服务方法可以返回一个字符串,其中包含要用于呈现模型的视图的名称。此示例返回“hello”作为逻辑视图名称。
创建 JSP 视图
Spring MVC 支持针对不同表示技术的多种类型的视图。这些包括 - JSP、HTML、PDF、Excel 工作表、XML、Velocity 模板、XSLT、JSON、Atom 和 RSS 提要、JasperReports 等。但最常见的是我们使用用 JSTL 编写的 JSP 模板。
让我们在 /WEB-INF/hello/hello.jsp 中编写一个简单的hello 视图:
<html> <head> <title>Hello Spring MVC</title> </head> <body> <h2>${message}</h2> </body> </html>
这里${message} 是我们在控制器内部设置的属性。您可以有多个属性在您的视图中显示。
Spring Web MVC 框架示例
基于上述概念,让我们检查一些重要的示例,这些示例将帮助您构建 Spring Web 应用程序:
序号 | 示例及描述 |
---|---|
1 | Spring MVC Hello World 示例
此示例将解释如何编写简单的 Spring Web Hello World 应用程序。 |
2 | Spring MVC 表单处理示例
此示例将解释如何使用 HTML 表单编写 Spring Web 应用程序,以将数据提交到控制器并显示处理后的结果。 |
3 | Spring 页面重定向示例
了解如何在 Spring MVC 框架中使用页面重定向功能。 |
4 | Spring 静态页面示例
了解如何在 Spring MVC 框架中访问静态页面以及动态页面。 |
5 | Spring 异常处理示例
了解如何在 Spring MVC 框架中处理异常。 |