[springmvc]springmvc超详细总结笔记

springMvc

1.回顾mvc

模型

  • 模型(dao,service):业务逻辑,保存数据的状态

视图

  • 视图(jsp,html……):展示页面

控制器

  • 控制(servlet):取得表单数据,调用业务逻辑,转向指定的页面

2.认识springMvc

  • 轻量级,简单易学
  • 高效,基于请求响应
  • 与spring可以无缝结合
  • 约定优于配置
  • 功能强大:restful风格,数据验证,格式化,本地化
  • 简洁灵活

[springmvc]springmvc超详细总结笔记

在以前的学习中,我们总是根据不同的需求请求不同的servlet,那么对于用户来说,这一步骤就非常麻烦,要不断的转换请求,为了解决这一问题,在原有的架构基础上面加上一层,专门用来处理这些请求,用户只需要请求 上面的一层即可。它就是DispatcherServlet

实际上这个DispatcherServlet它本身也是一个servlet。

实现原理:

[springmvc]springmvc超详细总结笔记

[springmvc]springmvc超详细总结笔记

快速搭建一个springmvc项目

方式一 实现类

(1)配置web文件


        springmvc
        org.springframework.web.servlet.DispatcherServlet

            contextConfigLocation
            classpath:springmvc-servlet.xml

        1

        springmvc
        /

(2)配置spring核心文件


(3)调用控制器层跳转

package com.spring.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author panglili
 * @create 2022-07-25-12:01
 */
public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView view = new ModelAndView();

        //业务代码
        String result="HelloSpringMvc";
        view.addObject("msg",result);
        //视图跳转
        view.setViewName("WEB-INF/jsp/test.jsp");

        return view;

    }
}

(4)视图层接受数据传给用户


    Title

${msg}

[springmvc]springmvc超详细总结笔记

方式二 注解实现

(1)配置web文件

  • 跟上面实现类的相同

(2)配置spring文件


(3)控制器类实现界面跳转

package com.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author panglili
 * @create 2022-07-25-13:15
 */
@Controller
public class hello {

    @RequestMapping("/hello")
    public String hello(Model md){
        md.addAttribute("msg","helloooo");
        return "hello";
    }
}

(4)视图跳转

  • 同实现类相同

3.restful风格

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。

RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

实现url的定义

在发起请求的时候可以加上参数

package com.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author panglili
 * @create 2022-07-25-13:15
 */
@Controller
public class hello {

    @RequestMapping("/hello/{a}/{b}")
    public String hello(@PathVariable int a,@PathVariable int b, Model md){
       int res=a*b;
        md.addAttribute("msg",res);
        return "hello";
    }
}

[springmvc]springmvc超详细总结笔记

restful的优点

  • 简洁,高效,安全性更高

也可以通过不同的请求方式实现请求路径的复用。

4.重定向与请求转发

使用servlet的请求转发

@RequestMapping("/servlet")
@ResponseBody
public String test1(HttpServletResponse res, HttpServletRequest req){
    req.setAttribute("msg","helloservlet");
    req.getRequestDispatcher("/hello");
    return "hello";
}

[springmvc]springmvc超详细总结笔记

使用servlet的重定向

@RequestMapping("/servlet")
@ResponseBody
public String test1(HttpServletResponse res, HttpServletRequest req) throws IOException {
    req.setAttribute("msg","helloservlet");
    //req.getRequestDispatcher("/hello");
    res.sendRedirect("/hello");
    return "hello";
}

[springmvc]springmvc超详细总结笔记

5.使用servlet实现控制器转发请求

在控制器类使用此请求方法,实现与Model方法一样的效果

@RequestMapping("/servlet")
public String test1(HttpServletResponse res, HttpServletRequest req){
    req.setAttribute("msg","helloservlet");

    return "hello";
}

[springmvc]springmvc超详细总结笔记

6.接收请求参数以及数据回显

接收普通参数

参数名与前端传递的参数名相同时

前端表单名name=name


    $Title$

    username:

