把页面中输入的值传递到后台以及后台向前台传递,有以下几种方式

这里以登录为例子,实现打印前端页面的值

1,新建一个控制器,根据不同的请求地址实现不同的请求方式

LoginController.java

  1. @Controller
  2. @RequestMapping("/login")
  3. public class LoginController {
  4.  
  5. }

2,新建不同登录的请求地址,Ajax参数规范和form一致

  1. @RequestMapping("/login01")
  2. public String login01(String userName, String userPwd, String age) {
  3.  
  4. // 在方法中声明和表单中控件name相同的名字的变量,即可完成自动注入
  5. // 在这一过程中也会对一些数据类型进行自动转换,因为从页面传递过来的数据对于服务器而言只有String类型,因此要进行转换才能将其放入对应服务器端的数据类型中
  6. // SpringMVC在底层通过AOP原理来完成类型的自动转换以及参数的自动注入
  7. System.out.println(userName);
  8. System.out.println(userPwd);
  9. System.out.println(age);
  10.  
  11. return "Hello";
  12. }
  13.  
  14. @RequestMapping("/login02")
  15. public String login02(@RequestParam(value = "userName", required = true) String name,
  16. @RequestParam(value = "userPwd", required = true) String pwd,
  17. @RequestParam(value = "age", required = false) String age) {
  18.  
  19. // 在方法中声明和表单中控件name相同的名字的变量,即可完成自动注入
  20. // 在这一过程中也会对一些数据类型进行自动转换,因为从页面传递过来的数据对于服务器而言只有String类型,因此要进行转换才能将其放入对应服务器端的数据类型中
  21. // SpringMVC在底层通过AOP原理来完成类型的自动转换以及参数的自动注入
  22. System.out.println(name);
  23. System.out.println(pwd);
  24. System.out.println(age);
  25.  
  26. return "Hello";
  27. }
  28.  
  29. @RequestMapping("/login03")
  30. public String login03(User user) {
  31.  
  32. // 如果表单中字段比较多,那么可以在服务器端封装一个对象,对象中的属性名和表单中的name属性值一致
  33. // 在Controller方法中直接注入该对象作为参数,表单中的值即可自动传递过来
  34. System.out.println(user);
  35. return "Hello";
  36. }

返回的Hello页面,为 / WEB-INF / Hello.jsp

springMVC-servlet.xml

  1. <!--
  2. 注解扫描器 ,base-package用于指定要扫描的包的路径
  3. 当前配置用来扫描com.niit.controller包及其子包下所有的类,所有含@Controller注解的类就会成为一个控制器类(就有了处理请求和返回响应的能力)
  4. 另外被@Controller注解标记的类也会成为Spring IOC 容器中被管理的一个对象
  5. -->
  6. <context:component-scan base-package="com.stu.controller"></context:component-scan>
  7.  
  8. <!-- 视图解析器 -->
  9. <bean id="viewResolver"
  10. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  11. <!-- 前缀 -->
  12. <property name="prefix" value="/WEB-INF/"></property>
  13. <!-- 后缀 -->
  14. <property name="suffix" value=".jsp"></property>
  15. </bean>
  16.  
  17. <!-- 不拦截静态资源 -->
  18. <mvc:annotation-driven></mvc:annotation-driven>
  19. <mvc:default-servlet-handler />

3,在前端通过form表单提交的方式

login.jsp

  1. <h3>
  2. login01
  3. </h3>
  4. <!-- 提交给/login/login01 进行处理,在控制台打印输入的值 -->
  5. <form method="post"
  6. action="<%=request.getContextPath()%>/login/login01">
  7. 用户名:
  8. <input type="text" name="userName" />
  9. <br />
  10. 密 码:
  11. <input type="text" name="userPwd" />
  12. <br />
  13. 年 龄:
  14. <input type="text" name="age" />
  15. <br />
  16. <button type="submit">
  17. 跳转到login01
  18. </button>
  19. </form>
  20.  
  21. <h3>
  22. login02
  23. </h3>
  24. <!-- 提交给/login/login02 进行处理,在控制台打印输入的值 -->
  25. <form method="post"
  26. action="<%=request.getContextPath()%>/login/login02">
  27. 用户名:
  28. <input type="text" name="userName" />
  29. <br />
  30. 密 码:
  31. <input type="text" name="userPwd" />
  32. <br />
  33. 年 龄:
  34. <input type="text" name="age" />
  35. <br />
  36. <button type="submit">
  37. 跳转到login02
  38. </button>
  39. </form>
  40.  
  41. <h3>
  42. login03
  43. </h3>
  44. <!-- 提交给/login/login03 进行处理,在控制台打印输入的值 -->
  45. <form method="post"
  46. action="<%=request.getContextPath()%>/login/login03">
  47. 用户名:
  48. <input type="text" name="userName" />
  49. <br />
  50. 密 码:
  51. <input type="text" name="userPwd" />
  52. <br />
  53. 年 龄:
  54. <input type="text" name="age" />
  55. <br />
  56. <button type="submit">
  57. 跳转到login03
  58. </button>
  59. </form>

