Spring - MVC 框架概述
Spring Web MVC 框架提供了模型-视图-控制器架构和现成的组件,可用于开发灵活且松散耦合的 Web 应用程序。MVC 模式导致分离应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑),同时在这些元素之间提供松散耦合。
Model 封装了应用程序数据,一般来说,它们将由 POJO 组成。
View 负责渲染模型数据,一般来说,它生成客户端浏览器可以解释的 HTML 输出。
Controller负责处理用户请求和构建合适的模型,并将其传递给视图进行渲染。
DispatcherServlet
Spring Web 模型-视图-控制器 (MVC) 框架是围绕处理所有 HTTP 请求和响应的 DispatcherServlet 设计的。 Spring Web MVC DispatcherServlet 的请求处理工作流程如下图所示。
以下是对应于对 DispatcherServlet 的传入 HTTP 请求的事件序列 −
收到 HTTP 请求后,DispatcherServlet 会咨询 HandlerMapping 以调用适当的 Controller。
控制器接受请求并根据使用的 GET 或 POST 方法 调用适当的服务方法。服务方法将根据定义的业务逻辑设置模型数据,并将视图名称返回给 DispatcherServlet。
DispatcherServlet 将获得 ViewResolver 的帮助来获取请求的定义视图。
一旦视图完成,DispatcherServlet 将模型数据传递给视图,最终在浏览器上呈现。
上述所有组件,即 HandlerMapping、Controller 和 ViewResolver 都是 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 的文件加载应用程序上下文。In this case, our file will be HelloWeb-servlet.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 请求的服务方法。
以下是关于上面定义的控制器需要注意的一些要点 −
您将在服务方法中定义所需的业务逻辑。 您可以根据需要在该方法中调用另一个方法。
根据定义的业务逻辑,您将在此方法中创建一个模型。 您可以设置不同的模型属性,视图将访问这些属性以呈现结果。这个例子创建了一个具有"message"属性的模型。
定义的服务方法可以返回一个字符串,其中包含要用于渲染模型的 视图 的名称。 此示例返回"hello"作为逻辑视图名称。
创建 JSP 视图
Spring MVC 支持多种类型的视图,用于不同的表示技术。 这些包括 - JSPs, HTML, PDF, Excel Worksheets, XML, Velocity Templates, XSLT, JSON, Atom 和 RSS feeds、JasperReports 等。然而,最常见的是用 JSTL 编写的 JSP 模板。 所以,让我们在 /WEB-INF/hello/hello.jsp 中编写一个简单的 hello 视图 −
实例
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
这里 ${message} 这里是我们在 Controller 中设置的属性。 您可以在视图中显示多个属性。