Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构和用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。
- 模型(Model)封装了应用程序数据,通常它们将由
POJO
类组成。 - 视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出。
- 控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
-
DispatcherServlet组件类
Spring Web模型 - 视图 - 控制器(MVC)框架是围绕
DispatcherServlet
设计的,它处理所有的HTTP请求和响应。 -
以下是对应于到
DispatcherServlet
的传入HTTP请求的事件顺序:- 在接收到HTTP请求后,
DispatcherServlet
会查询HandlerMapping
以调用相应的Controller
。 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>/</url-pattern> </servlet-mapping> </web-app>
web.xml
文件将保存Web应用程序的WebContent/WEB-INF
目录。在HelloWeb DispatcherServlet
初始化时,框架将尝试从位于应用程序的WebContent/WEB-INF
目录中的名为[servlet-name]-servlet.xml
的文件加载应用程序上下文。在这个示例中,使用的文件将是HelloWeb-servlet.xml
。接下来,
<servlet-mapping>
标记指示哪些URL
将由DispatcherServlet
处理。 这里所有以.jsp
结尾的HTTP请求都将由HelloWeb DispatcherServlet
处理。如果不想使用默认文件名为
[servlet-name]-servlet.xml
和默认位置为WebContent/WEB-INF
,可以通过在web.xml
文件中添加servlet
侦听器ContextLoaderListener
来自定义此文件名和位置 如下: - 在接收到HTTP请求后,
-
<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.snake" /> <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 base-package="com.snake" />
-
只扫描com.snake包 其他包不会扫描
标签将用于激活
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) {
//springmvc向页面传值 model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; } }value
属性指示处理程序方法映射到的URL,method
属性定义处理HTTP GET请求的服务方法。关于以上定义的控制器,需要注意以下几点: - 在服务方法中定义所需的业务逻辑。可以根据需要在此方法内调用其他方法。
- 基于定义的业务逻辑,将在此方法中创建一个模型。可以设置不同的模型属性,这些属性将被视图访问以呈现最终结果。此示例创建且有属性“
message
”的模型。 - 定义的服务方法可以返回一个
String
,它包含要用于渲染模型的视图的名称。此示例将“hello
”返回为逻辑视图名称。
-
-
创建JSP视图
Spring MVC支持许多类型的视图用于不同的表示技术。包括 - JSP,HTML,PDF,Excel工作表,XML,Velocity模板,XSLT,JSON,Atom 和 RSS 源,JasperReports等。但最常见的是使用JSPL编写的JSP模板,这里使用的是JSP模板,并在
/WEB-INF/jsp/hello.jsp
中写一个简单的hello
视图:<html> <head> <title>Hello Spring MVC</title> </head> <body> <h2>${message}</h2> </body> </html>
这里
${message}
是在Controller
中设置的属性。可以在视图中显示多个属性。