SpringMVC框架个人笔记之响应数据、文件上传
对应工程为springmvc-response,springmvc-file-upload,springmvc-file-upload-crossweb
1.返回值分类
1.1 字符串
//response.jsp
<body><a href="user/testString">testString</a>
</body>//Controller类
@Controller
@RequestMapping("/user")
public class userController {@RequestMapping("/testString")public String testString(Model model) {System.out.println("testString方法执行了");//模拟从数据库中获取user对象User user = new User();user.setUsername("佳琪");user.setPassword("123");user.setAge(45);model.addAttribute("user" ,user);return "success";}
}//success.jsp
<body><h3>执行成功</h3>${user}${user.username}${user.password}
</body>
1.2 void类型
<a href="user/testVoid">testString</a><br>@RequestMapping("/testVoid")public void testVoid(Model model) {System.out.println("testVoid方法执行了");}
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。默认会跳转到@RequestMapping(/testVoid") testVoid.jsp的页面。
但是我们可以使用请求转发或者重定向跳转到指定的页面。
请求转发如下:
@RequestMapping("/testVoid")public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("请求转发或者重定向");// 请求转发request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);return;}
重定向:
@RequestMapping("/testVoid")public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("请求转发或者重定向");// 重定向response.sendRedirect(request.getContextPath() + "/index.jsp");return;}
直接响应:
@RequestMapping("/testVoid")public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("请求转发或者重定向");// 直接响应数据,前面两句是避免中文乱码response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");response.getWriter().print("你好");return;}
1.3返回值是ModelAndView对象
ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图
<a href="user/testModelAndView">testModelAndView</a><br>@RequestMapping("/testModelAndView")public ModelAndView testModelAndView() {System.out.println("testModelAndView方法执行了");
// 创建ModelAndView对象ModelAndView mv = new ModelAndView();//模拟从数据库中获取user对象User user = new User();user.setUsername("里佳琪");user.setPassword("123456");user.setAge(35);
// 把user对象存储到mv对象中,也会吧user对象存入到request对象中mv.addObject("user", user);// 跳转到指定的页面mv.setViewName("success");return mv;}
1.4 SpringMVC框架提供的转发和重定向
使用关键字forward请求转发和redirect重定向
如下:
@RequestMapping("/testForwardOrRedirect")public String testForwardOrRedirect() {System.out.println("testForwardOrRedirect方法执行了");//return "forward:/WEB-INF/pages/success.jsp";return "redirect:/index.jsp";}
1.5 ResponseBody响应json数据
1.5.1 使用@RequestBody获取请求体数据
在webapp下新建一个js文件夹,导入js库。webapp存在静态文件的,动态文件放在WEB-INF下,同时外界不能访问WEB-INF下的文件
<script src="js/jquery-1.11.0.min.js"></script>
<script>$(function () {$("#btn").click(function () {alert("hello")$.ajax({type:"post",url:"user/testAjax",contentType:"application/json;charset=UTF-8",data:'{"username":"smm","password":"123","age":25}',dataType:"json",success:function (data) {alert(data)alert(data.username);alert(data.password);alert(data.age);}})})})
</script>
<body>
<button id="btn">发送ajax的请求</button>
</body>//testAjax方法@RequestMapping("/testAjax")public void testAjax(@RequestBody String body) {System.out.println("testAjax方法执行了");System.out.println(body);}
DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置:
<!-- 设置静态资源不过滤 --><mvc:resources location="/css/" mapping="/css/**"/><mvc:resources location="/images/" mapping="/images/**"/><mvc:resources location="/js/" mapping="/js/**"/>
还有一种更简单的方法,不用下载包,也不用配置springmvc.xml,直接可用。
<script type="text/javascript"src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
1.5.2 jackson的jar包
json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version></dependency>
1.5.3 使用@RequestBody注解把json的字符串转换成JavaBean的对象
意思就是把请求体的json内容给封装到方法里面的user对象去。
@RequestMapping("/testAjax")public void testAjax(@RequestBody User user) {System.out.println("testAjax方法执行了");//ajax请求,传的是json,后端给封装到user对象中System.out.println(user);}
与1.5.1的区别
public void testAjax(@RequestBody String body) {
1.5.4 使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应
修改方法void为User类型,并给注解@ResponseBody把JavaBean对象转换成json字符串。
@RequestMapping("/testAjax")public @ResponseBody User testAjax(@RequestBody User user) {System.out.println("testAjax方法执行了");//ajax请求,传的是json,后端给封装到user对象中System.out.println(user);//同时修改请求过来的数据user.setUsername("李嘉琪");user.setAge(65);return user;}
控制台输出
浏览器弹窗输出:
2.上传文件
2.1 非框架文件上传的必要前提
form
表单的enctype
取值必须是:multipart/form-data
(默认值是:application/x-www-form-urlencoded
)。enctype
:是表单请求正文的类型method
属性取值必须是post
- 提供一个文件选择域
<input type=”file” />
环境搭建:
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>
//index.xml页面
<form action="user/fileUpLoad1" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="upload"/><br/><input type="submit" value="上传文件"/>
</form>
控制器类:
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/fileUpLoad1")public String fileUpLoad1(HttpServletRequest request) throws Exception {System.out.println("fileUpLoad1文件上传...");// 使用fileupload组建完成文件上传,先获取到要上传的文件位置String path = request.getSession().getServletContext().getRealPath("/uploads/");// 创建File对象,一会向该路径下上传文件File file = new File(path);// 判断路径是否存在,如果不存在,创建该路径if (!file.exists()) {file.mkdirs();}// 创建磁盘文件项工厂DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload fileUpload = new ServletFileUpload(factory);// 解析request对象List<FileItem> items = fileUpload.parseRequest(request);// 遍历for (FileItem fileItem : items) {// 判断文件项是普通字段,还是上传的文件if (fileItem.isFormField()) {// 说明是普通字段} else {// 说明是上传文件项// 获取到上传文件的名称String filename = fileItem.getName();//把上传文件的名称设置唯一值uuidString uuid = UUID.randomUUID().toString().replace("-", "");filename=uuid+"_"+filename;// 上传文件fileItem.write(new File(path, filename));// 删除临时文件fileItem.delete();}}return "success";}
点击上传一个图片,在下面工程目录中可以找到
2.2 SpringMVC传统方式文件上传
传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。
SpringMVC框架提供了MultipartFile
对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同。
在主配置文件解析器对象:
<!-- 配置文件解析器对象,要求id名称必须是multipartResolver 10485760就是10*1024*1024,10M--><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10485760"/></bean>
控制类代码:
@RequestMapping("/fileUpLoad2")public String fileUpLoad2(HttpServletRequest request, MultipartFile upload) throws Exception {System.out.println("fileUpLoad2文件上传...");// 使用fileupload组建完成文件上传,先获取到要上传的文件位置String path = request.getSession().getServletContext().getRealPath("/uploads/");// 创建File对象,一会向该路径下上传文件File file = new File(path);// 判断路径是否存在,如果不存在,创建该路径if (!file.exists()) {file.mkdirs();}// 说明是上传文件项// 获取到上传文件的名称String filename = upload.getOriginalFilename();//把上传文件的名称设置唯一值uuidString uuid = UUID.randomUUID().toString().replace("-", "");filename=uuid+"_"+filename;// 上传文件upload.transferTo(new File(path,filename));return "success";}
2.3 SpringMVC跨服务器方式文件上传
在实际开发中,我们会有很多处理不同功能的服务器。例如:应用服务器:负责部署我们的应用。数据库服务器:运行我们的数据库。缓存和消息服务器:负责处理大并发访问的缓存和消息。文件服务器:负责存储用户上传文件的服务器。
导入开发需要的jar包:
<dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-core</artifactId><version>1.18.1</version></dependency><dependency><groupId>com.sun.jersey</groupId><artifactId>jersey-client</artifactId><version>1.18.1</version></dependency>
新建一个module,springmvc-file-upload-crossweb,用来存文件,他的pom.xml可以不用配置,纯粹用来存放文件用的,并新建一个uploads文件夹,传过来的文件放这里。
给这个module新配置一个tomcat,
但是有个坑,tomcat需要做个改动,不然后面传文件会报错500。在tomcat文件夹的conf下的web.xml把只读关闭,具体参考这篇博客:
<!--新增部分--><init-param><param-name>readonly</param-name><param-value>false</param-value></init-param>
回到原来的工程,加一个页面:
<h3>SpringMVC跨服务器的文件上传</h3>
<form action="user/fileUpLoad3" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="upload"/><br/><input type="submit" value="上传文件"/>
</form>
编写后端代码:
@RequestMapping("/fileUpLoad3")public String fileUpLoad3(MultipartFile upload) throws Exception {System.out.println("SpringMVC跨服务器方式的文件上传...");// 定义图片服务器的请求路径,springmvc-file-upload-crossweb是tomcat的deployment配置里面的,不是文件夹String path = "http://localhost:9090/springmvc-file-upload-crossweb/uploads/";// 获取到上传文件的名称String filename = upload.getOriginalFilename();String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();// 把文件的名称唯一化filename = uuid + "_" + filename;// 向图片服务器上传文件// 创建客户端对象Client client = Client.create();// 连接图片服务器WebResource webResource = client.resource(path + filename);// 上传文件webResource.put(upload.getBytes());return "success";}
输出:
SpringMVC框架个人笔记之响应数据、文件上传相关推荐
- SSM之SpringMVC 04 —— Ajax、拦截器、文件上传和下载
系列文章 SSM之SpringMVC 01 -- SpringMVC原理及概念.Hello SpringMVC 注解版和配置版 SSM之SpringMVC 02 -- Controller和RestF ...
- 【SpringMVC笔记】拦截器 + 文件上传下载
拦截器 + 文件上传下载 拦截器(interceptor) 自定义拦截器 验证用户是否登录 (认证用户) 没有拦截器 配置拦截器 文件的上传 文件输出流进行文件上传 file.Transto 进行文件 ...
- SSM框架之Spring MVC(三)http响应、文件上传
一.响应数据和结果视图 1.1 返回值分类 1.1.1 字符串 创建实体类和controller类 实体类User package cn.xiaomifeng1010.domain;import ja ...
- 【狂神说】JavaWeb笔记整理 | SMBMS项目 | 文件上传和邮件发送
目录 JavaWeb 1.基本概念 1.1 概念 1.2 web应用程序: 1.3 静态web 1.4 动态web 2.web服务器 2.1 技术讲解 2.2 web 服务器 3. Tomcat 3. ...
- Spring Boot基础学习笔记14:实现文件上传功能
文章目录 零.学习目标 一.文件上传概述 二.实现文件上传功能 (一)创建Spring Boot项目 (二)整合Bootstrap (三)编写文件上传页面 (四)编写项目配置文件 (五)编写文件上传控 ...
- 怎么把数据文件上传云服务器,怎么把数据上传导云服务器
怎么把数据上传导云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装数 ...
- Jmeter学习笔记(三)文件上传
本次测试的是文件上传接口,步骤如下: 1.通过fiddler抓包,获取要上传文件请求及参数: 2.把抓取的参数和请求地址添加到http请求中,参数值只取有效: 3.在文件上传下,添加要上传文件的位置. ...
- 怎么把数据文件上传云服务器,如何将数据上传到云服务器上
如何将数据上传到云服务器上 内容精选 换一换 您可以通过导出SQL语句的方式将数据库备份到弹性云服务器上.弹性云服务器不限制存放哪些数据,但是数据必须符合国家法律法规.您可以在弹性云服务器上存放数据库 ...
- 怎么把数据文件上传云服务器,怎样把数据上传到云服务器
怎样把数据上传到云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装数 ...
最新文章
- thinkphp概述
- WINCE6.0文件系统及存储管理器
- mysql内置函数,在mysql里面利用str_to_date()把字符串转换为日期格式
- 非常有用的并发控制-倒计时器CountDownLatc
- xcode w情ndows版,xcode Windows版安装使用介绍
- 用python画出圣诞树_【闲趣】如何用python画出一棵圣诞树
- Scala:输入输出
- 计算机无法连接蓝牙键盘,终于理会电脑无法识别蓝牙鼠标键盘
- 虚拟机及CentOS7各个版本镜像下载地址
- Java源码-猜数字小游戏(Swing编程版)
- 手把手带你从零开始完整开发经典游戏【俄罗斯方块】,全部逻辑只用不到200行代码。
- 深入Unreal蓝图开发:自定义蓝图节点(中)
- 开发者必读的十大经典书籍
- 面试官问:为什么 Java 线程没有Running状态?我懵了
- 一直无缝滚动的轮播图模板
- Exercise11-Matplotlib
- 运行时异常与一般异常有何异同
- 教师职称考计算机模块,2015年教师职称计算机考试模块
- 使用PCA9685控制多个舵机
- 利用python爬取网易云心爱歌单