[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)

大家都在看

  • 图文实例解析,InnoDB 存储引擎中行锁的三种算法

    前文提到,对于 InnoDB 来说,随时都可以加锁(关于加锁的 SQL 语句这里就不说了,忘记的小伙伴可以翻一下上篇文章),但是并非随时都可以解锁。具体来说,InnoDB 采用的是…

    数据库 2023年6月6日
    099
  • 解决数据库报错Error 1390: Prepared statement contains too many placeholders的问题

    今天在开发项目时,试着一次性插入大量数据,结果出现了以下报错: 依稀记得以前也遇到过类似的问题,于是打算记录下错误原因及解决过程: 首先,这是由于sql语句中占位符数量限制导致的 …

    数据库 2023年6月14日
    097
  • Pisa-Proxy 之 SQL 解析实践

    SQL 语句解析是一个重要且复杂的技术,数据库流量相关的 SQL 审计、读写分离、分片等功能都依赖于 SQL 解析,而 Pisa-Proxy 作为 Database Mesh 理念…

    数据库 2023年6月16日
    0124
  • Redis锁相关

    Redis锁相关 君不见,高堂明镜悲白发,朝如青丝暮成雪。 背景:面试的时候被问到有哪些锁,很快脱口而出Volatile、Synchronized和ReentrantLock,也能…

    数据库 2023年6月14日
    079
  • 深入浅出分析 HashMap

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在集合系列的第一章,咱们了解到,Map的实现类有HashMap、LinkedHashMap、TreeMap、Ident…

    数据库 2023年6月14日
    074
  • mybatisplus不支持sum,但支持这个

    我们知道,要对数据求和,写sql很简单:select sum(exp) from table_name我们在用mybatisplus做求和计算的时候,mybatisplus的Wra…

    数据库 2023年6月9日
    0235
  • Mybatis-Plus一键生成代码

    Mybatis-Plus一键生成代码 一、闲言碎语 闲来无事看了看了MP的官网看到一键生成的代码更新了! 整个Ui风格都变了,遂决定瞅一眼新的代码生成器 官网地址~~ 二、引入依赖…

    数据库 2023年5月24日
    073
  • 小心陷入MySQL索引的坑

    索引可以说是数据库中的一个大心脏了,如果说一个数据库少了索引,那么数据库本身存在的意义就不大了,和普通的文件没什么两样。所以说一个好的索引对数据库系统尤其重要,今天来说说MySQL…

    数据库 2023年6月6日
    097
  • 高并发组件了解

    消息队列 A服务和多个服务耦合,内部维护对多个服务发送数据的接口,那么这些接口如果有的挂了,有的不需要了,那么还得修改A内部的代码,如果使用MQ,A发送消息就好,不必考虑那么多事情…

    数据库 2023年6月16日
    067
  • 8 int和Integer的区别

    数据类型 int是基本数据类型,Integer是int的包装类,属于引用类型 初始值 int的初始值为0,Integer的初始值为null 存储位置 int是直接存储在栈中的,In…

    数据库 2023年6月6日
    096
  • 360浏览器兼容模式下jsp页面访问不到js文件

    360浏览器兼容模式下jsp页面访问不到js文件 查看自己js中的语法问题,不要用ES6的语法,编译不了故找不到js文件 const var of 码出高效 java 所有整型包装…

    数据库 2023年6月11日
    072
  • markdown笔记

    注:笔记旨在记录 1.1 展示一级标题(在标题紧接的下一行加若干个’=’) ======= 1.2 展示二级标题 (在标题紧接的下一行加若干个’…

    数据库 2023年6月16日
    0104
  • javaweb之HttpSession对象

    1.session会话追踪原理 客户端第一次请求服务端,服务端会创建一个session对象并且存储下来,之后会将session的唯一标识sessionId设置到响应头中传给客户端 …

    数据库 2023年6月16日
    083
  • 数据库性能优化八大方案,你知道几个

    前言 毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。 如果我们有一套成熟的方法论,能让大家快速、准确的去选择…

    数据库 2023年6月14日
    079
  • 4、Idea设置显示多行文件

    使用IDEA时,可能会没有注意到,一旦打开过多的Java文件时,默认会堆积在一行显示,就像浏览器打开了多个标签一样,此时需要通过右侧箭头筛选的方式来选择其他文件。为了解决这一问题,…

    数据库 2023年6月6日
    0103
  • 老毛桃WinPE以ISO镜像模式安装CentOS7

    准备: 一台新台式机(2TB磁盘),将用于安装centos 7,注意安装前请使用工具将磁盘分区先删除。 一个u盘,用户制作老毛桃winpe启动盘。 从www.laomaotao.o…

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