SpringMVC

SpringMVC

注解收集:

-@component    组件
    -@service      service
    -@controller   contro1ler
    /*代表这个类会被Spring接管
被这个注解的类,中的所有方法,如果返回值是string,并且有具体页面可以跳转,那么就会被视图解析器解析;**/

    -@Repository   dao

    -@RequestMapping/*注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。**/

    -@PathVariable/*在Spring MVC中可以使用@PathVariable注解,让方法参数的值对应绑定到一个URl模板变量
    @RequestMapping("/add/{a}/{b}")
    public String Test(@PathVariable int a, @PathVariable int b, Model model){

    }
    **/
    -@RequestParam("username") //前端传递参数
    -@ResponseBody//它就不会走视图解析器,会直接返回一个字符串
    -@RestController//他以下只会返回字符串

JavaWeb:认真学习,老师带,入门快

SSM框架:研究官方文档,锻炼自学能力,锻炼笔记能力,锻炼项目能力

SpringMVC + Vue + SpringBoot + SpringCloud + Linux

SSM = JavaWeb做项目;

Spring:IOC和AOP

SpringMVC:SpringMVC的执行流程!SSM整合

/:只匹配所有的请求,不会去匹配jsp页面

/*:匹配所有的请求,包括jsp页面

假设:你的项目的架构,是设计好的,还是演进的?

MVC :

MVVM:

​ M V VM(ViewModel):双向绑定

Spring:大杂烩,我们可以将SpringMVC中所有要用到的bean,注册到Spring中!

页面:{视图解析器前缀}+viewName+{视图解析器后缀}

一、SpringMVC的执行原理

SpringMVC

1.DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。

  • 我们假设请求的url为 :http://localhost:8080/SpringMVC/hello
  • 如上url拆分成三部分:
  • http://localhost:8080服务器域名. SpringMVC部署在服务器上的web站点hello表示控制器
  • 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。

2.HandlerMapping为处理器映射。DispatcherServlet调用

HandlerMapping,HandlerMapping根据请求url查找Handler。

3.HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为: hello。

4.HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

5.HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。

6.Handler让具体的Controller执行。

7.Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。

8.HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。

9.DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。

10.视图解析器将解析的逻辑视图名传给DispatcherServlet。

11.DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

12.最终视图呈现给用户。

二、配置

web.xml


        springmvc
        org.springframework.web.servlet.DispatcherServlet

            contextConfigLocation
            classpath:springmvc-servlet.xml

        1

        springmvc
        /

springmvc-servlet.xml


注解;springmvc-servlet.xml


三、注解开发SpringMVC

注解效果一样的,仅为了区分

-@component    组件
-@service      service
-@controller   contro1ler
//代表这个类会被Spring接管
//被这个注解的类,中的所有方法,如果返回值是string,并且有具体页面可以跳转,那么就会被视图解析器解析;
-@Repository   dao

RequestMapping 映射路径

@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的

方法都是以该地址作为父路径。

@Controller
@RequestMapping("h1")//父类
public class ControllerTest02 {
    @RequestMapping("/t2")//子类
    public String test1(Model model){
        model.addAttribute("msg","ControllerTest02");
        return "Test";
    }
}

@RequestParam 前端传参

@Controller
@RequestMapping("/user")
public class UserController {
    @GetMapping("/t1")
    public String test1(@RequestParam("username") String name, Model model) {
        //前端接收参数
        System.out.println("接收到的前端参数为:" + name);
        //将结果返回给前端
        model.addAttribute("msg", name);
        //跳转视图
        return "Test";
    }
}

User传递

  1. 接收前端用户传递的参数,判断参数的名字,假设名字直接在方法上,可以直接使用
  2. 假设传递的是一个对象User,匹配User对象中的字段名;如果名字一致则OK,否则,匹配不到
    @GetMapping("/t2")
    public String test2(User user){
        System.out.println(user);
        return "Test";
    }

Nodel 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了LinkedMap ,除了实现了自身的一些方法,同样的继承LinkedMap 的方法和特性;

ModelAndview 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

四、RestFul风格

概念:Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层

次,更易于实现缓存等机制。

使用RestFul操作资源:可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

@PathVariable注解

1、原来的写法:

@Controller
public class RestFulController {
    @RequestMapping("/add")
    public String Test(int a, int b, Model model){
        int result = a + b;
        model.addAttribute("msg","结果为:"+ result);
        return "Test";
    }
}

路径:http://localhost:8080/add?a=3&b=5

2、使用注解:

在Spring MVC中可以使用@PathVariable注解,让方法参数的值对应绑定到一个URl模板变量

@Controller
public class RestFulController {
    @RequestMapping("/add/{a}/{b}")
    public String Test(@PathVariable int a, @PathVariable int b, Model model) {
        int result = a + b;
        model.addAttribute("msg", "结果为:" + result);
        return "Test";
    }
}

路径:http://Localhost:8080/add/a/b

小结:

所有的地址栏请求默认都会是HTTP GET 类型的。

方法级别的注解变体有如下几个:组合注解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

3、为什么使用?

思考:使用路径变量的好处?

  • 使路径变得更加简洁、支持缓存、安全;
  • 获得参数更加方便,框架会自动进行类型转换。
  • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/1/a,则路径与方法不匹配,而不会是参数转换失败。

五、乱码问题

1、以前的方法

过滤器filter

public class EncodingFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
}

web.xml记得注册!!!


        EncodingFilter
        com.Aaron.filters.EncodingFilter

        EncodingFilter
        /*

2、SpringMVC过滤器

web.xml


        EncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter

            encoding
            utf-8

        EncodingFilter
        /*

六、JSON

1、什么是JSON?

JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。

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

在JavaScript语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。看

看他的要求和语法格式:

  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

1、将对象解析成json


    //编写一个JavaScript对象
    var user = {
        name: "小菜",
        age: 3,
        sex: "男"
    }
    //json转换
    var json = JSON.stringify(user)

    console.log(user)
    console.log(json)

2、将json转换为对象


    //编写一个JavaScript对象
    var user = {
        name: "小菜",
        age: 3,
        sex: "男"
    }
    //将JS对象转换为json
    var json = JSON.stringify(user);
    console.log(json);

    console.log("===================");

    //将json转换为js对象
    var obj= JSON.parse(json);
    console.log(obj);

2、使用json

1、依赖


    com.fasterxml.jackson.core
    jackson-databind
    2.13.2.2

2、乱码问题配置springmvc-servlet.xml


3、SimpleDateFormate

/**
SimpleDateFormat函数语法:
G 年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12)
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符
k 时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区 */

