栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

67-SpringMVC基本应用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

67-SpringMVC基本应用

SpringMVC基本应用
SpringMVC简介: MVC模式: MVC是软件工程中的一种软件架构模式,它是一种分离业务逻辑与显示界面的开发思想
 

SpringMVC概述: SpringMVC 是一种基于 Java 的实现 MVC 设计模式的轻量级 Web 框架 属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中 SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布 全面超越 Struts2,成为最优秀的 MVC 框架 它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口 同时它还支持 RESTful 编程风格的请求

总结 SpringMVC的框架就是封装了原来Servlet中的共有行为;例如:参数封装,视图转发等 SpringMVC快速入门: 需求 客户端发起请求,服务器接收请求,执行逻辑并进行视图跳转 步骤分析:
 
创建web项目,导入SpringMVC相关坐标 

war

    
    
        org.springframework
        spring-webmvc
        5.1.5.RELEASE
    
    
    
        javax.servlet
        javax.servlet-api
        3.1.0
        provided
    
    
        javax.servlet.jsp
        jsp-api
        2.2
        provided
    


配置SpringMVC前端控制器DispathcerServlet:


    
    
        dispatcherServlet
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:spring-mvc.xml
        
        
        
        2
        
    
    
        dispatcherServlet
        /
        

    @RequestMapping("quick")
    //一般我们使用Servlet来调用对应的get和post方法时,实际上只是使用对应方法来操作请求和响应信息
    //那么这个方法也是可以是其他的,当我们使用spring的DispatcherServlet(父类有Servlet)时
    //那么我们就可以使用他的方法,一般的普通的类,继承或者实现对应的Servlet时
    //使用xml或者注解会自动根据监听到的请求来调用对应的get和post方法
    //而DispatcherServlet虽然底层也是进行get和post方法的执行
    //但是他们都会调用同一个方法,即processRequest方法
    //如下
    
    //可以看到无论是get还是post最终的调用是一样的
    //而由于请求一般都是被监听的,就如xml和注解@WebServlet一样,对应请求到了,则初始化对应实例
    //那么DispatcherServlet由于(在这里)设置了/,那么所有的请求都会拦截,使得调用对应的get和post方法
    //而由于这两个方法一样,那就会根据这个方法,来得到请求信息
    //其中会进行IOC容器的检查,也就是检查对应实例是否有@RequestMapping注解(对实例进行反射)
    //若有,看看对应值是否是对应请求的相应路径
    //若是,则调用注解所在方法(其他参数有默认也要满足,后面会说明),并获得值,根据值,再次进行对应操作
    //如这里进行转发,传递参数,转发到对应的页面路径

    public String quick(){
        //业务逻辑
        System.out.println("哈哈哈");
        //视图跳转
        return "WEB-INF/pages/success.jsp";
    }
}

jsp:
<%--
  Created by IntelliJ IDEA.
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


嘿嘿嘿



配置SpringMVC核心文件spring-mvc.xml (名字当然不做要求) :

    
    
    
    

web工程执行流程 :

知识小结:
 
SpringMVC组件概述: 
SpringMVC的执行流程: 

 
SpringMVC组件解析: 
 
当我们不配置三大组件时,默认有对应配置(一般没有其他扩展),当然我们也可以配置对应三大组件 


    
    

    

    

    
    
        
        
        
        
    

具体方法:
  @RequestMapping("quick1")
    public String quick2(){
        //业务逻辑
        System.out.println("哈哈哈");
        //视图跳转,当配置视图解析器时,会进行拼接的,所以就不能写全路径了,使得可能找不到资源
        return "a";
    }

    @RequestMapping("quick2") //不能有相同的对应值,会检查的,相同就报错
    public String quick3(){
        //业务逻辑
        System.out.println("哈哈哈");
        //视图跳转
        return "b";
    }
SpringMVC注解解析: @Controller: SpringMVC基于Spring容器,所以在进行SpringMVC操作时,需要将Controller存储到Spring容器中 如果使用@Controller注解标注的话,就需要使用:



@RequestMapping:
 
