JavaWeb编程面试题——Spring Web MVC
2.Spring 和 Spring MVC 的关系?(简述题) 最开始只有Spring,提供IOC和AOP核心功能,后来出现了MVC、Security、Boot等。原来的Spring就变成了现在的Spring Core。 Spring MVC就是一个MVC框架,其实大范围上来说属于Spring,Spring MVC是一个类似于Struts的MVC模式的WEB开发框架,Spring MVC是基于 Spring 功能之上添加的 Web 框架,Spring 跟 SpringMVC可以理解为父子容器的关系,想用 Spring MVC 必须先依赖Spring。 Spring MVC是控制层,用来接收前台传值,调用service层和持久层,返回数据再通过 Spring MVC把数据返回前台。
3.Spring MVC 和 Struts2 的区别有哪些?(简述题) ● Spring MVC 的入口是一个 servlet 即前端控制器,而 struts2 入口是一个 filter 过虑器。 ● Spring MVC 是基于方法开发(一个 url 对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2 是基于类开发,传递参数是通过类的属性,只能设计为多例。 ● Struts 采用值栈存储请求和响应的数据,通过 OGNL 存取数据, springmvc 通过参数解析器是将 request 请求内容解析,并给方法形参赋值,将数据和视图封装成 ModelAndView 对象,最后又将 ModelAndView 中的模型数据通过 reques 域传输到页面。Jsp 视图解析器默认使用 jstl。
4.SpringMVC常用注解都有哪些?(简述题) ● @requestMapping:用于请求 url 映射。 ● @RequestBody: 注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。 ● @ResponseBody :注解实现将 controller 方法返回对象转化为 json 响应给客户。 ● @Controller:控制器的注解,表示是表现层,不能用用别的注解代替。
5.SpringMVC 是线程安全的么?(简述题)
-
SpringMVC是线程安全的,因为SpringMVC是基于方法拦截处理请求,参数的变量全部是局部变量,并且Spring容器中的Bean默认也是单例模式,所以一般情况下不会产生线程安全问题。 如果非得要在SpringMVC中定义成员变量,设置为只读状态或者无状态也不会有线程安全问题。 如若非得在Controller中定义带状态的对象,并且多线程可以操作,则两种方式解决线程安全问题。 在Controller中使用ThreadLocal变量,对于SpringMVC中的数据共享,是通过ThreadLocal实现,ThreadLocal相当于一个Map集合,只不过key实现线程对象,value是共享数据,针对共享数据进行线程隔离,同一个变量,不同的线程访问,会得到不同的结果,互相不干扰。 在Spring配置文件Controller中声明 scope=“prototype”,每次都创建新的 Controller。
6.过滤器和拦截器的区别?(简述题) 执行顺序 :过滤前 - 拦截前 - Action 处理 - 拦截后 - 过滤后。
-
拦截器是基于Java的反射机制的,而过滤器是基于函数回调。 拦截器不依赖与Servlet容器,过滤器依赖与Servlet容器。 拦截器只能对处理器(Controller、Action)请求起作用,而过滤器则可以对几乎所有的请求起作用。 拦截器可以访问上下文对象,而过滤器不能访问。 在Servlet的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次