Spring MVC面试系列-02

2022年7月17日
大约 5 分钟

Spring MVC面试系列-02

1. Spring MVC 控制器注解一般适用什么?可以适用什么替代?

一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody+@Controller,表示是表现层,除此之外,一般不用别的注解代替。

2. Spring MVC 中拦截器如何使用?

定义拦截器,实现HandlerInterceptor接口。

接口中提供三个方法

1、preHandle :进入 Handler方法之前执行,用于身份认证、身份授权,比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行。

2、postHandle:进入Handler方法之后,返回modelAndView之前执行,应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图。

3、afterCompletion:执行Handler完成执行此方法,应用场景:统一异常处理,统一日志处理。

拦截器配置

1、针对HandlerMapping配置(不推荐):springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该 拦截器。(一般不推荐使用)。

2、类似全局的拦截器:springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。

3. Spring MVC 中如何实现拦截器?

有两种写法,一种是实现HandlerInterceptor接口,另外一种是继承适配器类,接着在接口方法当中,实现处理逻辑;然后在SpringMvc的配置文件中配置拦截器即可。

<!-- 配置SpringMvc的拦截器 -->
<mvc:interceptors>
    <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 -->
    <bean id="myInterceptor" class="com.yoodb.action.MyHandlerInterceptor"></bean>
 
    <!-- 只针对部分请求拦截 -->
    <mvc:interceptor>
       <mvc:mapping path="/jingxuan.do" />
       <bean class="com.yoodb.action.MyHandlerInterceptorAdapter" />
    </mvc:interceptor>
</mvc:interceptors>

4. 说一说 Spring MVC 注解原理?

注解本质是一个继承了Annotation的特殊接口,其具体实现类是JDK动态代理生成的代理类。

通过反射获取注解时,返回的也是Java运行时生成的动态代理对象。

通过代理对象调用自定义注解的方法,会最终调用AnnotationInvocationHandler的invoke方法,该方法会从memberValues这个Map中查询出对应的值,而memberValues的来源是Java常量池。

5. Spring MVC 中日期类型参数如何接收?

1、controller控制层

日期类型参数接收时,需要注意Spring MVC在接收日期类型参数时,如不做特殊处理会出现400语法格式错误。

解决办法:定义全局日期处理。

@RequestMapping("/test")
public String test(Date birthday){
	System.out.println(birthday);
	return "index";
}

2、自定义类型转换规则

public class DateConvert implements Converter<String, Date> {

    @Override
    public Date convert(String stringDate) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return simpleDateFormat.parse(stringDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

全局日期处理类,其中Convert<T,S>,泛型T:代表客户端提交的参数 String,泛型S:通过convert转换的类型。

3、XML配置文件

首先创建自定义日期转换规则,并创建convertion-Service ,注入dateConvert,最后注册处理器映射器、处理器适配器 ,添加conversion-service属性。

<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
	<property name="converters">
		<set>
			<ref bean="dateConvert"/>
		</set>
	</property>
</bean>
<bean id="dateConvert" class="com.yoodb.DateConvert"/>

6. 说一说对 RESTful 的理解及项目中的使用?

RESTful一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。

RESTful主要用于客户端和服务器交互类的软件。

REST指的是一组架构约束条件和原则。

满足这些约束条件和原则的应用程序或设计就是RESTful。

RESTful结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

7. Spring MVC 常用的注解有哪些?

@RequestMapping:用于处理请求url映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。

@RequestBody:注解实现接收http请求的json数据,将json转换为java对象。

@ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。

8. Spring MVC模块的作用是什么?

Spring提供了MVC框架来构建Web应用程序。

Spring可以很容易地与其他MVC框架集成,但是Spring的MVC框架是更好的选择,因为它使用IoC来提供控制器逻辑与业务对象的清晰分离。

使用Spring MVC,可以声明性地将请求参数绑定到业务对象。

9. Spring MVC 都有哪些组件?

前端控制器(DispatcherServlet)

处理器映射器(HandlerMapping)

处理器适配器(HandlerAdapter)

拦截器(HandlerInterceptor)

语言环境处理器(LocaleResolver)

主题解析器(ThemeResolver)

视图解析器(ViewResolver)

文件上传处理器(MultipartResolver)

异常处理器(HandlerExceptionResolver)

数据转换(DataBinder)

消息转换器(HttpMessageConverter)

请求转视图翻译器(RequestToViewNameTranslator)

页面跳转参数管理器(FlashMapManager)

处理程序执行链(HandlerExecutionChain)

10. 简单介绍一下 WebApplicationContext?

WebApplicationContext继承了ApplicationContext并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。

11. Spring 中 BeanFactory 与 ApplicationContext 的作用有哪些?

Spring通过一个配置文件来描述Bean及Bean之间的依赖关系,利用Java的反射功能实例化Bean并建立Bean之间的依赖关系。Sprig的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。

Spring提供了两种类型的IOC容器实现:

BeanFactory:IOC容器的基本实现 ApplicationContext:提供了更多的高级特性,是BeanFactory的子接口。 Bean工厂(com.springframework.beans.factory.BeanFactory)是Spring框架中最核心的接口,它提供了高级IoC的配置机制。BeanFactory使管理不同类型的Java对象成为可能。而应用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基础之上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用。

一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文或Spring容器。