Springmvc 简明教程
Spring - MVC Framework Overview
Spring Web MVC框架提供了一个模型-视图-控制器架构和可以用来开发灵活且松散耦合的web应用程序的准备组件。MVC模式导致应用程序的不同方面(输入逻辑、业务逻辑和界面逻辑)分离,同时在这些元素之间提供松散耦合。
-
Model 封装了应用程序数据,而且一般来讲,它们将由 POJO 组成。
-
View 负责渲染模型数据,而且一般来讲,它生成 HTML 输出,客户端的浏览器可以解释这些输出。
-
Controller 负责处理 User Requests 和 Building Appropriate Model 将其传递给视图进行渲染。
The DispatcherServlet
Spring Web模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet设计的,它处理所有的HTTP请求和响应。Spring Web MVC DispatcherServlet的请求处理工作流显示在下图中。
以下为响应发送到 DispatcherServlet 的入站 HTTP 请求的事件序列 -
-
收到HTTP请求后,DispatcherServlet咨询 HandlerMapping 来调用适当的控制器。
-
控制器接收请求并基于所使用的 GET 或 POST method 调用适当的服务方法。服务方法将基于已定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
-
DispatcherServlet将借助 ViewResolver 来为该请求挑选已定义的视图。
-
一经最终确定视图,DispatcherServlet将模型数据传递给视图,该视图最终会在浏览器上渲染。
所有以上提到的组件,比如HandlerMapping、Controller和ViewResolver都是 WebApplicationContext 的一部分,它扩展了平实的 ApplicationContext ,其中有一些web应用程序所必需的额外功能。
Required Configuration
我们需要映射DispatcherServlet需要处理的请求,通过在 web.xml 文件中使用URL映射来实现。以下示例显示了 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 目录中。初始化DispatcherServlet时,框架将尝试从一个名为 [servlet-name]-servlet.xml 的文件中加载应用程序上下文,该文件位于应用程序的WebContent/WEB-INF目录中。在本例中,我们的文件将是 HelloWeb-servlet.xml 。
接下来, <servlet-mapping> 标签指出了哪些URL将由哪个DispatcherServlet处理。在这里,所有以.jsp结尾的HTTP请求都将由 HelloWeb DispatcherServlet处理。
如果你不想使用默认的文件名 [servlet-name]-servlet.xml 和默认位置WebContent/WEB-INF,你可以通过在你的web.xml文件中添加 ContextLoaderListener servlet监听器,来自定义这个文件名和位置,如下所示——
<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>
现在,让我们查看放置在你的web应用程序的WebContent/WEB-INF目录中的 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.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 的视图实现。
现在让我们了解如何创建实际组件,即控制器、模型和视图。
Defining a Controller
DispatcherServlet 将请求委托给 controller 以执行特定于该请求的功能。 @Controller 注解表明特定的类扮演 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" 的模型。
-
已定义的服务方法可以返回一个 String,它包含用于呈现模型的 view 的名称。此示例将 "hello" 作为逻辑视图名称返回。
Creating JSP Views
Spring MVC 支持许多不同展现技术的视图类型。这些包括 JSPs, HTML, PDF, Excel Worksheets, XML, Velocity Templates, XSLT, JSON, Atom 和 RSS 数据源、 JasperReports 等等。然而,最常见的是使用 JSTL 编写的 JSP 模板。所以,让我们在 /WEB-INF/hello/hello.jsp 中编写一个简单的问候视图:
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
此处, ${message} 是我们在控制器中设置的属性。您可以在视图中显示多个属性。