SpringMVC_基本使用

news2025/1/19 13:10:53

一、JavaWEB

1.回顾 JavaWEB

1.1新建项目结构

  • 新建 javaweb 项目目录结构

    在这里插入图片描述

1.2导入依赖

  • 依赖

    <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
          <scope>provided</scope>
        </dependency>
    
    	<dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
        <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
        </dependency>
    

1.3实现第一个 servlet

  • 通过注解写 servlet 实现 HttpServlet

    @WebServlet("/first")
    public class FirstServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("====进入了servlet===");
            req.setAttribute("username","sy");
    
            req.getRequestDispatcher("/test.jsp").forward(req,resp);
        }
    }
    
  • 通过 web.xml 配置

    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <servlet>
        <servlet-name>first-servlet</servlet-name>
        <servlet-class>cn.sycoder.FirstServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>first-servlet</servlet-name>
        <url-pattern>/test</url-pattern>
      </servlet-mapping>
    </web-app>
    
  • 开启 el 表达式支持

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@page isELIgnored="false" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${username}
    </body>
    </html>
    

1.4思考问题

  • 获取请求参数不方便

    //获取请求参数
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    
    • 给出的解决方案

      • 如果可以直接从方法入参传参是不是很方便,可以直接拿来用

        protected void service(String username,String password)
        
  • 设置响应视图或者设置响应的参数类型不方便

    req.getRequestDispatcher("/test.jsp").forward(req,resp);
    
    • 给出的解决方案

      • 如果不需要设置响应类型

      • 如果不需要设置请求转发,直接跳转更方便

        req.getRequestDispatcher("/test.jsp").forward(req,resp);
        //return "test";
        

2.回顾MVC

  • 概述:MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
  • MVC分别是什么
    • M:Model:模型层,指工程中的JavaBean,作用是处理数据
      • domain 对象,Student 对象
      • 业务bean,Service,Mapper
    • V:View:视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据
    • C:Controller:控制层,指工程中的servlet,作用是接收请求和响应浏览器

3.SpringMVC

  • 概述:SpringMVC是一种基于原生的 Servlet 实现MVC模型的轻量级Web框架,基于原生的Servlet,通过前端控制器DispatcherServlet,对请求和响应进行统一处理
  • 特点:
    • Spring 系列产品,可以与Spring无缝衔接
    • 基于原生的Servlet,使用DispatcherServlet对Servlet进行封装,可以对请求或者响应做统一的处理
    • 组件非常丰富,以后想用什么组件,直接配置使用就可以

二、SpringMVC快速入门

1.基于XML方式配置

1.1导入依赖

  • 导入依赖

    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.17.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
          <scope>provided</scope>
        </dependency>
    
        <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
        <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
        </dependency>
    

1.2创建SpringMVC配置文件

  • 配置文件

      <?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"
           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="cn.sycoder.controller"/>
        <bean id="view" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--        配置视图前缀-->
            <property name="prefix" value="/WEB-INF/pages/"/>
    <!--        配置视图后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    

1.3配置DispatcherServlet

  • web.xml

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--    初始化 spring-mvc 配置-->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>
    
    

1.4配置控制器

  • 配置

    @Controller
    public class XmlController {
    
        @RequestMapping("/test")
        public void test(){
            System.out.println("---------");
        }
    }
    

1.5配置视图解析器

  • 视图解析器

    <?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"
           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="cn.sycoder.controller"/>
        <bean id="view" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--        配置视图前缀-->
            <property name="prefix" value="/WEB-INF/pages/"/>
    <!--        配置视图后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    
  • 视图解析操作

    • 配置控制器

      @RequestMapping("/login")
          public String login(String username, String password) {
              if ("sy".equals(username) && "123456".equals(password))
                  return "success";
      
              return "fail";
          }
      
    • 配置视图
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.基于注解方式配置

2.1导入依赖

  • 导入依赖

    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.17.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
          <scope>provided</scope>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.0</version>
          <scope>provided</scope>
        </dependency>
    

2.2创建SpringMVC配置类

  • 创建配置类

    @Configuration
    @ComponentScan("cn.sycoder.controller")
    public class SpringMvcConfig {
    }
    

