Sproing MVC 面试笔记
一、基础知识
1、Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架
2、MVC设计模式:MVC是Model-View-Controller(模型-视图-控制器)
- Model:实体类以及实体类上面的逻辑操作 (dao层和service层)
- view:用户试图
- Controller:控制器作用于模型和视图上,控制上面两个模块的交互 (Controller层,调用service层)
3、Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应(筛选,分发)
4、Spring MVC的控制器是单例模式,在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段。
5、工作流程(来源见水印)【重点】
- 2、3、4步:使用 URL 匹配一个控制器
- 5、6、7、8步:调用Controller,返回试图
- 9、10、11、12步:对View进行渲染视图(即将模型数据填充至视图中)
二、注解
开启注解扫描 <context:component-scan base-package = “” />
1、 @RequestMapping:用来处理请求地址映射的注解(六个属性value、method等)
- value: 指定请求的实际地址:一般我们只写这一个参数
- method,指定请求类型:GET、POST、PUT、DELETE
2、 @Controller注解:
- 用于处理DispatcherServlet分发小来的请求,返回一个 Model 或 json
3、@RestController注解 == @ResponseBody + @Controller
- 与Controller相比只返回一个json的字符串,不返回试图,不会被视图层解析
4、@ResponseBody
- 使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用
- 不经过试图解析器
5、@PathVariable 和 @RequestParam
- @PathVariable获取 URL 路径上的参数
- 如 http://localhost:8989/test/index/7 中的 7 :使用
public String edit(@PathVariable("id") Integer id)
- @RequestParam获取携带的参数
- 如 http://localhost:8989/test/index?pageNo=2 中的pageNo的值 2:使用
public String list(@RequestParam(value="pageNo",required=false, defaultValue="1")String pageNoStr)
- 三个参数
- value:前端传递过来的名字
- required:是否必须
- defaultValue:默认值
三、其他
1、SpringMVC设置转发和重定向
- 转发:在返回值前加上“forward”(转发是服务器自己去获取目标页面并返回,客户端只发一个请求,不知道真实的地址)
- 重定向:在返回值前加上“redirect ”(重定向是服务器回一个消息给客户端,然后客户端重新发送一个请求)
2、在方法的形参中声明request,Spring MVC就自动把request对象传入
3、WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。
4、SpringMVC的返回值:可以有很多类型,有String, ModelAndView。ModelAndView类把视图和数据都合并的一起的,但一般用String比较好。
5、SpringMVC 后台向前台传递数据的方式:model、request、map,然后返回试图名;或者放在ModelAndView中,返回该对象(详细参考3)
@RequestMapping(value="/test.do",method = RequestMethod.POST)
public String checknameIsExist(@RequestParam("sid") String sid,Model model,HttpServletRequest request,Map map) {
Student stu = studentService.getStudent(sid);
if(stu != null){
System.out.println(stu.getSname());
}
//1.放在model里 建议使用
model.addAttribute("mode", "modeValue");
//2.放在request里
request.setAttribute("request", "requestValue");
//3.放在map里
map.put("map", "mapvalue");
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
map.put("listmap", list);
return "user";
// 另一种方式
@RequestMapping(value="/test2.do",method = RequestMethod.POST)
public ModelAndView checknameIsExist2(@RequestParam("sid") String sid,Model model,HttpServletRequest request) {
ModelAndView mav = new ModelAndView("user");
mav.addObject("ModelAndView", "ModelAndViewValue");
mav.setViewName("user");
return mav;
}
6、前台向后台传输数据
- 直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。
- 前台有很多个参数传入,并且这些参数都是一个对象的,直接在方法中声明这个对象,Spring MVC就自动会把属性赋值到这个对象里面
四、Struts2与SpringMVC的对比
1、相同点:都是基于mvc的表现层框架,都用于web项目的开发
2、不同点:
- 前端控制器不同:Spring MVC的前端控制器是servlet:DispatcherServlet;struts2的前端控制器是filter:StrutsPreparedAndExcutorFilter。
- 请求参数的接收方式不一样。Spring MVC是使用方法的形参接收请求的参数,基于方法的开发,线程安全,可以设计为单例或者多例的开发,推荐和默认使用单例模式的开发(执行效率更高)。struts2是通过类的成员变量接收请求的参数,是基于类的开发,线程不安全,只能设计为多例的开发。
- Struts采用值栈存储请求和响应的数据;Spring MVC通过参数解析器将request请求内容解析。
五、参考
1、Spring MVC 面试题
2、SpringMVC常用注解
3、SpringMVC后台向前台传数据
4、Struts2-值栈