代码解释: 
    //path:作用与value一样,同样是设置方法映射地址,即扫描注解被读取的数据操作一样
    //method:用来限定请求的方式RequestMethod.POST
    //使得只能以post的请求方式访问该方法,其他请求方式会报错
    //之所以这样,前面说过,get和post都调用同一个方法,其中传递了对应的请求和响应相关参数
    //通过这些参数可以得到请求方式,当扫描到这里进行数据的读取时
    //会判断method数据的请求方式值与请求参数的请求方式值是否一致
    //若不一致,则报错,当然这个只是限定约束,若不写,则没有限定约束,即post和get都可以
    //params:用来限定请求参数的条件,默认为null,即不是"",即可以不带对应参数,而""不能添加
    //因为""添加后,浏览器没有直接可以加上""的参数,所以一般访问不了,因为浏览器?后面的""不代表是数据""
    //而就是"",所以若要为空,则什么都不写就可以
    //params={"accountName"} 表示请求参数(不是参数值)中必须有accountName,对应值不做考虑
    //当然了,对于注解来说,若数组属性值是单个,则可以省略{},若是多个,则必须加上{}
    //当上述所有条件满足后,那么就会执行该方法
    //一般只要写了参数,那么值就默认为"",而不写则会得到null(如对应得到参数名方法)
    @RequestMapping(path = "/quick",method = RequestMethod.GET,params = {"accountName"})
知识小结:
 
SpringMVC的请求: 
请求参数类型介绍 : 
客户端请求参数的格式是: name=value&name=value…… 获得的对应值一般都是字符串(数组也是) 
所以有时候服务器要获取请求的参数的时候要进行类型转换,有时还需要进行数据的封装 
SpringMVC可以接收如下类型的参数: 
基本类型参数 
对象类型参数 
数组类型参数 如表单的复选框(多选框)提交 
一般也有对应的方法来获得,如request.getParameterValues()方法,指定参数名称,返回一个字符串数组,包含对应值 
也可以在URL后面加上多个相同参数名称,使得变成数组 
若加上多个相同参数名称(可以叫参数)而后台并没有使用上面的方法来获得全部参数值 
那么使用request.getParameter()方法,指定参数名称,就默认是获得第一个参数名称的值,即最左边的参数值 
集合类型参数 
获取基本类型参数 : 
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配 
并且能自动做类型转换;自动的类型转换是指从String向其他类型的转换 
<%--
  Created by IntelliJ IDEA.
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


${pageContext.request.contextPath}
<%--
${pageContext.request.contextPath}代表当前项目路径,我这里是/springmvc_quickstart  参数
--%>

    <%--注意:若好好变成'好好'这是一个整体,也就是说,后台获得的也是'好好'--%>
    基本参数类型




    @RequestMapping("simpleParam") //也默认加上/,有/则不加
    public String simpleParam(Integer id,String username) {
        //当我们通过实例进行反射时,在判断注解信息后,调用方法前,会对对应方法参数进行判断
        //若请求(被当成参数过来的)的对应参数名称
        //有与这个方法的对应参数名称有一样的(必须一样,没有拼接的操作,否则不赋值)
        //就与Spring中的构造注入一样名称必须一致,因为一般获取参数名称是需要特定操作的
        //所以一般进行参数操作时,反射一般不会进行拼接对应操作(如字母的大小写操作等等)
        //可以循环名称的,如request.getParameterNames()方法
        //则将该参数名称的值当成参数
        //会判断参数对应类型,使得可能会自动进行类型转换,如判断到了Integer时,将String转换成Integer
        //类型只是标识,这个要理解,因为都是二进制,标识使得有约束
        //并执行方法,参数值获取如对应的获得值方法

        System.out.println(id);
        System.out.println(username);

        return "success";
    }
