关于后端:SpringMvc-请求处理参数-和-响应数据处理

3次阅读

共计 6844 个字符,预计需要花费 18 分钟才能阅读完成。

1、申请解决参数

1.1 申请参数 @RequestParam

1.1.1 不应用 @RequestParam 注解

申请参数解决,不应用参数注解

1. 如果 申请参数名  和申请解决的  形参名统一 ,springMvc 框架会  主动  将你的申请  参数名对应的参数值 绑定  到申请办法的  形参中 办法内  就能够  间接应用,不必手动获取;

2. 如果你的申请 没有携带参数 ,不会报错,只不过,申请解决办法的  形参值都是 null 或其余值,如果申请解决办法形参是一个实体参数,原理和单个类型参数统一(只有申请参数名和实体名统一也能够主动绑定);

测试不应用 @RequestParam 注解

@RequestMapping("/testSpringMvcNoRequestParam")
public String testSpringMvcNoRequestParam(String userId,String userName){System.out.println(String.format("------ 申请参数:uid :%s ,uname:%s------",userId,userName));

    return "success";
}

测试 申请不带参数

测试 申请带参数

1.1.3 应用 @RequestParam 注解

@RequestParam 只能  写在申请办法的  形参上

required = false 设置 参数不是必传

defaultValue 默认值

  • 1. 如果申请解决办法,形参前,只减少了此注解,没有指定任何属性:

    • 作用:以后 形参必传 ,且  参数名  与  形参名  必须  统一,如果不统一,参数绑定失败,申请间接报 400 谬误,提醒你的参数没有提供;
  • 2. 如果申请解决办法,形参前,只 减少了此注解 ,并  增加了 value 属性值

    • 作用:申请的 参数名 必须和 value 属性指定 的名称统一,此 value 属性能够省略(只写 申请参数别名时,如果有其余的属性,value 属性必须指定);
  • 3. 如果要 勾销  每个参数的  必传校验,能够给此注解减少属性 required=false(默认是 true, 必传),参数能够不传,不须要参数值的绑定;
  • 4. 如果某个参数必传,然而为了避免申请没有携带此参数,能够通过指定属性 defaultValue 减少默认值,如果调用以后申请办法解决,没有提供参数,主动应用默认值,绑定到办法的对应形参中;

测试

