一、基础理解
1、SpringMVC运行流程
1)tomcat启动;
2)解析web.xml;{如果有:listener配置,创建spring容器[父]};
3)dispatcherServlet实例化
4)dispatcherServlet对象,通过init(),创建Spring容器[子];{如果有父容器,子容器通过.setParent()方法简历和父容器的关系}
5)接收请求。
2、SpringMVC中的父子容器
1)如果设置了多个dispatcherServlet、多个spring容器[子],对于一些单一功能的类,在各个spring容器中都要放入bean对象,这就很浪费资源,例如下边这样的service类,它创建多个bean对象有什么用?
class AService{
public void test(){
sout("12345");
}
}
这种情况下,才有创建父容器的必要;父容器把单一功能的类的bean对象收入其中,而不同的controller等类则放入对应的dispatcherServlet中的spring子容器。当执行请求时需要调用父容器的bean对象了,直接从父容器取即可。这样,整个系统就减少了很多冗余的bean对象。
2)spring父容器不是必须的,springMVC官网也说,一般一个项目有一个容器就足够了;但springMVC官网给了父子容器的配置方法,有些老项目作了借鉴、也这样配,实际并无必要。
实际上,除了有多个dispatcherServlet、多个spring子容器的项目,其余情况、一律建议只用一个spring容器;尤其那种一个子容器、一个父容器的项目,完全没有必要。
3、springMVC的“零配置”
web.xml文件,就是在创建一个dispatcherServlet对象,然后再往dispatcherServlet里放一个spring容器,再设置一个匹配路径;
spring.xml文件更简单,创建bean,设置扫描路径。
而这些xml的配置,完全可以用Java的方式实现,这种把xml配置文件的功能,用Java类实现,从而把xml配置文件完全替换掉的操作,有人也称之为“零配置”。
其实不是零配置,只是换了一种配置形式而已。
因为现在新项目,都在做JavaConfig的替换。
X、一些面试问题
0、SpringMVC提供的注解有哪些?
@RestController = @Controller + @ResponsBody(告知springmvc返回值为json,而不是MV对象);
@RequestMapping;
@PostMapping/Get…/Put…/Delete…
1、什么是Spring MVC?
Spring MVC是一款基于Java实现MVC设计模式的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解构,把复杂的web应用分成逻辑清晰的几部分,简化开发,也方便组内开发人员之间的配合。
2、Spring MVC的优点有那些?
1)可以支持各种视图技术,而不仅仅局限于JSP;
2)与Spring框架集成(如IoC容器、AOP等);
3)清晰的角色分配:
前端控制器(dispatcherServlet) ;
处理器映射(handlerMapping);
处理器适配器(HandlerAdapter);
视图解析器(ViewResolver)。
4)支持各种请求资源的映射策略。
3、Spring MVC的主要组件?
1)DispatcherServlet:
中央控制器,把请求给转发到具体的控制类
2)HandlerMapping:
映射处理器,负责映射中央处理器转发给controller时的映射策略
3)Controller:
具体处理请求的控制器
4)ModelAndView:
服务层返回的数据和视图层的封装类
5)ViewResolver:
视图解析器,解析具体的视图
6)Interceptors :
拦截器,负责拦截我们定义的请求然后做处理工作
4、MVC是什么?
MVC是一种设计模式:
模型(model)
视图(view)
控制器(controller)
三层架构的设计模式,用于实现前端页面的展现与后端业务数据处理的分离。
5、MVC设计模式的好处有哪些?
分层设计,实现了业务系统各个组件之间的解耦,有利于业务系统的可扩展性,可维护性。
有利于系统的并行开发,提升开发效率。
6、Spring MVC常用的注解有哪些?
@RequestMapping+@Post/GetMapping:
用于映射一个url到一个类或方法上。
@RequestBody:
接收请求体的参数。
@RequestParam:
接收请求路径的参数。
@PathVariable:
接收路径参数。
@ResponseBody:
把返回对象转化为json对象响应给客户。
一般用@Controller注解定义控制器
也可以使用@RestController它相当于@ResponseBody + @Controller
7、Spring MVC怎么样设定重定向和转发的?
转发:
在返回值前面加"forward:"
如:“forward:user.do?name=method4”
重定向:
在返回值前面加"redirect:",
如:“redirect:http://www.baidu.com”
8、SpringMVC的返回值类型
1)ModelAndView:跳转页面,同时传输数据给前端
2)String
3)void …(HttpServletResponse resp)
重定向
try {
resp.sendRedirect(url);
} catch () {
…
}
4)自定义类型对象
9、SpringMvc的Controller是不是单例模式?如果是,有什么问题?怎么解决?
答:是单例模式,所以在多线程访问时会有线程安全问题。解决方案是尽量不要在Controller中写字段。