后端收到的参数名String name

@RequestMapping("/hello")
public String hello(String name, Model md){

    md.addAttribute("msg",name);
    return "hello";
}

因此可以直接将前端的参数拿到

[springmvc]springmvc超详细总结笔记

参数名与前端传递的参数名不同时或者有多个参数取一个时

  • 名字相同时可以直接取到
@RequestMapping("/hello")
public String hello(String name, Model md){

    md.addAttribute("msg",name);
    return "hello";
}

[springmvc]springmvc超详细总结笔记
* 在参数前面加上你要取得前端参数名称,就可以取到指定的数据
@RequestMapping("/hello")
public String hello(@RequestParam("name") String name, Model md){

    md.addAttribute("msg",name);
    return "hello";
}

[springmvc]springmvc超详细总结笔记
@RequestMapping("/hello")
public String hello(@RequestParam("pwd") String name, Model md){

    md.addAttribute("msg",name);
    return "hello";
}

[springmvc]springmvc超详细总结笔记

接收对象

前端数据与对象数据名严格匹配,不配时使用@RequestParam,传入的属性不对应时缺少的属性会为空。

对象实体类

package com.spring.pojo;

import lombok.Data;

/**
 * @author panglili
 * @create 2022-07-25-19:45
 */
@Data
public class User {
    private String name;
    private String pwd;
    private int age;
    private String email;
}

前端界面


    $Title$

    username:
    password:
    password:
    password:

后台接受

@RequestMapping("/hello")
public String hello(User user, Model md){

    md.addAttribute("msg",user);
    return "hello";
}

界面显示

[springmvc]springmvc超详细总结笔记

7.乱码问题

在web服务器配置中直接加上下面的过滤处理


        encoding
        org.springframework.web.filter.CharacterEncodingFilter

            encoding
            utf-8

            forceEncoding
            true

        encoding
        /*

8.json

  • 前后端分离时代,前后端工程师约定的方便数据交换格式

JSON(JavaScript Object Notation, JS对象简谱)是一种 轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

json转换为js对象

//将json转json
 var obj =JSON.parse(json);
 console.log(obj);

js对象转换为json字符串

 //将js转换为json
var json= JSON.stringify(people);
console.log(json);

    Title

        var people={
            name:"哔哩哔哩",
            age:100,
            address:"www.bilibili.com"
        };

        //将js转换为json
       var json= JSON.stringify(people);
       console.log(json);

       //将json转json
        var obj =JSON.parse(json);
        console.log(obj);

jackson使用

导包


    com.fasterxml.jackson.core
    jackson-core
    2.13.3


    com.fasterxml.jackson.core
    jackson-databind
    2.13.3

Jackson转换java和json数据格式

package com.spring.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.spring.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author panglili
 * @create 2022-07-25-20:36
 */
@Controller
public class JsonController {
    //produces = "application/json;charset=utf-8"
    //json提供的数据编码处理
    @ResponseBody
    @RequestMapping(value = "/json",produces = "application/json;charset=utf-8")
    public String json1() throws JsonProcessingException {
        //jsckson 提供的将一个json字符与java对象自动转换的类
        ObjectMapper mapper = new ObjectMapper();

        //创建对象
        User user=new User("小镇",19,"男");
        //交给mapper转换
        String s = mapper.writeValueAsString(user);

        return s;

    }
}

json处理乱码还有一种方式,直接配置在mvc中,不需要每个请求上面都去搞


fastjson的使用

导包


    com.alibaba
    fastjson
    1.2.72

直接调用它提供的JSON对象

@RequestMapping("/j2")
@ResponseBody
public String json(){
    User user=new User("小镇",19,"男");
    String s = JSON.toJSONString(user);
    return s;
}

9.ssm整合框架

此整合没有具体的业务,因为ssm整合最难的点就在于配置文件的整合,因此这里只详细记录配置文件的整合

  • spring和dao整合将mybatis的配置文件的数据库连接和sqlsessionfactory的功能
  • spring和service整合将业务层的事务和日志利用aop实现
  • spring和mvc整合实现视图跳转