注意:项目中的WEB-INF的资源浏览器默认是不可直接访问的 一般需要转发进行跳转,重定向不可以,因为重定向实际上也是浏览器进行访问,而不是服务器 而转发是服务器的操作,所以可以,即WEB-INF这个文件夹也通常叫做安全文件夹 且在windows中,若创建了某个文件夹,那么在创建其他文件夹时 文件名称不能是创建好的文件名称(忽略大小写的,也就是说a和A是一样的),linux不忽略大小写,a和A不一样 但他们都不能创建同名(这是必定的) 所以当你创建一个WEB-INf文件夹是不可以的,因为有了WEB-INF文件夹,当然在项目了,只有WEB-INF是安全文件夹 所以创建其他文件夹时,是可以访问其他文件夹的资源的 获取对象类型参数 : Controller中的业务方法参数的POJO属性名与请求参数的name一致,参数值会自动映射匹配
  
    @RequestMapping("pojoParam") //也默认加上/
    public String pojoParam(User user,Integer id,String username) {

        //在这里注意一下:前面可能说过,不同的包相同的类的结合,实际上是反射时进行判断类的所在包
        //所以虽然是一样的类,但包一定不同,根据导入来判断
        //当对象和参数一起时,都会进行操作,因为对应的值并不会在赋值后没有
        //而使用对象时(判断到对象,反射可以得到包)
        //然后根据对应的set方法(对应名称,无视全部大小写,然后将得到的值当成参数),来操作对应的变量
        //而后面的参数也会出现值
        //注意:使用post方式,会出现中文乱码,而之所以get请求没有
        //是因为在tomcat的高版本下已经解决了对应乱码问题
        //如tomcat8.5及其以上,现在我们回顾前面使用Servlet时解决的乱码问题
        //是因为我们设置了对应编码,而不是使用默认编码读取和写入,get请求则设置了中文对应编码,使得没有乱码
        //post一般没有,后面会给出解决方式
        //一般请求方式和响应方式一般都不可以操作中文,而jsp一般都只设置响应请求编码,因为他并不使用请求信息
        //所以只操作了响应
        //如<%@ page contentType="text/html;charset=UTF-8" language="java" %>

        System.out.println(user);
        System.out.println(id);
        System.out.println(username);

        return "success";
    }

编号: 用户名:
中文乱码过滤器 : 当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤
 
    
        CharacterEncodingFilter
        
        org.springframework.web.filter.CharacterEncodingFilter
       
        
            encoding
            UTF-8
            
        
    
    
        CharacterEncodingFilter
        
    @RequestMapping("arrayParam") //也默认加上/
    public String arrayParam(Integer[] id) {
        //前面说过,单个参数使用request.getParameter()来赋值
        //多个参数使用request.getParameterValues()来获得全部值
        //当判断这个类型是数组类型时,就使用这个方法,将值给这个数组(数值自动进行转换,从下标0开始)
        //当然了也会判断变量名称是否有对应参数名称一致的,有就会进行上述操作


        System.out.println(Arrays.toString(id));

        return "success";
    }

编号:1 2 3 4 <%--都是值,所以type也可以是其他的,如text--%>
获取集合(复杂)类型参数 : 获得集合参数时,要将集合参数包装到一个POJO中才可以
  
@RequestMapping("/queryParam")
    public String queryParam(QueryVo queryVo) {
        //当有对应类里面存放了类或者集合时,需要在前面有指定名称的对象名称
        //如setUser,那么前端名称就要有user,如user.id(全部忽略大小写)
        //当看到user时,会创建一个空参user对象传入参数中(没有空参则报错)
        //最后在通过id对空参对象进行set操作赋值
        //所以可以在setUser里打印user时对应值是null的
        //因为是最后将id进行赋值,那么由于地址一样,所以对应user值也变化了
        //而当是集合时,也要对应名称,如userList[0].id,[0]被识别,且代表最高位置
        //如[2],那么前面就有[0],[1],先行判断,然后创建一个空的集合
        //若有具体识别则赋值,否则对应对象的值就是默认值(创建对象赋值的)
        //若[]里面的值一样,那么就会字符串合并,而不是覆盖,若是整型则取前面的参数
        //若不写[],但写了[]里面必须有值,否则报错
        //那么不会对任何识别进行赋值(即对应位置的user的set操作),与上面的对象一样
        //setUserList也是一个空的集合,最后进行赋值(创建User对象,也进行了set执行)
        //map集合与其他集合不同的是[]代表key,即[]里面不写时,就代表了""的key,当然也是会合并的
        //即没有最大位置的区分,其他的与上面集合一样,也是先创建集合,然后通过参数使用set赋值
        //有反射操作,自然可以set赋值(拼接的,忽略大小写),map也是setUserMap的赋值
        //然后操作小的User赋值,再然后放入集合中,地址一样,所以最终值也一样
        //由于可以获得类型的对应包或者创建泛型的实例使得可以得到对应的实例,而进行User小的操作放入
        //操作完后,上面的queryVo就有对应值了


        System.out.println(queryVo);
        return "success";
    }

