美文网首页
SpringMVC简单案例

SpringMVC简单案例

作者: 煗NUAN | 来源:发表于2020-03-03 22:49 被阅读0次

    一.MVC简介

    • MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码. 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
    • MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序
      的模式:
      • 模型Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受的请求,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。javabean
      • 视图View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等。
      • 控制器Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责请 求转发和重定向;servlet
    • Spring MVC是基于 Model 2实现的技术框架,Model 2是经典的MVC(model,view,control)模型在WEB应用中的变体。这个改变主要源于HTTP协议的无状态性,Model 2 的目的和MVC一样,也是利用处理器分离模型,视图和控制,达到不同技术层级间松散层耦合的效果,提高系统灵活性,复用性和可维护性.大多情况下,可以将Model 2 与 MVC等同起来.
      • model2和model的区别
        • Model1和Model2的最根本的区别是,Model是JSP+JavaBeans开发模式,Model2是JSP+Servlet+JavaBeans开发模式,两者都是MVC模式的应用,但是应用程度不同。在Model2模式的开发下,基于分层思想,JavaBeans的代码也进行了抽象,原来JavaBeans是既做业务逻辑,也做数据持久化,既然分层,那么业务逻辑和数据持久化就得分开,这也就有了Dao层,所以说Dao层的出现也是策略模式的体现,将数据持久化进行封装,业务层使用时,不需要知道数据持久化的操作过程。(model1没有dao层和servlet层)

    二.Spring MVC创建项目的流程(实现controller接口)

    • 创建流程

      • 引入依赖
      • 配置web.xml
      • 配置SpringMVC配置文件
      • 创建controler包及控制类
      • 测试
    • 引入依赖

      <dependencies>
        <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>4.3.6.RELEASE</version>
        </dependency>
      </dependencies>
      
    • 配置web.xml文件

      • 让所的/请求都交给了DispatcherServlet,而DispatcherServlet里面需要配置一个contextConfigLocation,上下文配置路径,也就是我们的SpringMVC的配置文件。如果没有配置该属性,SpringMVC会在默认WEB-INF下去找[servlet-name]-servlet.xml文件
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
              <servlet>
                  <servlet-name>dispartcherservlet</servlet-name>
                  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                              <!--DispatcherServlet的路径不能出错-->
                  <init-param>
                      <param-name>contextConfigLocation</param-name>
                      <!--也可不写,但是要在WEB-INF下去找[servlet-name]-servlet.xml-->
                      <param-value>classpath:spring-mvc.xml</param-value>
                  </init-param>
              </servlet>
      
              <servlet-mapping>
                  <servlet-name>dispartcherservlet</servlet-name>
                  <url-pattern>/</url-pattern>
              </servlet-mapping>
      </web-app>
      
    • 配置SpringMVC的视图解析器 可以分别指定前缀和后缀

      • prefix: /WEB-INF/view/,那么控制器那边会在虚拟视图前拼接该字符串
      • suffix:.jsp或者 .html,那么控制器那边会在虚拟视图后面拼接该字符串
      • 配置缺省的servlet处理器,静态资源可以直接被访问
      <mvc:default-servlet-handler />
      
      <?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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
      
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
              <property name="prefix" value="/WEB-INF/page/" />   <!--拼接返回的ModelAndView的前部分-->
              <property name="suffix" value=".jsp" />       <!--拼接返回的ModelAndView的后缀-->
          </bean>
      
          <!--配置缺省的servlet处理器,静态资源可以直接访问-->
          <mvc:default-servlet-handler />
      
          <!--bean标签可以用name进行标识,也可以使用id,但是id属性值不能包含特殊字符,
              name值可以,路径中需要使用name来标识一个控制器的路径,指定name对应路径交给哪个控制器来进行具体的处理-->
          <bean name="/toLoginController" class="com.mvc.controller.ToLoginController" />
          <bean name="/toUserInfoController" class="com.mvc.controller.ToUserInfoController" />
      </beans>
      
    • 创建controler包及控制类

      • ToLoginController.java
      • SpringMVC配置文件中让/toLoginController请求会交给当前类来进行处理,自动执行Controller的回调方法
      public class ToLoginController implements Controller {
      
          @Override
          public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
              return new ModelAndView("loginController");
          }
      }
      
      • ToUserInfoController.java
      • SpringMVC配置文件中让/toUserInfoController请求会交给当前类来进行处理,自动执行Controller的回调方法
      public class ToUserInfoController implements Controller {
          @Override
          public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
              UserBean userBean=new UserBean();
      
              String uid= req.getParameter("uid");
              String name=req.getParameter("name");
              String age= req.getParameter("age");
              String sex=req.getParameter("sex");
              String img=req.getParameter("img");
      
              userBean.setUid(uid);
              userBean.setName(name);
              userBean.setAge(age);
              userBean.setSex(sex);
              userBean.setImg(img);
      
              ModelAndView mav=new ModelAndView("userInfoController","user",userBean);
              return mav;
          }
      
    • 页面及测试

      • loginController.jsp
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>login</title>
          <!-- 新 Bootstrap 核心 CSS 文件 -->
          <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
      </head>
      <body>
      <h3>欢迎你,大帅比</h3>
      <form action="/toUserInfoController" method="post" class="form-horizontal" role="form">
          <div class="form-group">
              <lable class="col-sm-2 control-label" >编号</lable>
              <div class="col-sm-8">
                  <input type="text" name="uid" class="form-control">
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" >名称</lable>
              <div class="col-sm-8">
                  <input type="text" name="name" class="form-control">
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" >年龄</lable>
              <div class="col-sm-8">
                  <input type="text" name="age" class="form-control">
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" >性别</lable>
              <div class="col-sm-8">
                  <input type="text" name="sex"  class="form-control">
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" >图片</lable>
              <div class="col-sm-8">
                  <input type="text" name="img"  class="form-control">
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" ></lable>
              <div class="col-sm-8">
                  <input type="submit" value="submit"  class="form-control">
              </div>
          </div>
      
      </form>
      
      <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
      <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
      
      <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
      <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
      </body>
      </html>
      
      
      • userInfoController.jsp
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>用户详情</title>
          <!-- 新 Bootstrap 核心 CSS 文件 -->
          <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
      </head>
      <body>
      <h3>大帅比,你好</h3>
      <div class="form-horizontal" role="form">
          <div class="form-group">
              <lable class="col-sm-2 control-label" >名称</lable>
              <div class="col-sm-8">
                  <span class="form-control">${user.name}</span>
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" >年龄</lable>
              <div class="col-sm-8">
                  <span class="form-control">${user.age}</span>
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" >性别</lable>
              <div class="col-sm-8">
                  <span class="form-control">${user.sex}</span>
              </div>
          </div>
      
          <div class="form-group">
              <lable class="col-sm-2 control-label" >图片</lable>
              <div class="col-sm-8">
                  <span class="form-control">${user.img}</span>
              </div>
          </div>
      
      </div>
      
          <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
          <script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
      
          <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
          <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
      </body>
      </html>
      
    • 执行流程

      • 项目启动时,先进入到web.xml文件中,根据DispatcherServlet跳转到配置文件spring-mvc.xml中,执行< bean name="/toLoginController" class="com.mvc.controller.ToLoginController" />,跳转到com.mvc.controller.ToLoginController.java中,自动执行ToLoginController.java中实现的Controller的回调方法,再到spring-mvc.xml中,去拼接地址,根据地址跳转页面
    • 注意

      • 也可以不在spring-mvc.xml中拼接地址的尾部扩展名,但是需要在控制器的回调函数中添加扩展名,不然地址拼接不正确

    三.SpringMVC流程

    • 流程

      • 用户发送请求至前端控制器DispatcherServlet
      • DispatcherServlet收到请求调用HandlerMapping处理器映射器
      • 处理器映射器找到具体的处理器handler(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
      • DispatcherServlet调用HandlerAdapter处理器适配器
      • HandlerAdapter经过适配调用具体的处理器handler(也就是我们编写的Controller,也叫后端控制器)
      • Controller执行完成返回ModelAndView
      • HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
      • DispatcherServlet将ModelAndView传给ViewReslover视图解析器
      • ViewReslover解析后返回具体View
      • DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
      • DispatcherServlet响应用户
    SpringMVC流程.jpg
    • 组件说明

      以下组件通常使用框架提供实现:

      • DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。

      • HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

      • HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。

      • handler:也就是我们编写的Controller,也叫后端控制器。

      • ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等

    相关文章

      网友评论

          本文标题:SpringMVC简单案例

          本文链接:https://www.haomeiwen.com/subject/yypllhtx.html