总之,spring这个大容器将所有的事情包揽,统一的控制

1.spring和dao



2.spring和service


3.spring和mvc


最后将这几个spring的配置文件导入到一个applicationContext的配置文件即可


10.Ajax异步请求

  • Ajax即 Asynchronous Javascript And XML(异步JavaScript和XML在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的’新’方法 。 使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。

总之就是异步无刷新的请求

使用jQuery的库实现ajax


    ajax

    function ajax() {
        $.post({
            url:"${pageContext.request.contextPath}/ajax/j1",
            data:{"name":$("#username").val()},
            success:function(data){
                alert(data);
            }
        })
    }

 name:

@RequestMapping("/ajax/j1")
@ResponseBody
public void ajax(String name, HttpServletResponse res) throws IOException {
    System.out.println(name+"this is name value");
    if(name.equals("panglili")){
        res.getWriter().write("true");
    }else{
        res.getWriter().write("false");
    }

}

在表单失去焦点的一瞬间,前端就向后台发起了ajax异步请求

[springmvc]springmvc超详细总结笔记

[springmvc]springmvc超详细总结笔记

使用ajax实现前后台对象数据交换

  • 下面是jsp代码,当前台点击加载数据的时候,就会异步处理去后台拿取到所有用户的数据显示在前台

    ajax

    function ajax() {
        $.post({
            url:"${pageContext.request.contextPath}/ajax/j2",
            // data:{"name":$("#username").val()},

            success:function(data){
                var html="";
               for(var i=0;i<data.length;i++){
                   html+="<tr>"+
                       "<td>"+data[i].name+"</td>"+
                       "<td>"+data[i].age+"</td>"+
                           "<td>"+data[i].sex+"</td>"+
                       "</tr>"
               }
               $("#tab").html(html);
            }
        });
    }

      name
      age
      sex

  • 下面是后台代码,当收到前端请求,返回所有数据,在前后台分离时代,前端与后台只需做好各自的事情,实现相应的交接即可。
@RequestMapping("/ajax/j2")
@ResponseBody
public List ajax2(){
    //模拟实体类为数据库数据
    ArrayList users = new ArrayList();
    User user1 = new User("xiaoming",19,"nan");
    User user2 = new User("xiaozhang",19,"nan");
    User user3 = new User("xiaohong",19,"nan");
    users.add(user1);
    users.add(user2);
    users.add(user3);
    return users;
}

[springmvc]springmvc超详细总结笔记

11.拦截器

  • 只会拦截controller的请求,对于静态资源不处理

被spring代理的拦截器实现只需要两步:

1.实现一个拦截器类

package com.spring.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author panglili
 * @create 2022-07-26-13:43
 */
//继承一个拦截器
public class MyInterceptor implements HandlerInterceptor {

    //true 放行
    //false 不放行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("处理前-------------");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("处理后-------------");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        System.out.println("清理—--------------");
    }
}

2.配置拦截器


