- Spring MVC基础
- Spring MVC - 首页
- Spring MVC - 概述
- Spring MVC - 环境搭建
- Spring MVC - HelloWorld示例
- Spring MVC - 表单处理
- Spring MVC - 表单处理
- Spring MVC - 页面重定向
- Spring MVC - 静态页面
- Spring MVC - 表单标签库
- Spring MVC - 文本框
- Spring MVC - 密码框
- Spring MVC - 文本区域
- Spring MVC - 复选框(单选)
- Spring MVC - 复选框(多选)
- Spring MVC - 单选按钮(单选)
- Spring MVC - 单选按钮(多选)
- Spring MVC - 下拉列表
- Spring MVC - 列表框
- Spring MVC - 隐藏域
- Spring MVC - 错误处理
- Spring MVC - 文件上传
- Spring MVC - 处理器映射
- Bean名称URL处理器映射
- 控制器类名处理器映射
- 简单URL处理器映射
- Spring MVC - 控制器
- Spring MVC - 多动作控制器
- 属性方法名解析器
- 参数方法名解析器
- 可参数化视图控制器
- Spring MVC - 视图解析器
- 内部资源视图解析器
- Spring MVC - XML视图解析器
- 资源包视图解析器
- 多个解析器映射
- Spring MVC - 集成
- Spring MVC - Hibernate验证器
- Spring MVC - 生成RSS Feed
- Spring MVC - 生成XML
- Spring MVC - 生成JSON
- Spring MVC - 生成Excel
- Spring MVC - 生成PDF
- Spring MVC - 使用log4j
- Spring 常见问题解答
- Spring - 常见问题解答
- Spring 有用资源
- Spring MVC - 快速指南
- Spring MVC - 有用资源
- Spring MVC - 讨论
Spring - MVC框架概述
Spring Web MVC框架提供了一种模型-视图-控制器架构和现成的组件,可用于开发灵活且松散耦合的Web应用程序。MVC模式导致分离应用程序的不同方面(输入逻辑、业务逻辑和UI逻辑),同时提供这些元素之间的松散耦合。
模型封装应用程序数据,通常由POJO组成。
视图负责呈现模型数据,通常生成客户端浏览器可以解释的HTML输出。
控制器负责处理用户请求和构建相应的模型,并将其传递给视图进行呈现。
DispatcherServlet
Spring Web模型-视图-控制器(MVC)框架围绕一个DispatcherServlet设计,该Servlet处理所有HTTP请求和响应。下图显示了Spring Web MVC DispatcherServlet的请求处理工作流程。
以下是对应于传入DispatcherServlet的HTTP请求的事件序列:
接收到HTTP请求后,DispatcherServlet会查询处理器映射来调用相应的控制器。
控制器接收请求,并根据使用的GET或POST方法调用相应的服务方法。服务方法将根据定义的业务逻辑设置模型数据,并将视图名称返回给DispatcherServlet。
DispatcherServlet将借助视图解析器来选择请求的定义视图。
一旦视图确定,DispatcherServlet将模型数据传递给视图,最终在浏览器上呈现。
所有上述组件,即处理器映射、控制器和视图解析器,都是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的文件加载应用程序上下文。在本例中,我们的文件将是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>
现在,让我们检查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的视图实现。
现在让我们了解如何创建实际组件,即控制器、模型和视图。
定义控制器
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支持许多不同表示技术的视图类型。这些包括 - JSP、HTML、PDF、Excel工作表、XML、Velocity模板、XSLT、JSON、Atom和RSS feed、JasperReports等。但是,最常见的是使用JSTL编写的JSP模板。因此,让我们在/WEB-INF/hello/hello.jsp中编写一个简单的hello视图:
<html> <head> <title>Hello Spring MVC</title> </head> <body> <h2>${message}</h2> </body> </html>
这里的${message}是我们控制器中设置的属性。您可以在视图中显示多个属性。