[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等)使用;
[SpringMVC-值传递] 初始SpringMVC--SpringMVC中的值传递的更多相关文章
- VB6中的引用传递 与 VB.NET中的引用传递的区别
首先注意一点,在VB6中缺省参数传递的方式是:引用传递,而在VB.NET中缺省参数传递的方式是:值传递. 然后我们看下面VB6中的引用传递与VB.NET中的引用传递的对比. VB6中的引用传递 Pri ...
- 如何获取select中的value、text、index相关值 && 如何获取单选框中radio值 && 触发事件 && radio 默认选中
如何获取select中的value.text.index相关值 select还是比较常用的一个标签,如何获取其中的内容呢? 如下所示: <select id="select" ...
- jsp用el表达式获取后台传来的值,或者获取session中的值
<script type="text/javascript"> var usernameC = ${sessionScope.SESSION_USER_PROFILE. ...
- 为什么说Java中只有值传递
本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...
- 为什么说Java中只有值传递(转载)
出处:https://www.hollischuang.com/archives/2275 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同, ...
- 为什么说Java中只有值传递----说服自己
在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本文. 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递.如果是个引用,就 ...
- 为什么说 Java 中只有值传递?
对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...
- 为什么Java中只有值传递
原文链接:https://www.cnblogs.com/wchxj/p/8729503.html 在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本 ...
- 转:为什么说Java中只有值传递
原文:https://www.cnblogs.com/wchxj/p/8729503.html 错误理解 在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好 ...
- Eclipse RCP 中创建自己定义首选项,并能读取首选项中的值
Eclipse RCP的插件中若想自定义首选项须要扩展扩展点: org.eclipse.core.runtime.preferences //该扩展点用于初始化首选项中的值 org.eclipse.u ...
随机推荐
- 2-SET 前缀优化建图
1, Duff in Mafia CodeForces - 587D 2, Ants CodeForces - 1007D
- Linux下查看相应端口的进程
1)查找被占用的端口:netstat -tln | grep 7777 2)查看被占用端口的PID:lsof -i:7777 3)禁用使用kill -9 PID来禁用端口进程
- Python中单线程、多线程和多进程的效率对比实验
GIL机制导致如下结果: Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)python多线程适合io操作密集型的任务(如sock ...
- 78. Subsets C++回溯法
本题还是基本的回溯法.就是回溯函数的参数选择上要花点心思! class Solution { public: void backTrack(vector<int> ans, vector& ...
- python中RabbitMQ的使用(路由键模糊匹配)
路由键模糊匹配 使用正则表达式进行匹配.其中“#”表示所有.全部的意思:“*”只匹配到一个词. 匹配规则: 路由键:routings = [ 'happy.work', 'happy.life' , ...
- 1.Liunx 文件管理
文件管理命令 1.基本命令:ls .cd .pwd .man 2.文件操作:touch . cp . rm . mv .ln . mkdir . rmdir 3.文件查看:cat .more .les ...
- ISO/OSI七层网络参考模型、TCP/IP四层网络模型和教学五层网络模型
一.说明 直接的原因是昨晚<计算机网络(自顶向下方法)>到货了,以为能讲得有些不一样,但看完整本也就是老调地讲过来讲应用层.传输层.网络层.网络接口层.感觉比之谢希仁的<计算机网络& ...
- Tomcat指定JDK路径(Linux+Windows)
当系统有多套JDK,不方便在系统配统一的JAVA_HOME时,我们可能想给tomcat指定JDK路径. 1.Linux下Tomcat指定JDK路径 找到$CATALINE_HOME/bin/catal ...
- 消费Restful的web服务(三)
构架工程 创建一个springboot工程,去消费RESTFUL的服务.这个服务是 http:///gturnquist-quoters.cfapps.io/api/random ,它会随机返回Jso ...
- 微信支付 php兼容问题
总结: php7 已删除 HTTP_RAW_POST_DATA 获取时需要file_get_contents("php://input"); 下面的是兼容方法. //存储微信的回 ...