当前位置: 首页 > news >正文

SpringMVC重点记录

目录

  • 1.学习重点
  • 2.回顾MVC
  • 3.回顾servlet
  • 4.初始SpringMVC
    • 4.1.为什么要学SpringMVC?
    • 4.2.SpringMVC的中重点DispatcherServlet
    • 4.3.SpringMVC项目的搭建
    • 4.4.MVC框架要做哪些事情?
    • 4.5.可能会遇到的问题
  • 5.SpringMVC的执行原理
  • 6.使用注解开发SpringMVC
  • 7.Controller控制总结
  • 8.RestFul风格
  • 9.转发和重定向
    • 9.1.通过ModelAndView对象
    • 9.2.通过ServletAPI
    • 9.3.通过SpringMVC
      • 9.3.1.通过SpringMVC来实现转发和重定向 - 无需视图解析器
      • 9.3.2.通过SpringMVC来实现转发和重定向 - 有视图解析器;
  • 10.数据处理
    • 10.1.处理请求提交的数据
    • 10.2.后端数据显示到前端
    • 10.3乱码问题解决
  • 11.json交互处理
    • 11.1.什么是json?
    • 11.2.jackson的使用
    • 11.3.fastjson的使用
  • 12.ssm整合
    • 12.1.环境搭建
      • 12.1.1.版本:
      • 12.1.2.数据库环境:
      • 12.1.3.项目架构:
      • 12.1.4.实体类及对应的mapper:
    • 12.1.整合mybatis层
    • 12.2.整合Spring层
    • 12.3.整合SpringMVC层
    • 12.4.项目运行
  • 13.Ajax总结
    • 13.1.什么是Ajax?
    • 13.2.伪造Ajax
    • 13.3JQuery的使用
      • 13.3.1.JQuery是什么?
      • 13.3.2.使用JQuery的两种方式
      • 13.3.3.Ajax的请求参数与JQuery的注意事项
    • 13.5.Ajax和JQuery的使用
    • 13.6.Ajax执行流程
    • 13.7.Ajax验证用户名体验
    • 13.8.JSON乱码问题的解决
  • 14.拦截器
    • 14.1.Springmvc的拦截器:
    • 14.2.登录判断验证:
  • 15.文件下载和上传
    • 15.1.文件上传
    • 15.2.文件下载
  • 16.总结和展望
    • 16.1.ssm回顾:
    • 16.2.前端应该掌握

1.学习重点

在这里插入图片描述

  • SpringMVC重点:SpringMVC执行流程,SSM框架整合。
  • 在这个阶段,博客的重要性非常重要。
  • mvc就是不停的做,做的越多理解的越深刻。

2.回顾MVC

MVC:模型(dao,service) ,视图(Jsp),和控制器(Servlet)。

在这里插入图片描述
在这里插入图片描述
细分pojo实体类,vo是视图层的对象。dto是数据传输时的对象。
在这里插入图片描述

架构的发展不是一直不变的,有这么一个过程。
在这里插入图片描述
在这里插入图片描述
java最优秀的地方在于适合构建一些复杂性的项目。
项目越大,java越容易维护。

3.回顾servlet

回顾servlet和tomcat。然后才能进阶到SpringMVC。
相关依赖:

    <dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>

3.1步骤
新建一个maven工程。
添加依赖。
加入web支持。
创建一个servlet。

//只要继承了servlet接口的程序就叫servlet。
public class HelloServlet  extends HttpServlet {@Overrideprotected 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);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

在这里插入图片描述

test.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>test</title>
</head>
<body>
${msg}
</body>
</html>

在web.xml中注册servlet。

<?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>hello</servlet-name><servlet-class>com.kuang.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>
<!--    <session-config>-->
<!--        <session-timeout>15</session-timeout>-->
<!--    </session-config>-->
<!--    <welcome-file-list>-->
<!--        <welcome-file>index.jsp</welcome-file>-->
<!--    </welcome-file-list>-->
</web-app>

在这里插入图片描述
测试运行。

如果为了保证安全,用户不可见就放在WEB-INF下面,如果是公共的页面就放在web下面就可以了。
Artifact 是maven中的一个概念,表示某个module要如何打包。
在这里插入图片描述
在这里插入图片描述
发现依赖没有导入。

在这里插入图片描述
在这里插入图片描述

4.初始SpringMVC

4.1.为什么要学SpringMVC?

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
在这里插入图片描述

4.2.SpringMVC的中重点DispatcherServlet

在这里插入图片描述
DispatcherServlet:请求分发调度作用。
在这里插入图片描述
SpringMVC建议全用注解。
在这里插入图片描述

4.3.SpringMVC项目的搭建

  • 1.新建maven项目,添加web支持。
  • 2.导入依赖。
   <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>
  • 3.配置web.xml,注册DispatcherServlet:

web.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"><!--A.注册DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><!--启动级别-1--><load-on-startup>1</load-on-startup></servlet><!--/ 匹配所有的请求;(不包括.jsp)--><!--/* 匹配所有的请求;(包括.jsp)--><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
  • 4.配置springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<!--B,配置这三个-->
