1.转发:
方式一:使用传统的方法转发:
@Controller
@RequestMapping("/mvc")
public class MVCController {
@RequestMapping("/springmvcA")
public void springmvcA(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("springmvcA");
request.getRequestDispatcher("/mvc/springmvcB")
.forward(request,response);
}
@RequestMapping("/springmvcB")
public String springmvcB(){
System.out.println("springmvcB");
return "springmvc";
}
}
方式二:SpringMVC的转发:
关键字:forward
//@RequestMapping("/springmvcA")
public String springmvcA_1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("springmvcA--转发开始");
//关键字转发: forward:/
return "forward:/mvc/springmvcB";
}
//@RequestMapping("/springmvcB")
public String springmvcB_1(){
System.out.println("springmvcB");
return "springmvc";
}
2.重定向:
传统方式:
@RequestMapping("/springmvcA")
public void springmvcA_2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("springmvcA--重定向开始");
// 必须添加上下文路径
response.sendRedirect(request.getContextPath()+"/mvc/springmvcB");
}
@RequestMapping("/springmvcB")
public String springmvcB_2(){
System.out.println("springmvcB");
return "springmvc";
}
关键字方式:
@RequestMapping("/springmvcA")
public String springmvcA_3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("springmvcA--重定向开始");
//redirect:/关键字 自动添加了上下文路径
return "redirect:/mvc/springmvcB";
}
@RequestMapping("/springmvcB")
public String springmvcB_3(){
System.out.println("springmvcB");
return "springmvc";
}
小结:
1. springMVC遇到关键字redirect 或者 forward时,则默认开启重定向和转发操作,
要求返回值类型是String
说明: 如果跳转首页 通过IndexController配置 比较繁琐. 所以SpringMVC通过视图控制器 跳转首页.
框架分析:
Spring: 内部包含了SpringMVC框架 所以可以无缝集成.
父子关系: Spring父级-SpringMVC子级.
调用规则:
使用对象: 原来从Spring容器中获取的对象.
使用mvc标签: 默认规则启用子级容器SpringMVC,只要mvc容器启动 则以后的Controller只能从springMVC容器中获取.
问题: 通过包扫描 将Controller的对象都交给Spring管理, 如果想要代码正确,应该将Controller对象交给SpringMVC容器管理.
解决方案: 开启SpringMVC注解
查询业务: GET类型
删除业务:DELETE类型
新增业务:POST类型
修改业务:PUT类型
文件下载放在公共路径还是服务器
改变页面跳转默认位置
在IndexController里就体现到了
//@RequestMapping("/")
public String index(){
return "index";
}
开启SpringMVC容器 现在由SpringMVC容器管理
1.准备file页面
Title
我是文件下载
下载文件
2.文件实现类
@GetMapping("/getFile")
public ResponseEntity getFile() throws IOException {
//获取文件下载路径
String filePath = "E:/atguigu/课堂资料/张梦迪/张梦迪/苹果1.mp4";
//读取文件
InputStream inputStream = new FileInputStream(filePath);
//3.准备响应对象
// inputString.avaiable() 获取文件可用的字节长度,适用于小型文件,
// 大文件使用buffer缓冲流做
byte[] bytes = new byte[inputStream.available()];
//4.将数据保存到数组中
inputStream.read(bytes);
//5.准备响应头信息
HttpHeaders httpHeaders = new HttpHeaders();
//6.将字符串转化为ISO-8859-1
// attachment:附件形式 filename文件名称
String filename = new String("苹果1.mp4".getBytes("UTF-8"),"ISO-8859-1");
httpHeaders.add("Content-Disposition","attachment;filename="+filename);
//参数1:读取的字节数组 参数2: 添加响应头,告知下载文件 参数3:响应状态:200
return new ResponseEntity<>(bytes,httpHeaders, HttpStatus.OK);
}
1.添加jar包
commons-fileupload
commons-fileupload
1.3.1
2.配置文件上传视图解析器
设置最大上传量 ,单位是byte
3.file页面设置
1.file.html
2.实现
@PostMapping("/uploadFile2")
public String uploadFile2(MultipartFile file) throws IOException {
//1.定义文件的根目录信息
String baseDir = "E:/atguigu/课堂资料/张梦迪/";
//2.要求 按照时间yyyy/mm/dd的目录保存数据
String datePath = new SimpleDateFormat("/yyyy/mm/dd/").format(new Date());
//3.提前准备目录
String fileDirPath = baseDir +datePath;
File fileDir = new File(fileDirPath);
if (!fileDir.exists()){
//创建多级目录
fileDir.mkdirs();
}
//4.为了防止文件重名 ,我们使用UUID
String uuid = UUID.randomUUID().toString().replace("-","");
//5.获取文件类型 file.getOriginalFilename().lastIndexOf(".") 找到 . 的位置, 从后往前找 根据 . 来截取
String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String newFileName = uuid +fileType;
//6.拼接文件的全路径
File newFile = new File(fileDirPath + newFileName);
//7.文件上传
file.transferTo(newFile);
return "file_success";
}
@GetMapping("/removeFile")
public String removeFile(String fileName){
//1.制定根目录
String baseDir = "E:/atguigu/课堂资料/张梦迪/";
//2.拼接完整路径
String fullPath = baseDir + fileName;
//3.封装为对象
File file = new File(fullPath);
if (file.exists()){
if (file.delete()){
System.out.println("删除成功");
}
else {
System.out.println("删除文件失败");
}
{
System.out.println("文件不存在");
}
}
return "file_success";
}
过滤器是JavaWeb 核心组件之一
Servlet
Filter
Listener
过滤器作用:
当用户访问Servlet时 首先会经过过滤器,如果不放行,则不能访问资源.
什么场景使用过滤器:
校验用户登录的token
处理字符串乱码问题.
过滤器一般拦截的是请求 不能直接干预业务的执行
1.创建拦截器的页面
我是拦截器的测试
获取服务器数据信息
2.创建拦截器实现类
package com.liu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/interceptor")
public class interceptorController {
@RequestMapping("/getMsg")
public String getMsg(){
System.out.println("业务调用成功");
return "interceptor";
}
}
3.自定义拦截器 ,包装
HandlerInterceptor
package com.liu.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//SpringMVC调用流程 处理器真正的执行业务方法 Controller -Service -Dao
public class MyInterceptor1 implements HandlerInterceptor {
//true: 表示放行 业务方法可以正常执行
//false: 表示拦截 +配合重定向使用
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("1.处理器执行业务前调用");
// return true;
response.sendRedirect("http://www.baidu.com");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("2.处理器执行业务之后");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("3.处理器执行完成业务,返回给用户前,最后一关");
}
}
4.在xml中配置拦截器
规则1: 先执行的 最后返回
规则2: 如果有一个拦截器 不放行 则不能执行业务方法.
1.执行的位置不同
Filter在Servlet前执行
拦截器在业务执行前执行
2.功能不同
Filter一般处理公共的业务,字符集问题 token校验问题
拦截器: 具体的业务问题