• 【SSM框架 三】SpringMVC


    三、SpringMVC

    1、回顾MVC

    MVC:模型(dao,service) 视图(jsp) 控制(servlet)

    1. 用户发送请求
    2. Servlet接收用户请求数据,并调用对应的业务逻辑方法
    3. 业务处理完毕,返回更新后的数据给Servlet
    4. Servlet转向jsp,由jsp来渲染页面
    5. 响应给前端更新后的页面

    职责分析

    1. Controller:控制器
     - 取得表单数据
     - 调用业务逻辑
     - 转向指定页面
    2. Model:模型
     - 业务逻辑
     - 保存数据的状态
    3. View:视图
     - 显示页面 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、初始springMVC

    我们可以将springMVC中使用的所有bean注册到spring中

    Spring的web框架围绕DispatcherServlet设计,DispatcherServlet它的作用是将请求分发到不同的处理器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzlFUPG8-1670147240885)(D:\Java\Markdown\java学习笔记\05第五阶段:SSM框架.assets\image-20221124150719846.png)]

    1.导入依赖

    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-webmvcartifactId>
        <version>5.3.23version>
    dependency>
    dependency>
    <dependency>
        <groupId>javax.servletgroupId>
        <artifactId>jstlartifactId>
        <version>1.2version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. 配置dispatcherServlet

    web.xml

    
    <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>springmvcservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        
            <init-param>
                <param-name>contextConfigLocationparam-name>
                <param-value>classpath:springmvc-servlet.xmlparam-value>
            init-param>
            
            <load-on-startup>1load-on-startup>
        servlet>
        
        <servlet-mapping>
            <servlet-name>springmvcservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3.编写spring的配置文件

    springmvc-servlet.xml

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
        
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        bean>
        
        <bean id="/hello" class="com.daban.controller.HelloController"/>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4.编写Controller

    package com.daban.controller;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class HelloController implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            ModelAndView mv = new ModelAndView();
            //业务代码
            mv.addObject("msg","这是响应的数据");
            //设置视图跳转
            mv.setViewName("hello");
            return mv;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.编写显示页面(jsp)

    hello.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    ${msg}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6.启动tomcat测试

    如果报404,检查一下编译输出目录out有没有lib包导出

    3、使用注解开发

    1.新建一个maven项目,导入web框架

    2.编写web.xml

    
    <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>springmvcservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
            <init-param>
                <param-name>contextConfigLocationparam-name>
                <param-value>classpath:springmvc-servlet.xmlparam-value>
            init-param>
            <load-on-startup>1load-on-startup>
        servlet>
        <servlet-mapping>
            <servlet-name>springmvcservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    3.编写springmvc-servlet.xml

    
    <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/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        
        <context:component-scan base-package="com.daban.controller"/>
        
        <mvc:default-servlet-handler/>
        
        <mvc:annotation-driven/>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="suffix" value="/WEB-INF/jsp/"/>
            <property name="prefix" value=".jsp"/>
        bean>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    4.创建Controller

    package com.daban.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HelloController {
        @RequestMapping("/hello")//请求路径
        public String hello(Model model){
            //封装数据
            model.addAttribute("msg","我是注解开发");
            return "hello";//返回的视图名字(跳转的视图)
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5.视图

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        Title
    
    
    ${msg}
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注解扩展:

    @Controller
    @RequestMapping("/all")//如果给类加上该注解,则url变成http://localhost:8080/all/hello
    @RestController//标识该类不会被视图解析器解析,返回的是一个字符串
    public class HelloController {
        @RequestMapping("/hello")//请求路径
        public String hello(Model model){
            //封装数据
            model.addAttribute("msg","我是注解开发");
            return "hello";//返回的视图名字(跳转的视图)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4、Controller总结

    • 控制器负责提供访问应用程序的行为,可以通过接口定义和注解定义两种方式实现
    • 控制器负责解析用户的请求,将其转换为模型
    • SpringMVC中的控制器可以包含多个方法

    4.1 实现controller接口方式(不建议使用)

    1. web.xml配置DispatcherServlet
    2. springmvc-servlet.xml配置(处理器映射(省略),处理器适配器(省略),视图解析器)
    3. 创建类实现Controller接口,方法中封装数据,视图跳转
    4. springmvc-servlet.xml中注册控制器,注意注册控制器的id就是请求的路径
    5. 编写视图显示页面

    4.2 使用注解实现

    1. web.xml配置DispatcherServlet
    2. springmvc-servlet.xml配置(扫描包,静态资源过滤,注解驱动生效,视图解析器)
    3. 创建类,使用@Controller注解标注该类是控制器
    4. 控制器中创建一个方法,该方法的返回值就是需要跳转的页面,参数为Model类型,使用参数封装数据
    5. 使用@RequestMapping(“/t2”)注解来设置该方法被请求的路径
    6. 编写视图显示页面

    5、RestFul风格

    概念:RestFul是一个资源定位及资源操作的风格,不是标准,也不是协议,是一种风格

    5.1 传统方式操作资源

    使用不同的地址,带不同的参数来实现

    原始方式:http://localhost:8080/r?a=1&b=2

    @Controller
    public class RestFulTest {
        //http://localhost:8080/r?a=1&b=2
        @RequestMapping("/r")
        public String test(int a, int b , Model model){
            int res = a+b;
            model.addAttribute("msg","结果为:"+res);
            return "test1";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.2 使用RestFul操作资源

    通过不同的请求方式实现,使用相同的地址实现不同的请求

    更改后url:http://localhost:8080/r/1/2

    @Controller
    public class RestFulTest {
        //http://localhost:8080/r/1/2
        @RequestMapping("/r/{a}/{b}")
        public String test(@PathVariable int a, @PathVariable int b , Model model){
            int res = a+b;
            model.addAttribute("msg","结果为:"+res);
            return "test1";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    限定请求方式一

    @Controller
    public class RestFulTest {
        //http://localhost:8080/r/1/2
        @RequestMapping(value = "/r/{a}/{b}",method = RequestMethod.POST)
        public String test(@PathVariable int a, @PathVariable String b , Model model){
            String res = a+b;
            model.addAttribute("msg","结果为:"+res);
            return "test1";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    限定请求方式二

    @GetMapping

    @PostMapping

    @PutMapping

    @DeleteMapping

    @PatchMapping

    @Controller
    public class RestFulTest {
        //http://localhost:8080/r/1/2
        @GetMapping("/r/{a}/{b}")
        public String test(@PathVariable int a, @PathVariable String b , Model model){
            String res = a+b;
            model.addAttribute("msg","结果为:"+res);
            return "test1";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这样通过限定不同的请求方式,来使同一个地址,执行不同的方法

    6、重定向和转发

    return "forward:/login.jsp"; //转发到 根目录/login.jsp
    return "forward:/login";     //转发到 根目录/login
    return "redirect:/login.jsp";//重定向到  根目录/login.jsp
    return "redirect:/login";    //重定向到  根目录/login
    return "login.jsp";          //转发到,根目录/WEB-INF/jsp/login.jsp.jsp,错误用法
    return "login";              //转发到  根目录/WEB-INF/jsp/login
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    @Controller
    public class DispatcherTest {
        @RequestMapping("/d/t1")
        public String test3(Model model){
            model.addAttribute("msg","t3");
            //默认是转发,加上redirect:就是重定向
            return "redirect:/index.jsp";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    WEB-INF下的文件无法重定向

    ​ WEB-INF是安全目录,客户端无法访问,而重定向就相当于用户直接从客户端访问了的路径,自然就不可以啦,只有程序内部转发的时候才能转发到WEB-INF下的JSP

    7、接收请求参数及回显

    7.1 处理提交数据

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

      //http://localhost:8080/hello?name=123
      public String test3(String name,Model model){
          return "test1";
      }
      
      • 1
      • 2
      • 3
      • 4
    2. 提交域名称和处理方法的参数名不一致

      //http://localhost:8080/hello?name=123
      public String test3(@RequestParam("name") String username, Model model){
          return "test1";
      }
      
      • 1
      • 2
      • 3
      • 4
    3. 提交的是一个对象

      创建一个实体类,实体类的属性就是提交的参数

      //http://localhost:8080/hello?name=ss&age=12
      public String test3(User user, Model model){
          return "test1";
      }
      
      • 1
      • 2
      • 3
      • 4

    如果使用对象的话,前端传递的参数名必须和实体类的属性名一致,否则会为null

    7.2 数据显示到前端

    1. 使用ModelAndView

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

      public ModelAndView test3(ModelAndView mv){
          mv.addObject("msg","ModelAndView");
          mv.setViewName("test1");
          return mv;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    2. 使用Model

      只有寥寥的几个方法,只适用于存储数据,简化操作

      public String test3(Model model){
          model.addAttribute("msg","信息");
          return "test1";
      }
      
      • 1
      • 2
      • 3
      • 4
    3. 使用ModelMap

      继承了LinkedMap,除了实现自身的一些方法,同样继承了LinkedMap的方法,操作更丰富

      public String test3(ModelMap map){
          map.addAttribute("msg","map");
          return "test1";
      }
      
      • 1
      • 2
      • 3
      • 4

    8、乱码问题

    加上过滤器,这里一定要注意"/“和”/*"的区别

    / :匹配所有请求,不会去匹配jsp页面
    /* :匹配所有请求,包括jsp页面
    
    • 1
    • 2
    <filter>
        <filter-name>encodingfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>utf-8param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>encodingfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    9、JSON

    json是js对象的字符串表示形式,它使用文本表示一个js对象信息,本质是一个字符串

    var obj = {name:"zhangsan",age:12};//这是对象
    var json ='{{name:"zhangsan",age:12}}'//这是json字符串
    
    • 1
    • 2

    json和js对象互相转化

    var obj1 = JSON.parse(json);//json字符串转js对象
    var json1 = JSON.stringify(obj);//js对象转json字符串
    
    • 1
    • 2

    9.1 响应直接返回字符串

    @RestController //标识该类不会被视图解析器解析,返回的是一个字符串

    @ResponseBody //标识该方法不会被视图解析器解析,返回的是一个字符串

    9.2 解析工具jackson

    对象使用toString输出样式

    User{name='张三', age=12, sex='男'}
    
    • 1

    对象使用jackson转换成json字符串输出样式

    {"name":"张三","age":12,"sex":"男"}
    
    • 1
    @Controller
    public class UserController {
        @RequestMapping("/j1")
        @ResponseBody
        public String json() throws JsonProcessingException {
            User user = new User("张三",12,"男");
            ObjectMapper mapper = new ObjectMapper();
            String s = mapper.writeValueAsString(user);
            return s;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    9.3 返回的json数据乱码解决

    后端响应给前端的字符串乱码解决

    @RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
    
    • 1

    或这个spingmvc-servlet.xml文件中配置

    <mvc:annotation-driven>
        <mvc:message-converters>
            <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    9.4 几种类型值的返回

    1. 列表返回

      @Controller
      public class UserController {
          @RequestMapping("/j1")
          @ResponseBody
          public String json() throws JsonProcessingException {
              ArrayList<User> list = new ArrayList<>();
              ObjectMapper mapper = new ObjectMapper();
              User user = new User("张三",12,"男");
              User user1 = new User("张三1",12,"男");
              User user2 = new User("张三2",12,"男");
              list.add(user);
              list.add(user1);
              list.add(user2);
              return mapper.writeValueAsString(list);
          }
      }
      
      返回值:[{"name":"张三","age":12,"sex":"男"},{"name":"张三1","age":12,"sex":"男"},{"name":"张三2","age":12,"sex":"男"}]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    2. 时间返回

      @Controller
      public class UserController {
          @RequestMapping("/j1")
          @ResponseBody
          public String json() throws JsonProcessingException {
              ObjectMapper mapper = new ObjectMapper();
              Date date = new Date();
              return mapper.writeValueAsString(date);
          }
      }
      
      返回值:1669365101815
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      @Controller
      public class UserController {
          @RequestMapping("/j1")
          @ResponseBody
          public String json() throws JsonProcessingException {
              ObjectMapper mapper = new ObjectMapper();
              //设置一个我们喜欢的时间格式
              SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
              //关闭ObjectMapper的自动转换时间格式功能
              mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
              //设置使用自己的时间格式
              mapper.setDateFormat(dateFormat);
              Date date = new Date();
              return mapper.writeValueAsString(date);
          }
      }
      
      返回值:"2022-11-25 04:41:45"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

    9.5 解析工具fastjson

    依赖

    <dependency>
        <groupId>com.alibabagroupId>
        <artifactId>fastjsonartifactId>
        <version>2.0.19version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    //java对象转json字符串
    String s = JSON.toJSONString(list);
    System.out.println("java对象转json字符串(列表):"+s);
    String us = JSON.toJSONString(user);
    System.out.println("java对象转json字符串(对象):"+us);
    //json字符串转Java对象
    JSONObject javaObj = JSON.parseObject(us);
    System.out.println("json字符串转Java对象:"+javaObj);
    //java对象转json对象
    JSONObject jsonObject = (JSONObject) JSON.toJSON(user1);
    System.out.println("java对象转json对象:"+jsonObject);
    //json对象转java对象
    User user3 = JSON.toJavaObject(jsonObject, User.class);
    System.out.println("json对象转java对象:"+user3);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    10、SSM整合

    10.1 搭建框架

    1. 创建一个数据库

      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` VARCHAR(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,'三国演义',10,'三国'),
      (2,'西游记',8,'孙悟空'),
      (3,'红楼梦',32,'贾府,林黛玉'),
      (4,'水浒传',6,'梁山好汉三结义'),
      (5,'三体',43,'科技之光'),
      (6,'射雕英雄传',98,'金庸大作');
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
    2. 创建一个Maven项目

      导入依赖

      
      <dependency>
          <groupId>junitgroupId>
          <artifactId>junitartifactId>
          <version>4.12version>
      dependency>
      
      <dependency>
          <groupId>mysqlgroupId>
          <artifactId>mysql-connector-javaartifactId>
          <version>5.1.47version>
      dependency>
      
      <dependency>
          <groupId>com.mchangegroupId>
          <artifactId>c3p0artifactId>
          <version>0.9.5.2version>
      dependency>
      
      <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>servlet-apiartifactId>
          <version>2.5version>
      dependency>
      <dependency>
          <groupId>javax.servlet.jspgroupId>
          <artifactId>jsp-apiartifactId>
          <version>2.2version>
      dependency>
      <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>jstlartifactId>
          <version>1.2version>
      dependency>
      
      <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatisartifactId>
          <version>3.5.11version>
      dependency>
      <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatis-springartifactId>
          <version>2.0.7version>
      dependency>
      
      <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-webmvcartifactId>
          
          <version>6.0.0version>
      dependency>
      <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-jdbcartifactId>
          <version>6.0.0version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
    3. 创建配置文件mybatis-config.xml

      
      DOCTYPE configuration
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "https://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
          <typeAliases>
              <package name="com.daban.pojo"/>
          typeAliases>
      
      configuration>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    4. 创建数据源database.properties

      jdbc.driver=com.mysql.jdbc.Driver
      jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf-8
      jdbc.username=root
      jdbc.password=123456
      
      • 1
      • 2
      • 3
      • 4
    5. 创建spring空配置文件ApplicationContext.xml

      
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
      
      beans>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    10.2 DAO层

    1. 创建books实体类

      package com.daban.pojo;
      
      
      public class Books {
          private int bookID;
          private String bookName;
          private String bookCounts;
          private String detail;
      
          public Books(int bookID, String bookName, String bookCounts, String detail) {
              this.bookID = bookID;
              this.bookName = bookName;
              this.bookCounts = bookCounts;
              this.detail = detail;
          }
      
          public int getBookID() {
              return bookID;
          }
      
          public void setBookID(int bookID) {
              this.bookID = bookID;
          }
      
          public String getBookName() {
              return bookName;
          }
      
          public void setBookName(String bookName) {
              this.bookName = bookName;
          }
      
          public String getBookCounts() {
              return bookCounts;
          }
      
          public void setBookCounts(String bookCounts) {
              this.bookCounts = bookCounts;
          }
      
          public String getDetail() {
              return detail;
          }
      
          public void setDetail(String detail) {
              this.detail = detail;
          }
      
          @Override
          public String toString() {
              return "Books{" +
                      "bookID=" + bookID +
                      ", bookName='" + bookName + '\'' +
                      ", bookCounts='" + bookCounts + '\'' +
                      ", detail='" + detail + '\'' +
                      '}';
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
    2. 创建接口BookMapper.java

      package com.daban.dao;
      
      import com.daban.pojo.Books;
      import org.apache.ibatis.annotations.Param;
      
      import java.util.List;
      
      public interface BookMapper {
          //增加一本书
          int addBook(Books books);
          //删除一本书
          int deleteBookById(@Param("bookId") int id);
          //修改一本书
          int updateBook(Books books);
          //查询一本书
          Books queryBookById(@Param("bookId") int id);
          //查询全部书
          List<Books> queryAllBook();
          List<Books> queryBookByName(String bookName);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
    3. 创建接口映射文件BookMapper.xml

      
      DOCTYPE mapper
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="com.daban.dao.BookMapper">
      
          <insert id="addBook" parameterType="books">
              insert into ssmbuild.books(bookName, bookCounts, detail)
              values (#{bookName},#{bookCounts},#{detail});
          insert>
          <delete id="deleteBookById" parameterType="int">
              delete from ssmbuild.books where bookID = #{bookId};
          delete>
          <update id="updateBook" parameterType="books">
              update ssmbuild.books
                  set bookName = #{bookName},bookCounts=#{bookCounts},detail=#{detail}
              where bookID = #{bookID};
          update>
          <select id="queryBookById" parameterType="int" resultType="books">
              select * from ssmbuild.books where bookID=#{bookId};
          select>
          <select id="queryAllBook" resultType="books">
              select *from ssmbuild.books;
          select>
          <select id="queryBookByName" parameterType="String" resultType="books">
              select * from ssmbuild.books where bookName like #{bookName};
          select>
      mapper>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
    4. 在mybatis配置文件中注册mapper

      <mappers>
          <mapper resource="com/daban/dao/BookMapper.xml"/>
      mappers>
      
      • 1
      • 2
      • 3

    10.2 Service层

    1. 创建接口BookService.java

      package com.daban.service;
      
      import com.daban.pojo.Books;
      import java.util.List;
      
      public interface BookService {
          //增加一本书
          int addBook(Books books);
          //删除一本书
          int deleteBookById(int id);
          //修改一本书
          int updateBook(Books books);
          //查询一本书
          Books queryBookById(int id);
          //查询全部书
          List<Books> queryAllBook();
          List<Books> queryBookByName(String bookName);
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    2. 创建接口的实现类BookServiceImp.java

      package com.daban.service;
      
      import com.daban.dao.BookMapper;
      import com.daban.pojo.Books;
      
      import java.util.List;
      
      public class BookServiceImp implements BookService{
          //业务层调dao层
          private BookMapper bookMapper;
          public void setBookMapper(BookMapper bookMapper) {
              this.bookMapper = bookMapper;
          }
      
          @Override
          public int addBook(Books books) {
              return bookMapper.addBook(books);
          }
      
          @Override
          public int deleteBookById(int id) {
              return bookMapper.deleteBookById(id);
          }
      
          @Override
          public int updateBook(Books books) {
              return bookMapper.updateBook(books);
          }
      
          @Override
          public Books queryBookById(int id) {
              return bookMapper.queryBookById(id);
          }
      
          @Override
          public List<Books> queryAllBook() {
              return bookMapper.queryAllBook();
          }
          @Override
          public List<Books> queryBookByName(String bookName) {
              return bookMapper.queryBookByName(bookName);
          }
      
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44

    10.3 Spring整合Dao

    1. 创建spring-dao.xml

      
      <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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             https://www.springframework.org/schema/context/spring-context.xsd">
      
          
          <context:property-placeholder location="classpath:database.properties"/>
          
          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
              <property name="driverClass" value="${jdbc.driver}"/>
              <property name="jdbcUrl" value="${jdbc.url}"/>
              <property name="user" value="${jdbc.username}"/>
              <property name="password" value="${jdbc.password}"/>
              
              <property name="maxPoolSize" value="30"/>
              <property name="minPoolSize" value="10"/>
              
              <property name="autoCommitOnClose" value="false"/>
              
              <property name="checkoutTimeout" value="10000"/>
              
              <property name="acquireRetryAttempts" value="2"/>
          bean>
          
          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              
              <property name="dataSource" ref="dataSource"/>
              
              <property name="configLocation" value="classpath:mybatis-config.xml"/>
          bean>
      
          
          <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
              
              <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
              
              <property name="basePackage" value="com.daban.dao"/>
          bean>
      beans>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46

    10.4 Spring整合Sevice

    1. 创建spring-service.xml

      
      <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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             https://www.springframework.org/schema/context/spring-context.xsd">
      
          
          <context:component-scan base-package="com.daban.service"/>
          
          
          <bean id="BookServiceImp" class="com.daban.service.BookServiceImp">
              <property name="bookMapper" ref="bookMapper"/>
          bean>
          
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              
              <property name="dataSource" ref="dataSource"/>
          bean>
          
      beans>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23

    10.5 SpringMVC

    1. 增加web支持

    2. 配置web.xml

      这里有一个兼容文件,在配置DispatcherServlet时报错,把spring-webmvc依赖版本改成5.3.23

      
      <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>springmvcservlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
              <init-param>
                  <param-name>contextConfigLocationparam-name>
                  <param-value>classpath:ApplicationContext.xmlparam-value>
              init-param>
              <load-on-startup>1load-on-startup>
          servlet>
          <servlet-mapping>
              <servlet-name>springmvcservlet-name>
              <url-pattern>/url-pattern>
          servlet-mapping>
          
          <filter>
              <filter-name>encodingfilter-name>
              <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
              <init-param>
                  <param-name>encodingparam-name>
                  <param-value>utf-8param-value>
              init-param>
          filter>
          <filter-mapping>
              <filter-name>encodingfilter-name>
              <url-pattern>/*url-pattern>
          filter-mapping>
          
          <session-config>
              <session-timeout>15session-timeout>
          session-config>
      web-app>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
    3. 创建配置spring-mvc.xml

      
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
             http://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/mvc
             http://www.springframework.org/schema/mvc/spring-mvc.xsd
             http://www.springframework.org/schema/context
             https://www.springframework.org/schema/context/spring-context.xsd">
      
          
          <mvc:annotation-driven/>
          
          <mvc:default-servlet-handler/>
          
          <context:component-scan base-package="com.daban.controller"/>
          
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
             
              <property name="prefix" value="/WEB-INF/jsp/"/>
              <property name="suffix" value=".jsp"/>
          bean>
      beans>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
    4. 将spring配置文件统一到ApplicationContext中

      <import resource="classpath:spring-dao.xml"/>
      <import resource="classpath:spring-service.xml"/>
      <import resource="classpath:spring-mvc.xml"/>
      
      • 1
      • 2
      • 3

    10.6 Controller层

    1. 创建一个控制类BookController.java

      package com.daban.controller;
      
      import com.daban.pojo.Books;
      import com.daban.service.BookService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Qualifier;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.RequestMapping;
      
      import java.util.List;
      
      @Controller
      @RequestMapping("/book")
      public class BookController {
          @Autowired
          @Qualifier("BookServiceImp")
          private BookService bookService;
          //查询所有书籍
          @RequestMapping("/allBook")
          public String allBook(Model model){
              List<Books> books = bookService.queryAllBook();
              model.addAttribute("boos",books);
              return "allBook";
          }
      
          //跳转到新增书籍页面
          @RequestMapping("/addBookPage")
          public String toAddBookPage(){
              return "addBookPage";
          }
      
          //执行添加书籍
          @RequestMapping("/addBook")
          public String addBook(Books books){
              //System.out.println(books);
              bookService.addBook(books);
              return "redirect:/book/allBook";
              //return "allBook";
          }
          //跳转到书籍修改页
          @RequestMapping("/updateBookPage")
          public String toUpdateBookPage(int id,Model model){
              Books book = bookService.queryBookById(id);
              model.addAttribute("book",book);
              return "updateBookPage";
          }
          //执行修改书籍
          @RequestMapping("/updateBook")
          public String updateBook(Books books){
              System.out.println(books);
              bookService.updateBook(books);
              return "redirect:/book/allBook";
          }
          //删除数据
          @RequestMapping("/deleteBook")
          public String deleteBook(int id){
              bookService.deleteBookById(id);
              return "redirect:/book/allBook";
          }
          //查询书籍
          @RequestMapping("/queryBookByName")
          public String queryBook(String queryBookName,Model model){
              List<Books> books = bookService.queryBookByName("%"+queryBookName+"%");
              //System.out.println(books);
              if(books.size()==0){
                  model.addAttribute("error","没有查到内容");
              }else
              {
                  model.addAttribute("boos",books);
              }
              return "allBook";
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71
      • 72
      • 73
      • 74

    10.6 编写页面

    页面其实和Controller层同步写的

    1. 编写首页index.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
        
          首页
          
        
        
          

      全部书籍

      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
    2. 编写allbook.jsp

      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          查询全部书籍
          
      
      
      
      书籍编号 书籍名称 书籍数量 书籍描述 操作
      ${book.bookID} ${book.bookName} ${book.bookCounts} ${book.detail} 修改  |  删除
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
    3. 编写addBookPage.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          添加书籍
          
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
    4. 编写updateBookPage.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          修改书籍
          
      
      
      
      <%-- 一定要注意这个隐藏的字段,没有id没办法修改--%>
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42

    11、AJAX

    11.1 简介

    他是一个在无需刷新网页的情况下,能够更新部分网页数据的技术

    Ajax的核心是XMLHttpRequest对象(XHR)

    jQuery提供了多个与ajax相关的方法

    jQuery静态资源找不到问题

    • spring配置文件没有加这个语句,过滤静态资源使不经过servlet
    • 增加了静态资源后必须重新启动服务器
    function a(){
      $.ajax({
        //请求地址
        url:"${pageContext.request.contextPath}/a2",
        //请求数据
        data:{"name":$("#username").val()},
        //成功回调函数,带返回数据data,这个参数是键值对
        success:function (data) {
          alert(data);
          console.log("执行的成功的回调函数");
        },
         //失败回调函数
        error:function () {
          console.log("执行的失败的回调函数");
        }
      })
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    11.2 Ajax异步加载数据

    • 实体类

      package com.daban.pojo;
      
      import lombok.AllArgsConstructor;
      import lombok.Data;
      import lombok.NoArgsConstructor;
      
      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User {
          private String name;
          private int age;
          private String sex;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    • 控制层

      @RequestMapping("/a3")
      public List<User> a3(){
          ArrayList<User> userList = new ArrayList<>();
          userList.add(new User("张三",32,"男"));
          userList.add(new User("李四",12,"女"));
          userList.add(new User("王五",52,"男"));
          userList.add(new User("王留",22,"男"));
          return userList;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    • 页面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          Title
          
      
          
      
      
          
          
      姓名 年龄 性别
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42

    11.3 Ajax验证用户名

    • 控制层

      @RequestMapping(value = "/a4",produces = "text/html;charset=utf-8")
      public String a4(String name){
          if(name.equals("ss")){
              return "OK";
          }else
              return "用户名不存在";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • 页面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
      
          Title
          
          
      
      
          用户名:
          
          
      密码:
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31

    12、拦截器

    12.1 介绍

    SpringMVC的拦截器类似于servlet中的过滤器Filter

    拦截器是AOP思想的具体应用,意思拦截器就是横切进去的

    拦截器只会拦截访问控制器的方法,静态页面放行,自带静态资源过滤

    自定义拦截器(实现HandlerInterceptor接口):

    package com.daban.config;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("===========拦截前===========");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("===========拦截后===========");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("===========清理===========");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在springmvc中配置拦截器,才能使用

    <mvc:interceptors>
        <mvc:interceptor>
            
            <mvc:mapping path="/**"/>
            <bean class="com.daban.config.MyInterceptor"/>
        mvc:interceptor>
    mvc:interceptors>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    12.2 登录权限验证(拦截)

    控制器:

    @RequestMapping("/login")
    public String login(HttpSession session, String name, String pwd, Model model){
        //如果name或pwd为空,则说明是使用session越权登录,正常跳转
        //否则是正常登陆,需要验证用户名密码
        if(name==null || pwd==null){
            return "main";
        }else {
            if(name.equals("zj") && pwd.equals("123")){
                session.setAttribute("username",name);
                return "main";
            }else{
                model.addAttribute("msg","账号或密码错误");
                return "forward:/login.jsp";
            }
        }
    
    }
    @RequestMapping("/logout")
    public String logout(HttpSession session){
        session.removeAttribute("username");
        return "redirect:/login.jsp";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    拦截器:

    package com.daban.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 {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            HttpSession session = request.getSession();
            Object username = session.getAttribute("username");
            String name = request.getParameter("name");
            String pwd = request.getParameter("pwd");
            //如果name和pwd都不为空,则是正常登录,需要放行
            if (name!=null && pwd!=null){
                return true;
            }
            //如果name和pwd字段为空,则表示越权登陆,就需要判断是否有session
            //如果有session则放行,没session则重定向
            if(username!=null){
                return true;
            }else {
                response.sendRedirect("/login.jsp");
            }
    
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    13、文件上传和下载

    要使用spring的上传功能,需要上下文中配置MultipartResolver

    前端表单必须是post,enctype设置为multipart/form-data

    表单属性enctype说明

    • application/x-www=form-urlencoded,默认方式,只处理表单中的value
    • multipart/form-data,以二进制流处理表单,把文件内容封装到请参数中,不会对字符编码
    • text/plain,除了把空格转换成+号外,其他字符不做编码,这种适合表单发邮件

    13.1 文件上传

    步骤:

    1. 导入文件上传的jar包

      <dependency>
          <groupId>commons-fileuploadgroupId>
          <artifactId>commons-fileuploadartifactId>
          <version>1.4version>
      dependency>
      <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>javax.servlet-apiartifactId>
          <version>4.0.1version>
      dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    2. 写提交页面

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
        
          $Title$
        
        
        
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    3. spring配置文件中配置

      
      <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <property name="defaultEncoding" value="utf-8"/>
          <property name="maxUploadSize" value="10485760"/>
          <property name="maxInMemorySize" value="40960"/>
      bean>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    4. 写controller

      • 方法一

        package com.daban.controller;
        
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestParam;
        import org.springframework.web.multipart.commons.CommonsMultipartFile;
        
        import javax.servlet.http.HttpServletRequest;
        import java.io.File;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.InputStream;
        
        @Controller
        public class FileController {
            //将表单中name属性为file的控件得到的文件封装成CommonsMultipartFile对象
            //批量上传,CommonsMultipartFile为数组即可
            //注意重点,CommonsMultipartFile必须加@RequestParam("file"),否则报空指针
            @RequestMapping("/upload")
            public String upload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
                //获取文件名
                String filename = file.getOriginalFilename();
                //如果文件为空,则直接回到首页
                System.out.println("文件名:"+filename);
                if("".equals(filename)){
                    return "redirect:/index.jsp";
                }
                //上传路径保存设置
                String path = request.getServletContext().getRealPath("/upload");
                //如果路径不存在,创建一个
                File realPath = new File(path);
                if(!realPath.exists()){
                    realPath.mkdir();
                }
                System.out.println("上传路径:"+realPath);
                InputStream is = file.getInputStream();
                FileOutputStream fos = new FileOutputStream(new File(realPath, filename));
                int len=0;
                byte[] buffer = new byte[1024];
                while ((len=is.read(buffer))!=-1){
                    fos.write(buffer,0,len);
                    fos.flush();
                }
                is.close();
                fos.close();
                return "redirect:/index.jsp";
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
        • 40
        • 41
        • 42
        • 43
        • 44
        • 45
        • 46
        • 47
        • 48
      • 方法二

        package com.daban.controller;
        
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RequestParam;
        import org.springframework.web.multipart.commons.CommonsMultipartFile;
        
        import javax.servlet.http.HttpServletRequest;
        import java.io.File;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.InputStream;
        
        @Controller
        public class FileController {
            //将表单中name属性为file的控件得到的文件封装成CommonsMultipartFile对象
            //批量上传,CommonsMultipartFile为数组即可
            //注意重点,CommonsMultipartFile必须加@RequestParam("file"),否则报空指针
            @RequestMapping("/upload")
            public String upload(@RequestParam("file")CommonsMultipartFile file, HttpServletRequest request) throws IOException {
                //获取文件名
                String filename = file.getOriginalFilename();
        
                //上传路径保存设置
                String path = request.getServletContext().getRealPath("/upload");
                //如果路径不存在,创建一个
                File realPath = new File(path);
                if(!realPath.exists()){
                    realPath.mkdir();
                }
                //通过CommonsMultipartFile的方法直接写文件
                file.transferTo(new File(realPath+"/"+filename));
                return "redirect:/index.jsp";
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35

    13.2 文件下载

    写controller

    package com.daban.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.net.URLEncoder;
    
    @Controller
    public class FileController {
        @RequestMapping("/download")
        public String download(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //要下载文件的地址
            String path = request.getServletContext().getRealPath("/upload");
            String fileName = "123.md";
            //设置响应头
            response.reset();//设置响应页面不缓存,清空buffer
            response.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);
            FileInputStream fis = new FileInputStream(file);
            OutputStream os = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len=fis.read(buffer))!=-1){
                os.write(buffer,0,len);
                os.flush();
            }
            os.close();
            fis.close();
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    【残差网络 论文泛读】……DenseNet……(Densely Connected Convolutional Networks)
    [C++] - GCC和LLVM对方法 warning: non-void function does not return a value [-Wreturn-type] 的处理差异
    quasar q-layout布局说明
    【Swift 60秒】12 - Arrays vs Sets vs Tuples
    LeetCode - 698 划分为k个相等的子集
    Spring mvc处理异常
    Java复习-25-单例设计模式
    HTML5,CSS,JS前端常见知识面试题
    Long-Polling, WebSocket, SSE 傻傻分不清楚
    华为数字化转型之道认知篇第一章数字化转型,华为的战略选择
  • 原文地址:https://blog.csdn.net/daban2008/article/details/128175064