@RequestMapping("/testSpringMvcRequestParam")
public String testSpringMvcRequestParam(@RequestParam("uid") String userId,
                                        @RequestParam(value = "uname",required = false,defaultValue = "KH96-mvc") String userName,
                                        @RequestParam String userPwd){System.out.println(String.format("------ 申请参数:uid :%s ,uname:%s,uPwd:%s------",userId,userName,userPwd));

    return "success";

测试后果

1.2 申请头参数 @RequestHeader

申请头参数 @RequestHeader:

  • 解决 申请头携带参数;
  • 作用:从申请头中获取参数,依据别名或者参数形参名,将申请头对应参数值,绑定到申请解决办法的形参中,间接应用,用法跟 @RequestParam 相似,也能够指定是否必传,默认值;

测试

@RequestMapping("/testSpringMvcNoRequestHeader")
public String testSpringMvcNoRequestHeader(@RequestHeader(value = "token",required = false,defaultValue = "KH96_mvc") String token){System.out.println(String.format("------ 申请头参数:token :%s ------",token));

    return "success";
}

测试后果

1.3 Cookie 参数 @CookieValue

@CookieValue:

从 cookie 中获取参数 ,依据别名或者参数形参名,将  申请头对应参数值 绑定  到申请解决办法的  形参中 ,间接应用,用法跟 @RequestParam,@RequestHeader 相似,也能够指定  是否必传 默认值

测试

@RequestMapping("/testSpringMvcCookieValue")
public String testSpringMvcCookieValue(@CookieValue("JSESSIONID") String sessionId){System.out.println(String.format("------ 申请 cookie 参数:JSESSIONID :%s ------",sessionId));

    return "success";
}

测试后果:

1.4 实体参数

申请参数解决 实体参数

主动将申请参数主动将实体的 属性名与形参绑定,原理和单个参数类型统一;

测试


@RequestMapping("/testSpringMvcBeanParam")
public String testSpringMvcBeanParam(UserVO userVO){System.out.println(String.format("------ 申请实体参数:userVO :%s ------",userVO));

    return "success";
}

测试后果

1.5 原生 servlet 的 API 接口作为申请参数

用法和 javaWeb 截断学习的用法完全一致;


@RequestMapping("testSpringMvcServletAPI")
public  void testSpringMvcServletAIP(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws IOException, ServletException {
// 获取申请形式
System.out.println(String.format("------ 申请形式:%s ------",request.getMethod()));

// 获取申请参数
System.out.println(String.format("------ 申请参数:%s ------",request.getParameter("userTel")));

// 手动转发
// request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request,response);

// 获取 session 对象
// 手动增加参数
HttpSession sessionHad = request.getSession();

//sessionHad.setAttribute("userTel",request.getParameter("userTel"));

// 形式 2;间接将 HttpSession 对象申明在申请解决办法的形参中,能够主动获取 session

// 重定向到
//        response.sendRedirect("http://www.baidu.com");

}

// 获取申请形式
System.out.println(String.format("------ 申请形式:%s ------",request.getMethod()));

// 获取申请参数
System.out.println(String.format("------ 申请参数:%s ------",request.getParameter("userTel")));

// 手动转发
// request.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(request,response);

// 获取 session 对象
// 手动增加参数
HttpSession sessionHad = request.getSession();

//sessionHad.setAttribute("userTel",request.getParameter("userTel"));

// 形式 2;间接将 HttpSession 对象申明在申请解决办法的形参中,能够主动获取 session

// 重定向到
//        response.sendRedirect("http://www.baidu.com");

}</pre>

2、响应数据处理

2.1 ModelAndView

ModelAndView 的 数据模型放在 request 的作用域中 视图模型,放在 request.getRequestDispatcher(前缀 + 视图名字 + 后缀) ;

论断:SpringMVC 框架的 前端外围控制器 ,会主动将返回的 ModelAndView 对象中的  数据模型 ,增加到 request 作用域 中  应用外部转发形式,转发到指标视图;

测试

@RequestMapping("/testSpringMvcModelAndView")
public ModelAndView testSpringMvcModelAndView(String userEmail){

    // 创立一个 ModelAndView 对象
    ModelAndView mav = new ModelAndView();

    // 增加模型数据
    mav.addObject("uemail",userEmail);
    // 能够增加多个模型数据,外部应用 ModelMap 汇合寄存的
    mav.addObject("uage",18);

    // 设置指标视图
    mav.setViewName("ok");

    // 返回  ModelAndView 对象
    return  mav;

}

测试后果

2.2 Map

要求:应用 map 返回模型数据 ,必须将 map  申明在  申请解决办法的  形参中,定义在办法的外部是有效的;

总结:

  • 1.springMVC 底层在调用指标申请解决办法前 ,会主动创立一个 Model 接口的隐含对象 作为  模型数据  的  存储对象 ,如果指标申请  解决办法定义了一个 map 接口 ,主动将隐含对象应用援用传递形式传递到指标申请解决办法中,办法体内就能够  间接增加模型数据
  • 2.SpringMvc 底层,在调用完你的申请解决办法后,不论返回什么类型,都会被转换为一个 ModelAndView 对象

测试

@RequestMapping("/testSpringMvcMap")
public  String testSpringMvcMap(String userEmail, Map<String,Object> map){

    // 输入 map 的指标类型
    System.out.println(map.getClass().getName());
    //org.springframework.validation.support.BindingAwareModelMap

    // 增加模型数据
    map.put("uemail",userEmail);

    // 返回指标视图名称
    return "ok";

}

测试后果

2.3 Model

Model, 能够增加模型数据;

必须将 Model 申明  在申请解决办法的  形参中,定义在办法的外部是有效的, 用法跟 Map 统一;

测试

@RequestMapping("/testSpringMvcModel")
public  String testSpringMvcModel(String userEmail, Model model){

    // 增加模型数据
    model.addAttribute("uemail",userEmail);

    // 返回指标视图名称
    return "ok";

}

测试后果

2.4 forward: 转发 和 redirect: 重定向

2.4.1forward 转发

只须要在返回的视图名称前,减少一个前缀:forward 即可,间接转发到指标资源;

以后申请解决办法中的模型对象能够带走;

@RequestMapping("/testSpringMvcForward")
public String testSpringMvcForward(Map<String,Object> map){

    // 转发页面跳转
    //return "forward:/forward.jsp";

    // 转发到其余申请中
    //return "forward:/testSpringMvcModel?userEmail=123@qq.com";

    // 自定义转发,携带模型数据
    map.put("uaddr","nj_wd_kh96");

    return "forward:/testSpringMvcModel?userEmail=123@qq.com";
}

2.4.2 redirect 重定向

只须要在返回的视图名称前,减少一个前缀:redirect 即可,不做视图解析器,间接重定向

留神,重定向,以后申请解决办法中的模型对象不能带走

@RequestMapping("/testSpringMvcRedirect")
public String testSpringMvcRedirect(){

    // 重定向页面跳转
    //return "redirect:/redirect.jsp";

    // 重定向 能够重定向到 其余申请中
    return "redirect:/testSpringMvcModel?userEmail=123@qq.com";

}

2.5 @ResponseBody

返回 JSON 数据;

  • 留神:返回 不须要手动转换为 json 字符串,间接返回对象;
  • @ResponseBody 将返回申请解决办法返回的源对象数据,间接转换为 json 格局字符串 ,返回, 不走视图解析 ;
  • 留神:必须减少 Jackson 依赖的 jar 包,否者报错,且必须要减少注解扫描 <mvc:annotation-driven></mvc:annotation-driven> 才能够;
  • 地位:能够写在申请解决办法上或者类上,写在 类上 ,就是对以后类中  所有申请解决办法失效 ,写在办法上,只有对  以后办法失效 ;

2.5.1 jar 包

<!-- JSON begin -->
<!--jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.4</version>
</dependency>
<!--jackson-->
<!-- JSON end -->

2.5.2 配置

<beans xmlns=
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    <!-- 开启 MVC 的注解扫描 -->
    <mvc:annotation-driven></mvc:annotation-driven>

</beans>

2.5.3 测试

@RequestMapping("/testSpringMvcJson")
@ResponseBody
public UserVO testSpringMvcJson(){

    // 模仿获取去用户详情对象
    UserVO userVO = new UserVO();

    userVO.setUserId("KH96_01");
    userVO.setUserName("GKC");
    userVO.setUserPwd("123");

    return userVO;

}

测试后果

正文完
 0