栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC完整笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC完整笔记

文章目录
      • 1、回顾MVC
        • 1.1、MVC概述
        • 1.2、执行流程
        • 1.3、职责分析
        • 1.4、MVC框架做的事
        • 1.5、说明
      • 2、回顾servlet
        • 2.1、环境搭建
      • 3、SpringMVC介绍
        • 3.1、概述
        • 3.2、特点
        • 3.3、中心控制器
        • 3.4、执行原理
        • 3.5、初步搭建SpringMVC项目
        • 3.6、注意点
      • 4、使用注解开发SpringMVC
        • 4.1、环境搭建
        • 4.2、实现步骤
        • 4.3、控制器Controller
      • 5、RestFul风格
        • 5.1、概念
        • 5.2、功能
        • 5.3、传统方式操作资源
        • 5.4、使用RestFul操作资源
        • 5.5、传统方式的示例
        • 5.6、RestFul示例
        • 5.7、总结
      • 6、重定向和转发
        • 6.1、ModelAndView
        • 6.2、ServletAPI
        • 6.3、SpringMVC
      • 7、接收请求参数及数据回显
        • 7.1、接收请求参数
        • 7.2、数据回显到前端
      • 8、过滤器解决乱码问题
      • 9、JSON讲解
        • 9.1、什么是JSON
        • 9.2、JSON 和Javascript对象互转
        • 9.3、Controller返回JSON数据(Jackson)
        • 9.4、Fastjson

1、回顾MVC 1.1、MVC概述
  • MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。
  • 是将业务逻辑、数据、显示分离的方法来组织代码。
  • MVC主要作用是降低了视图与业务逻辑间的双向偶合。
  • MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
  • MVC三层架构
    • Model(模型)︰数据模型,提供要展示的数据,因此包含数据和行为。可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来: Value object(数据Dao)和服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
    • View(视图)︰负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
    • Controller(控制器)︰接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
  • 最典型的MVC就是JSP + servlet + javabean的模式。
1.2、执行流程
  • 用户发请求
  • Servlet接收请求数据,并调用对应的业务逻辑方法
  • 业务处理完毕,返回更新后的数据给servlet
  • servlet转向到JSP,由JSP来渲染页面
  • 响应给前端更新后的页面
1.3、职责分析
  • Controller:控制器
    • 取得表单数据
    • 调用业务逻辑
    • 向指定的页面
  • Model:模型
    • 业务逻辑
    • 保存数据的状态
  • View:视图
    • 显示页面
1.4、MVC框架做的事
  • 将url映射到java类或java类的方法
  • 封装用户提交的数据
  • 处理请求–调用相关的业务处理–封装响应数据
  • 将响应的数据进行渲染. jsp / html 等表示层数据.
1.5、说明
  • 常见的服务器端MVC框架有:Struts、Spring MVC、ASP.NET MVC、Zend framework、JSF;
  • 常见前端MVC框架:vue、angularjs、react、backbone;
  • 由MVC演化出了另外一些模式如:MVP、MVVM(M;V;VM–ViewModel:双向绑定)等
2、回顾servlet 2.1、环境搭建
  • 导入依赖

    
        junit
        junit
        4.12
    
    
        org.springframework
        spring-webmvc
        5.2.0.RELEASE
    
    
        javax.servlet
        servlet-api
        2.5
    
    
        javax.servlet.jsp
        jsp-api
        2.2
    
    
        javax.servlet
        jstl
        1.2
    
    
    
        org.projectlombok
        lombok
        1.18.20
    
    
  • 编写一个Servlet类HelloServlet,用来处理用户的请求

    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.获取前端参数
            String method = req.getParameter("method");
            if (method.equals("add")){
                req.getSession().setAttribute("msg","执行了add方法");
            }
            if(method.equals("delete")){
                req.getSession().setAttribute("msg","执行了delete方法");
            }
            //2.调用业务层
    
            //3.视图转发或者重定向
            req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,resp);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
    
  • 编写jsp页面test.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    ${msg}
    
    
    
  • 配置文件web.xml,

    
    
    
    	    
        
            hello
            com.ping.servlet.HelloServlet
        
        
            hello
            /hello
        
    
    
    
    
  • 部署Tomcat测试