4,新建的User对象

User.java

  1. package com.stu.vo.param;
  2.  
  3. import java.io.Serializable;
  4.  
  5. /**
  6. * 文件名称: com.stu.vo.param.User.java<br/>
  7. * 初始作者: Administrator<br/>
  8. * 创建日期: 2018-2-6<br/>
  9. * 功能说明: 用户对象 <br/>
  10. * =================================================<br/>
  11. * 修改记录:<br/>
  12. * 修改作者 日期 修改内容<br/>
  13. * ================================================<br/>
  14. * Copyright (c) 2010-2011 .All rights reserved.<br/>
  15. */
  16. public class User implements Serializable {
  17.  
  18. private static final long serialVersionUID = 2660672112156513335L;
  19. private String userName;
  20. private String userPwd;
  21. private String age;
  22.  
  23. public String getUserName() {
  24.  
  25. return userName;
  26. }
  27.  
  28. public void setUserName(String userName) {
  29.  
  30. this.userName = userName;
  31. }
  32.  
  33. public String getUserPwd() {
  34.  
  35. return userPwd;
  36. }
  37.  
  38. public void setUserPwd(String userPwd) {
  39.  
  40. this.userPwd = userPwd;
  41. }
  42.  
  43. public String getAge() {
  44.  
  45. return age;
  46. }
  47.  
  48. public void setAge(String age) {
  49.  
  50. this.age = age;
  51. }
  52.  
  53. @Override
  54. public String toString() {
  55.  
  56. return "User [age=" + age + ", userName=" + userName + ", userPwd=" + userPwd + "]";
  57. }
  58.  
  59. }

把值向前端打印 以及 两种重定向方式

继续在LoginController.java中添加代码

  1. @RequestMapping("/login04")
  2. public ModelAndView login04(User user) {
  3.  
  4. // 新建一个ModelAndView对象
  5. ModelAndView mav = new ModelAndView();
  6. mav.addObject("userInfo", user);// 相当于request中的setAttribute方法
  7. mav.setViewName("Hello");// 指定处理的视图名称,这里为Hello.jsp页面
  8.  
  9. return mav;
  10. }
  11.  
  12. @RequestMapping("/login05")
  13. public String login05(ModelMap map, User user) {
  14.  
  15. // 可以通过操作ModelMap直接将模型数据直接写入request作用域中
  16. // 最后再通过返回String类型来指定对应的视图名称
  17.  
  18. System.out.println(user);
  19. map.addAttribute("user", user);
  20. return "Hello";
  21. }
  22.  
  23. @RequestMapping("/login06")
  24. public String login06(@ModelAttribute("user") User user) {
  25.  
  26. // 如果在参数前面加上@ModelAttribute注解,则可以将该参数直接写入request作用域
  27. // 注解中的值就相当于mv.addObjetct 或 map.addAttribute 中的key值
  28.  
  29. System.out.println(user);
  30. return "Hello";
  31. }
  32.  
  33. /**
  34. * 两种重定向方式
  35. */
  36. @RequestMapping("/redirect01")
  37. public ModelAndView redirect01() {
  38.  
  39. // 页面重定向--使用重定向视图
  40. RedirectView rv = new RedirectView("http://....");
  41. ModelAndView mav = new ModelAndView(rv);
  42.  
  43. return mav;
  44. }
  45.  
  46. @RequestMapping("/redirect02")
  47. public String redirect02() {
  48.  
  49. // 页面重定向--通过String类型返回值跳转
  50. // redirect:固定写法
  51.  
  52. return "redirect:http://....";
  53. }

通过前端页面的提交,即可对应不同的操作。

在页面中通过EL表达式打印,ps:作用域的范围和 request 一致

  1. 登录信息${requestScope.user}

如果方法中还需要指定一些特殊的入参类型,如HttpServletRequest,HttpServletResponse,HttpSession ,OutputStream,直接在形参中指定即可

  1. @RequestMapping("/login07")
  2. public String login09(HttpServletRequest req, HttpServletResponse res, HttpSession session, OutputStream os)
  3. throws IOException {
  4.  
  5. System.out.println(req);
  6. System.out.println(res);
  7. System.out.println(req.getSession());
  8. System.out.println(session);
  9. System.out.println(os);
  10. System.out.println(res.getOutputStream());
  11. System.out.println(req.getSession().getServletContext());
  12. return "Hello";
  13. }

