springmvc笔记
复习:
mvc:一种软件的设计思想,设计模式 ,
m:model
v: 视图 (jsp freemark jsf themeleaf(html)->springboot )
c:
前后端分离 : 写前端(js: node.js angular.js vue.js)
后端:java python .net
Springmvc:(ssm 微服务)
@Controller: spring框架的注解(类上,被扫描了控制器)
<context: 全局
@RequestMapping: spring框架中的web块的springmvc子块的注解
<mvc: 子块
自定义转换器:
Convertor《当前类型,目标类型》
配置: 配置转换器 使用springmvc提供工具类 ConversionServiceFactoryBea
课程目标
1:返回值的处理
2:文件的上传和下载
3: 生成验证码
返回值处理
1.String 作为内容输出
如果方法声明了注解 @ResponseBody ,将内容或对象作为 HTTP 响应正文返回,并调 用适合 HttpMessageConverter 的 Adapter 转换对象,写入输出流。这时的 String 不再是路径而是内容。
@RequestMapping("/r4")
@ResponseBody
public String return4() {
//返回值作为HTTP 响应正文返回
return “返回值为String”;
}
发现中文件出现乱码,讲解完返回值类型再去解决springmvc返回值String作为响应体中文件乱码的问题。
解决乱码的方法:
1.单一方法修改
2.统一修改
在springmvc.xml 加入
mvc:annotation-driven
<mvc:message-converters register-defaults=“true”>
</mvc:message-converters>
</mvc:annotation-driven>
2:返回值为任意类型
1.返回类型为自定义类型
Product 本身,而非视图, Spring 会选择一个合适的方式解析对象,默认是 json ,需手动导入jackjson相关的jar包。
否则报错:No converter found for return value of type
@RequestMapping("/r8")
@ResponseBody
public Dog return8(){
Dog dog=new Dog(“tomer”,2);
return dog;
}
2.返回值为基本数据类型
如果确实需要直接将基本数据类型返回,则可以使用注解 @ReponseBody。需手动导入jackjson相关的jar包。
@RequestMapping("/r9")
@ResponseBody
public Integer return9(){
return 9527;
}
3.返回值为List集合类型
4.返回值为Map集合类型
Springmvc的文件上传
1: 导入工具包:
commons-fileupload.jar
commons-io.jar
2: 配置springmvc上传文件的工具springmvc.xml
<!-- 处理文件上传的工具类 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 通过属性来规范上传文件的信息 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 上传文件的最大字节数 -->
<property name="maxUploadSize" value="5000000"></property>
</bean>
3: 设置表单的提交方式
设置表单的提交方式method=”post” enctype=”multipart/form-data”:表单中的数据已二进制的字节的方式传入到服务器
文件:
文件:
4: 书写上传代码:
springmvc提供了一个工具类 MultipartFile 处理文件上传的
/*
* MultipartFile 包含了上传文件的信息
* 开发: 文件服务器(静态资源) 图片 文本文档…
*/
@RequestMapping("/upload")
public String upload(@RequestParam(“myFiles”)MultipartFile[] myFiles) throws IllegalStateException, IOException {
String path = “C:\Users\tan\Desktop\img”;
if(myFiles!=null&&myFiles.length>0) {
for (MultipartFile multipartFile : myFiles) {
if(multipartFile.getSize()>0) {
String fileName = multipartFile.getOriginalFilename();
File file = new File(new File(path),fileName);
multipartFile.transferTo(file);
}
}
}
else {
System.out.println(“没有文件上传!!”);
}
return “success”;
}
Springmvc异步图片上传并回显
1.Upload.jsp
2.FileUploadController
@RequestMapping("/uploadAndShow")
@ResponseBody
public String uploadAndShow(@RequestParam(“upload”)MultipartFile myFiles) throws IllegalStateException, IOException {
String path = “C:\Users\tan\Desktop\img”;
String fileName = myFiles.getOriginalFilename();
File file = new File(new File(path),fileName);
myFiles.transferTo(file);
return fileName;
}
3.设置映射路径到本地目录文件夹
文件下载
1、前端页面
下载文件
2、controller下载代码
@Controller
public class DownloadController {
@RequestMapping("/download")
public ResponseEntity<byte[]> download(String fileName) throws IOException {
HttpHeaders headers = new HttpHeaders();
File file = new File(new File(“C:\Users\tan\Desktop\img”),fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", new String(fileName.getBytes("UTF-8"),"ISO-8859-1"));
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers, HttpStatus.OK);
}
}
生成验证码
编写验证码生成控制器
public void getImage(HttpServletRequest request, HttpServletResponse response,HttpSession session)
throws ServletException, IOException {
// 1 高和宽
int height = 30;
int width = 60;
String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
Random random = new Random();
// 2 创建一个图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 3 获得画板
Graphics g = image.getGraphics();
// 4 填充一个矩形
// * 设置颜色
g.setColor(Color.BLACK);
g.fillRect(0, 0, width, height);
g.setColor(Color.WHITE);
g.fillRect(1, 1, width - 2, height - 2);
// * 设置字体
g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 25));
String code = "";
// 5 写随机字
for (int i = 0; i < 4; i++) {
// 设置颜色--随机数
g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
// 获得随机字
int index = random.nextInt(data.length());
String str = data.substring(index, index + 1);
code+=str;
// 写入
g.drawString(str, width / 6 * (i + 1), 20);
}
// 6 干扰线
// for (int i = 0; i < 3; i++) {
// // 设置颜色–随机数
// g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
// // 随机绘制先
// g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
// // 随机点
// g.drawOval(random.nextInt(width), random.nextInt(height), 2, 2);
// }
session.setAttribute("verifyCode", code);
// end 将图片响应给浏览器
ImageIO.write(image, "jpg", response.getOutputStream());
}