spring父容器,springmvc子容器,子容器可以访问父容器
用户通过视图层发送请求到服务器,在服务器中的请求被controller接收,controller调用相应的model层处理请求,处理完毕将结果返回到controller,controller再根据请求处理的结果找到相应的view视图,渲染数据后最终响应给浏览器
/:匹配浏览器向服务器发送的所有请求(不包括.jsp)
/*:匹配浏览器向服务器发送的所有请求(包括.jsp)
将DispatcherServlet的初始化时间提前到服务器启动时
1
"param":表示当前所匹配请求的请求参数中必须携带param参数
"!param":表示当前所匹配请求的请求参数中一定不能携带param参数
"param=value":表示当前所匹配请求的请求参数中必须携带param参数且值必须为value
"param!=value":表示当前所匹配请求的请求参数中可以不携带param参数,但是一旦携带param参数值不能为value
若浏览器发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求参数不匹配,报400错误
作用:通过请求的请求头信息匹配请求,即浏览器发送的请求的请求头信息必须满足headers属性的设置
头信息:第一次访问首页没有来源,后续点击链接跳转其他页面,头信息就是首页的url
若浏览器发送的请求的请求路径和@RequestMapping注解value属性匹配,但是请求头信息不匹配,报404错误,资源未找到
thymeleaf模板使用请求携带参数
?:任意的单个字符(不包括?)
* :任意个数的任意字符(不包括?和/)
**:任意层数的任意目录(只能/**/,前后不能有其他字符)
在url匹配时先运行代码产生session对象,之后就可以看到cookie了
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
CharacterEncodingFilter
/*
@RequestMapping("/mav")
public ModelAndView testMAV(){
ModelAndView mav=new ModelAndView();
mav.addObject("testRequestScope","hello,mav!");
mav.setViewName("success");
return mav;
}
@RequestMapping("/model")
public String testModel(Model model){
model.addAttribute("testRequestScope","hello,model!");
return "success";
}
@RequestMapping("/modelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("testRequestScope","hello,modelMap!");
return "success";
}
@RequestMapping("/map")
public String testMap(Map map){
map.addAttribute("testRequestScope","hello,map!");
return "success";
}
总结:这些类型的形参最终都是通过BindAwareModelMap创建
@RequestMapping("/test/session")
public String testSession(HttpSession session){
session.setAttribute("testSessionScope","hello,session!");
return "success";
}
@RequestMapping("/test/application")
public String testApplication(HttpSession session){
ServletContext servletContext=session.getServletContext();
servletContext.setAttribute("testApplicationScope","hello,application!");
return "success";
}
session与浏览器开启关闭有关,而application与服务器开启关闭有关
打勾之后,重启服务器但是浏览器没有关闭,session依旧存在,application不存在
session钝化:当前服务器关闭,当前session中的数据 会被保存到(钝化到)我们当前的磁盘文件上,钝化到Tomcat的work目录,重启服务器之后,会把钝化的数据重新加载到session中,(如果session共享的是实体类数据,那么实体类必须实现序列化接口)
为当前的请求直接设置视图名称实现页面跳转(若设置视图控制器,则只有视图控制器所设置的请求会被处理,其他请求全部将404,此时必须再配置一个标签:开启mvc的注解驱动)
修改删除的话需要在配置文件web.xml添加设置请求方式的过滤器HiddenHttpMethodFilter
HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
HiddenHttpMethodFilter
/*
配置默认的servlet处理静态资源
web.xml需要配置3个东西(编码过滤器和处理请求方式过滤器)前端控制器
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
1
SpringMVC
@RequestBody注解作用:将请求体中的内容和控制器方法的形参进行绑定
使用@RequestBody注解将json格式的请求参数转换为java对象
a.导入jackson的依赖
b.在SpringMVC的配置文件中设置
c.在处理请求的控制器方法的形参位置,直接设置json格式的请求参数要转换的java类型的形参,使用@RequestBody注解标识即可(如果没有对应的java类型则默认为Map类型)
com.fasterxml.jackson.core
jackson.databind
2.12.1
@RequestMapping("/test/RequestBody/json")
public void testRequestBody(@RequestBody User user,HttpResponse response) throws IOException{
System.out.println(user);
response.getWriter().write("hello,requestbody!");
}
@RequestMapping("/test/RequestBody/json")
public void testRequestBody(@RequestBody Map map,HttpResponse response) throws IOException{
System.out.println(map);
response.getWriter().write("hello,requestbody!");
}
@ResponseBody注解作用:将所标识的控制器方法的返回值作为响应报文的响应体响应到浏览器
使用@ResponseBody注解响应浏览器json格式的数据
a.导入jackson的依赖
b.在SpringMVC的配置文件中设置
c.将需要转换为json字符串的java对象直接作为控制器方法的返回值,使用@ResponseBody注解标识控制器方法,就可以将java对象直接转换为json字符串,并响应到浏览器
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public User testResponseBodyJson(@RequestBody Map map,HttpResponse response) throws IOException{
User user=new User(10001,"admin","123456",20,"男");
return user;
}
常用的java对象转换为json结果:实体类、Map转换为json对象,List转换为json数组
下载文件
@RequestMapping("/test/down")
public ResponseEntity testResponseEntity(HttpSession session) throws IOException{
// 获取ServletContext对象
ServletContext servletContext=session.getServletContext();
// 获取服务器中文件的真实路径
String realPath=servletContext.getRealPath("img");
realPath=realPath+File.separator+"1.jpg";
// 创建输入流
InputStream is= new FileInputStream(realPath);
// 创建字节数组,获取输入流所对应文件的字节数
byte[] bytes=new byte[is.available()];
// 将流读到字节数组中
is.read(bytes);
// 创建HttpHeaders对象设置响应头信息
MultiValueMap headers=new HttpHeaders();
// 设置下载方式以及下载文件的名字
headers.add("Content-Disposition","attachment;filename=1.jpg");
// 设置响应状态码
HttpStatus statusCode=HttpStatus.ok();
// 创建ResponseEntity对象
ResponseEntity responseEntity=new ResponseEntity<>(bytes,headers,statusCode);
// 关闭输入流
is.close();
return responseEntity();
}
上传文件
springmvc.xml配置文件上传解析器bean需要加id
pom.xml配置依赖
commons-fileupload
commons-fileupload
1.3.1
@RequestMapping("/test/up")
public String testUp(MultipartFile photo,HttpSession session) throws IOException{
// 获取上传的文件的文件名
String fileName=photo.getOriginalFilename();
// 获取后缀名
String hzName=fileName.substring(fileName.lastIndexOf("."));
// 获取UUID
String uuid=UUID.randomUUID().toString();
// 拼接一个新的文件名
fileName=uuid+hzname;
// 获取ServletContext对象
ServletContext servletContext=session.getServletContext();
// 获取当前工程下photo目录的真实路径
String photoPath=servletContext.getRealPath("photo");
// 创建photoPath所对应的File对象
File file=new File(photoPath);
// 判断file所对应目录是否存在
if(!file.exists()){
file.mkdir();
}
String finalPath=photoPath+File.separator+fileName;
// 上传文件
photo.transferTo(new File(finalPath));
return "success";
}
springmvc.xml文件配置:/**代表拦截所有资源,而/*代表只拦截单层资源
springmvc.xml配置
error
使用注解配置异常处理@ControllerAdvice
@ControllerAdvice
public class ExceptionController{
// 设置要处理的异常信息
@ExceptionHandler(ArithmeticException.class)
// ex表示控制器方法出现的异常
public String handleException(Throwable ex,Model model){
model.addAttribute("ex",ex);
return "error";
}
}
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer{}
public class WebConfig implements WebMvcConfigurer{}
@Configuration声明类为配置类
@ComponentScan开启组件扫描
@EnableWebMVC开启MVC注解驱动
@Bean作用:可以将标识方法的返回值作为bean进行管理,bean的id为方法的方法名
使用@Bean配置文件上传解析器、视图控制器
@Bean
public CommonsMultipartResolver multipartResolver(){
return new CommonsMultipartResolver();
}
默认的Servlet处理静态资源、配置视图解析器、配置拦截器、配置异常处理器