SpringMVC获取请求参数

通过ServletAPI获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象
就是在参数列表中加一个HttpServletRequest类型的参数,和之前在学习AOP时,加的那个连接点的参数类似,加了就自动给你传过来。
 

通过控制器方法的形参获取请求参数

在方法中添加名称与传过来参数相同的key的形参,就可以自动接收到参数

当形参名称与key不相同时,可以添加@RequestParam(“key”)注解来进行指定对应的参数

@RequestParam

将请求参数与方法的形参绑定

这个注解还有两个属性:

required是否必需,默认为true

defaultValue默认参数值,设置后required失效

 

@RequsetHeader

将请求头信息与方法的形参绑定

@CookieValue

将cookie数据与方法的形参绑定

 

通过pojo获取参数

在控制器方法的形参中设置一个pojo,pojo里面的属性名和传过来的参数名一致,会自动获取

 

参数乱码问题

当获取过任意参数后,再设置httprequest的编码是没有用的

可以使用过滤器,在获取参数前就设置编码

spring中已经封装了过滤器

复制代码
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--配置请求编码-->
<init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param>
<!--配置响应编码-->
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
复制代码

处理请求参数的过滤器需要配置到所有过滤器的最前边

 

域对象共享参数(request请求域)

在Spring中,所有共享参数的方法在最后实现的时候,spring都会把他们封装成一个ModelAndView对象

使用thymeleaf时,可以用th:text="${Attribute名称}"的方式取出数据

1、使用servletAPI

跟web阶段用的一样,在request调用setAttribute

2、使用ModelAndView

官方推荐的使用方式

在DispatcherServlet中,所有方法最终都是以ModelAndView类型封装的

控制器返回类型设置为ModelAndView,然后创建mav对象,在里面添加Object为参数,viewName为跳转到的视图路径

复制代码
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView() { 
        /*** ModelAndView有Model和View的功能 
         * * Model主要用于向请求域共享数据 
         * * View主要用于设置视图,实现页面跳转 */
        ModelAndView mav = new ModelAndView(); 
        //向请求域共享数据 
        mav.addObject("testScope", "hello,ModelAndView"); 
        // 设置视图,实现页面跳转 
        mav.setViewName("success"); return mav; }
    }
复制代码

 

3、使用Model、ModelMap、Map

这三种方法,返回值还是String,用来设置view的路径,然后在形参中设置Model,用来接受放置参数的集合

这三种方法创建的都是同一种对象:org.springframework.validation.support.BindingAwareModelMap  

@RequestMapping("/testModel") 
public String testModel(Model model){ 
    model.addAttribute("testScope", "hello,Model");
    return "success"; 
}

 

@RequestMapping("/testModelMap") 
public String testModelMap(ModelMap modelMap){ 
    modelMap.addAttribute("testScope", "hello,ModelMap");
    return "success"; 
}

 

@RequestMapping("/testMap") 
public String testMap(Map<String, Object> map){ 
    map.put("testScope", "hello,Map"); 
    return "success";
}

 

域对象共享参数(session会话域和application应用域)

使用servletAPI

在方法上添加HttpSession类型的形参,然后可以用session获取ServletContext对象

@RequestMapping("/testSession") 
public String testSession(HttpSession session){ 
    session.setAttribute("testSessionScope", "hello,session"); 
    return "success";
}

 

@RequestMapping("/testApplication") 
public String testApplication(HttpSession session){ 
    ServletContext application = session.getServletContext();
    application.setAttribute("testApplicationScope", "hello,application"); 
    return "success"; 
}

thymeleaf获取会话域和应用域的参数

th:text="${session.属性名}"

th:text="${application.属性名}"

 

SpringMVC的视图

SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户
SpringMVC视图的种类很多,默认有转发视图和重定向视图
当工程引入jstl的依赖,转发视图会自动转换为JstlView
若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView

 

ThymeleafView

在IOC容器中已经配置了一个id为viewrResolver的bean,但是并没有在IOC配置文件中调用,这个bean决定了普通的view的返回类型

当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析
视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转
@RequestMapping("/testHello") 
public String testHello(){ 
  return "hello"; 
}

thymeleafView其实也是转发视图

貌似只有这种方式转发才能解析页面中 带有 th: 的thymeleaf语法

转发视图

SpringMVC中默认的转发视图是InternalResourceView
SpringMVC中创建转发视图的情况:
当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视
图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部
分作为最终路径通过转发的方式实现跳转
例如"forward:/","forward:/employee"
 
@RequestMapping("/testForward") 
public String testForward(){ 
    return "forward:/testHello"; 
}

 

重定向视图

SpringMVC中默认的重定向视图是RedirectView
当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不
会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最
终路径通过重定向的方式实现跳转
例如"redirect:/","redirect:/employee"
@RequestMapping("/testRedirect") 
public String testRedirect(){ 
    return "redirect:/testHello"; 
}

重定向在SpringMVC中会自动添加上下文路径

 

视图控制器view-controller

当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以在IOC配置文件中使用view-controller标签代替控制器方法

 

<!--path:设置处理的请求地址 view-name:设置请求地址所对应的视图名称 --> 
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>

 

 

注:
当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:
<mvc:annotation-driven />