搜索关键字:
user对象:
list集合
第一个元素:
第二个元素:
map集合
第一个元素:
第二个元素:
自定义类型转换器: SpringMVC 默认已经提供了一些常用的类型转换器;例如:客户端提交的字符串转换成int型进行参数设置 日期格式类型要求为:yyyy/MM/dd 不然的话会报错,对于特有的行为 SpringMVC提供了自定义类型转换器方便开发者自定义处理
    
    @RequestMapping("data")
    public String data(Date date){
        //再赋值前判断是Date类型,然后看看字符串是否有/分割的(内置的操作),不是则报错
        //一般操作不了时分秒,即一般如2012/12/10这样的形式
        //则将这些变成对应字符串,然后转换成Date类型,但对应的数字是不能越springmvc日期的界的
        //之所以特定数码springmvc日期的界,是因为在springmvc中月在1-69是可以被操作的
        //日则在0-69,超过的月和日,会被分解(月开始变年,然后日开始变月),即变成年或者月

        System.out.println(date);
        return "success";
    }

生日:
上面是使用默认的操作 接下来我们自定义一个类型转换器
 


 
    
        
            
                
                
            
        
    

package com.lagou.converter;


import org.springframework.core.convert.converter.Converter;

import java.text.SimpleDateFormat;
import java.util.Date;


//Converter接收String转成Date
public class DateConverter implements Converter {
    //dateStr就是表单传递过来的请求参数
  public Date convert(String dateStr) {
    //将日期字符串转换成日期对象 返回
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    Date date = null;
    try {
      date = format.parse(dateStr); 
        //虽然可以操作-了,但/也不可操作了(这里会报错,但还是会输出,只是为null而已),但是-使用的多一点
       
    } catch (Exception e) {
      e.printStackTrace();
    }
    return date;
  }
}


 
    @RequestMapping("data")
    public String data(Date date){
      
        System.out.println(date);
        return "success";
    }
相关注解: @RequestParam 当请求的参数name名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
 
    @RequestMapping("/findByPage")
    public String findByPage(@RequestParam(name = "pageNo",defaultValue = "1",required = true)
                                     Integer pageNum, @RequestParam(defaultValue = "5") Integer 
                             pageSize) {
        System.out.println(pageNum);
        System.out.println(pageSize);
        return "success";
    }

    分页查询

@RequestHeader : 获取请求头的数据
 
    //得到请求头中cookie的信息
    //为什么可以得到,在前面说过,get和post最终结果一致,且传递了request参数,那么对应cookie也是可以得到的
    //将cookie的信息给cookie这个参数,所以值都拼接在String里,包括名称和对应值,=连接,;分割
    @RequestMapping("cookie")
    public String requestHead(@RequestHeader("cookie")String cookie) {
        System.out.println(cookie);
        return "success";
    }
@CookieValue 获取cookie中的数据
    //得到cookie的名称是JSESSIONID的对应值,给这个参数
    @RequestMapping("cookieValue")
    public String cookieValue(@CookieValue("JSESSIONID")String jesessionid){
        System.out.println(jesessionid);
        return "success";
    }

获取Servlet相关API : SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:
    @RequestMapping("/servletAPI")
    //之前的基本都是判断参数名称,然后根据类型进行自动转换使得赋值
    //而当出现servlet的一些基本的类型时,只会根据类型进行赋值(赋值的是servlet的,而不是传递的参数)
	//且不会看参数名称,其中传递的参数不会参与到对应servlet类型中,但会参与到不是对应的servlet类型中
    //所以可以在这里进行其他赋值
    public String servletAPI(HttpServletRequest request, HttpServletResponse
            response, HttpSession session, @RequestParam(name="request")Integer s ) {
        //因为参数不能是一样的,所以需要@RequestParam注解来表示使用赋值
          System.out.println(request);
          System.out.println(response);
          System.out.println(session);
          return "success";
    }

SpringMVC的响应: SpringMVC响应方式介绍: 页面跳转: 返回字符串逻辑视图 void原始ServletAPI ModelAndView 返回数据: 直接返回字符串数据 将对象或集合转为json返回(下个博客会演示) 返回字符串逻辑视图: 直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转到指定页面
@RequestMapping("/returnString")
public String returnString() {
    return "success";
}
void原始ServletAPI : 我们可以通过request、response对象实现响应:
    @RequestMapping("returnVoid")
    //返回值是void(且有HttpServletResponse类型的参数),或者转发和重定向都不会经过视图解析器
    //也就是说不会通过视图解析器的转发(状态判断)
    //而设置void(且有HttpServletResponse类型的参数)且没有转发和重定向
    //那么返回的就是一个空页面,即普通的servlet的运行完毕(响应一个空信息)
    //若没有HttpServletResponse类型的参数,就把@RequestMapping的值当成拼接对象去操作
    //若有HttpServletResponse类型的参数,就不会经过视图解析器,也就是说,当传递时,也就设置了对应的状态了
    //使得不会经过视图解析器
    public void returnVoid(HttpServletRequest request, HttpServletResponse
            response) throws ServletException, IOException {

        //借助request对象完成请求转发一次请求
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);

        //response.sendRedirect(request.getContextPath() + "/index.jsp");
    }
