1、springMvc常用注解
@RestController
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@RequestBody
@RequestParam
@Pathvarible
@ResponseBody
@ExceptionHandler
@ControllerAdvice
2、springMVC执行流程
dispacherServlet接收请求;
使用handlerMapping找到handler处理器(controller);
使用handlerAdapter适配handler处理器;
执行handler处理器,返回modelAndView;
dispacherServlet将modelAndView交给视图解析器;
视图解析器找到视图,渲染数据,返回html代码;
dispacherServlet响应html代码;
3、什么是适配器模式?
适配器模式用于解决接口间的兼容问题。
当我们需要使用某个类提供的接口,但是这个接口与现在的系统需求不符,由于该接口是由第三方提供的,或者是已经在生产上跑了很久的存量类,我们不想通过改变这个类来满足现在系统的需求,那么这时候就可以考虑通过将目标类封装成一个满足系统需求的新类,因此适配器(Adapter)也称为包装器(Wrapper)。
4、什么是拦截器?拦截器和过滤器的区别?三个方法分别什么时候执行?
拦截器是用来拦截请求,对请求进行处理。
和过滤器的作用一样,只是出现的时机不同。
过滤器是tomat提供的一个servlet组件,用于过滤发给web资源的请求(jsp,servlet==)。
拦截器是springMVC提供的一个组件,主要用于拦截发给controller的请求。
执行顺序:
1.在请求到来的时候,拦截器会拦截,执行preHandle方法。如果该方法的返回值为true,就继续往下执行,否则,就结束执行,往下就不再执行任何方法。该方法在目标方法执行之前执行。可以考虑做权限、日志或者事务。
2.在preHandle的返回值为true的情况下,就继续执行请求的jsp页面或者controller。
3.执行完请求后,执行postHandle方法。该方法在目标方法执行之后执行,但在渲染视图之前执行,可以对请求域中的属性或视图做出修改。
4.最后执行afterComplete方法。
做一些资源清理的工作。
5、统一异常处理
处理controller层的异常
局部异常处理
//当前controller中,如果出现算数异常,执行该方法处理
@ExceptionHandler({ArithmeticException.class})
public String ex1(){
return "ArithmeticException";
}
//当前controller中,如果出现空指针异常,执行该方法处理
@ExceptionHandler(NullPointerException.class)
public String ex2(){
return "NullPointerException";
}
全局异常处理
@ControllerAdvice
@ResponseBody
public class MyExceptionHandle {
//如果出现算数异常,执行该方法处理
@ExceptionHandler({ArithmeticException.class})
public String ex1(){
return "ArithmeticException";
}
//如果出现空指针异常,执行该方法处理
@ExceptionHandler(NullPointerException.class)
public String ex2(){
return "NullPointerException";
}
}
6、静态资源的处理方式
(1)直接使用tomcat的缺省servlet处理
<!-- tomcat缺省servlet-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*.txt</url-pattern>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
(2)在springmvc中,交给tomcat的缺省servlet处理
<!-- 静态资源处理:交给tomcat处理-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
(3)指定访问目录(记得开启mvc注解驱动)
<!-- 静态资源处理:到指定目录下找-->
<mvc:resources mapping="/html/**" location="/html/"></mvc:resources>
7、什么是类型转换器?如何自定义类型转换器?
遵循 http 协议的 servletreqeust 传输的参数都是 String 类型,但是在控制层组件需要得到的参数都是我们指定或者我们需要的类型,比如 int,double,Object。
自定义类型转换器
第一步,写一个类实现Converter接口,实现converter方法。
public class MyStringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
Date date=null;
try {
date= sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
第二步,配置类型转换器
<!-- 配置类型转换器-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.hs.util.MyStringToDateConverter"></bean>
</list>
</property>
</bean>
8、文件上传如何操作?
第一步、导入依赖
commons-fileupload-.jar
commons-io-.jar
第二步,配置文件解析器
<!-- 配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 总文件大小-->
<property name="maxUploadSize" value="10485760"></property>
<!-- 文件编码-->
<property name="defaultEncoding" value="utf-8"></property>
<!-- 临时目录-->
<property name="uploadTempDir" value="/temp"></property>
</bean>
注意:请求类型必须时POST,请求内容类型必须是"multipart/form-data"
需要对上传的文件重新命名,起个唯一的名字。
可以使用uuid。
9、什么是restful编码风格?
Restful风格指的是网络应用中就是资源定位和资源操作的风格。不是标准也不是协议。
Rest即Representational State Transfer的缩写,可译为"表现层状态转化”。Restful风格最大的特点为:资源、统一接口、URI和无状态。
这种风格设计的软件,可以更简洁,更有层次,更易于实现缓存等机制。
10、如何发送和接收put和delete请求?
在Ajax中,采用Restful风格PUT和DELETE请求传递参数无效,传递到后台的参数值为null
原因:
Tomcat会做:
1.将请求体中的数据,封装成一个map
2.request.getParameter(“id”)就会从这个map中取值
3.SpringMvc封装POJO对象的时候,
会进行request.getParamter()操作从map中获取值,然后把值封装到POJO中去。
AJAX发送PUT请求引发的血案:
PUT请求,请求体中的数据,request.getParamter()拿不到
Tomcat一看是PUT请求,就不会把请求体中的key-value封装到map中,只有POST形式的请求会才封装到map中去。
方案一,如果是PUT或DELETE,使用POST请求。
这样tomcat就可以获取请求参数了,但是restful编码风格需要的是PUT或DELETE。
springMVC提供了一个过滤器:在服务器端,根据参数"_method",将POST再改成PUT或DELETE。
HiddenHttpMethodFilter
必须满足条件:POST,_method,application/x-www-form-urlencoded
方案二,直接发送PUT或DELETE请求。
springMVC提供了一个过滤器:专门解析请求参数,封装map。
HttpPutFormContentFilter
无法处理delete请求
11、beanfactory和factorybean区别
BeanFactory是个Factory,也就是IOC容器或对象工厂
FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似
12、beanfactory和applicationContext区别
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。
依赖关系
BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。
ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
继承MessageSource,因此支持国际化。
统一的资源文件访问方式。
提供在监听器中注册bean的事件。
同时加载多个配置文件。
载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
13、springmvc父子容器关系
Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean。