[SpringMVC-值传递] 初始SpringMVC--SpringMVC中的值传递
把页面中输入的值传递到后台以及后台向前台传递,有以下几种方式
这里以登录为例子,实现打印前端页面的值
1,新建一个控制器,根据不同的请求地址实现不同的请求方式
LoginController.java
@Controller @RequestMapping("/login") public class LoginController { }
2,新建不同登录的请求地址,Ajax参数规范和form一致
@RequestMapping("/login01") public String login01(String userName, String userPwd, String age) { // 在方法中声明和表单中控件name相同的名字的变量,即可完成自动注入 // 在这一过程中也会对一些数据类型进行自动转换,因为从页面传递过来的数据对于服务器而言只有String类型,因此要进行转换才能将其放入对应服务器端的数据类型中 // SpringMVC在底层通过AOP原理来完成类型的自动转换以及参数的自动注入 System.out.println(userName); System.out.println(userPwd); System.out.println(age); return "Hello"; } @RequestMapping("/login02") public String login02(@RequestParam(value = "userName", required = true) String name, @RequestParam(value = "userPwd", required = true) String pwd, @RequestParam(value = "age", required = false) String age) { // 在方法中声明和表单中控件name相同的名字的变量,即可完成自动注入 // 在这一过程中也会对一些数据类型进行自动转换,因为从页面传递过来的数据对于服务器而言只有String类型,因此要进行转换才能将其放入对应服务器端的数据类型中 // SpringMVC在底层通过AOP原理来完成类型的自动转换以及参数的自动注入 System.out.println(name); System.out.println(pwd); System.out.println(age); return "Hello"; } @RequestMapping("/login03") public String login03(User user) { // 如果表单中字段比较多,那么可以在服务器端封装一个对象,对象中的属性名和表单中的name属性值一致 // 在Controller方法中直接注入该对象作为参数,表单中的值即可自动传递过来 System.out.println(user); return "Hello"; }
返回的Hello页面,为 / WEB-INF / Hello.jsp
springMVC-servlet.xml
<!-- 注解扫描器 ,base-package用于指定要扫描的包的路径 当前配置用来扫描com.niit.controller包及其子包下所有的类,所有含@Controller注解的类就会成为一个控制器类(就有了处理请求和返回响应的能力) 另外被@Controller注解标记的类也会成为Spring IOC 容器中被管理的一个对象 --> <context:component-scan base-package="com.stu.controller"></context:component-scan> <!-- 视图解析器 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/"></property> <!-- 后缀 --> <property name="suffix" value=".jsp"></property> </bean> <!-- 不拦截静态资源 --> <mvc:annotation-driven></mvc:annotation-driven> <mvc:default-servlet-handler />
3,在前端通过form表单提交的方式
login.jsp
<h3> login01 </h3> <!-- 提交给/login/login01 进行处理,在控制台打印输入的值 --> <form method="post" action="<%=request.getContextPath()%>/login/login01"> 用户名: <input type="text" name="userName" /> <br /> 密 码: <input type="text" name="userPwd" /> <br /> 年 龄: <input type="text" name="age" /> <br /> <button type="submit"> 跳转到login01 </button> </form> <h3> login02 </h3> <!-- 提交给/login/login02 进行处理,在控制台打印输入的值 --> <form method="post" action="<%=request.getContextPath()%>/login/login02"> 用户名: <input type="text" name="userName" /> <br /> 密 码: <input type="text" name="userPwd" /> <br /> 年 龄: <input type="text" name="age" /> <br /> <button type="submit"> 跳转到login02 </button> </form> <h3> login03 </h3> <!-- 提交给/login/login03 进行处理,在控制台打印输入的值 --> <form method="post" action="<%=request.getContextPath()%>/login/login03"> 用户名: <input type="text" name="userName" /> <br /> 密 码: <input type="text" name="userPwd" /> <br /> 年 龄: <input type="text" name="age" /> <br /> <button type="submit"> 跳转到login03 </button> </form>
4,新建的User对象
User.java
package com.stu.vo.param; import java.io.Serializable; /** * 文件名称: com.stu.vo.param.User.java<br/> * 初始作者: Administrator<br/> * 创建日期: 2018-2-6<br/> * 功能说明: 用户对象 <br/> * =================================================<br/> * 修改记录:<br/> * 修改作者 日期 修改内容<br/> * ================================================<br/> * Copyright (c) 2010-2011 .All rights reserved.<br/> */ public class User implements Serializable { private static final long serialVersionUID = 2660672112156513335L; private String userName; private String userPwd; private String age; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "User [age=" + age + ", userName=" + userName + ", userPwd=" + userPwd + "]"; } }
把值向前端打印 以及 两种重定向方式
继续在LoginController.java中添加代码
@RequestMapping("/login04") public ModelAndView login04(User user) { // 新建一个ModelAndView对象 ModelAndView mav = new ModelAndView(); mav.addObject("userInfo", user);// 相当于request中的setAttribute方法 mav.setViewName("Hello");// 指定处理的视图名称,这里为Hello.jsp页面 return mav; } @RequestMapping("/login05") public String login05(ModelMap map, User user) { // 可以通过操作ModelMap直接将模型数据直接写入request作用域中 // 最后再通过返回String类型来指定对应的视图名称 System.out.println(user); map.addAttribute("user", user); return "Hello"; } @RequestMapping("/login06") public String login06(@ModelAttribute("user") User user) { // 如果在参数前面加上@ModelAttribute注解,则可以将该参数直接写入request作用域 // 注解中的值就相当于mv.addObjetct 或 map.addAttribute 中的key值 System.out.println(user); return "Hello"; } /** * 两种重定向方式 */ @RequestMapping("/redirect01") public ModelAndView redirect01() { // 页面重定向--使用重定向视图 RedirectView rv = new RedirectView("http://...."); ModelAndView mav = new ModelAndView(rv); return mav; } @RequestMapping("/redirect02") public String redirect02() { // 页面重定向--通过String类型返回值跳转 // redirect:固定写法 return "redirect:http://...."; }
通过前端页面的提交,即可对应不同的操作。
在页面中通过EL表达式打印,ps:作用域的范围和 request 一致
登录信息${requestScope.user}
如果方法中还需要指定一些特殊的入参类型,如HttpServletRequest,HttpServletResponse,HttpSession ,OutputStream,直接在形参中指定即可
@RequestMapping("/login07") public String login09(HttpServletRequest req, HttpServletResponse res, HttpSession session, OutputStream os) throws IOException { System.out.println(req); System.out.println(res); System.out.println(req.getSession()); System.out.println(session); System.out.println(os); System.out.println(res.getOutputStream()); System.out.println(req.getSession().getServletContext()); return "Hello"; }
void返回的方法
/** * void返回类型 */ @RequestMapping("/login07") public void redirect07(User user, HttpServletResponse res) { JSONObject jsonObject = JSONObject.fromObject(user); try { // 转为JSON值 res.setContentType("application/json;charset=utf-8"); PrintWriter pw = res.getWriter(); pw.print(jsonObject); } catch (IOException e) { e.printStackTrace(); } } @RequestMapping("/login08") // 对于SpringMVC中默认情况下几乎所有的返回结果都认为是String, // 如果使用@ResponseBody注解就可以使得最终的返回值不以String类型进行解析 // 而是以特定的格式的输出流进行打印,具体的格式由 <mvc:annotation-driven/> 来决定, // 默认将返回值以json格式输出 @ResponseBody public User login08(User user) { return user; } @RequestMapping("/showImg01") public void showImg(OutputStream os) { String filePath = "C:\\a.png";// 文件路径 Resource resource = new FileSystemResource(filePath); try { // 输入流 InputStream is = resource.getInputStream(); // 输出流(方法中直接注入的参数) // 将输入流的内容拷贝到输出流中 FileCopyUtils.copy(is, os); } catch (IOException e) { e.printStackTrace(); } } @RequestMapping("/showImg02") public void showImg02(HttpServletResponse res) { String filePath = ""; Resource resource = new FileSystemResource(filePath); InputStream is; try { is = resource.getInputStream(); FileCopyUtils.copy(is, res.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } }
@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,
一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,
加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;