转发和重定向: 企业开发我们一般使用返回字符串逻辑视图实现页面的跳转,这种方式其实就是请求转发 我们也可以写成:forward转发 如果用了forward:则路径必须写成实际视图url,不能写逻辑视图。它相当于:
request.getRequestDispatcher("url").forward(request,response)
使用请求转发,既可以转发到jsp,也可以转发到其他的控制器方法
    @RequestMapping("forward")
    public String forward(Model model){
        //springmvc会自动进行注入(实际上是进行传参),就如上面的servlet的类型一样的操作
        //这样可以设置一些属于这个操作的值了
        model.addAttribute("name","哈哈哈");
        //键值对形式,由于本质上是在request域中存储,那么就可以在jsp中使用ek表达式来获取
        //而转发自然的也会将request转发过去,所以jsp在转译,编译后(访问时才会进行,启动服务器不会)
        //但若已经转译,编译后了,则直接使用(前提文件没有被改变,改变的话也要重新转译,编译)
        //变成servlet时是可以得到request的值的
        return "forward:/WEB-INF/pages/success.jsp";
        //一般的,返回的字符串会被视图解析器进行拼接,但当被找到forward:这个关键字时
        //就会进行转发操作
        //也就是直接request.getRequestDispatcher("返回的forward:后面的数据").forward(request,response)
        //这样不会经过拼接了(状态判断),从而直接转发
    }
<%--
  Created by IntelliJ IDEA.
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


嘿嘿嘿
${name}



从这里到上面的网页,基本都是jsp变化的,当然对应的html也可以,但有些el表达式需要jsp,且设置了jsp不拦截 Redirect重定向(/会表示加在后面,全部路径则会当作全部路径) 我们可以不写虚拟目录,springMVC框架会自动拼接,并且将Model中的数据拼接到url地址上



    
    Title


index...
${name}
<%--空的null不会显示出来,即返回"",而""在servlet通过输出流到前端时,显示的就是空的,即什么都没添加--%>


    @RequestMapping("redirect")
    public String redirect(Model model){

        //由于底层也是request域,那么jsp使用不了el表达式来操作
        //因为使用重定向是不同的request,所以获取不到
        model.addAttribute("name","哈哈哈");
        //当然使用上面的并不是没有作用,会使得请求数据的url,加上上面的对应参数和值(重定向默认是get方式的)
        //如http://localhost:8080/springmvc_quickstart/index.jsp?name=哈哈哈,进行了拼接
        //这就是与request域的一个区别,即虽然model的addAttribute方法最终也是request的setAttribute方法
        //但多一个可以在重定向的重定向的url里添加参数的能力(代码多一点,则效率低一点)

        return "redirect:/index.jsp";

    }
ModelAndView : 方式一 : 在Controller中方法创建并返回ModelAndView对象,并且设置视图名称
 
    @RequestMapping("Model")
    public ModelAndView returnModelAndView(){
        
        ModelAndView modelAndView = new ModelAndView();

        //由上面注释可知:那么我们可以直接设置model,而不用自己取出model进行设置了
        //model设置实际上是设置request的设置,如request.setAttribute("name","哈哈哈");
        modelAndView.addObject("name","哈哈哈");

        //也可以设置返回的视图,而不用我们手动进行返回在放入modelAndView了
        //在交给视图解析器时,会进行view的拼接(前提没有设置void,转发或者重定向)
        //实际上设置void,会使得view为null,当视图解析器判断到是null,则不会进行拼接,转发
        //而转发和重定向设置后,由于状态变化,那么也不会进行拼接转发
        modelAndView.setViewName("success");

        return modelAndView;
    }
方式二: 在Controller中方法形参上直接声明ModelAndView,无需在方法中自己创建 在方法中直接使用该对象设置视图,同样可以跳转页面
    @RequestMapping("Modell")
    public ModelAndView returnModelAndViewl(ModelAndView modelAndView){
        //我们创建ModelAndView对象是会占资源的,为了不用频繁的创建
        //我们可以将servlet的ModelAndView进行传递过来(自动判断参数类型进行注入,servlet的参数)
        modelAndView.addObject("name","哈哈哈");


        modelAndView.setViewName("success");

        return modelAndView;
    }
