美文网首页
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