3、SpringMVC介绍 3.1、概述
  • Spring MVC是Spring framework的一部分,是基于Java实现MVC的轻量级Web框架。
3.2、特点
  • 经量级,简单易学
  • 高效,基于请求响应的MVC框架
  • 与Spring兼容性好,无缝结合
  • 约定优于配置
  • 功能强大:RESTful、数据验证、格式化、本地化、主题等
  • 简洁灵活
  • 最重要的一点还是用的人多,使用的公司多
3.3、中心控制器
  • Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。
  • Spring MVC框架像许多其他MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet(它继承自HttpServlet 基类)。
3.4、执行原理
  • 当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。

  • 上图为SpringMVC的一个较完整的流程图,实线表示SpringMVC框架提供的技术,不需要开发者实现虚线表示需要开发者实现。
  • 简要分析执行流程
    • DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
      • 我们假设请求的url为 : http://localhost:8080/SpringMVC/hello
      • 如上url拆分成三部分:
      • http://localhost:8080服务器域名.
      • SpringMVC部署在服务器上的web站点
      • hello表示控制器
      • 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
    • HandlerMapping为处理器映射。DispatcherServlet调用
      HandlerMapping,HandlerMapping根据请求url查找Handler。
    • HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为: hello。
    • HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
    • HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
    • Handler让具体的Controller执行。
    • Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView
    • HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
    • DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
    • 视图解析器将解析的逻辑视图名传给DispatcherServlet。
    • DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
    • 最终视图呈现给用户。
3.5、初步搭建SpringMVC项目
  • 配置文件web.xml

    
    
    
        
        
            springmvc
            org.springframework.web.servlet.DispatcherServlet
            
            
                contextConfigLocation
                classpath:springmvc-servlet.xml
            
            
            1
        
    
        
        
        System.out.println(user);
        return "test";
    }
    
7.2、数据回显到前端
  • 通过ModelAndView,见3.5
    • 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
  • 通过ModelMap,用法同Model
    • 继承了 linkedMap ,除了实现了自身的一些方法,同样的继承linkedNap 的方法和特性;
  • 通过Model,见4.1
    • 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