直接返回字符串数据:
 
    @RequestMapping("ret")
    public void ret(HttpServletResponse mm) throws IOException {

        mm.setContentType("text/html;charset=utf-8");
        PrintWriter writer = mm.getWriter();
        writer.println("哈哈哈");
        //提前设置了response的对应值,那么在最后响应时,就会取出这个值,放在响应报文里面
        //之所以这样,是因为request和response都是在一个方法里共用的
        //即get和post方法里对应方法的实际参数就是这两个参数

    }
@SessionAttributes : 如果在多个请求之间共用数据,则可以在控制器类上标注一个 @SessionAttributes,配置需要在session中存放的数据范围 Spring MVC将存放在model中对应的数据暂存到 HttpSession 中 注意:@SessionAttributes只能定义在类上
@Controller //IOC容器中的四个方式的一种,他们四个基本一样,为了语义即用这个
@RequestMapping("/user") //一级目录
@SessionAttributes("name") //使得 向request域(model)中存入key为name时,会同步到session中
//也就是说,model在使用addAttribute方法时,会检查有没有这个注解操作的信息
//注解操作的信息被读取时,一般由变量进行获得,那么就会判断这个变量值
//即若这个变量值是name,那么key是name的值则会操作session.setAttribute方法进行放入,且key也是name
//否则只会放入request域中去,即操作request.setAttribute方法进行放入
//也就是说,当读取这个注解时,创建的实例中会被这些注解操作
//注意:注解一般只会操作spring的对应实例
//那是因为在创建对应实例时,他们进行了操作,而你直接的创建对象,他们是没有进行操作的
public class UserController {
}
  
    @RequestMapping("re")
    public String re(Model model,HttpServletRequest request){
      return "success";
    }
注意:当model的addAttribute方法执行时,若你进行打印request.getAttribute对应方法,返回的null 之所以不是对应值,那是因为model的addAttribute方法只是先将值存放好,最后才进行放入的 就如前面的集合中set对应集合名称类似,最后才进行User赋值 之所以这样设置,是为了不让数据明显的直接设置成功,即我们基本不能直接操作数据,而是让框架帮我们操作数据 我们只是编写数据而已,并没有操作数据,这样的好处,就在于我们不用写具体的业务代码,而是直接指定数据去操作 springmvc帮我们封装好的具体业务代码了 知识小结:
 
静态资源访问的开启 : 
当有静态资源需要加载时,比如jquery文件,通过谷歌开发者工具抓包发现,没有加载到jquery文件 
原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省) 
<%--
引入jquery-3.4.1.min.js,由于一些外部资源也是需要进行请求的,在设置了/(除了jsp不会拦截外)
那么基本都会被拦截(前端控制器DispatcherServlet的url-pattern配置拦截),使得请求就会受springmvc进行操作
然后就出现找这个名称的对应注解,也就是RequestMapping注解的值
当然没找到就会报错,并说明没有资源存在,即一般都是404
且一般服务器的报错,一般都会转发到错误页面,所以我们看到的页面实际上是服务器自带的对应错误页面
即这样的访问使得变成注解的对应判断(一般这里就会使得报错)并进行操作转发了
即使得对应资源并没有访问到(jsp动态资源)
js,css,img,html一般称之为静态资源
动态资源:当受到程序的影响时,可能对应资源数据不同
静态资源:当受到程序的影响时,资源数据基本固定
静态资源也会参与访问获取,所以就会被拦截,拦截一般不会拦截动态资源,因为一般设置/
--%>

<%--
    若这个资源是复制过来的,注意进行maven的clean和compile来进行重新编译(服务器基本不会再次操作这个编译)
    防止没有被加载(即路径加载),最好也把浏览器缓存也清除
    防止springmvc使得cookie中可能会默认存放对应资源文件的一些信息,使得你删除了且编译了,还是认为存在
    即需要刷新,因为普通的编译或者部署,可能没有对他重新加载(即路径加载)
    --%>
代表对所有的静态资源都进行处理操作,这样就不会执行Tomcat内置的DefaultServlet处理,我们可以通过以下两种 方式指定放行静态资源:

    
    
    



方式二:

    
 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847874.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号