SSM--SpringMVC复习(二)

请求 URL匹配: @RequestMapping

@RequestMapping 负责将请求映射到对应的控制器方法上。

@RequestMapping 注解可用于类或方法上。用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。

在整个 Web 项目中,@RequestMapping 映射的请求信息必须保证全局唯一。

@RequestMapping 注解常用属性

value

@RequestMapping 注解的默认属性,如果只有 value 属性时,可以省略该属性名,如果有其它属性,则必须写上 value 属性名称。

复制代码
// 斜杠可省略
@RequestMapping(value="/login")
@RequestMapping("/login")

value 属性支持通配符匹配,如 value="user/*" 表示 user/1user/login 都能够正常访问。

path

用法同 value。

name

用来添加描述信息,相当于方法注释。如 @RequestMapping(value = "/login",name = "用户登录")

method

method 属性用于表示该方法支持哪些 HTTP 请求。省略 method 则说明该方法支持全部的 HTTP 请求。

复制代码
//表示该方法只支持 GET 请求
@RequestMapping(value = "login",method = RequestMethod.GET)
//说明该方法同时支持 GET 和 POST 请求
@RequestMapping(value = "login",method = {RequestMethod.GET,RequestMethod.POST})

params

用于指定请求中规定的参数 。

复制代码
//请求中必须包含 type 参数时才能执行该请求,即 /login?type=x 可访问该方法,/login 则无法访问该方法。
@RequestMapping(value = "login",params = "type")
public String doLogin() {
    return "/test.jsp";
}
​
//请求中必须包含 type 参数且值为1时才能执行该请求,否则无法访问
@RequestMapping(value = "login",params = "type=1")
public String doLogin() {
    return "/test.jsp";
}

表示请求中必须包含某些指定的 header 值。

consumes

用于指定请求提交内容类型(Content-Type),例如:application/json、text/html。

复制代码
@RequestMapping(value = "login",consumes = "application/json")

produces

用于指定返回的内容类型,返回的内容类型必须是 request 请求头(Accept)中所包含的类型。 除此之外,还可以指定返回值的编码。

复制代码
// 指定返回内容类型
@RequestMapping(value = "login", produces = "application/json")
// 指定返回内容类型,同时指定返回值编码
@RequestMapping(value = "login",produces = "application/json,charset=utf-8") 

请求参数获取

Spring MVC Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合。主要有以下几种方式:

  • 通过处理方法的简单形参接收请求参数
  • 通过实体 Bean 接收请求参数

  • 通过 HttpServletRequest 接收请求参数

  • 通过 @RequestParam 接收请求参数

  • 通过 @PathVariable 接收 URL 中的请求参数

通过处理方法的简单形参接收请求参数

通过方法形参接收请求参数,是根据请求参数名和方法形参名相同原则进行赋值。该接收参数方式适用于 get 和 post 提交请求方式。

复制代码
@RequestMapping("/login")
public String doLogin(String username,String pwd){
    return "/show.jsp"; //请求转发
}

通过实体Bean接收请求参数

实体 Bean 接收请求参数适用于 get 和 post 提交请求方式。Bean 的属性名称必须与请求参数名称相同。请求参数按同名原则,赋值给 Bean 的属性。如果 Bean 中的属性是 数字类型,则 SpringMVC 会自动尝试参数类型的转换。

复制代码
@RequestMapping("/login")
public String doLogin(User user){
    return "/show.jsp"; //请求转发
}

通过HttpServletRequest接收请求参数

复制代码
@RequestMapping("/login")
public String doLogin(HttpServletRequest request){
    String name = request.getParameter("username");
    String pwd = request.getParameter("pwd");
    return "/show.jsp"; //请求转发
}

通过@RequestParam接收请求参数

@RequestParam 有以下三个参数:

  • value | name:参数名

  • required:是否必须,默认为 true,表示请求中必须包含对应的参数名,若不存在将抛出异常

  • defaultValue:参数默认值

复制代码
@RequestMapping("/login")
public String doLogin(@RequestParam(name = "name",defaultValue = "admin")String username, @RequestParam String pwd){
    return "/show.jsp"; //请求转发
}

通过@PathVariable接收URL中的请求参数

复制代码
/*
    访问 /login/admin/123456, URL中的模板变量 {name} 和 {pwd} 将值 admin 和 123456 绑定到通过 @PathVariable 注解的参数 username 和 pwd 上。
*/
@RequestMapping("/login/{name}/{pwd}")
public String doLogin(@PathVariable("name") String username, @PathVariable String pwd){
    return "/show.jsp"; //请求转发
}

请求转发和重定向

请求转发

  • 方式 1

    复制代码
    @RequestMapping("/login")
    public String doLogin(){
        return "/show.jsp"; 
    }
  • 方式 2

    复制代码
    @RequestMapping("/login")
    public String doLogin(){
        return "forward:/show.jsp"; 
    }
  • 方式3

    复制代码
    @RequestMapping("/login")
    public ModelAndView doLogin(){
        ModelAndView mv = new ModelAndView("/show.jsp");
        return mv;
    }
  • 方式4

    复制代码
    @RequestMapping("/login")
    public void doLogin(HttpServletRequest request, HttpServletResponse response){
        request.getRequestDispatcher("show.jsp").forward(request,response);
    }

