1. 注解式开发之annotation-driven解释
(1) mvc注解驱动在哪个文件中配置?
Springmvc.xml
(2) 配置mvc注解驱动使用哪个标签?
2. 注解式开发之视图解析器
(1) 视图解析器起到什么作用?
视图解析器可以根据服务方法的返回值,自动的拼接最终的viewName数据.
(2) 视图解析器如何使用?
3. 处理器方法常用参数
(1) 处理器方法的常用参数有哪些?
HttpServletRequest
HttpServletResponse
HttpSession
用于承载数据的Model、Map、ModelMap
请求中所携带的请求参数
(2) SpringMVC控制层常用的承载数据的对象有哪些?
Model、Map、ModelMap
4. 参数接收之逐个接收
(1) 在后端控制器中如何接收前台参数?
注意:逐个接收时,JSP页面中的name值和后台控制器中方法的形参名称必须一致才可以。如果两者不一致可以在形参前加注解@RequestPara(“请求参数名”)来指定该参数对应的是哪个请求参数。
将jsp页面中数据post提交给目标方法的相对路径
用户名:
年龄:
在后端控制器目标方法中将网页提交的数据作为参数传入,并通过ModelAndView对象添加对象,然后通过setViewName方法跳转到其他页面。
@RequestMapping("/hello")
public ModelAndView hello(String username,int age) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username", username);
modelAndView.addObject("age", age);
modelAndView.setViewName("welcome");
return modelAndView;
}
(2) 在后端控制器中接收前台“age”参数,是否需要手动转换成int类型,为什么?
不需要,后端控制器自动帮我们做了类型转换。
5. 参数接收之对象整体接收
(1) 简述以对象形式整体接收参数的步骤?
1-创建实体类
2-在后台控制器的方法中传入实体类对象作为参数。JSP页面的请求数据都封存在了实体类对象中,根据对象的属性来操作请求数据。
(2) 以对象形式整体接收参数有什么要求?
实体类的属性名一定要和请求页面中标签的name属性值保持一致。
6. 参数接收之数组或集合接收参数
(1) 请简述用数组或集合接收参数的步骤?
在数据提交页面,多条数据输入的name属性值要保持一致:
Sing
Dance
Rap
Basketball
在后台控制器中,方法参数中以数组或者集合的方式接收请求数据:
@RequestMapping("/hello")
public void hello(String[] interest) {
for (String string : interest) {
System.out.println(string);
}
}
//集合接收参数
@RequestMapping("/hello")
public void hello1(@RequestParam List interest) {
for (String string : interest) {
System.out.println(string);
}
}
(2) 请描述数组和集合接收参数的区别?
使用结合接收请求参数需要借助@RequestParam来调整参数的格式,否则浏览器不能识别会报500错误。而集合方式则不用。
7. 参数接收之域属性参数接收及restful风格传参
(1) 域属性参数的接收需要注意什么?
域属性参数接收页面name的值命名规范是 属性对象名.属性对象的属性名
例如:伙伴名称:
(2) 什么是restful风格传参?
将参数以路径的方式传入,这种方式就叫做restful传参。
比如:
后端控制器:
//后端控制器
@Controller //该注解代表当前类交给spring容器管理
@Scope("prototype") //设置bean的作用域,默认是singleton单态模式。
@RequestMapping("/springmvc") //该注解起到限定范围的作用
public class MyController {
//restful风格传参
@RequestMapping("/{name}/{age}/hello")
public void hello1(@PathVariable String name,@PathVariable int age) {
System.out.println(name+age);
}
}
访问时路径:
http://localhost:8080/springmvc-09-receiveParameter-restful/springmvc/Lucas/12/hello
获取参数。控制台输出Lucas12
8. 参数接收之接收json
(1) 如何在后端控制器中接收前台传过来的Json字符串?
在后端控制器的方法参数前使用@RequestBody来获取请求体中的参数
例如:
//接收前台JSON字符串
@RequestMapping("/hello")
public void hello1(@RequestBody User user) {
System.out.println(user);
}
(2) 如何将页面中的Json对象转换成Json字符串?
JSON.stringify(data1)
9. 获取请求头中信息@RequestHeader
(1) 请求头中有哪些常用信息?
Host:主机信息
Cookie:cookie的jsessionid
(2) @RequestHeader该注解放到什么位置?
放在后台控制器方法的参数之前。
10. 处理器方法返回值类型String
(1) 处理器方法何时使用String作为返回值类型?
只跳转到视图资源,不附带数据的情况下,可以使用String作为返回值类型。
(2) 如果处理器方法返回值类型为String,默认情况访问该方法会如何跳转?
根据返回的字符串再结合springmvc.xml文件中配置的视图解析器完成跳转页面的路径解析,然后跳转到指定路径的页面。
如果返回的数据乱码,可以在方法注解@RequestMapping中添加produces属性来解决。
例如:@RequestMapping(value="/hello",produces="text/html;charset=utf-8")
11. 处理器方法无返回值void
(1) 如果处理器方法无返回值,那么能否进行资源跳转及传递数据,如何实现?
可以。通过ajax来实现。同时可以借助HttpServletResponse对象来存储数据。
(2) 何时处理器方法无返回值较合适?
页面局部刷新的时候无返回值比较合适。因为返回字符串相当于页面跳转,整个页面刷新,而局部刷新会节省资源,效率更高,用户体验也更高。
12. 处理器方法返回值类型Object
(1) 如何将处理器方法返回值返回到前台?
@ResponseBody //将当前方法的返回值放到响应体中,并且转换成json格式,调用的是jackson包里面的方法。
13. 请求转发与重定向
(1) 请描述请求转发与重定向区别?
请求转发:服务器内部的资源跳转,浏览器地址栏不变,是一次请求。
重定向:服务器在第一次请求进行重定向后会返回给浏览器访问另一个资源的响应,浏览器重新发送请求。地址栏会改变。是两次不同的请求。如果要进行数据的传递需要依赖session对象。
(2) 在javaEE中请求转发和重定向是如何实现的?
modelAndView.setViewName("welcome");和返回字符串路径的方式都是默认请求转发。
modelAndView.setViewName("redirect:/jsp/welcome.jsp");这种方式是重定向。重定向的视图页面需要借助param对象来获取地址栏的请求参数。
14. 文件上传
(1) 文件上传时,表单中添加了什么属性,具体值是什么?
enctype="multipart/form-data"
(2) 使用springMVC进行文件上传时,接收文件的参数类型是什么?
MultipartFile
15. 文件下载
(1) 该视频中后端控制器方法的返回值类型是什么?
ResponseEntity
(2) 文件下载时后端控制器中涉及哪些步骤?
@RequestMapping("/fileDownload")
public ResponseEntity download() throws IOException{
//下载指定文件
File file = new File("d:/忘了他.jpg");
FileInputStream fis = new FileInputStream(file);
//创建字节数组,并且设置数组大小为预估的文件字节数
byte[] body = new byte[fis.available()];
//将输入流中字符存储到缓存数组中
fis.read(body);
//获取下载显示的文件名,并解决中文乱码问题
String name = file.getName();
String downloadFileName = new String(name.getBytes("utf-8"),"ISO-8859-1");
//设置http响应头信息,并且通知浏览器以附件的形式进行下载。
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Disposition", "attachment;filename="+downloadFileName);
//设置Http响应状态信息
HttpStatus status = HttpStatus.OK;
ResponseEntity responseEntity = new ResponseEntity<>(body, httpHeaders, status);
return responseEntity;
}
16. 自定义拦截器
(1) 如何自定义拦截器?
//自定义拦截器
public class FirstInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception exception)
throws Exception {
//该方法执行时机,所有工作处理完成之后,响应给浏览器客户端之前执行
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
//该方法执行时机,处理器方法执行之后执行
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//该方法执行时机,处理器方法执行之前执行
System.out.println("拦截器preHandle方法执行");
return false;
}
}
(2) 如何注册拦截器?
17. 自定义拦截器-添加拦截器后执行流程(对应31-32视频)
(1) 自定义拦截器实现HandlerInterceptor接口需要实现哪些方法,这些方法分别是何时执行?
preHandle:该方法执行时机,处理器方法执行之前执行;
postHandle:该方法执行时机,处理器方法执行之后执行;
afterCompletion:该方法执行时机,所有工作处理完成之后,响应给浏览器客户端之前执行
(2) 程序中有多个拦截器,那么程序的执行流程是怎样的?
按照springmvc.xml中的配置先后顺序依次执行各个拦截器的preHandle方法。然后再逆序执行各个拦截器的postHandle方法。等所有工作处理完成之后,响应给浏览器客户端之前再逆序执行各个拦截器的afterCompletion方法。
18. Spring与SpringMVC父子容器关系解释
(1) 简述Spring与SpringMVC的关系?
在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景就是在一个项目中引入Spring和SpringMVC这两个框架,那么它其实就是两个容器,Spring是父容器,SpringMVC是其子容器,并且在Spring父容器中注册的Bean对于SpringMVC容器中是可见的,而在SpringMVC容器中注册的Bean对于Spring父容器中是不可见的,也就是子容器可以看见父容器中的注册的Bean,反之就不行。