Original: https://www.cnblogs.com/lumanmanqixiuyuanxi/p/16544589.html
Author: 路漫漫qixiuyuanxi
Title: [springmvc]springmvc超详细总结笔记

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619545/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java 中的线程池

    为什么要用线程池 在 HotSpot VM 的线程模型中,Java 线程被一对一映射为内核线程。 Java 在使用线程执行程序时,需要调用操作系统内核的 API,创建一个内核线程,…

    数据库 2023年6月11日
    060
  • js中创建正则对象时,变量中存在转义字符(’/’,’.’等)时,是否需要转义?

    使用直接量创建正则时,很方便,但是如果存在变量时,不适用。 使用正则对象(RegExp)创建时,对于变量中的转义字符不需要处理。 另外测试正则地址: https://develop…

    数据库 2023年6月11日
    098
  • MySQL锁:02.InnoDB锁

    传送门:MySQL锁:01.总览传送门:MySQL锁:02.InnoDB锁传送门:MySQL锁:03.InnoDB行锁 InnoDB锁 InnoDB行锁实现机制 InnoDB隐式、…

    数据库 2023年6月16日
    076
  • 多商户商城系统功能拆解22讲-平台端分销商品

    多商户商城系统,也称为B2B2C(BBC)平台电商模式多商家商城系统。可以快速帮助企业搭建类似拼多多/京东/天猫/淘宝的综合商城。 多商户商城系统支持商家入驻加盟,同时满足平台自营…

    数据库 2023年6月14日
    094
  • SQL语言的总结

    SQL语言分类:1.数据查询语言(DQL:Data Query Language),也称为”数据检索语句”,用以从表中查询获得数据,常用关键字SELECT …

    数据库 2023年5月24日
    065
  • Jenkins初始化界面一直显示Please wait while Jenkins is getting ready to work …

    第一次访问 jenkins时,会提示如下界面: 注:如果这个界面初始化的时间过长,则需要修改相关配置文件。 原因:因为访问官网太慢。我们只需要换一个源,不使用官网的源即可。 1、找…

    数据库 2023年6月14日
    063
  • Linux 学习笔记2(未完待续)

    Linux 学习笔记2 学习Linux的原因 Linux刚面世时并没有图形界面,所有操作全靠命令完成,如磁盘操作、文件读写、目录操作、进程管理、文件权限; 在职场中,大量的服务器维…

    数据库 2023年6月14日
    070
  • MyBatis详解

    😀搭建 MyBatis mysql mysql-connector-java 8.0.29 org.mybatis mybatis 3.5.7 junit junit 4.12 t…

    数据库 2023年6月14日
    070
  • Docker 从入门到入土

    1、Docker简介 1.1 虚拟化技术 介绍 Docker之前有必要了解一下虚拟化技术,其实Docker的出现也是虚拟机技术发展的一个里程碑。随着企业业务量的不断提升,需要横向的…

    数据库 2023年6月6日
    072
  • Python–异常

    1 # -*- coding:utf-8 -*- 2 name = ‘tj’ 3 try: 4 int(name) 5 except (IndexError,KeyError) a…

    数据库 2023年6月9日
    062
  • 01-MySQL连接查询、聚合函数

    1、连接查询 1.1、左连接 以左表为基准进行查询,左表数据回全部显示出来 右表中如果匹配连接条件的数据则显示相应字段的数据,如果不匹配,则显示为NULL 1.2、右连接 以右表为…

    数据库 2023年6月16日
    095
  • Zabbix-(1)安装

    环境: VMware Workstation Pro 16.0 &#x7248;&#x672C; &#x7CFB;&#x7EDF; Centos7 …

    数据库 2023年6月14日
    065
  • Linux快速安装流量监控工具(实用版)

    前言: Linux流量监控工具,在此我推荐两种分别为: 1、nload(推荐)因为个人看着舒服点😂 2、iftop 以上两种任选其一即可,在此对两种都有介绍和安装教程,我写了,大家…

    数据库 2023年6月16日
    072
  • MySQL 8 新特性之Clone Plugin

    Clone Plugin是MySQL 8.0.17引入的一个重大特性,为什么要实现这个特性呢?个人感觉,主要还是为Group Replication服务。在Group Replic…

    数据库 2023年6月11日
    0104
  • 对象映射时 Integer 类型字段转换枚举处理麻烦 一个工具类搞定

    使用场景 当我们返回给前端所需的对象数据时,大多数情况可以直接使用 StructMap 映射实现自动转换,但碰到对象中的某些字段需要从 Integer 类型转换成对应枚举的时候,在…

    数据库 2023年6月6日
    056
  • 将博客搬至CSDN

    将博客搬至CSDN posted @2021-11-11 15:01 深海云帆 阅读(20 ) 评论() 编辑 Original: https://www.cnblogs.com/…

    数据库 2023年6月9日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球