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>
相关推荐
萧瑟余晖9 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
Flittly14 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(二):执行隔离沙箱实战
java·spring boot·spring
BUG指挥官1 天前
Sa-Token和Spring Security对比
java·后端·spring
geminigoth1 天前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring
xbgRS2 天前
spring整合mybaits
java·spring·mybatis
ruleslol2 天前
静态依赖注入 VS 动态依赖查询
spring
墨雨晨曦882 天前
Spring AI总结
java·人工智能·spring
用户3126874877202 天前
Spring Boot 异常处理到底怎么玩的?从 DispatcherServlet 到全局兜底的全链路拆解
spring
不才不才不不才2 天前
Spring 源码系列(17): HandlerMapping 与 HandlerAdapter 两大体系
java·后端·spring
(轻舟已过万重山)2 天前
第40章 Spring AI 实战:企业级 AI 应用架构
人工智能·spring·架构