纯Java解决

    @RequestMapping("/j3")
    public String json3() throws JsonProcessingException {
        //Jackson , ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        Date date = new Date();

        SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //ObjectMapper,时间解析后的默认格式为:Timestamp,时间戳
        return mapper.writeValueAsString(SDF.format(date));
    }

Spring格式

    @RequestMapping("/j3")
    public String json3() throws JsonProcessingException {
        //Jackson , ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        //不使用时间戳的形式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        //自定义日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(sdf);

        Date date = new Date();

        return mapper.writeValueAsString(date);
    }

复用工具类

JasonUtis

public class JsonUtils {
    public static String getJson(Object object, String simpleDateFormat) {
        ObjectMapper mapper = new ObjectMapper();

        //不使用时间戳的形式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定义日期格式
        SimpleDateFormat sdf = new SimpleDateFormat(simpleDateFormat);
        mapper.setDateFormat(sdf);

        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

调用

    @RequestMapping("/j3")
    public String json3() throws JsonProcessingException {
        Date date = new Date();

        return JsonUtils.getJson(date,"yyyy-MM-dd HH:mm:ss");
    }

七、FastJson1

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字符串之间

1、导入依赖


    com.alibaba
    fastjson
    1.2.62

2、测试

    @RequestMapping("/j4")
    public String fastjson4() throws JsonProcessingException {
        List userList = new ArrayList();
        User user1 = new User("小菜1", 3, "男");
        User user2 = new User("小菜2", 3, "男");
        User user3 = new User("小菜3", 3, "男");
        User user4 = new User("小菜4", 3, "男");

        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);

        String string = JSON.toJSONString(userList);
        return string;
    }

CREATE TABLE books(
bookID INT(10) NOT NUll AUTO_INCREMENT COMMENT ‘书id’,
bookName VARCHAR(100) NOT NUll COMMENT ‘书名’,
bookCounts INT(11) NOT NUll COMMENT ‘数量’,
detail VARCHAR(200) NOT NUll COMMENT ‘描述’,
KEY bookID(bookID)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO books(bookID, bookName, bookCounts, detail)VALUES
(1,’Java’,’从入门到放弃’),
(2,’MySQL’,’从删库到跑路’),
(3,’Linux’,’从进门到进牢’);

八、Ajax

Ajax:异步无刷新请求

jQuery是一个库;js 的大量函数(方法)

jQuery 不是生产者,而是大自然搬运工。

jQuery Ajax本质就是XMLHttpRequest,对他进行了封装,方便调用!

SpringMVC

js:

  • 函数:闭包 () ()
  • Dom
  • id , name ,tag
  • create , remove
  • Bom
  • windowo
  • document

SpringMVC

Login.jsp


    Title

        function a1() {
            $.get({
                url: "${pageContext.request.contextPath}/a3",
                data: {"username": $("#username").val()},
                success: function (data) {
                    if (data.toString() === 'ok') {
                        $("#usernameInfo").css("color", "green");
                    } else {
                        $("#usernameInfo").css("color", "red");
                    }
                    $("#usernameInfo").html(data);
                }
            })
        }

        function a2() {
            $.get({
                url: "${pageContext.request.contextPath}/a3",
                data: {"password": $("#password").val()},
                success: function (data) {
                    if (data.toString() === 'ok') {
                        $("#passwordInfo").css("color", "green");
                    } else {
                        $("#passwordInfo").css("color", "red");
                    }
                    $("#passwordInfo").html(data);
                }
            })
        }

    用户名:

    密码:

Controller.java

    @RequestMapping("/a3")
    public String a3(String username, String password) {
        String msg = "";
        if (username != null) {
            //admin在数据库中查询
            if ("admin".equals(username)) {
                msg = "ok";
            } else {
                msg = "用户名有误";
            }
        }

        if (password != null) {
            //admin在数据库中查询
            if ("12345".equals(password)) {
                msg = "ok";
            } else {
                msg = "密码有误";
            }
        }
        return msg;
    }

九、拦截器

  1. 概念:SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
  2. 过滤器与拦截器的区别:拦截器是AOP思想(横切思想)的具体应用。

过滤器

  • servlet规范中的一部分,任何java web工程都可以使用
  • 在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的

Original: https://www.cnblogs.com/Alaskaboo/p/16305095.html
Author: Alaskaboo
Title: SpringMVC

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

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

(0)

大家都在看

  • Redis压缩列表

    此篇文章是主要介绍Redis在数据存储方面的其中一种方式,压缩列表。本文会介绍1. 压缩列表(ziplist)的使用场景 2.如何达到节约内存的效果?3.压缩列表的存储格式 4. …

    Java 2023年6月14日
    067
  • 二分查找

    基本知识 当数据量很大适宜采用二分查找方法。采用二分法查找时,一般来说数据需是排好序的. 其实二分查找的核心是 单调, 这个数组有序这是单调的一种情况, 对于局部调单也可以使用二分…

    Java 2023年6月7日
    0120
  • 实现随机验证码

    Java实现随机验证码的生成 随机验证码: 法一:普通方法 核心逻辑: 1.定义一个String类型的变量存储验证码字符。 2.定义一个for循环,循环n次(n为验证码的所需要字符…

    Java 2023年6月6日
    076
  • Redisson报错

    org.redisson.client.RedisResponseTimeoutException: Redis server response timeout (3000 ms)…

    Java 2023年6月6日
    081
  • Spring中实现文件上传

    实现图片上传用户必须能够上传图片,因此需要文件上传的功能。比较常见的文件上传组件有Commons FileUpload(http://jakarta.apache.org/comm…

    Java 2023年5月30日
    085
  • day40-网络编程02

    Java网络编程02 4.TCP网络通信编程 基本介绍 基于客户端–服务端的网络通信 底层使用的是TCP/IP协议 应用场景举例:客户端发送数据,服务端接收并显示控制台…

    Java 2023年6月15日
    074
  • 6000字|22张图 带你彻底弄懂Zookeeper分布式锁

    前面我们剖析了Redisson的源码,主要分析了Redisson实现Redis分布式锁的15问,理清了Redisson是如何实现的分布式锁和一些其它的特性。这篇文章就来接着剖析Zo…

    Java 2023年6月16日
    072
  • SpringBoot 项目部署 (配置文件分离)

    SpringBoot 配置文件加载 SpringBoot 加载配置文件的优先级如下: 当前目录下的 config 子目录; 当前目录; classpath下的 config文件夹;…

    Java 2023年6月7日
    066
  • 面试官:线程池如何按照core、max、queue的执行循序去执行?(内附详细解析)

    前言 这是一个真实的面试题。 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题: “线程池如何按照core、max、queue的执行循序去执行?”。 我…

    Java 2023年5月30日
    081
  • Mysql安装后打开MySQL Command Line Client闪退的解决方法

    问题原因:安装时mysql command line Client中的my.ini目录地址是MySQL软件的地址!实际上,我们安装MySQL时,一般是MySQL软件地址和MySQL…

    Java 2023年6月5日
    061
  • Spring(十一):使用注解开发

    一、导包(添加依赖) 在Spring4之后,想要使用注解就必须要导入spring-aop这个包,这里我直接添加的spring-webmvc,其中包含了我们需要的包。 maven:s…

    Java 2023年6月15日
    065
  • Java 入门阶段

    Java 帝国的诞生 java 特性和优势 JDK、JRE、JVM 搭建开发环境 HelloWorld IDEA 安装和介绍 C & C+ 1972年C诞生 贴近硬件,运行…

    Java 2023年6月8日
    0180
  • Java基础-JVM篇

    1.1 .线程 ​ 这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关…

    Java 2023年6月8日
    066
  • MongoDB 快速入门

    Storms make trees take deeper roots. 越是经历风暴,树木扎根越深。 org.springframework.boot spring-boot-s…

    Java 2023年6月9日
    075
  • java知识大全积累篇

    这里搜集了用来构建应用程序的工具。 Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建。Maven优于Apache Ant。后者采…

    Java 2023年5月29日
    072
  • Git SSH访问+多帐号

    Git SSH访问+多帐号 本篇说一下 Git 通过 ssh 访问 以及配置 多个公钥,因为一些墙化软件原因,导致用Http访问Github总是会卡死,最后发现ssh 访问可以 1…

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