Spring MVC: Spring mvc 和servlet的模式流程: 1.用户发请求 2.Servlet接受请求数据,调用对应的业务逻辑方法 3.业务处理完毕,返回更新后丶数据给servlet 4.servlet转向JSP,由JSP来渲染页面 5.响应给前端更新后的页面
注: Spring MVC 框架并不关心使用的视图技术,唯一需要的只是对应的映射值。
职责分析: Controller: (Servlet:调用层) 1.取得表单数据 2.调用业务逻辑 3.转向定向页面 Model: (service and DAO 层) 1.业务逻辑 2.保存数据的状态 View: 前端页面层,mvc教程里默认是jsp。 java:越大的项目相比其他语言越好维护
补充概念: 概念:
VO(View Object): 视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object): 数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO(Domain Object): 领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
PO(Persistent Object): 持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
模型:
对象在三层架构应用中的位置
用户发出请求(可能是填写表单),表单的数据在展示层被匹配为VO。
展示层把VO转换为服务层对应方法所要求的DTO,传送给服务层。
服务层首先根据DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务。
服务层把DO转换为持久层对应的PO(可以使用ORM工具,也可以不用),调用持久层的持久化方法,把PO传递给它,完成持久化操作。
对于一个逆向操作,如读取数据,也是用类似的方式转换和传递,略。具体配置: 1)创建 Web 应用并引入 JAR 包
在 MyEclipse 中创建一个名为 springMVCDemo01 的 Web 应用,在 springMVCDemo01 的 lib 目录中添加 Spring MVC 程序所需要的 JAR 包,包括 Spring 的 4 个核心 JAR 包、commons-logging 的 JAR 包以及两个与 Web 相关的 JAR 包(spring-web-3.2.13.RELEASE.jar 和 spring-webmvc-3.2.13. RELEASE.jar)。
另外,在 Spring MVC 应用中使用注解时不要忘记添加 spring-aop-3.2.13.RELEASE.jar 包,添加后的 JAR 包如图 1 所示。
添加后的JAR包 图 1 添加后的 JAR 包 2)在 web.xml 文件中部署 DispatcherServlet
在开发 Spring MVC 应用时需要在 web.xml 中部署 DispatcherServlet,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns ="http://java.sun.com/xml/ns/javaee" xmlns:web ="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version ="3.0" > <display-name > springMVC</display-name > <servlet > <servlet-name > springmvc</servlet-name > <servlet-class > org.springframework.web.servlet.DispatcherServlet</servlet-class > <load-on-startup > 1</load-on-startup > </servlet > <servlet-mapping > <servlet-name > springmvc</servlet-name > <url-pattern > /</url-pattern > </servlet-mapping > </web-app >
上述 DispatcherServlet 的 servlet 对象 springmvc 初始化时将在应用程序的 WEB-INF 目录下查找一个配置文件,该配置文件的命名规则是“servletName-servlet.xml”,例如 springmvc-servlet.xml。
另外,也可以将 Spring MVC 配置文件存放在应用程序目录中的任何地方,但需要使用 servlet 的 init-param 元素加载配置文件。示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <servlet > <servlet-name > springmvc</servlet-name > <servlet-class > org.springframework.web.servlet.DispatcherServlet </servlet-class > <init-param > <param-name > contextConfigLocation</param-name > <param-value > classpath:springmvc-servlet.xml</param-value > </init-param > <load-on-startup > 1</load-on-startup > </servlet > <servlet-mapping > <servlet-name > springmvc</servlet-name > <url-pattern > /</url-pattern > </servlet-mapping >
3)创建 Web 应用首页
在 springMVCDemo01 应用的 WebContent 目录下有个应用首页 index.jsp。index.jsp 的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <%@ page language ="java" contentType ="text/html; charset=UTF-8" pageEncoding ="UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html > <head > <meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > <title > Insert title here</title > </head > <body > 未注册的用户,请<a href ="${pageContext.request.contextPath }/register" > 注册</a > ! <br /> 已注册的用户,去<a href ="${pageContext.request.contextPath }/login" > 登录</a > ! </body > </html >
4)创建 Controller 类
在 src 目录下创建 controller 包,并在该包中创建 RegisterController 和 LoginController 两个传统风格的控制器类(实现了 Controller 接口),分别处理首页中“注册”和“登录”超链接的请求。
RegisterController 的具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class LoginController implements Controller { public ModelAndView handleRequest (HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { return new ModelAndView("/WEB-INF/jsp/register.jsp" ); } } LoginController 的具体代码如下: package controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class RegisterController implements Controller { public ModelAndView handleRequest (HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { return new ModelAndView("/WEB-INF/jsp/login.jsp" ); } }
5)创建 Spring MVC 配置文件并配置 Controller 映射信息
传统风格的控制器定义之后,需要在 Spring MVC 配置文件中部署它们(学习基于注解的控制器后不再需要部署控制器)。在 WEB-INF 目录下创建名为 springmvc-servlet.xml 的配置文件,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc ="http://www.springframework.org/schema/mvc" xmlns:p ="http://www.springframework.org/schema/p" xmlns:context ="http://www.springframework.org/schema/context" xsi:schemaLocation =" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd" > <bean name ="/login" class ="controller.LoginController" /> <bean name ="/register" class ="controller.RegisterController" /> </beans >
6)应用的其他页面
RegisterController 控制器处理成功后跳转到 /WEB-INF/jsp 下的 register.jsp 视图,LoginController 控制器处理成功后跳转到 /WEB-INF/jsp 下的 login.jsp 视图,因此在应用的 /WEB-INF/jsp 目录下应有 register.jsp 和 login.jsp 页面,这两个 JSP 页面的代码在此省略。 只需要有对应的值和name可以调出就可以