Web MVC Framework
Spring Web MVC框架提供模型 - 视图 - 控制器(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 。
Controller接受请求并根据使用的GET或POST方法调用适当的服务方法。 服务方法将基于定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet 。
DispatcherServlet将从ViewResolver获取帮助以获取请求的已定义视图。
一旦视图完成, DispatcherServlet将模型数据传递给最终在浏览器上呈现的视图。
所有上述组件,即HandlerMapping,Controller和ViewResolver都是WebApplicationContext w的一部分,它是普通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-INFdirectory中的名为[servlet-name]-servlet.xml的文件加载应用程序上下文。 在这种情况下,我们的文件将是HelloWebservlet.xml 。
接下来,标记指示哪个URL将由哪个DispatcherServlet处理。 这里以.jsp结尾的所有HTTP请求都将由HelloWeb DispatcherServlet处理。
如果您不希望使用默认文件名作为[servlet-name]-servlet.xml并将默认位置作为WebContent/WEB-INF ,则可以通过在web.xml文件中添加servlet侦听器ContextLoaderListener来自定义此文件名和位置如下 -
<web-app...>
<!-------- <i>DispatcherServlet</i> 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 = "cn.xnip" />
<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的视图实现。
以下部分将向您展示如何创建实际组件,即Controller,Model和View。
定义控制器
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”的模型。
定义的服务方法可以返回String,其中包含用于呈现模型的view的名称。 此示例返回“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}是我们在Controller中设置的属性。 您可以在视图中显示多个属性。
Spring Web MVC框架示例
基于以上概念,让我们查看几个可以帮助您构建Spring Web应用程序的重要示例 -
Sr.No. | 示例和说明 |
---|---|
1 | Spring MVC Hello World示例 这个例子将解释如何编写一个简单的Spring Web Hello World应用程序。 |
2 | Spring MVC表单处理示例 此示例将说明如何使用HTML表单编写Spring Web应用程序以将数据提交到控制器并显示处理结果。 |
3 | Spring页面重定向示例 学习如何在Spring MVC Framework中使用页面重定向功能。 |
4 | Spring静态页面示例 了解如何在Spring MVC Framework中访问静态页面以及动态页面。 |
5 | Spring异常处理示例 学习如何处理Spring MVC Framework中的异常。 |