Spring全家桶知识概括

Springmvc与JS

对于springMVC:

  • 在web工程中对于资源的路径和handler的路径都是相对于web工程的!!!
  • 因为都在webcontent文件夹中。虽然java类的编译Class文件在WEB-INF的classes中
  • 但springmvc映射了路径!!!

springMVC接受参数:

  • @pathVariable:从路径中获取变量,也就是把路径当做变量
 someUrl/{
   paramId}
  • @RequestParam是从请求里面获取参数
/Springmvc/user/page.do?pageSize=3&pageNow=2
  • Spring MVC 会按请求参数名和 POJO属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel 等

springMVC与JS中接受发送数组(一名多值)详解:

  • JS发送一个数组时默认会将每个元素设置为同名的数组名[]形式,以表示发送的为一个数组。
    ①例如:
    array=1
    array=2
    array=3
    springMVC对于同名的数组可以使用数组或List接受但是需要在请求参数后面要写多个[],例如@RequestParam("array[]")。
  • 此外JS也可以使用带下标的人造数组方式发送:
    ①例如:
    array[1]=1
    array[2]=2
    array[3]=3
    springMVC对于带下标的数组可以使用javabean接受,但javabean里要有一个List或数组字段。
  • 对于上述两种方式都比较麻烦,因此可以采用JS发送JSON格式化的数组。
    springMVC对于JSON字符串可以在入参中使用requestBody注解进行解析接受。
    使用String接受,在Cotroller层转化回数组或List。

springMVC与JS中接受发送Map详解:

  • SpringMVC处理请求用Map类型接收参数时,如果参数无注解(@requestParam),则会传入BindingAwareModelMap类型,等价于Model、ModelMap参数。
  • 参数添加@RequestParam注解时,会将参数包装称LinkedHashMap对象,参数的key为Map的key,参数值为Map的value,支持Get、Post方法(应该支持Put、Delete,没有测,俩方法与Post类似)。
    可以采用JS直接发送对象。
    ②此处可以:
    <1>发送json对象,然后使用map接受,逐个取出。
    <2>发送值为json字符串的对象,然后使用map接受,取出一个即ok
  • 添加@RequestBody注解时接收Json类型数据,也会包装成LinkedHashMap对象,该注解不支持Get请求,Get请求没有请求体不能传Json。
    可以采用JS发送JSON字符串。
    @RequestBody只接受JSON字符串。
//发送ajax请求(第一种方式,推荐):1.contentType 可以不填 2.发送数据为json对象
let obj=getFromData();
 $.ajax({
   
          url: "srarch_data/search_data_detail.action",
         type: "post",
          dataType:'json',
          data: {
   "jsonData":JSON.stringify(obj)},
          success: function (json) {
   
     
         }
      });
//发送ajax请求(第二种方式):1.必须填写contentType 2.发送数据为json字符串
      $.ajax({
   
          url: "srarch_data/search_data_detail.action",
         type: "post",
          dataType:'json',
        contentType : 'application/json;charset=utf-8',
          data:  JSON.stringify(obj),
          success: function (json) {
   
     
         }
      });

 //第一种ajax请求对应的后台接口
  @RequestMapping("search_data_detail")
  @ResponseBody
  public void searchInfo(@RequestParam Map<String,String> map){
   
 
    Map<String, Object> jsonMap= JsonToMap.jsonToMap(map.get("jsonData"));
 
    for (Map.Entry<String,Object> entry:jsonMap.entrySet()){
   
      System.out.print("得到键为:==="+entry.getKey());
      System.out.println("得到值为:==="+entry.getValue());
    }
 
  }
   //第二种ajax请求后台对应的后台接口
    @RequestMapping("search_data_detail")
    @ResponseBody
    public void searchInfo(@RequestBody Map<String,String> map)  {
   
   
      for (Map.Entry<String,String> entry:map.entrySet()){
   
          System.out.print("得到键为:==="+entry.getKey());
          System.out.println("得到值为:==="+entry.getValue());
      }
    }
  • 此外还可以使用spring框架中的一个工具类WebUtils,里面有一个静态方法: ①WebUtils.getParametersStartingWith(ServletRequest request, String prefix);
    第一个参数为request对象,第二个参数为键值名的前缀,没有前缀直接写空串。
    此处JS发送的是JS对象。
