Spring Web MVC框架提供了模型 - 视图 - 控制器架构和现成的组件,可用于开发灵活且松散耦合的Web应用程序. MVC模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时在这些元素之间提供松散耦合.
模型封装了应用程序数据,一般来说,它们将包含 POJO .
视图负责呈现模型数据,一般情况下,它会生成客户端浏览器可以解释的 HTML 输出.
控制器负责处理用户请求和构建适当的模型并将其传递给渲染视图.
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 ,这是普通的 ApplicationContext 的扩展,包含Web应用程序所需的一些额外功能.
必需的配置
我们需要使用 web.xml 文件中的URL映射来映射您希望DispatcherServlet处理的请求.以下是显示 HelloWeb DispatcherServlet :
Spring MVC Application HelloWeb org.springframework.web.servlet.DispatcherServlet 1 HelloWeb *.jsp
web.xml 文件将保存在您的 WebContent/WEB-INF 目录中Web应用程序.初始化 HelloWeb DispatcherServlet后,框架将尝试从位于应用程序WebContent/WEB中的名为 [servlet-name] -servlet.xml 的文件加载应用程序上下文-INF目录.在这种情况下,我们的文件将是 HelloWeb-servlet.xml .
接下来,< servlet-mapping> 标记表示哪些URL将由哪个DispatcherServlet处理.这里,所有以.jsp结尾的HTTP请求都将由 HelloWeb DispatcherServlet处理.
如果你不想使用默认文件名 [servlet-name] -servlet.xml ,默认位置为WebContent/WEB-INF,您可以通过在web.xml中添加servlet侦听器 ContextLoaderListener 来自定义此文件名和位置文件如下 :
.... contextConfigLocation /WEB-INF/HelloWeb-servlet.xml org.springframework.web.context.ContextLoaderListener
现在,让我们检查 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.it1352"/> < bean class ="org.springframework.web.servlet.view.InternalResourceViewResolver"> < property name ="prefix"value ="/WEB-INF/jsp/"/> < property name ="suffix"value =".jsp"/>
以下是关于 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 路径相关.
next注释 @RequestMapping(method = RequestMethod.GET)用于将 printHello()方法声明为控制器处理HTTP GET请求的默认服务方法.我们可以定义另一个方法来处理同一个URL上的任何POST请求.
我们也可以用另一种形式编写上面的控制器,我们可以在@RequestMapping中添加其他属性,如下所示;
@Controllerpublic class HelloController{ @RequestMapping(value = "/hello", method = RequestMethod.GET) public String printHello(ModelMap model) { model.addAttribute("message", "Hello Spring MVC Framework!"); return "hello"; }}
值属性表示处理程序方法的URL映射,方法属性定义处理HTTP GET请求的服务方法.
以下是关于上面定义的控制器的一些重要注意事项;
您将在服务方法中定义所需的业务逻辑.您可以根据需要在此方法中调用另一个方法.
根据定义的业务逻辑,您将在此方法中创建一个模型.您可以设置不同的模型属性,视图将访问这些属性以显示结果.此示例创建一个模型,其属性为"message".
定义的服务方法可以返回一个String,其中包含视图的名称用于渲染模型.此示例返回"hello"作为逻辑视图名称.
创建JSP视图
Spring MVC支持不同表示技术的多种类型的视图.这些包括 - JSP,HTML,PDF,Excel工作表,XML,Velocity模板,XSLT,JSON,Atom 和 RSS 供稿, JasperReports 等但是,最常见的是使用JSTL编写的JSP模板.所以,让我们在/WEB-INF/hello/hello.jsp中写一个简单的hello视图 :
Hello Spring MVC ${message}
这里 $ {message} 这是我们在Controller中设置的属性.您可以在视图中显示多个属性.