<!--    1.添加 处理映射器--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--    2.添加 处理器适配器--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--上面两个的作用是把url去匹配Spring里面有哪个Controller,然后去处理它。--><!--3.视图解析器:DispatcherServlet给他的ModelAndView--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean>
  • 5.写一个控制类,实现Controller接口
package com.kuang.controller;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;//C.先导入controller接口
public class HelloController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和视图ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中mv.addObject("msg","helloSpringMVC");
//封装要跳转的视图,放到放在ModelAndView中mv.setViewName("hello"); // /WEB-INF/jsp/hello.jsp
//        即可以用于存数据和跳转。会经过视图解析器拼接前后缀,然后找到返回的页面。return mv;}
}
/*
原来存放东西是通过session和request里面,现在通过ModelAndView存放东西。
原来跳转页面需要重定向或者转发,现在设置一个视图的名字就可以了。*/
  • 6.在springmvc-servlet.xml中注册该接口
<!--    Handler-->
<!-- c.   匹配导/hello后,交给HelloController去处理-->
<bean id="/hello" class="com.kuang.controller.HelloController"/>
  • 7.配置tomcat并启动

在这里插入图片描述

4.4.MVC框架要做哪些事情?

1.将url映射到java类或java类的方法 .
2.封装用户提交的数据 .
3.处理请求–调用相关的业务处理–封装响应数据 .
4.将响应的数据进行渲染 . jsp / html 等表示层数据 .

4.5.可能会遇到的问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.SpringMVC的执行原理

在这里插入图片描述
这里的前端控制器就理解成DispatcherServlet
在这里插入图片描述
在这里插入图片描述
即3个部分,1是适配请求是干嘛的 2.(请求到底做什么)根据请求找到Controller,返回ModelAndView 3.最后(视图解析)渲染到视图上。
真正要做的就两步:1.controller层调业务层。2.设置视图返回的名字。

6.使用注解开发SpringMVC

在这里插入图片描述

1.在springmvc-servlet.xml中自动扫描包,并且让SpringMVC不处理静态资源

   <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --><context:component-scan base-package="com.kuang.controller"/><!-- 让Spring MVC不处理静态资源 --><mvc:default-servlet-handler /><!--支持mvc注解驱动在spring中一般采用@RequestMapping注解来完成映射关系要想使@RequestMapping注解生效必须向上下文中注册DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例这两个实例分别在类级别和方法级别处理。而annotation-driven配置帮助我们自动完成上述两个实例的注入。--><mvc:annotation-driven />

2.使用注解实现控制类

package com.kuang.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller  //代表这个类会被Spring接管
//被这个注解的类的所有方法,如果返回值是String,并且有具体页面可以跳转
// 那么就会被视图解析器解析。
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/h1")
//返回一个视图解析器。public String Hello(Model model){model.addAttribute("msg","Hello,HelloController");return "hello";}
}

7.Controller控制总结

缺点是:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦;
使用注解必须使用包扫描。
在这里插入图片描述
在这里插入图片描述
只要改了java的代码,就重新发布(Reploy)一下。
只要改了配置文件,就重新tomcat。

8.RestFul风格

在这里插入图片描述
在这里插入图片描述

@Controller
public class RestFulController {
//    @RequestMapping("/add")
//    public String test1(int a, String b, Model model) {
//        String res = a + b;
//        model.addAttribute("msg", res);
//        return "test";
//    }
@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)
public String test1(@PathVariable int a,@PathVariable String b, Model model) {String res = a + b;model.addAttribute("msg", res);return "test";
}@PostMapping("/add/{a}/{b}")public String test2(@PathVariable int a,@PathVariable String b, Model model) {String res = a + b;model.addAttribute("msg", res);return "test";}
}

9.转发和重定向

三种跳转方式:1.通过ModelAndView对象。2.通过ServletAPI。3.通过SpringMVC。

9.1.通过ModelAndView对象

设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 .

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

9.2.通过ServletAPI

通过原生的servlet来做。

1.通过HttpServletResponse实现输出和重定向

rsp.sendRedirect("/index.jsp");

2.通过HttpServletResponse实现转发

  //转发req.setAttribute("msg","/result/t3");req.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(req,rsp);

9.3.通过SpringMVC

9.3.1.通过SpringMVC来实现转发和重定向 - 无需视图解析器

测试前,需要将视图解析器注释掉

   // 无视图解析器-转发@RequestMapping("/m1/t1")public String test1(){return "/WEB-INF/jsp/test.jsp";}//     无视图解析器-重定向@RequestMapping("/m1/t1")public String test1(){return "redirect:/index.jsp";}

9.3.2.通过SpringMVC来实现转发和重定向 - 有视图解析器;

//有视图解析器时-转发
@RequestMapping("/m1/t1")
public String test1(){return "test";//默认转发
}
//有视图解析器-重定向
@RequestMapping("/m1/t1")
public String test1(){return "redirect:/index.jsp";//默认转发
}

重定向仍然是这种形式。

10.数据处理

10.1.处理请求提交的数据

1、提交的域名称和处理方法的参数名一致

提交数据 : http://localhost:8080/hello?name=kuangshen

@RequestMapping("/hello")
public String hello(String name){System.out.println(name);return "hello";
}

2、提交的域名称和处理方法的参数名不一致