void返回的方法

  1. /**
  2. * void返回类型
  3. */
  4. @RequestMapping("/login07")
  5. public void redirect07(User user, HttpServletResponse res) {
  6.  
  7. JSONObject jsonObject = JSONObject.fromObject(user);
  8. try {
  9. // 转为JSON值
  10. res.setContentType("application/json;charset=utf-8");
  11. PrintWriter pw = res.getWriter();
  12. pw.print(jsonObject);
  13. } catch (IOException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17.  
  18. @RequestMapping("/login08")
  19. // 对于SpringMVC中默认情况下几乎所有的返回结果都认为是String,
  20. // 如果使用@ResponseBody注解就可以使得最终的返回值不以String类型进行解析
  21. // 而是以特定的格式的输出流进行打印,具体的格式由 <mvc:annotation-driven/> 来决定,
  22. // 默认将返回值以json格式输出
  23. @ResponseBody
  24. public User login08(User user) {
  25.  
  26. return user;
  27.  
  28. }
  29.  
  30. @RequestMapping("/showImg01")
  31. public void showImg(OutputStream os) {
  32.  
  33. String filePath = "C:\\a.png";// 文件路径
  34. Resource resource = new FileSystemResource(filePath);
  35. try {
  36. // 输入流
  37. InputStream is = resource.getInputStream();
  38. // 输出流(方法中直接注入的参数)
  39. // 将输入流的内容拷贝到输出流中
  40. FileCopyUtils.copy(is, os);
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. @RequestMapping("/showImg02")
  47. public void showImg02(HttpServletResponse res) {
  48.  
  49. String filePath = "";
  50. Resource resource = new FileSystemResource(filePath);
  51. InputStream is;
  52. try {
  53. is = resource.getInputStream();
  54. FileCopyUtils.copy(is, res.getOutputStream());
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58.  
  59. }

@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,

  一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,

  加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。

作用:
  该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:
  返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

[SpringMVC-值传递] 初始SpringMVC--SpringMVC中的值传递的更多相关文章

  1. VB6中的引用传递 与 VB.NET中的引用传递的区别

    首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...

  2. 如何获取select中的value、text、index相关值 && 如何获取单选框中radio值 && 触发事件 && radio 默认选中

    如何获取select中的value.text.index相关值 select还是比较常用的一个标签,如何获取其中的内容呢? 如下所示: <select id="select" ...

  3. jsp用el表达式获取后台传来的值,或者获取session中的值

    <script type="text/javascript"> var usernameC = ${sessionScope.SESSION_USER_PROFILE. ...

  4. 为什么说Java中只有值传递

    本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...

  5. 为什么说Java中只有值传递(转载)

    出处:https://www.hollischuang.com/archives/2275 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同, ...

  6. 为什么说Java中只有值传递----说服自己

    在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本文. 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递.如果是个引用,就 ...

  7. 为什么说 Java 中只有值传递?

    对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...

  8. 为什么Java中只有值传递

    原文链接:https://www.cnblogs.com/wchxj/p/8729503.html 在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本 ...

  9. 转:为什么说Java中只有值传递

    原文:https://www.cnblogs.com/wchxj/p/8729503.html 错误理解 在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好 ...

  10. Eclipse RCP 中创建自己定义首选项,并能读取首选项中的值

    Eclipse RCP的插件中若想自定义首选项须要扩展扩展点: org.eclipse.core.runtime.preferences //该扩展点用于初始化首选项中的值 org.eclipse.u ...

随机推荐

  1. CentOS7 安装redis4:

      phpredis-4.0.12.tar.gz:下载:wget http://download.redis.io/releases/redis-4.0.12.tar.gz   $ tar -zxvf ...

  2. Linux系统常见内核问题修复(转发)

    Linux系统常见内核问题修复(转发) 常见Linux系统破坏修复 http://blog.csdn.net/jmilk/article/details/49619587

  3. python记录_day12 生成器

    什么是生成器? 生成器的实质就是迭代器,我们能够从生成器中一个一的拿值 python中获取生成器的方式有三种: 1.通过生成器函数 2.通过生成器表达式 3.通过数据转换也可以获取生成器(某些对象执行 ...

  4. Docker实现原理之Namespace,CGroup

    找了几篇这方面的文章,写的还不错,跟大家共享:DOCKER基础技术:LINUX NAMESPACE(上)DOCKER基础技术:LINUX NAMESPACE(下)DOCKER基础技术:LINUX CG ...

  5. Spring Boot集成Thymeleaf

    Thymeleaf是一个java类库,是一个xml/xhtml/html5的模板引擎,可以作为mvc的web应用的view层.Thymeleaf提供了额外的模块与Spring MVC集成,所以我们可以 ...

  6. java动态代理机制

    首先了解代理设计模式,其思想是为其他对象提供一种代理以控制对这个对象的访问. java动态代理就是遵循这种思想,spring中的AOP实现原理就是java的动态代理. 在java的动态代理机制中,有两 ...

  7. Python 3.X 要使用urllib.request 来抓取网络资源。转

    Python 3.X 要使用urllib.request 来抓取网络资源. 最简单的方式: #coding=utf-8 import urllib.request response = urllib. ...

  8. php + mysql 分布式事务

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元: 事务应该具有4个属性:原子性.一致性.隔离性.持续性 原子性(atomicity).一个事务是一个不可分割的工作单 ...

  9. 2017-3-31/socket

    1. 讲讲你对套接字编程的理解,它的协议是如何的? socket通常称为"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通过套接字向网络发出请求或应答网络请求. 服 ...

  10. 牛客第二场A-run

    链接:https://www.nowcoder.com/acm/contest/140/A 来源:牛客网 White Cloud is exercising in the playground. Wh ...