spring web mvc 框架提供了模型-视图-控制的体系结构和可以用来开发灵活、松散耦合的 web 应用程序的组件。mvc 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 ui 逻辑)的分离,同时提供了在这些元素之间的松散耦合。
模型封装了应用程序数据,并且通常它们由 pojo 组成。
视图主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的 html 输出。
spring web 模型-视图-控制(mvc)框架是围绕 dispatcherservlet 设计的,dispatcherservlet 用来处理所有的 http 请求和响应。spring web mvc dispatcherservlet 的请求处理的工作流程如下图所示:
下面是对应于 dispatcherservlet 传入 http 请求的事件序列:
收到一个 http 请求后,dispatcherservlet 根据 handlermapping 来选择并且调用适当的控制器。
控制器接受请求,并基于使用的 get 或 post 方法来调用适当的 service 方法。service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 dispatcherservlet 中。
dispatcherservlet 会从 viewresolver 获取帮助,为请求检取定义视图。
上面所提到的所有组件,即 handlermapping、controller 和 viewresolver 是 webapplicationcontext 的一部分,而 webapplicationcontext 是带有一些对 web 应用程序必要的额外特性的 applicationcontext 的扩展。
你需要映射你想让 dispatcherservlet 处理的请求,通过使用在 web.xml 文件中的一个 url 映射。下面是一个显示声明和映射 helloweb dispatcherservlet 的示例:
web.xml 文件将被保留在你的应用程序的 webcontent/web-inf 目录下。好的,在初始化 helloweb dispatcherservlet 时,该框架将尝试加载位于该应用程序的 webcontent/web-inf 目录中文件名为 [servlet-name]-servlet.xml
的应用程序内容。在这种情况下,我们的文件将是 helloweb-servlet.xml。
接下来, 标签表明哪些 urls 将被 dispatcherservlet 处理。这里所有以 .jsp 结束的 http 请求将由 helloweb dispatcherservle t处理。
如果你不想使用默认文件名 [servlet-name]-servlet.xml
和默认位置 webcontent/web-inf,你可以通过在 web.xml 文件中添加 servlet 监听器 contextloaderlistener 自定义该文件的名称和位置,如下所示:
<web-app...>
....
<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。
标签将用于激活 spring mvc 注释扫描功能,该功能允许使用注释,如 @controller 和 @requestmapping 等等。
/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() 方法作为控制器的默认 service 方法来处理 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";
}
}
值属性表明 url 映射到哪个处理方法,方法属性定义了 service 方法来处理 http get 请求。关于上面定义的控制器,这里有以下几个要注意的要点:
你将在一个 service 方法中定义需要的业务逻辑。你可以根据每次需求在这个方法中调用其他方法。
基于定义的业务逻辑,你将在这个方法中创建一个模型。你可以设置不同的模型属性,这些属性将被视图访问并显示最终的结果。这个示例创建了一个带有属性 “message” 的模型。
对于不同的表示技术,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 应用程序:
序号 | 例子 & 描述 |
---|---|
1 | spring mvc hello world example 这个例子将解释如何编写一个简单的 spring web hello world 应用程序。 |
2 | spring mvc form handling example 这个例子将解释如何编写一个 spring web 应用程序,它使用 html 表单提交数据到控制器,并且显示处理结果。 |
3 | spring page redirection example 学习在 spring mvc 框架中如何使用页面重定向功能。 |
4 | spring static pages example 学习在 spring mvc 框架中如何访问静态页面和动态页面。 |
5 | spring exception handling example 学习在 spring mvc 框架中如何处理异常。 |