重定向

  • 方式1

    复制代码
    @RequestMapping("/login")
    public String doLogin(){
        return "redirect:/show.jsp"; 
    }
  • 方式2

    复制代码
    @RequestMapping("/login")
    public void doLogin(HttpServletResponse response){
        response.sendRedirect("/demo/show.jsp");
    }

传值到View

  • 方式1

    复制代码
    // 将放在 model 中的属性 m2 的作用域设置为 session 范围
    @SessionAttributes("m2")  
    public class LoginController {
        @RequestMapping("/login")
        public String doLogin(Model model){
            model.addAttribute("m1","info");        //request
            model.addAttribute("m2","info2");       //session
            return "forward:/show.jsp"; 
        }
    }
  • 方式2

    复制代码
    @RequestMapping("/login")
    public ModelAndView doLogin(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("/show.jsp");
        mv.addObject("m","info");
        return mv;
    }
  • 方式3

    复制代码
    @RequestMapping("/login")
    public String doLogin(HttpServletRequest request,HttpSession session){
        request.setAttribute("m1","info");      //request
        session.setAttribute("m2","info2");     //session
        return "forward:/show.jsp"; 
    }
  • 方式4

    @ModelAttribute 注解用于将其修饰的对象自动暴露为模型数据,在视图页面展示时使用。

    复制代码
    @RequestMapping("/login")
    //等价于 model.addAttribute("user",user)
    public String doLogin(@ModelAttribute("user") User user){
        return "/show.jsp";
    }
    ​
    @RequestMapping("/login")
    //等价于 model.addAttribute("User",yh)
    public String doLogin(@ModelAttribute User yh){
        return "/show.jsp";
    }

Ajax 响应

@Controller

复制代码
@Controller
public class LoginController {
    @RequestMapping("/login")
    @ResponseBody       // 响应 Ajax 请求,必须添加此注解
    public Student doLogin(String name,String pwd){
        User user = userService.selectUser(name,pwd);
        return user;    // 返回到 view 的数据会自动转为 json(js) 对象
    }
}

@RestController

@RestController = @Controller+@ResponseBody

复制代码
@RestController
public class LoginController {
    @RequestMapping("/login")
    public User login(String name,String pwd) {
        User user = userService.selectUser(name,pwd);
        return user;
    }
}

视图资源解析器

视图解析器(ViewResolver)是 Spring MVC 的重要组成部分,负责将逻辑视图名解析为具体的视图对象。

URLBasedViewResolver

UrlBasedViewResolver 是对 ViewResolver 的一种简单实现,主要提供了一种拼接 URL 的方式来解析视图。

UrlBasedViewResolver 通过 prefix 属性指定前缀,suffix 属性指定后缀。当 ModelAndView 对象返回具体的 View 名称时,它会将前缀 prefix 和后缀 suffix 与具体的视图名称拼接,得到一个视图资源文件的具体加载路径,从而加载真正的视图文件并反馈给用户。

使用 UrlBasedViewResolver 除了要配置前缀和后缀属性之外,还需要配置"viewClass",表示解析成哪种视图。

md-end-block 复制代码
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">            
    <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceViewResolver"/><!--不能省略-->
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>  
 </bean>

存放在 /WEB-INF/ 目录下的内容不能直接请求到,为了安全性考虑,通常把 jsp 文件放在 WEB-INF 目录下

InternalResourceViewResolver

InternalResourceViewResolver 为"内部资源视图解析器",是日常开发中最常用的视图解析器类型。它是 URLBasedViewResolver 的子类,拥有 URLBasedViewResolver 的一切特性。

md-end-block 复制代码
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--前缀-->
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>  
</bean>
相关推荐
小扳44 分钟前
微服务篇-深入了解使用 RestTemplate 远程调用、Nacos 注册中心基本原理与使用、OpenFeign 的基本使用
java·运维·分布式·后端·spring·微服务·架构
一撮不知名的呆毛2 小时前
MVC、EL、JSTL
mvc
sin22012 小时前
SpringMVC入门
mvc
豪宇刘2 小时前
Spring MVC
java·spring·mvc
White graces2 小时前
Spring MVC练习(前后端分离开发实例)
java·开发语言·前端·后端·spring·java-ee·mvc
小小李程序员10 小时前
LRU缓存
java·spring·缓存
kingbal11 小时前
SpringCloud:Injection of resource dependencies failed
后端·spring·spring cloud
CopyLower16 小时前
深入理解 MyBatis 的缓存机制:一级缓存与二级缓存
spring·缓存·mybatis
Iced_Sheep16 小时前
Spring @Transactional 你真的会用吗???
后端·spring