提交数据 : http://localhost:8080/hello?username=kuangshen
@RequestParam("请求中的参数")

//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){System.out.println(name);return "hello";
}

3、提交的是一个对象

要求提交的表单域和对象的属性名一致 , 参数使用对象即可
提交数据 : http://localhost:8080/mvc04/user?name=kuangshen&id=1&age=15

public class User {private int id;private String name;private int age;
}

请求的参数自动转化为对象中的属性。

@RequestMapping("/user")
public String user(User user){System.out.println(user);return "hello";
}

如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。

10.2.后端数据显示到前端

第一种 : 通过ModelAndView

public class ControllerTest1 implements Controller {public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {//返回一个模型视图对象ModelAndView mv = new ModelAndView();mv.addObject("msg","ControllerTest1");mv.setViewName("test");return mv;}
}

第二种 : 通过ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){//封装要显示到视图中的数据//相当于req.setAttribute("name",name);model.addAttribute("name",name);System.out.println(name);return "hello";
}

第三种 : 通过Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){//封装要显示到视图中的数据//相当于req.setAttribute("name",name);model.addAttribute("msg",name);System.out.println(name);return "test";
}

对于新手而言简单来说使用区别没有太大差别。

Model 只有寥寥几个方法只适合用于储存数据
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

10.3乱码问题解决

11.json交互处理

11.1.什么是json?

Json:一种数据交换的格式,并不是一个新的语言。
后端提供一个这样的格式,前端按照这样的格式去解析
在这里插入图片描述

在这里插入图片描述

前端一般对象和json对象之间的转换。

<body>
<script type="text/javascript">
<!--编写一个javascript对象-->
var user={name:"阿文",age:12,sex:"男"
};
//将js对象转换为json对象
var stringify = JSON.stringify(user);
console.log(stringify)
console.log("=========")
// console.log(user)//将json对象转为为js对象
var parse = JSON.parse(stringify);
console.log(parse);
</script>
</body>

重点要学习java这么生成json对象。

一般说的API接口是提供一个地址栏,别人访问地址栏就可以访问到。在这里插入图片描述

11.2.jackson的使用

常用解析json的工具:Jackson, fastjson。
Jackson的使用:

(1)导包

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.8</version>
</dependency>

(2)JsonUtils工具类

package com.kuang.utils;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;import java.text.SimpleDateFormat;/****/
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();
//不使用时间戳的方式mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);
//        自定义日期的格式SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);mapper.setDateFormat(sdf);try {return mapper.writeValueAsString(object);} catch (JsonProcessingException e) {e.printStackTrace();}return null;}
}

(3)使用

    //produces属性解决json字符串乱码问题。@RequestMapping(value = "/j3",produces = "application/json;charset=utf-8")@ResponseBody  //不会走视图解析器,会直接返回一个字符串public String json3() throws JsonProcessingException {Date date = new Date();return JsonUtils.getJson(date,"yyyy-MM-dd");}@RequestMapping(value = "/j2",produces = "application/json;charset=utf-8")@ResponseBody  //不会走视图解析器,会直接返回一个字符串public String json2() throws JsonProcessingException {
//        ObjectMapper objectMapper = new ObjectMapper();List<User> userList=new ArrayList<>();User user1 = new User("小奈儿", 13, "男");User user2 = new User("小奈儿", 14, "男");User user3 = new User("小奈儿", 15, "男");User user4 = new User("小奈儿", 16, "男");userList.add(user1);userList.add(user2);userList.add(user3);userList.add(user4);
//创建一个对象return JsonUtils.getJson(userList);}

@RestController和@ResponseBody注解:

  • @RestController:@Controller更换成@RestControlle后,该类下面的所有方法,只会返回json字符串。

@RequestMapping和@ResponseBody联合使用,该注解标记的方法会返回字符串。

  • @RequestMapping(value = “/j2”,produces = “application/json;charset=utf-8”)
  • @ResponseBody //不会走视图解析器,会直接返回一个字符串。

11.3.fastjson的使用

(1)Fastjosn的pom依赖:

   <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.8</version></dependency>

(2)使用:

package com.kuang.controller;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kuang.pojo.User;import java.util.ArrayList;
import java.util.List;public class FastJsonDemo {public static void main(String[] args) {//创建一个对象User user1 = new User("秦疆1号", 3, "男");User user2 = new User("秦疆2号", 3, "男");User user3 = new User("秦疆3号", 3, "男");User user4 = new User("秦疆4号", 3, "男");List<User> list = new ArrayList<User>();list.add(user1);list.add(user2);list.add(user3);list.add(user4);System.out.println("*******Java对象 转 JSON字符串*******");String str1 = JSON.toJSONString(list);System.out.println("JSON.toJSONString(list)==>"+str1);String str2 = JSON.toJSONString(user1);System.out.println("JSON.toJSONString(user1)==>"+str2);System.out.println("\n****** JSON字符串 转 Java对象*******");User jp_user1=JSON.parseObject(str2,User.class);System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);System.out.println("\n****** Java对象 转 JSON对象 ******");JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name"));System.out.println("\n****** JSON对象 转 Java对象 ******");User to_java_user = JSON.toJavaObject(jsonObject1, User.class);System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);}
}

12.ssm整合

12.1.环境搭建

12.1.1.版本:

在这里插入图片描述

12.1.2.数据库环境:

create database `ssmbuild`;
USE `ssmbuild`;DROP TABLE IF EXISTS `books`;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=utf8INSERT  INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');

12.1.3.项目架构:

在这里插入图片描述

12.1.4.实体类及对应的mapper:

Books.java

public class Books {
private int bookID;
private String bookName;
private int bookCounts;
private String detail;}

BooksMapper.java

import com.kuang.pojo.Books;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BooksMapper {
//    增加一本书int addBook(Books books);
//    删除一本书
int deleteBookById(@Param("id") int id);
//    更新一本书
int updateBook(Books books);
//    查询一本书
Books queryBookById(@Param("id") int id);
//    查询所有书List<Books> queryAllBook();
//    通过书籍名查询书籍Books queryBookByName(@Param("bookName") String bookName);
}

BooksMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.BooksMapper"><insert id="addBook" parameterType="Books">insert into booksvalues (null, #{bookName}, #{bookCounts}, #{detail});</insert><delete id="deleteBookById" parameterType="int">deletefrom bookswhere bookID = #{id}</delete><update id="updateBook" parameterType="Books">update books<set><if test="bookName!=null">bookName=#{bookName},</if><if test="bookCounts!=null">bookCounts=#{bookCounts},</if><if test="detail!=null">detail=#{detail}</if></set>where bookID=#{bookID}</update><select id="queryBookById" parameterType="int" resultType="Books">select * from books where bookID=#{id}</select><select id="queryAllBook" resultType="Books">select * from books</select><select id="queryBookByName"  resultType="Books">SELECT * FROM `books` where bookName=#{bookName}</select>
</mapper>

导入依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.kuang</groupId><artifactId>ssmbuild</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><!--    依赖--><dependencies><!--Junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!-- 数据库连接池 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!--Servlet - JSP --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!--Mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><!--Mybatis整合Spring--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency><!--Spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency><!--Spring连接jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.0.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version></dependency>
<!--        aop横切--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency></dependencies>
<!--    资源导出问题--><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build>
</project>

12.1.整合mybatis层

数据库配置文件:database.properties

jdbc.driver=com.mysql.jdbc.Driver
#如果使用Mysql8.0+,需要增加一个时区的配置
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456

在8.0后的Mysql里面,如果没有设时区,就会报错。

mybatis核心配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    配置数据源,交给Spring去做。--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings>
<typeAliases><package name="com.kuang.pojo"/>
</typeAliases><mappers>//注册mapper// <mapper class="com.kuang.dao.BooksMapper"/></mappers>
</configuration>

12.2.整合Spring层

1.spring-dao.xml

<?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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">
<!--1.关联数据库配置文件--><context:property-placeholder location="classpath:database.properties"/><!--    2.连接池:原来用的Spring的,这里用c3p0--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="jdbcUrl" value="${jdbc.url}"/><property name="driverClass" value="${jdbc.driver}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!-- c3p0连接池的私有属性 --><property name="maxPoolSize" value="30"/><property name="minPoolSize" value="10"/><!-- 关闭连接后不自动commit --><property name="autoCommitOnClose" value="false"/><!-- 获取连接超时时间 --><property name="checkoutTimeout" value="10000"/><!-- 当获取连接失败重试次数 --><property name="acquireRetryAttempts" value="2"/></bean><!--3.sqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/>
<!--        绑定Mybatis的配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/></bean><!--    4.配置dao接口扫描包,动态的实现了 Dao接口可以注入到Spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--    注入sqlSessionFactory--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!--    要扫描的dao包--><property name="basePackage" value="com.kuang.dao"/>
</bean></beans>

2.spring-service.xml:

<?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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 1.扫描service下的包-->
<context:component-scan base-package="com.kuang.service"/><!--2.将我们的所以业务类注入到Spring,可以通过配置或者注解实现--><bean id="BookServiceImpl" class="com.kuang.service.BooksServiceImpl"><property name="booksMapper" ref="booksMapper"/></bean><!-- 3.配置声明式事务配置--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--        注入数据源--><property name="dataSource" ref="dataSource"/></bean><!--4.aop事务支持,要加入事务就把下面的注释解开--><!--    结合AOP实现事务的织入--><!--    配置事务的通知:-->
<!--    <tx:advice id="txAdvice" transaction-manager="transactionManager">-->
<!--        <tx:attributes>-->
<!--            <tx:method name="*" propagation="REQUIRED"/>-->
<!--        </tx:attributes>-->
<!--    </tx:advice>--><!--    配置事务切入-->
<!--    <aop:config>-->
<!--        <aop:pointcut id="txPointCut" expression="execution(* com.kuang.*.*(..))"/>-->
<!--        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>-->
<!--    </aop:config>-->
</beans>

3.整合到Spring核心配置文件applicationContext.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="spring-dao.xml"/><import resource="spring-service.xml"/><import resource="spring-mvc.xml"/>
</beans>

12.3.整合SpringMVC层

加入web支持,配置web.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"><!--1.DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><!--一定要注意:我们这里加载的是总的配置文件,之前被这里坑了!--><param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--2.乱码过滤--><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--3.Session过期时间--><session-config><session-timeout>15</session-timeout></session-config>
</web-app>

配置spring-mvc.xml

<?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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置SpringMVC --><!-- 1.注解驱动 --><mvc:annotation-driven /><!-- 2.静态资源过滤--><mvc:default-servlet-handler/><!-- 3.扫描包:controller--><context:component-scan base-package="com.kuang.controller" /><!-- 4.视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean></beans>

在applicationContext.xml中进行整合:

 <import resource="spring-mvc.xml"/>

12.4.项目运行

1.配置tomcat
2.导入包:
在这里插入图片描述
3.运行项目。

13.Ajax总结

13.1.什么是Ajax?

在这里插入图片描述

url请求一个链接,只会有两种状态,一个是转发一个是重定向。这两个都会使整个页面刷新。

在这里插入图片描述
在这里插入图片描述

返回来的json数据展示在前端了。可以让我们的网页交互性极强,更像本地的原生应用。

在这里插入图片描述

13.2.伪造Ajax

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>iframe体验页面无刷新</title><script>function go() {//万物皆war//要操作对应的元素,就要先获取它。var url= document.getElementById("url").value;document.getElementById("iframe1").src = url;}</script>
</head>
<body>
<div><p>请输入地址:</p><p><input type="text" id="url" value="https://www.iqiyi.com/dianshiju/"><!--    点击提交之后,绑定一个事件onclick,点击事件,点击后就会触发该事件。--><input type="button" value="提交" onclick="go()"></p></div>
<div><!--  通过一个点击事件,改变窗口的内容。--><iframe id="iframe1" style="width: 100%;height: 500px"></iframe>
</div>
</body>
</html>

在这里插入图片描述

13.3JQuery的使用

13.3.1.JQuery是什么?

JQuery是一个库,里面包含Js的大量函数。
在这里插入图片描述

13.3.2.使用JQuery的两种方式

1.引入cdn

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

2.下载jquery.js文件

13.3.3.Ajax的请求参数与JQuery的注意事项

在这里插入图片描述
只会用到这四个。
在这里插入图片描述

13.5.Ajax和JQuery的使用

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title>
<%--    <script src="${pageContext.request.contextPath}/static/js/jquery-3.4.1.js"></script>--%><script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script>// $=jQueryfunction a(){//调这个函数后,发起一个请求。$.post({url:"${pageContext.request.contextPath}/a1",data:{"name":$('#username').val()},success:function (data,status){// alert(date)console.log("data->"+data)console.log("status"+status) //200,300,400,500可以通过状态码判断请求是否成功。}})}</script></head><body>
<%-- 失去焦点的时候发起一个请求到后台--%>
<%--onblur:失去焦点事件。--%>
用户名:<input type="text" id="username" onblur="a()"></body>
</html>

如果$.不报错,说明jQuery加载成功了。jQuery的缩写就是$

AjaxController:

@RestController
public class AjaxController {@RequestMapping("/a1")public void a1(String name, HttpServletResponse resp) throws IOException {
//        接收前端传来的username等参数System.out.println("param->" + name);if ("kuang".equals(name)) {resp.getWriter().print("true");} else {resp.getWriter().print("false");}}

在这里插入图片描述引入JQuery.js的方式,如果静态资源不被过滤,会报jQuery找不到。

13.6.Ajax执行流程

在这里插入图片描述
在这里插入图片描述

Json:为了前后端彻底分离。
在这里插入图片描述
这样就实现了前后端交互,并且实现了异步刷新。
Ajax将主动权交给前端。

13.7.Ajax验证用户名体验

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script>function a1(){
$.post("${pageContext.request.contextPath}/a3",{"name":$("#name").val()},function (data){// console.log(data)if (data.toString()==="ok"){$("#userInfo").css("color","green");}else {$("#userInfo").css("color","red");}$("#userInfo").html(data);
})}function a2(){
$.post({url:"${pageContext.request.contextPath}/a3",data:{"pwd":$("#pwd").val()},success:function (data) {// console.log(data)if (data.toString()==="ok"){$("#pwdInfo").css("color","green");}else {$("#pwdInfo").css("color","red");}$("#pwdInfo").html(data);}
})}</script>
</head>
<body>
<p>用户名:<input type="text" id="name" onblur="a1()">
<span id="userInfo"></span>
</p>
<p>密码:<input type="text" id="pwd" onblur="a2()">
<span id="pwdInfo"></span>
</p>
</body>
</html>

AjaxController .java

package com.kuang.controller;import com.kuang.pojo.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@RestController
public class AjaxController {@RequestMapping("/a3")public String a3(String name, String pwd) {String msg = "";if (name != null) {if ("admin".equals(name)) {msg = "ok";} else {msg = "用户名有误";}}if (pwd != null) {if ("123456".equals(pwd)) {msg = "ok";} else {msg = "密码有误";}}return msg;}
}

13.8.JSON乱码问题的解决

在Spring核心配置文件applicationContext.xml中:

    <mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><property name="failOnEmptyBeans" value="false"/></bean></property></bean></mvc:message-converters></mvc:annotation-driven>

14.拦截器

14.1.Springmvc的拦截器:

在这里插入图片描述
拦截器自带静态资源过滤。
在这里插入图片描述

拦截器写完,aop和拦截器要配置。

14.2.登录判断验证:

登录页:login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login" method="post">用户名: <input type="text" name="username"/>密码:<input type="text" name="password"/><input type="submit" value="提交"/>
</form>
</body>
</html>

LoginController

package com.kuang.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;@Controller
@RequestMapping("/user")
public class LoginController {@RequestMapping("/main")public String main(){return "main";}
@RequestMapping("/goLogin")public String login(){return "login";}@RequestMapping("/login")public String login(Model model,HttpSession session, String username, String password) {
//        把用户的信息存在session中。System.out.println(username+"---"+password);model.addAttribute("username",username);session.setAttribute("userLoginInfo", username);return "main";}@RequestMapping("/goOut")public String goOut(HttpSession session){session.removeAttribute("userLoginInfo");return "main";}
}

首页:main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<p>首页</p>
<span>${username}</span>
<p><a href="${pageContext.request.contextPath}/user/goOut" >注销</a>
</p>
</body>
</html>

初始页:index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body>
<h1><a href="${pageContext.request.contextPath}/user/goLogin">登录页面</a> </h1>
<h1><a href="${pageContext.request.contextPath}/user/main">首页</a> </h1></body>
</html>

拦截器:LoginInterceptor

package com.kuang.config;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();
//        判断什么情况下登录
// session中有东西if (session.getAttribute("userLoginInfo")!=null){return true;}
//        登录页面也会放行(只能通过登录页面提交数据的方式登录)if (request.getRequestURI().contains("login")){return true;}
//        判断什么情况下没有登录request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);return false;}
}

在spring中注册拦截器:

<!--    拦截器设置--><mvc:interceptors>
<!--        拦截哪里,谁去拦截。--><mvc:interceptor><!--            包括这个请求下面的所以请求。--><mvc:mapping path="/user/**"/><bean class="com.kuang.config.LoginInterceptor"/></mvc:interceptor></mvc:interceptors>

15.文件下载和上传

15.1.文件上传

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

导入依赖:

    <!--文件上传--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency><!--servlet-api导入高版本的--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency>

文件上传的配置:

    <!--文件上传配置 id=multipartResolver,不能是其他的id。--><bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --><property name="defaultEncoding" value="utf-8"/><!-- 上传文件大小上限,单位为字节(10485760=10M) --><property name="maxUploadSize" value="10485760"/><property name="maxInMemorySize" value="40960"/></bean>

FileController

package com.kuang.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.commons.CommonsMultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;@RestController
public class FileController {//@RequestParam("file") 将 name=file控件 得到的文件 封装成CommonsMultipartFile 对象//批量上传CommonsMultipartFile则为数组即可/**** @param file  CommonsMultipartFile:是用来接收文件的。* @param request* @return* @throws IOException*/@RequestMapping("/upload")public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {//1.获取文件名 : file.getOriginalFilename();String uploadFileName = file.getOriginalFilename();//2.如果文件名为空,直接回到首页!if ("".equals(uploadFileName)){return "redirect:/index.jsp";}System.out.println("上传文件名 : "+uploadFileName);//3.上传路径保存设置String path = request.getServletContext().getRealPath("/upload");//如果路径不存在,创建一个File realPath = new File(path);if (!realPath.exists()){realPath.mkdir();}System.out.println("上传文件保存地址:"+realPath);InputStream is = file.getInputStream(); //文件输入流OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流//4.读取写出int len=0;byte[] buffer = new byte[1024];while ((len=is.read(buffer))!=-1){os.write(buffer,0,len);os.flush();}os.close();is.close();return "redirect:/index.jsp";}/** 采用file.Transto 来保存上传的文件*/@RequestMapping("/upload2")public String  fileUpload2(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {//上传路径保存设置String path = request.getServletContext().getRealPath("/upload");File realPath = new File(path);if (!realPath.exists()){realPath.mkdir();}//上传文件地址System.out.println("上传文件保存地址:"+realPath);//通过CommonsMultipartFile的方法直接写文件(注意这个时候)file.transferTo(new File(realPath +"/"+ file.getOriginalFilename()));return "redirect:/index.jsp";}@RequestMapping("/download")public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{System.out.println("download--->");//要下载的图片地址
//        String  path = request.getServletContext().getRealPath("/upload");String  path = request.getServletContext().getRealPath("/statics");String  fileName = "1.png";//1、设置response 响应头response.reset(); //设置页面不缓存,清空bufferresponse.setCharacterEncoding("UTF-8"); //字符编码response.setContentType("multipart/form-data"); //二进制传输数据//设置响应头response.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));File file = new File(path,fileName);//2、 读取文件--输入流InputStream input=new FileInputStream(file);//3、 写出文件--输出流OutputStream out = response.getOutputStream();byte[] buff =new byte[1024];int index=0;//4、执行 写出操作while((index= input.read(buff))!= -1){out.write(buff, 0, index);out.flush();}out.close();input.close();return "ok";}
}

即4个步骤:1.导包 2.web.xml 3.表单 4.controller

15.2.文件下载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16.总结和展望

16.1.ssm回顾:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重点是闭着眼睛都能写出来的。
在前后端分离之前,或者vue之前,要熟练掌握js。

16.2.前端应该掌握

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

SpringMVC重点记录

目录 1.学习重点2.回顾MVC3.回顾servlet4.初始SpringMVC4.1.为什么要学SpringMVC?4.2.SpringMVC的中重点DispatcherServlet4.3.SpringMVC项目的搭建4.4.MVC框架要做哪些事情?4.5.可能会遇到的问题 5.SpringMVC的执行原理6.使用注解开发SpringMVC7.Controller控制总结8.RestF…...

一条 SQL 更新语句如何执行的

Server 层 存储引擎层 总流程 查询语句 连接器 查询缓存 分析器 优化器 执行器 更新语句 redo log&#xff08;节省的是随机写磁盘的 IO 消耗&#xff08;转成顺序写&#x…...

Github上哪些好用的安全工具1

专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; URLFinder 一款快速提取网页信息的工具。该项目可以快速爬取网页上的 URL 地址、JS 文件里的 API 接口等信息&#xff0c;支持批量抓取…...

手写Mybatis自动填充插件

目录 一、Mybatis插件简介&#x1f959;二、工程创建及前期准备工作&#x1f96b;实现代码配置文件 三、插件核心代码实现&#x1f357;四、测试&#x1f953; 一、Mybatis插件简介&#x1f959; Mybatis插件运行原理及自定义插件_简述mybatis的插件运行原理,以及如何编写一个…...

upload文件上传漏洞复现

什么是文件上传漏洞&#xff1a; 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷&#xff0c;而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马&#xff0c;病毒&#xff0c;恶意脚本或者WebShell等。“…...

Docker 安装部署 SqlServer 数据库

Docker 安装部署 SqlServer 数据库 背景&#xff1a; ​ 最近在开发数据中台数据集成模块&#xff0c;需要对接大量的数据做测试&#xff0c; 由于SqlServer 下载安装会耗费大量时间&#xff0c;所以采用 Docker 安装 Sqlserver 的方式部署数据库。 1、拉去 sqlserver 镜像 …...

cmath 中cos sin等常用函数的坑(弧度角度换算)

cmath中三角函数的输入是弧度,不是角度.忘了这件事,找bug找了好久! 弧度是旧称弪。在数学和物理中&#xff0c;弧度是角的度量单位。它是由国际单位制导出的单位&#xff0c;单位缩写是rad。弧度是指在一个圆中&#xff0c;弧长和半径之比&#xff0c;即|弧度|弧长半径。 角度…...

深度解析HTTP反向代理-okey proxy

反向代理這個概念可能並不常見&#xff0c;但其實它對於提升網路安全和訪問速度方面發揮著很大作用。 HTTP反向代理&#xff08;HTTP Reverse Proxy&#xff09;是一種特殊的代理伺服器&#xff0c;首先它能夠接收互聯網上的連接請求&#xff0c;然後將這些請求轉發給內部網路…...

SwinIR训练报错解决

swinir训练报错解决 记录swinir图像超分重建算法复现过程中的报错信息,并提供相应的解决方案 报错信息 UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at C:\actions-runner\_work\pyto…...

C++类和对象一

#include <iostream> using namespace std;//设计一个学生类 class CStudent {public: //公有成员void InputData(){cout << "请输入学号";cin >> sno;cout << "请输入姓名";cin >> sname;cout << "请输入分…...

Linux之线程互斥

目录 一、问题引入 二、线程互斥 1、相关概念 2、加锁保护 1、静态分配 2、动态分配 3、锁的原理 4、死锁 三、可重入与线程安全 1、概念 2、常见的线程不安全的情况 3、常见的线程安全的情况 4、常见不可重入的情况 5、常见可重入的情况 6、可重入与线程安全联系…...

C++ 拷贝构造函数和运算符重载

目录 一. 拷贝构造函数 1. 引入 2. 拷贝构造的概念 3. 浅拷贝 4. 深拷贝 二. C运算符重载 1. 概念 2. 注意事项 3.举例 一. 拷贝构造函数 1. 引入 我们在创建对象时&#xff0c;能不能创建一个与原先对象一模一样的新对象呢&#xff1f;为了解决这个问题&#x…...

二刷代码随想录算法训练营第二十三天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 一、669. 修剪二叉搜索树 二、108. 将有序数组转换为二叉搜索树 三、538. 把二叉搜索树转换为累加树 一、669. 修剪二叉搜索树 题目链接&#xff1a;力扣 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a; 你修剪的方式不对&#xff0c;我来给你纠正一下&#…...

信息抽取在旅游行业的应用:以景点信息抽取为例

开源项目推荐 今天先给大家推荐一个开源项目&#xff0c;多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口&#xff0c;功能强大&#xff0c;欢迎体验。 https://gitee.com/stonedtx/free-nlp-api 场景描述 在旅游行业…...

Linux——基础指令

一、Linux目录结构 1、树形结构 Linux只有一个根目录 / &#xff0c;所有文件都在它下面 2、Linux路径的描述方式 在Linux系统中&#xff0c;路径之间的层级关系&#xff0c;使用&#xff1a; / 来表示 eg&#xff1a; /usr/local/hello.txt 注意&#xff1a; 开头/表示根…...

H5 带网站测速引导页源码

源码名称&#xff1a;带网站测速引导页源码 源码介绍&#xff1a;一款带网站测速功能的引导页源码 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/10717.html...

案例分析篇07:数据库设计相关28个考点(23~28)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…...

Word中解决插入脚注导致的分页位置错误问题

先放一个截图&#xff1a; 上面的截图中&#xff0c;样式为标题3的段落“四、固执的念头”前插入了连续型分节符&#xff0c;并且该分节符的样式为正文&#xff0c;前后的正文段落中有脚注&#xff0c;结果在分页时&#xff0c;标题3段落“四、固执的念头”后的正文段落自动进入…...

2024/03/14(网络编程·day2)

一、思维导图 二、TCP通信 //服务器 #include<myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.117.103" //服务器IP int main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET,SOCK_STREAM,…...

2024最新陪诊小程序/医院陪诊滴嗒陪诊小程序源码-陪护服务平台陪诊师陪

.系统介绍: 陪护小程序、微信陪诊、、ThinkPHP框架、ThinkPHP6框架、FastAdmin框架、微信小程序。 嘀嗒陪诊小程序功能相对简单,后台也简捷,如果只是做个陪诊服务的小程序也基本能满足了,整体测试了未发现BUG,小程序端也能正常为使用,用户授权接口是老的。 应用背景:人…...

基于单片机的温度控制系统设计

基于单片机的温度控制系统设计 摘要: 最近这些年&#xff0c;随着科学技术的不断发展和进步&#xff0c;单片机技术通过在各行各业中的应用也日臻完善。而温度测控系统也因单片机所特有的强大处理能力、功耗低以及体积小等优点向着小型化和智能化发展。本设计以STC89C52单片机…...

unity3d Animal Controller的Animal组件中Speeds,States和modes基础部分理解

Speeds 速度集是修改你可以做的原始动画,增加或减少运动,旋转,或动画速度。它们与 州 所以,当动物在运动状态下,在飞行或游泳时,你可以有不同的速度 如果你的性格动画是 (已到位), 你一定要调整速度 位置 和 旋转 每一种的价值观 速度装置 …否则,它们不会移动或旋转。 每个速…...

Tomcat详解

1Tomcat安装 下载 Tomcat&#xff1a;首先&#xff0c;您需要从 Tomcat 官方网站&#xff08;http://tomcat.apache.org&#xff09;下载适合您系统的最新版本的 Tomcat 软件包。通常情况下&#xff0c;您会选择一个稳定的版本进行下载。解压缩&#xff1a;下载完成后&#xf…...

SpringCloudAlibaba 网关gateway整合sentinel日志默认路径修改

SpringCloudAlibaba 网关gateway整合sentinel 实现网关限流熔断 问题提出 今天运维突然告诉我 在服务器上内存满了 原因是nacos日志高达3G,然后将日志文件发给我看了一下之后才发现是gateway整合sentinel使用了默认日志地址导致日志生成地址直接存在与根路径下而且一下存在多…...

#LLM入门|Prompt#3.3_存储_Memory

在与语言模型交互时&#xff0c;一个关键问题&#xff1a;记忆缺失使得对话缺乏真正的连续性。 因此&#xff0c;接下来介绍 LangChain 中的储存模块&#xff0c;即如何将先前的对话嵌入到语言模型中的&#xff0c;使其具有连续对话的能力。 当使用 LangChain 中的储存(Memory)…...

基于SSM+Vue的龙腾公司员工信息管理系统设计与实现

​ 1 绪论 1.1研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&a…...

使用点链云管家创建瑜伽约课小程序

点链云管家 点链云管家是由上海点链科技开发的门店管理系统&#xff0c;为线下门店商家提供一站式门店运营服务平台解决方案&#xff0c;适用于瑜伽健身、美业、新零售会员制电商、母婴店、宠物店、按摩养生、服装、美容、美甲、汽车服务、商超零售、餐饮、KTV娱乐、干洗等18个…...

【Node.js从基础到高级运用】八、Express 框架入门

Express 框架入门 Express 是一个灵活且广泛使用的 Node.js web 应用框架&#xff0c;它提供了一系列强大特性来帮助开发者创建各种 Web 和移动设备应用。在这一节中&#xff0c;我们将介绍如何安装和配置 Express&#xff0c;并简单探讨其路由和中间件的概念。 安装 Express…...

Unity Timeline学习笔记(2) - PlayableTrack

PlayableTrack 是可自定义播放的轨道。我们可以通过进入轨道后调用自己的函数方法&#xff0c;使用起来也是比较顺手的。 添加轨道 我们点击加号添加 这样就有一个空轨道了&#xff0c;然后我们创建两个测试脚本。 添加脚本 分别是Playable Behaviour和PlayableAsset脚本。…...

Linux的一些常用指令

一、文件中 r w x - 的含义 r&#xff08;read&#xff09;是只读权限&#xff0c; w&#xff08;write&#xff09;是写的权限&#xff0c; x&#xff08;execute&#xff09;是可执行权限&#xff0c; -是没有任何权限。 二、一些指令 # 解压压缩包 tar [-zxvf] 压缩包名…...