20201130 王维
学习总结
1 响应数据和结果视图
1.1 返回值分类
1.1.1 字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址
1.1.2 void
道 Servlet 原始 API 可以作为控制器中方法的参数,我们可以使用 request/response进行重定向以及请求转发操作。
1.1.3 ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
//添加键值对
modelAndView.addObject("username", "张三");
//设置视图名称
modelAndView.setViewName("success");
注意: 我们在页面上获取值使用的是 requestScope.username 取的,所以返回 ModelAndView 类型时,浏 览器跳转只能是请求转发。
也可以在创建ModelAndView对象是传入视图名称。
1.2 转发和重定向
1.2.1 forward 转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。
需要注意的是,如果用了 forward: 则路径必须写成实际视图 url,不能写逻辑视图。 它相当于 request.getRequestDispatcher("url").forward(request,response) 。使用请求转 发,既可以转发到 jsp ,也可以转发到其他的控制器方法。
1.2.2 Redirect 重定向
contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:
它相当于 response.sendRedirect(url) 。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能 写在 WEB-INF 目录中,否则无法找到。
1.3 ResponseBody 响应 json 数据
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数 据如:json,xml 等,通过 Response 响应给客户端
需要注意springMVC默认使用的是 MappingJackson2HttpMessageConverter 对 json 数据进行转换,所以需要加入 jackson 的包.而且需要注意spring5.0需要的是 Jackson 2.9 and higher
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
1.4 RestController
RestController 相当于将 ResponseBody 注解在一个注解有 Controller 的类上。这时,类中所有返 回的字符串都会解析为一个串返回,而不经过视图解析器,也就是说返回的字符串不再是一个逻辑视图 了。
2 SpringMVC 实现文件上传
- form 表单的 enctype 取值必须是: multipart/form-data (默认值是: application/x-www-formurlencoded ) enctype:是表单请求正文的类型
- method 属性取值必须是 Post
- 提供一个文件选择域
<input type=”file” />
2.1 springmvc 传统方式的文件上传
2.1.1 第一步:导入依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
2.1.2 第二步:编写 jsp 页面
<form action="fileUpload" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picname"/><br/>
图片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value="上传"/>
</form>
2.1.3 第三步:编写控制器
package com.itlaobing.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Controller
public class FileUploadController {
@RequestMapping("fileUpload")
public String testResponseJson(String picname , MultipartFile uploadFile , HttpServletRequest request) throws IOException {
//定义文件名
String filename = "";
//获取原始文件名
String uploadFileName = uploadFile.getOriginalFilename();
//截取文件扩展名
String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
//把文件加上随机数,防止文件名重复被覆盖
String uuid = UUID.randomUUID().toString().replace("-" , "").toUpperCase();
//判断是否输入了文件名
if (!StringUtils.isEmpty(picname)) {
//拼接新的文件名称
filename = uuid + "_" + picname + "." + extendName;
} else {
filename = uuid + "_" + uploadFileName;
}
System.out.println(filename);
//获取文件路径
ServletContext context = request.getServletContext();
String basePath = context.getRealPath("/static/uploads");
//解决同一文件夹或只能怪文件过多问题
String dataPath = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//判断文件夹是否存在
File file = new File(basePath + "/" + dataPath);
if (!file.exists()) {
file.mkdirs();
}
//使用MulitpartFile 接口中的方法,把上传的文件写入到指定位置
uploadFile.transferTo(new File(file , filename));
return "success";
}
}
2.1.4 第四步:配置文件解析器
<!-- 配置文件解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB-->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
注意: 文件上传的解析器 id 是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其 他字段也将无法绑定)
2.2 springmvc 跨服务器方式的文件上传
3 SpringMVC 中的异常处理
4 SpringMVC 中的拦截器
心得体会
springmvc的学习今天结束了,至此,ssm框架的内容基本学习完毕,接着就是整合了,然后开发项目,对所学知识进行熟练和实际运用。
今天的内容看着不是那种多的不行那种,但是练习起来比较容易出现差错,练习起来比较的缓慢,这也暗示着后面实际使用时需要多多注意,不然很容易出现问题。
近期评论