public ServerResponse list(ServletRequest request){
   
   //获取所有前缀为s_的name存入map中
   Map<String,Object> map = WebUtils.getParametersStartingWith(request, "");
   for (Map.Entry<String,Object> entry :map.entrySet()){
   
       System.out.println("遍历map得到键为:"+entry.getKey());
       System.out.println("遍历map得到值为:"+entry.getValue());
   }

拦截器与过滤器的区别

拦截器与过滤器的区别

  • 链接:拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
  • Filter需要在web.xml中配置,依赖于Servlet;
  • Interceptor需要在SpringMVC中配置,依赖于框架;
  • Filter的执行顺序在Interceptor之前,具体的流程见下图;
    在这里插入图片描述
  • 两者的本质区别:拦截器(Interceptor)是基于Java的反射机制而过滤器(Filter)是基于函数回调
  • 从灵活性上说拦截器功能更强大些,过滤器能做的事情拦截器都能做,而且可以在请求前,请求后执行,比较灵活。
  • 在一次请求的生命周期中:拦截器可以多次调用,而过滤器只能调用一次。
  • Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),
  • 太细的话,还是建议用interceptor不过还是根据不同情况选择合适的。

spring容器、spring MVC容器、web容器的区别

简介:
在这里插入图片描述

spring容器、spring MVC容器、web容器的区别简介:

  • springmvc和spring它俩都是容器,容器就是管理对象的地方,例如Tomcat,就是管理servlet对象的,
  • 而springMVC容器和spring容器,就是管理bean对象的地方,
  • 再说的直白点,springmvc就是管理controller对象的容器,spring就是管理service和dao的容器。
  • 所以我们在springmvc的配置文件里配置的扫描路径就是controller的路径,而spring的配置文件里自然配的就是service和dao的路径

spring容器和springmvc容器的关系

  • 其次 spring容器和springmvc容器的关系是父子容器的关系。spring容器是父容器,springmvc是子容器。
  • 在子容器里可以访问父容器里的对象,但是在父容器里不可以访问子容器的对象,
  • 说的通俗点就是,在controller里可以访问service对象,但是在service里不可以访问controller对象

Web容器

  • web容器是管理servlet,以及监听器(Listener)和过滤器(Filter)的。这些都是在web容器的掌控范围里。但他们不在spring和springmvc的掌控范围里。
  • 因此,我们无法在这些类中直接使用Spring注解的方式来注入我们需要的对象,是无效的,web容器是无法识别的。
  • 但我们有时候又确实会有这样的需求,比如在容器启动的时候,做一些验证或者初始化操作,这时可能会在监听器里用到bean对象;又或者需要定义一个过滤器做一些拦截操作,也可能会用到bean对象。
  • 那么在这些地方怎么获取spring的bean对象呢?下面我提供两个方法:
方法一:
public void contextInitialized(ServletContextEvent sce) {
   
  ApplicationContext context = (ApplicationContext) sce.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); 
  UserService userService = (UserService) context.getBean("userService");
}

方法二:
public void contextInitialized(ServletContextEvent sce) {
   
  WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext()); 
  UserService userService = (UserService) webApplicationContext.getBean("userService"); 
}
  • 注意:以上代码有一个前提,那就是servlet容器在实例化ConfigListener并调用其方法之前,要确保spring容器已经初始化完毕!而spring容器的初始化也是由Listener(ContextLoaderListener)完成,因此只需在web.xml中先配置初始化spring容器的Listener,然后在配置自己的Listener。

Spring在web容器的配置与ContextLoaderListener简介:

  • ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext.xml的配置信息。
  • ContextLoaderListener继承自ContextLoader,实现的是ServletContextListener接口。在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。
  • ContextLoaderListener可以指定在Web应用程序启动时载入Ioc容器,正是通过ContextLoader来实现的,ContextLoader来完成实际的WebApplicationContext,也就是Ioc容器的初始化工作
  • ContextLoaderListener的作用就是启动Web容器时,读取在contextConfigLocation中定义的xml文件,自动装配ApplicationContext的配置信息,并产生WebApplicationContext对象,然后将这个对象放置在ServletContext的属性里,这样我们只要得到Servlet就可以得到WebApplicationContext对象,并利用这个对象访问spring容器管理的bean。
  • 配置案例:
<!-- Spring配置文件开始  -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-config.xml
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值