8、过滤器解决乱码问题
  • 以前乱码问题通过过滤器解决,而SpringMVC给我们提供了一个过滤器,可以在web.xml中配置

    
        encoding
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
    
    
    
        encoding
        /*
    
    
9、JSON讲解 9.1、什么是JSON
  • JSON(Javascript Object Notation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。

  • 采用完全独立于编程语言的文本格式来存储和表示数据。

  • 简洁和清晰的层次结构使得JSON成为理想的数据交换语言。

  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

  • 在Javascript语言中,一切都是对象。因此,任何Javascript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。看看它的要求和语法格式:

    • 对象表示为键值对,数据由逗号分隔
    • 花括号保存对象
    • 方括号保存数组
  • JSON键值对是用来保存Javascript对象的一种方式,和Javascript对象的写法也大同小异,建/值对组合中的键名写在前面并用双引号""包裹,使用冒号∶分隔,然后紧接着值

  • JSON 是Javascript对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。

    //这是一个对象,注意键名也是可以使用引号包裹的
    var user ={
                name : "ping",
                age:3,
                sex:"男"
    };
    //这是一个JSON字符串,本质是一个字符串
    var json = '{"name":"ping","age":3,"sex":"男"}'
    
9.2、JSON 和Javascript对象互转
  • 要实现从Javascript对象转换为JSON字符串,使用JSON.stringify()方法:

    var json = JSON.stringify(user);
    
  • 要实现从JSON字符串转换为Javascript对象,使用JSON.parse()方法:

    var obj = JSON.parse(json);
    
  • 完整js

    
    
    
9.3、Controller返回JSON数据(Jackson)
  • Jackson应该是目前比较好的json解析工具;另外还有阿里巴巴的 fastjson等等。

  • 使用Jackson,需要导入它的jar包

    
        com.fasterxml.jackson.core
        jackson-databind
        2.10.0
    
    
  • 代码测试

    • 实体类User

      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
          private String name;
          private int age;
          private String sex;
      }
      
    • UserController

      @Controller//走视图解析器
      public class UserController {
      
          @RequestMapping("/j1")
          @ResponseBody //配合@Controller使用,不会走视图解析器,会直接返回一个字符串
         
          public String json1() throws JsonProcessingException {
              //jackson, ObjectMapoper
              ObjectMapper mapper = new ObjectMapper();
      
              //创建一个对象
              User user = new User("小明", 20, "男");
              String str = mapper.writevalueAsString(user);
              return str;
          }
      }
      
      
    • 使用@RestController注解(相当于@Controller+ @ResponseBody)

      @RestController //以下方法不走视图解析器,只会返回JSON字符串
      public class UserController {
          
          @RequestMapping("/j1")
          public String json1() throws JsonProcessingException {
              //jackson, ObjectMapoper
              ObjectMapper mapper = new ObjectMapper();
      
              //创建一个对象
              User user = new User("小明", 20, "男");
              String str = mapper.writevalueAsString(user);
              return str;
          }
      }
      
      
  • 将上述代码中的公共部分提到工具类中

    • JsonUtils类

      public class JsonUtils {
      
          public static String getJson(Object object){
              return getJson(object,"yyyy-MM-dd HH-mm-ss");
          }
      
          public static String getJson(Object object,String dateFormat){
              ObjectMapper mapper = new ObjectMapper();
              //使用ObjectMapper来格式化输出,不使用时间戳的方式
              mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
      
              //自定义日期格式
              SimpleDateFormat sf = new SimpleDateFormat(dateFormat);
      
              mapper.setDateFormat(sf);
      
              try {
                  return mapper.writevalueAsString(object);
              } catch (JsonProcessingException e) {
                  e.printStackTrace();
              }
      
              return null;
          }
      }
      
      
    • 测试

      @RequestMapping("/j1")
      public String json1() throws JsonProcessingException {
          User user = new User("小明", 20, "男");
          return JsonUtils.getJson(user);
      }
      
      @RequestMapping("/j2")
      public String json2() throws JsonProcessingException {
      
          List userList = new ArrayList();
      
          User user1 = new User("小明1", 20, "男");
          User user2 = new User("小明2", 20, "男");
          User user3 = new User("小明3", 20, "男");
          User user4 = new User("小明4", 20, "男");
      
          userList.add(user1);
          userList.add(user2);
          userList.add(user3);
          userList.add(user4);
      
          return JsonUtils.getJson(userList);
      }
      
      @RequestMapping("/j3")
      public String json3() throws JsonProcessingException {
      
          Date date = new Date();
          String json = JsonUtils.getJson(date);
          return json;
      }
      
  • 出现了乱码问题,需要设置一下它的编码格式为utf-8,以及它返回的类型;

    • 方式一:通过@RequestMaping的produces属性来实现,修改下代码

      //prodeces:指定响应体返回类型和编码
      @RequestMapping(value="/j1",produces="application/json;charset=utf-8")
      
    • 方式二(推荐):可以通过Spring配置统一指定,这样就不用每次都去处理了!
      可以在springmvc的配置文件(springmvc-servlet.xml)上添加一段消息StringHttpMessageConverter转换配置

      
          
              
                  
              
              
                  
                      
                          
                      
                  
              
          
      
      
9.4、Fastjson
  • fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是—样的。

  • fastjson的pom依赖

    
        com.alibaba
        fastjson
        1.2.60
    
    
  • fastjson三个主要的类:

    • JSonObject 代表json对象】
      • JSONObject实现了Map接口,猜想JSONObject底层操作是由Map实现的
      • JSONObject对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(), isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
    • 【JSonArray 代表json对象数组】
      • 内部是有List接口中的方法来完成操作的。
    • 【JSON代表JSONObject和JSONArray的转化】
      • JSON类源码分析与使用
      • 仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
  • 代码示例

    //fastjson
    @RequestMapping("/j4")
    public String json4(){
    
        User user = new User("小明", 20, "男");
    
        //Java对象 转 JSON字符串
        String s = JSON.toJSONString(user);
    
        //JSON字符串 转 Java对象
        User user1 = JSON.parseObject(s, User.class);
    
        //Java对象 转 JSON对象
        JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user);
        System.out.println(jsonObject1.getString("name"));
    
        //JSON对象 转 Java对象
        User user2 = JSON.toJavaObject(jsonObject1, User.class);
    
        return s;
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331625.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号