2.3通过配置类替换web.xml

  • 替换操作

    public class ServletConfig extends AbstractDispatcherServletInitializer {
    
        @Override
        protected WebApplicationContext createServletApplicationContext() {
            //获取SpringMVC容器
            AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
            context.register(SpringMvcConfig.class);// 同等与mvc配置类替换xml文件
            return context;
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    
        @Override
        protected WebApplicationContext createRootApplicationContext() {
            return null;
        }
    }
    

2.4配置Controller

  • 配置Controller

    @Controller
    public class SpringMvcController {
        @RequestMapping("/get")
        public void getSpring(){
            System.out.println("========");
        }
    }
    

四、请求

1.@RequestMapping

  • 作用:设置请求映射路径

  • SpringMVC 接收到指定请求时,在映射关系中找到对应的控制方法

名称@RequestMapping
位置类或接口、或者方法上
作用设置定义控制器方法的访问路径
属性String[] value() 设置访问路径的,RequestMethod[] method() 指定访问方法

1.1 @ResponseBody与@RequestMapping的使用

  • 当需要返回json串的时候才需要使用@ResponseBody

  • 使用位置

    @Controller
    @RequestMapping("/requestMappingController")
    public class RequestMappingController {
    
        @RequestMapping(headers ={"header=123"} ,value = {"/test"})// /requestMapping/test
        @ResponseBody
        public String test(){
            System.out.println("============");
            return "OK";
        }
    }
    
  • 指定请求类型

    • 延伸注解
      • @GetMapping 发起get 请求
      • @PostMapping 发起Post 请求
      • @PutMapping 发起 put 请求
      • @DeleteMapping 发起 delete 请求
    @RequestMapping(value = "/test1",method = RequestMethod.POST)
        @ResponseBody
        public String test1(){
            System.out.println("============");
            return "OK";
        }
    
  • 指定请求头(可以做权限拦截)(了解一下就行)

    @RequestMapping(headers ={"header=123"} ,value = {"/test"})// /requestMapping/test
        @ResponseBody
        public String test(){
            System.out.println("============");
            return "OK";
        }
    
  • 指定请求参数(没用)

    @RequestMapping(params = {"username=123"},value = {"/test2"})// /requestMapping/test
        @ResponseBody
        public String test2(){
            System.out.println("============");
            return "OK";
        }
    

2.获取请求参数

2.1一般获取参数方式

  • 获取方式

    @Controller
    @RequestMapping("/requestParams")
    public class RequestParams {
    
        @RequestMapping("/test")
        @ResponseBody
        public String test(String username,String password){
            System.out.println("username:"+username+",password:"+password);
            return "ok";
        }
    }
    

2.2参数名称不对应

  • @RequestParam

    名称@RequestParam
    位置控制器方法中的形参上
    属性boolean required() 表示是否必填String value(),参数重命名名称
    作用绑定请求参数与处理器方法之间形参的关系
  • 出现问题,获取不到参数值

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 解决方案

    @Controller
    @RequestMapping("/requestParams")
    public class RequestParams {
    
        @RequestMapping("/test")
        @ResponseBody
        public String test(@RequestParam(value = "un",required = false) String username,
                           @RequestParam(value = "password1",required = false) String password){
            System.out.println("username:"+username+",password:"+password);
            return "ok";
        }
    }
    

3.参数传递

3.1对象参数传递

  • 传递方式

    @RequestMapping("/user")
        @ResponseBody
        public String user(User user){
            System.out.println("username:"+user.getAccount()+",password:"+user.getPassword());
            return "ok";
        }
    
  • 图示

    在这里插入图片描述

3.2复合型对象参数传递

  • 如果出现对象嵌套,直接通过属性名称.传参即可

    public class User {
        private String account;
        private String password;
    
        private Address address;
    }
    
  • 图示
    在这里插入图片描述

3.3数组参数传递

  • 传数组

    @RequestMapping("/array")
        @ResponseBody
        public String array(String[] cities){
            System.out.println(Arrays.toString(cities));
            return "ok";
        }
    
  • 传递参数

    在这里插入图片描述

3.4集合参数传递

  • 传集合

    @RequestMapping("/list")
        @ResponseBody
        public String list(@RequestParam List<String> cities){
            System.out.println(cities);
            return "ok";
        }
    
  • 传参图示

    在这里插入图片描述

4.JSON 参数传递

  • springMVC 默认支持的json处理不是使用fastjson,而是使用 jackson 处理的

4.1导入依赖

  • 依赖

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.5</version>
    </dependency>
    

4.2开启 SpringMVC 注解支持

  • 开启支持

    @Configuration
    @ComponentScan("cn.sycoder.controller")
    @EnableWebMvc
    public class SpringMvcConfig {
    }
    
  • @EnableWebMvc

    名称@EnableWebMvc
    位置SpringMVC 配置类上
    作用开启SpringMVC 的辅助功能支持
  • @RequestBody

    名称@RequestBody
    位置SpringMVC控制方法形参里面
    作用将请求中的请求体包含的数据传递给形参
    属性boolean required() 表示是否必填

4.2发送 json数据-@RequestBody

  • 传送 json 用户数据到后台,只有加了@RequestBody这个注解,才可以通过json传递数据,并再前端需要设置contentType:application/json

    @Controller
    @RequestMapping("/RequestBodyController")
    public class RequestBodyController {
    
        @PostMapping("/user/save")
        @ResponseBody
        public String saveUser(@RequestBody User user){
            System.out.println(user);
            return "OK";
        }
    }
    
  • 图示

    在这里插入图片描述

  • 如果 json 参数有嵌套也是老样子传参即可

    {  	"account": " 123", 	"password": "123456", 	"address": {  		"city": "杭州" 	} }
    
  • 接收图示

    在这里插入图片描述

4.3传 json 数组到后台

  • 传递json 数组

    @PostMapping("/user/lists")
    @ResponseBody
    public String saveUser(@RequestBody List<String> lists){
        System.out.println(lists);
        return "OK";
    }
    
  • 图示

    在这里插入图片描述

4.4传递对象集合json 数据

  • 传递对象集合json数据

     @PostMapping("/user/lists/user")
        @ResponseBody
        public String listUser(@RequestBody List<User> lists){
            System.out.println(lists);
            return "OK";
        }
    
  • 传递图示

    在这里插入图片描述

  • json 数据

    [{"account":" 123","password":"123456","address":{"city":"杭州"}},{"account":" sy","password":"123456","address":{"city":"北京"}}]
    

5.@RequestParam 和 @RequestBody总结

  • 区别
    • @RequestBody 用于接收json 数据的[application/json]
    • @RequestParam 用于接收 url 地址参数的 [application/x-www-form]
  • 应用
    • 后面的开发,都是前后端分离的,以 json 数据传输为主,所以 @RequestBody 使用更多
    • 如果不是使用json传输,就用 @RequestParam

6.日期类型参数传递

  • 2022-11-12
  • 2022/11/12

6.1常规格式

  • 控制器

    @Controller
    @RequestMapping("/date")
    public class DateController {
    
        @RequestMapping("/test")
        @ResponseBody
        public String testDate(Date date){
            System.out.println(date);
            return "ok";
        }
    }
    
  • 图示

    在这里插入图片描述

6.2修改格式

  • 出现错误

    在这里插入图片描述

  • 定制化格式操作

    @Controller
    @RequestMapping("/date")
    public class DateController {
    
        @RequestMapping("/test")
        @ResponseBody
        public String testDate(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date){
            System.out.println(date);
            return "ok";
        }
    }
    

6.3@DateTimeFormat

名称@DateTimeFormat
作用指定日期格式(yyyy-MM-dd)
属性String pattern() 指定日期格式
使用位置SpringMVC 控制器方法形参前面,还可以使用到具体的对象属性上

在这里插入图片描述

6.4底层转换的原理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五、响应

1.注解配置的另一种方式

  • 配置

    public class ServletConfig  extends AbstractAnnotationConfigDispatcherServletInitializer {
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[0];
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{SpringMvcConfig.class};
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    }
    

2.设置响应页面

  • 注解配置视图解析器

    @Configuration
    @ComponentScan("cn.sycoder.controller")
    @EnableWebMvc
    public class SpringMvcConfig implements WebMvcConfigurer {
    
    
       @Bean
       public ViewResolver viewResolver(){
           InternalResourceViewResolver resolver = new InternalResourceViewResolver();
           resolver.setPrefix("/WEB-INF/pages/");
           resolver.setSuffix(".jsp");
           return resolver;
       }
    }
    
  • 配置视图解析器之后跳转

    @Controller
    public class TestController {
        @RequestMapping("/test")
        public String test(){
            return "ok.jsp";
        }
        //配置视图解析器之后的视图跳转
        @RequestMapping("/view")
        public String view(){
            return "view";
        }
    }
    
  • 图示

    在这里插入图片描述

    在这里插入图片描述

3.响应文本类型

  • 如果没有使用 @ResponseBody 会出现如下问题

    @RequestMapping("/respbody")
    //    @ResponseBody
        public String respbody(){
            return "ok";
        }
    

    在这里插入图片描述

  • 响应文本类型使用 @ResponseBody

    @RequestMapping("/respbody")
        @ResponseBody
        public String respbody(){
            return "ok";
        }
    

4.响应JSON数据

  • 使用 @ResponseBody + @EnableWebMvc 才能返回 json

  • SpringMVC 配置类

    @Configuration
    @ComponentScan("cn.sycoder.controller")
    @EnableWebMvc
    public class SpringMvcConfig {
    
    
       @Bean
       public ViewResolver viewResolver(){
           InternalResourceViewResolver resolver = new InternalResourceViewResolver();
           resolver.setPrefix("/WEB-INF/pages/");
           resolver.setSuffix(".jsp");
           return resolver;
       }
    }
    

4.1响应单个json对象

  • 控制器方法使用 @ResponseBody

    @RequestMapping("/userjson")
        @ResponseBody
        public User respUserJson(){
            User user = new User();
            user.setAddTime(new Date());
            user.setName("sy");
            user.setUsername("sy666");
            user.setId(1L);
            return user;
        }
    

    在这里插入图片描述

4.2响应集合json对象

  • 控制器方法

    @RequestMapping("/listuserjson")
        @ResponseBody
        public List<User> respListUserJson(){
            List<User> list = new ArrayList<>();
            User user = new User();
            user.setAddTime(new Date());
            user.setName("sy");
            user.setUsername("sy666");
            user.setId(1L);
            list.add(user);
            User user1 = new User();
            user1.setAddTime(new Date());
            user1.setName("sy");
            user1.setUsername("sy666");
            user1.setId(1L);
            list.add(user1);
            return list;
        }
    

    在这里插入图片描述

4.3@RestController

  • @RestController = @Controller + @ResponseBody

  • 应用

    @RestController
    public class MyRestController {
    
        @RequestMapping("/listuserjson")
        public List<User> respListUserJson(){
            List<User> list = new ArrayList<>();
            User user = new User();
            user.setAddTime(new Date());
            user.setName("sy");
            user.setUsername("sy666");
            user.setId(1L);
            list.add(user);
            User user1 = new User();
            user1.setAddTime(new Date());
            user1.setName("sy");
            user1.setUsername("sy666");
            user1.setId(1L);
            list.add(user1);
            return list;
        }
    }
    

4.4@ResponseBody 总结

名称@ResponseBody
作用设置控制器的返回值作为响应体,如果返回的是对象类型,会转换成 json 对象传输
位置可以使用到类上,或者控制器方法上

六、域对象共享

1.HttpServletRequest

  • 具体应用,就是jsp中可以获取后端的数据,通过el表达式获取到数据

    @RequestMapping("/ok")
        public String okServletRequest(HttpServletRequest request){
            request.setAttribute("ok","66666");
            return "ok";
        }
    
  • jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@page isELIgnored="false" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${ok}
    </body>
    </html>
    

2.ModelAndView

  • 具体应用

    @RequestMapping("/modelAndView")
        public ModelAndView modelAndView(){
            ModelAndView view = new ModelAndView();
            view.setViewName("ok");
            view.addObject("ok","==============");
            return view;
        }
    
  • jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@page isELIgnored="false" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${ok}
    </body>
    </html>
    

3.Map 向 Request 中共享数据

  • 具体应用

    @RequestMapping("/testMap")
    public String testMap(Map<String,Object> map){
        map.put("ok","-------------");
        return "ok";
    }
    
  • jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <%@page isELIgnored="false" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${ok}
    </body>
    </html>
    

七、RESTFul 风格

1.REST简介

  • REST概述:Representational State Transfer,表现层资源状态转移

2.传统访问资源和 REST 对照

操作传统方式REST风格
查询操作/student/getById?id=5student/5 get请求
保存操作/saveStudentstudent post 请求
更新/updateStudentstudent put 请求
删除/deleteById?id=5student/5 delete 请求
  • REST 优点
    • 隐藏资源访问行为,做到无法根据资源访问猜测是什么样的逻辑
    • 书写也简单化
  • 注意
    • REST 风格只是一种约定方式,并不是规范
    • 以后通过 REST 风格访问网络资源就叫 RESTFul

3.案例实现

3.1案例分析

在这里插入图片描述

3.2传统实现方式

  • 实现

    @Controller
    @RequestMapping("/item")
    public class ItemController {
    
        //增加
        @RequestMapping("/save")
        @ResponseBody
        public String save(@RequestBody Item item){
            System.out.println(item);
            return "save OK";
        }
        //删除
        @RequestMapping("/delete")
        @ResponseBody
        public String delete(Long id){
            System.out.println(id);
            return "delete OK";
        }
        //修改
        @RequestMapping("/update")
        @ResponseBody
        public String update(@RequestBody Item item){
            System.out.println(item);
            return "update OK";
        }
        //查询
        @RequestMapping("/getById")
        @ResponseBody
        public String getById(Long id){
            System.out.println(id);
            return "getById OK";
        }
    }
    

3.3RESTFul 实现方式

  • 实现

    @RestController
    public class ItemRestController {
        //增加
        @PostMapping("/item")
        public String save(@RequestBody Item item){
            System.out.println(item);
            return "rest save OK";
        }
        //删除
        @DeleteMapping("/item/{id}")
        public String delete(@PathVariable Long id){
            System.out.println(id);
            return "rest delete OK";
        }
        //修改
        @PutMapping("/item")
        public String update(@RequestBody Item item){
            System.out.println(item);
            return "rest update OK";
        }
        //查询
        @GetMapping("/item/{id}")
        public String getById(@PathVariable Long id){
            System.out.println(id);
            return "rest getById OK";
        }
    }
    

4.静态资源的处理

4.1拷贝静态资源到项目webapp 下面

在这里插入图片描述

  • 但是出现如下问题

    在这里插入图片描述

  • 原因:SpringMVC 拦截了静态资源,根据 /pages/item.html 去找对于的 controller 方法执行,匹配我们配置的 / 的getServletMappings,找不到所以 404

4.2解决方案

  • 配置静态资源放行就可以了

  • 配置如下

    @Configuration
    public class StaticSupport extends WebMvcConfigurationSupport {
    
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            //当访问 /pages/ 资源的时候,设置放行
            registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
            registry.addResourceHandler("/js/**").addResourceLocations("/js/");
            registry.addResourceHandler("/css/**").addResourceLocations("/css/");
            registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    
        }
    }
    
  • 注意,需要将静态支持交给 springmvc 管理

    @Configuration
    @ComponentScan("cn.sycoder")
    @EnableWebMvc
    public class SpringMvcConfig  {
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/967121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1776_树莓派简介视频学习小结

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 卖树莓派的时候赠送了部分视频资料&#xff0c;今天看了一段&#xff0c;主要是对树莓派进行一个简单的介绍的视频。挑我自己感兴趣的大致总结如下&#xff1a…

第五章 树与二叉树 二、二叉树的定义和常考考点,WPL的算法

一、定义 二叉树可以用以下方式详细定义&#xff1a; 二叉树是由节点构成的树形结构&#xff0c;每个节点最多可以有两个子节点。每个节点有以下几个属性&#xff1a; 值&#xff1a;存储该节点的数据。左子节点&#xff1a;有一个左子节点&#xff0c;如果没有则为空。右子节…

【包过滤防火墙——iptables静态防火墙】的简单使用

文章目录 规则链的分类--五链处理的动作iptables常用参数和作用 防火墙就是堵和通的作用 iptables &#xff1a;包过滤防火墙&#xff0c;是内核防火墙netfilter的管理工具 核心&#xff1a;四表五链 规则链的分类–五链 在进行路由选择前处理的数据包&#xff1a;PREROUTIN…

python实现zscore归一化和minmax标准化

zscore归一化&#xff1a; minmax from sklearn import preprocessing from sklearn.preprocessing import StandardScaler import numpy as np# 数据 x np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]]) print(----------------minmaxscaler标准化-------------) # 调用minma…

RK3568-INPUT输入子系统

本文档以检测按键电平状态为例 硬件连接(KEY0与GPIO3B6引脚相连) 驱动分为三类: 1 自己编写input输入子系统按键驱动 2 使用内核按键中断驱动 /kernel/drivers/input/keyboard/gpio_keys.c 3 使用内核按键轮休驱动 /kernel/drivers/input/keyboard/gpio_keys_polled.c内核…

docker 笔记2 Docker镜像和数据卷

参考&#xff1a; 1.镜像是什么&#xff1f;&#xff08;面试题&#xff09; 是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文…

【LeetCode75】第四十五题 重新规划路线

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个表示城市连通情况的有向图&#xff0c;要求每个城市都要可以通向0号城市&#xff0c;不同城市之间只有一条路线&#xff0c;我…

Gteam2.0免授权毛玻璃拟态UI带后台版本修复版

程序使用PHP7版本运行 后台信息/Admin 账号admin 密码123456 后台功能 多管理员、系统日志等等功能

知识图谱实战应用26-基于知识图谱构建《本草纲目》的中药查询与推荐项目应用

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用26-基于知识图谱构建《本草纲目》的中药查询与推荐项目应用,本文通过Py2neo连接到知识图谱数据库,系统实现了中药的快速查询、关系分析、智能推荐和知识展示等功能。用户可以输入中药的名称或特征进行查询,系统将从知…

1778_树莓派系统安装

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 一段视频学习教程的总结&#xff0c;对我来说基本上用处不大。因为我自己的树莓派简简单单安装完就开机成功了&#xff0c;而且实现了很多视频中介绍的功能。 …

人工智能研究的未来:20 年机器学习和深度学习的论文创意!

“机器学习的美妙之处在于&#xff0c;它可以应用于你想要解决的任何问题&#xff0c;只要你能为计算机提供足够的例子。” 一、说明 该文章列出了 20 年机器学习和深度学习本科课程的 2023 个潜在论文想法。每个论文的想法都包括一个介绍&#xff0c;简要概述了主题和研究目标…

Elasticsearch 对比传统数据库:深入挖掘 Elasticsearch 的优势

当你为项目选择数据库或搜索引擎时&#xff0c;了解每个选项的细微差别至关重要。 今天&#xff0c;我们将深入探讨 Elasticsearch 的优势&#xff0c;并探讨它与传统 SQL 和 NoSQL 数据库的比较。 1. Elasticsearch简介 Elasticsearch 以强大的 Apache Lucene 库为基础&#…

安装Ubuntu系统,将U盘当作启动盘后写保护怎么恢复?

下载ChipGenius 插入写保护的U盘&#xff0c;打开ChipGenius.exe后可以扫描到U盘&#xff0c;如下图中的E:盘就是我插入的U盘&#xff08;我的PC上只有C、D两个分区&#xff09;&#xff1b; ChipGenius的作用 下载ChipGenius是为了获取U盘的设备信息&#xff1a;重点是主控…

Paddle训练COCO-stuff数据集学习记录

COCO-stuff数据集 COCO-Stuff数据集对COCO数据集中全部164K图片做了像素级的标注。 80 thing classes, 91 stuff classes and 1 class ‘unlabeled’ 数据集下载 wget --directory-prefixdownloads http://images.cocodataset.org/zips/train2017.zip wget --directory-prefi…

stable diffusion实践操作-复制-清空-保存提示词

系列文章目录 stable diffusion实践操作 stable diffusion实践操作-webUI教程 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、右上生成图标附近按钮介绍1. 箭头介绍&#xff08;复现别人的…

博客程序系统其它功能扩充

一、注册功能 1、约定前后端接口 2、后端代码编写 WebServlet("/register") public class RegisterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置…

《凤凰架构》第三章——事务处理

前言 由于一些地方原文感觉不太清楚&#xff0c;有些地方用小林coding的文章代替。 总结 事务处理主要的目的就是要让数据在各种条件下&#xff0c;最终的运行结果都能符合你的期望。要达成这个目标有三点需要满足&#xff1a;原子性&#xff08;业务要么同时成功&#xff0…

RT-Thread 原子操作

原子操作简介 原子操作&#xff08;Atomic operation&#xff09;是指一种不可分割的操作&#xff0c;要么完全执行成功&#xff0c;要么完全不执行。 原子操作的执行过程中不允许有任何中断&#xff0c;如果出现了中断&#xff0c;那么操作的结果就无法保证。 原子操作通常…

【Linux】多路IO转接问题-select

select&#xff1a; 首先设置一个lfd绑定服务端地址结构&#xff0c;用于监听新的连接。select函数调用&#xff0c;用于对整个fd数组进行监听&#xff0c;该数组最大限制1024&#xff0c;通过遍历&#xff0c;来确定是哪个fd有变化&#xff1a; 1.如果是lfd&#xff1a;那么可…

PriorityQueue介绍

PriorityQueue堆的应用找前k个最小数据&#xff08;TOPK问题&#xff09;求k个最小的数优化堆排序 PriorityQueue Java集合框架中提供了PriorityQueue和PriorityBlockingQueue&#xff08;优先级阻塞队列&#xff09;两种类型的优先级队列&#xff0c;PriorityQueue是线程不安…