1. 请说一下SpringMVC 的执行流程


步骤:

1.用户向服务器发送申请,申请被 springMVC 前端控制器 DispatchServlet 捕捉;
2.前端控制器申请处理器映射器:查问可能解决该申请的Controller
3.将找到的Controller门路返回给前端控制器.

4.前端控制器申请处理器适配器: 找到可能解决该申请的处理器。
5.处理器执行申请代码。(controller-service-dao)
6.将解决后的后果和响应页面封装到ModelAndView对象中,返回给处理器适配器.
7.将ModelAndView对象返回给前端控制器.

8.前端控制器申请视图解析器: 解析View对象,确定是哪个页面。
9.视图解析器外部拼接,将页面名称拼接成实在的页面门路,返回给前端控制器。(拼接前缀和后缀:View=hello -->(/WEB-INF/hello.jsp))
10.视图渲染(将数据填充到页面中(request域中)),最初将残缺的view展现给用户。

2. Spring MVC的次要组件

  • 前端控制器 DispatcherServlet(不须要程序员开发)
    作用:接管申请、响应后果,相当于转发器,有了DispatcherServlet 就缩小了其它组件之间的耦合度。
  • 处理器映射器HandlerMapping(不须要程序员开发)
    作用:依据申请的URL来查找Handler
  • 处理器适配器HandlerAdapter
    留神:在编写Handler的时候要依照HandlerAdapter要求的规定去编写,这样适配器HandlerAdapter才能够正确的去执行Handler。
  • 处理器Handler(须要程序员开发)
  • 视图解析器 ViewResolver(不须要程序员开发)
    作用:进行视图的解析,依据视图逻辑名解析成真正的视图(view)
  • 视图View(须要程序员开发jsp)
    View是一个接口, 它的实现类反对不同的视图类型(jsp,freemarker,pdf等等)

3. springMVC和struts2的区别有哪些?

  • springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
  • springmvc是基于办法开发(一个url对应一个办法),申请参数传递到办法的形参,能够设计为单例或多例(倡议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
  • Struts采纳值栈存储申请和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request申请内容解析,并给办法形参赋值,将数据和视图封装成ModelAndView对象,最初又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认应用jstl。

4. 如何解决POST申请中文乱码问题,GET的又如何解决呢

  • 解决post申请乱码问题:
    在web.xml中配置一个CharacterEncodingFilter过滤器,设置成utf-8;
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

  • get申请中文参数呈现乱码解决办法有两个:
  • ①批改tomcat配置文件增加编码与工程编码统一,如下:
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

  • ②另外一种办法对参数进行从新编码:
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,须要将tomcat编码后的内容按utf-8编码。

5. SpringMVC罕用的注解有哪些

  • @RequestMapping:用于解决申请 url 映射的注解,可用于类或办法上。用于类上,则示意类中的所有响应申请的办法都是以该地址作为父门路。
  • @RequestBody:注解实现接管http申请的json数据,将json转换为java对象。
  • @ResponseBody:注解实现将conreoller办法返回对象转化为json对象响应给客户。

6.SpringMvc的Controller是不是单例模式,如果是,有什么问题,怎么解决?

答:是单例模式,所以在多线程拜访的时候有线程平安问题,会影响性能的。解决方案是尽量不要在Controller中应用类变量。

对于多例状况一般属性是不会共用的,对于动态属性会去共用这个属性。
对于单例状况一般属性和动态属性都会被共用。(controller默认为单例)
springmvc是基于办法开发的,办法里边的形参不会被共享,因而默认是多例。springmvc如果要应用类变量,须要定义为多例的。Struts是基于类的属性开发的,单例会共享属性,因而单例不平安,所以默认为多例。

7. 什么是MVC模式?

  1. MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计榜样。它是用一种业务逻辑、数据与界面显示拆散的办法来组织代码,将泛滥的业务逻辑汇集到一个部件外面,在须要改良和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑,达到缩小编码的工夫。
  2. V即View视图是指用户看到并与之交互的界面。比方由html元素组成的网页界面,或者软件的客户端界面。MVC的益处之一在于它能为利用程序处理很多不同的视图。在视图中其实没有真正的解决产生,它只是作为一种输入数据并容许用户操纵的形式。
  3. M即model模型是指模型表示业务规定。在MVC的三个部件中,模型领有最多的解决工作。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,因为利用于模型的代码只需写一次就能够被多个视图重用,所以缩小了代码的重复性。
  4. C即controller控制器是指控制器承受用户的输出并调用模型和视图去实现用户的需要,控制器自身不输入任何货色和做任何解决。它只是接管申请并决定调用哪个模型构件去解决申请,而后再确定用哪个视图来显示返回的数据。

8. SpringMVC有哪些长处?

  1. SpringMVC自身是与Spring框架联合而成的,它同时领有Spring的长处(例如依赖注入DI和切面编程AOP等)。
  2. SpringMVc提供弱小的约定大于配置的契约式编程反对,即提供一种软件设计范式,缩小软件开发人员做决定的次数,开发人员仅需规定利用中不合乎约定的局部。
  3. 反对灵便的URL到页面控制器的映射。
  4. 能够不便地与其余视图技术(JSP、FreeMarker等)进行整合。因为SpringMVC的模型数据往往是搁置在Map数据结构中的,因而其能够很不便地被其余框架援用。
  5. 领有非常简洁的异样解决机制。
  6. 能够非常灵便地实现数据验证、格式化和数据绑定机制,能够应用任意对象进行数据绑定操作。
  7. 反对RestFul格调。

9. 当一个办法向AJAX返回非凡对象,譬如Object,List等,须要做什么解决?

  1. 在办法上加@ResponseBody注解,示意该办法的返回值不论是什么类型,都会返回JSON格局的数据。
  2. 把原来Controller类上的@Controller注解替换为@RestController注解。@RestController = @Controller + @ResponseBody,表明该Controller类所有的办法都返回JSON格局的数据(没有加@RequestMapping注解的办法除外)。
  3. 退出@ResponseBody注解就能返回JSON格局数据的起因是:SpringMVC提供的HttpMessageConverter主动转为JSON ,如果应用了Jackson或者Gson,不须要额定配置就能够主动返回JSON了,因为框架帮咱们提供了对应的HttpMessageConverter ,如果应用了Alibaba的Fastjson的话,则须要本人手动提供一个相应的 HttpMessageConverter的实例。

10.SpringMVC用什么对象从后盾向前台传递数据的?

  • 应用Map、Model和ModelMap的形式,这种形式存储的数据是在request域中
@RequestMapping("/getUser")public String getUser(Map<String,Object> map,Model model,ModelMap modelMap){    //1.放在map里      map.put("name", "xq");    //2.放在model里,个别是应用这个    model.addAttribute("habbit", "Play");    //3.放在modelMap中     modelMap.addAttribute("city", "gd");    modelMap.put("gender", "male");    return "userDetail";} 

  • 应用request的形式
@RequestMapping("/getUser")public String getUser(Map<String,Object> map,Model model,ModelMap modelMap,HttpServletRequest request){    //放在request里      request.setAttribute("user", userService.getUser());    return "userDetail";} 

  • 应用ModelAndView
@RequestMapping("/getUser")  public ModelAndView getUser(ModelAndView modelAndView) {    mav.addObject("user", userService.getUser());      mav.setViewName("userDetail");      return modelAndView;  } 

11.怎么样把ModelMap外面的数据放入session外面?

在类上增加@SessionAttributes注解将指定的Model数据存储到session中。

@SessionAttributes

  1. 默认状况下Spring MVC将模型中的数据存储到request域中。当一个申请完结后,数据就生效了。如果要跨页面应用。那么须要应用到session。而@SessionAttributes注解就能够使得模型中的数据存储一份到session域中。
  2. @SessionAttributes只能定义在Class,interface enum上,作用是将指定的Model中的键值对增加至session中,不便在一个会话中应用。

@SessionAttributes参数

  1. names:这是一个字符串数组。外面应写须要存储到session中数据的名称。
  2. types:依据指定参数的类型,将模型中对应类型的参数存储到session中。
  3. value:其实和下面的names是一样的。
@SessionAttributes(value={"names"},types={Integer.class})@Controllerpublic class session{    @RequestMapping("/session")    public String session(Model model){        model.addAttributes("names", Arrays.asList("caoyc","zhh","cjx"));        model.addAttributes("age", 22);        return "/session";    }} 

在下面代码中,在类上增加@SessionAttributes注解,并指定将names名称的Model数据存储到session域中,以及将Integer类型的Model数据存储到session域中。

12.SpringMMV中有个类把视图和数据都合并的一起的,叫什么?

它就是ModelAndView。

  1. 应用ModelAndView类存储解决完后的后果数据,以及显示该数据的视图。从名字上看ModelAndView中的Model代表模型,View代表视图,从名字看就很好地解释了该类的作用。Controller处理器调用模型层解决完用户申请后,把后果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,而后把ModelAndView返回给前端控制器。前端控制器通过调用配置文件中定义的视图解析器,对该对象进行解析,最初把后果数据显示在指定的页面上。
  2. 返回指定页面
    ModelAndView构造方法能够指定返回的页面名称。
    也能够通过setViewName()办法跳转到指定的页面 。
  3. 返回所需数值
    应用addObject()设置须要返回的值,addObject()有几个不同参数的办法,能够默认和指定返回对象的名字。

13.Springmvc 中零碎如何分层 ?

零碎分为体现层(UI):数据的展示,操作页面,申请转发。
业务层(服务层):封装业务解决逻辑
长久层(数据拜访层):封装数据拜访逻辑
各层之间的关系: 表示层通过接口调用业务层,业务层通过接口调用长久层,这样,当下一层发生变化扭转,不影响上一层的数据。 MVC是一种体现层的架构

14. Springmvc 中拦截器如何应用

定义拦截器,实现HandlerInterceptor接口。接口中提供三个办法。

preHandle :进入 Handler办法之前执行,用于身份认证、身份受权,比方身份认证,如果认证通过示意以后用户没有登陆,须要此办法拦挡不再向下执行
postHandle:进入Handler办法之后,返回modelAndView之前执行,利用场景从modelAndView登程:将专用的模型数据(比方菜单导航)在这里传到视图,也能够在这里对立指定视图
afterCompletion:执行Handler实现执行此办法,利用场景:对立异样解决,对立日志解决

拦截器配置:

针对HandlerMapping配置(不举荐):springmvc拦截器针对HandlerMapping进行拦挡设置,如果在某个HandlerMapping中配置拦挡,通过该 HandlerMapping映射胜利的handler最终应用该 拦截器。(个别不举荐应用)
相似全局的拦截器:springmvc配置相似全局的拦截器,springmvc框架将配置的相似全局的拦截器注入到每个HandlerMapping中

15. 介绍一下Spring的事务管理   

事务就是对一系列的数据库操作(比方插入多条数据)进行对立的提交或回滚操作,如果插入胜利,那么一起胜利,如果两头有一条出现异常,那么回滚之前的所有操作。 

这样能够防止出现脏数据,避免数据库数据呈现问题。 开发中为了防止这种状况个别都会进行事务管理。Spring中也有本人的事务管理机制,个别是应用TransactionMananger进行治理,能够通过Spring的注入来实现此性能。

sping的事务管理的两种形式:

1、编程式(粒度是到代码块级别);

       编程式次要应用transactionTemplate;手动编程治理事务

2、申明式(粒度是到办法级别);

    通过AOP实现,  其本质是对办法前后进行拦挡,而后在指标办法开始之前创立或者退出一个事务,在执行完指标办法之后依据执行状况提交或者回滚事务。申明式事务最大的长处就是不须要通过编程的形式治理事务,这样就不须要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相干的事务规定申明(或通过基于@Transactional注解的形式),便能够将事务规定利用到业务逻辑中。

16. 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 容器 。

17. 你对Spring框架的了解,Spring框架有哪些模块?

Spring是一个轻量级的IoC和AOP容器框架,是为Java应用程序提供基础性服务的一套框架,目标是用于简化企业应用程序的开发,它使得开发者只须要关怀业务需要。

Spring,一种用来简化企业应用级开发的一种开源框架。
简化开发:它对罕用的API做了封装,比方对JDBC的封装,应用Spring JDBC拜访数据库,就不须要思考如何获取连贯和敞开的问题。
解耦:Spring帮咱们管理软件之间的依赖关系,这样对象之间的耦合性就升高了,这样的维护性就失去了进步。
集成其它框架:不便扩大和优化其性能,例如和Mybatis的集成等。

Spring框架是依照设计模式精心打造的,这使得咱们在开发环境中,能不便的应用框架,不必思考后盾是怎么进行的。
Spring容器是Spring框架中一个外围的模块,用来治理对象的创立,销毁和初始化等操作,以及对象之间的依赖关系等。

次要包含以下七个模块:

Spring Context:提供框架式的Bean拜访形式,以及企业级性能(JNDI、定时工作等);
Spring Core:外围类库,所有性能都依赖于该类库,提供IOC和DI服务;
Spring AOP:AOP服务;
Spring Web:提供了根本的面向Web的综合个性,提供对常见框架如Struts2的反对,Spring可能治理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器;
Spring MVC:提供面向Web利用的Model-View-Controller,即MVC实现;
Spring DAO:对JDBC的形象封装,简化了数据拜访异样的解决,并能对立治理JDBC事务;
Spring ORM:对现有的ORM框架的反对。

18. 什么是管制反转(IOC),什么是依赖注入(DI)?

IOC:就是对象之间的依赖关系由容器来创立,对象之间的关系原本是由咱们开发者本人创立和保护的,在咱们应用Spring框架后,对象之间的关系由容器来创立和保护,将开发者做的事让容器做,这就是管制反转。BeanFactory接口是Spring Ioc容器的外围接口。
DI:咱们在应用Spring容器的时候,容器通过调用set办法或者是结构器来建设对象之间的依赖关系。
管制反转是指标,依赖注入是咱们实现管制反转的一种伎俩。

19. Spring Bean的生命周期?

Spring作为以后Java最风行、最弱小的轻量级框架,受到了程序员的热烈欢迎。精确的理解Spring Bean的生命周期是十分必要的。咱们通常应用ApplicationContext作为Spring容器。这里,咱们讲的也是 ApplicationContext中Bean的生命周期。而实际上BeanFactory也是差不多的,只不过处理器须要手动注册。

简略来说,Spring Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization --> 销毁 Destruction

但具体来说,Spring Bean的生命周期蕴含下图的流程:

(1)实例化Bean

对于BeanFactory容器,当客户向容器申请一个尚未初始化的bean时,或初始化bean的时候须要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。

对于ApplicationContext容器,当容器启动完结后,通过获取BeanDefinition对象中的信息,实例化所有的bean。

(2)设置对象属性(依赖注入)

实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring依据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口实现属性设置与依赖注入。

(3)解决Aware接口

Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,能够让咱们拿到Spring容器的一些资源:

①如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)办法,传入Bean的名字;
②如果这个Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()办法,传入ClassLoader对象的实例。
②如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()办法,传递的是Spring工厂本身。
③如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)办法,传入Spring上下文。

(4)BeanPostProcessor前置解决

如果想对Bean进行一些自定义的前置解决,那么能够让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)办法。

(5)InitializingBean

如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()办法。

(6)init-method

如果Bean在Spring配置文件中配置了 init-method 属性,则会主动调用其配置的初始化办法。

(7)BeanPostProcessor后置解决

如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)办法;因为这个办法是在Bean初始化完结时调用的,所以能够被利用于内存或缓存技术;

以上几个步骤实现后,Bean就曾经被正确创立了,之后就能够应用这个Bean了。

(8)DisposableBean

当Bean不再须要时,会通过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()办法。

(9)destroy-method

最初,如果这个Bean的Spring配置中配置了destroy-method属性,会主动调用其配置的销毁办法。

20. Spring框架中都用到了哪些设计模式?

单例模式 : Spring 中的 Bean 默认都是单例的。
工厂模式 : Spring应用工厂模式通过 BeanFactory、ApplicationContext 创立 bean 对象。
模板办法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就应用到了模板模式。
代理模式 : Spring AOP 性能的实现。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个利用。
适配器模式 :Spring AOP 的加强或告诉(Advice)应用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
装璜者模式 : 咱们的我的项目须要连贯多个数据库,而且不同的客户在每次拜访中依据须要会去拜访不同的数据库。这种模式让咱们能够依据客户的需要可能动静切换不同的数据源。

21. Spring AOP(面向切面)编程的原理?

AOP面向切面编程,它是一种思维。它就是针对业务处理过程中的切面进行提取,以达到优化代码的目标,缩小反复代码的目标。 就比方,在编写业务逻辑代码的时候,咱们习惯性的都要写:日志记录,事物管制,以及权限管制等,每一个子模块都要写这些代码,代码显著存在反复。这时候,咱们使用面向切面的编程思维,采纳横切技术,将代码中反复的局部,不影响主业务逻辑的局部抽取进去,放在某个中央进行集中式的治理,调用。 造成日志切面,事物管制切面,权限管制切面。 这样,咱们就只须要关系业务的逻辑解决,即进步了工作的效率,又使得代码变的简洁优雅。这就是面向切面的编程思维,它是面向对象编程思维的一种扩大。

AOP的应用场景: 缓存、权限治理、内容传递、错误处理、懒加载、记录跟踪、优化、校准、调试、长久化、资源池、同步治理、事物管制等。 AOP的相干概念: 切面(Aspect) 连接点(JoinPoint) 告诉(Advice) 切入点(Pointcut) 代理(Proxy): 织入(WeaVing)
Spring AOP的编程原理? 代理机制JDK的动静代理:只能用于实现了接口的类产生代理。 Cglib代理:针对没有实现接口的类产生代理,利用的是底层的字节码加强技术,生成以后类的子类对象。
(1)连接点(Join point):指程序运行过程中所执行的办法。在Spring AOP中,一个连接点总代表一个办法的执行。

(2)切面(Aspect):被抽取进去的公共模块,能够用来会横切多个对象。Aspect切面能够看成 Pointcut切点 和 Advice告诉 的联合,一个切面能够由多个切点和告诉组成。

在Spring AOP中,切面能够在类上应用 @AspectJ 注解来实现。

(3)切点(Pointcut):切点用于定义 要对哪些Join point进行拦挡。

切点分为execution形式和annotation形式。execution形式能够用门路表达式指定对哪些办法拦挡,比方指定拦挡add、search。annotation形式能够指定被哪些注解润饰的代码进行拦挡。

(4)告诉(Advice):指要在连接点(Join Point)上执行的动作,即加强的逻辑,比方权限校验和、日志记录等。告诉有各种类型,包含Around、Before、After、After returning、After throwing。

(5)指标对象(Target):蕴含连接点的对象,也称作被告诉(Advice)的对象。 因为Spring AOP是通过动静代理实现的,所以这个对象永远是一个代理对象。

(6)织入(Weaving):通过动静代理,在指标对象(Target)的办法(即连接点Join point)中执行加强逻辑(Advice)的过程。

(7)引入(Introduction):增加额定的办法或者字段到被告诉的类。Spring容许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你能够应用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

几个概念的关系图能够参考下图:

AOP实现的关键在于代理模式,AOP代理次要分为动态代理和动静代理。动态代理的代表为AspectJ;动静代理则以Spring AOP为代表。

(1)AspectJ是动态代理,也称为编译时加强,AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是加强之后的AOP对象。

(2)Spring AOP应用的动静代理,所谓的动静代理就是说AOP框架不会去批改字节码,而是每次运行时在内存中长期为办法生成一个AOP对象,这个AOP对象蕴含了指标对象的全副办法,并且在特定的切点做了加强解决,并回调原对象的办法。

Spring AOP中的动静代理次要有两种形式,JDK动静代理和CGLIB动静代理:

① JDK动静代理只提供接口的代理,不反对类的代理,要求被代理类实现接口。JDK动静代理的外围是InvocationHandler接口和Proxy类,在获取代理对象时,应用Proxy类来动态创建指标类的代理类(即最终真正的代理类,这个类继承自Proxy并实现了咱们定义的接口),当代理对象调用实在对象的办法时, InvocationHandler 通过invoke()办法反射来调用指标类中的代码,动静地将横切逻辑和业务编织在一起;

InvocationHandler 的 invoke(Object proxy,Method method,Object[] args):proxy是最终生成的代理对象; method 是被代理指标实例的某个具体方法;args 是被代理指标实例某个办法的具体入参, 在办法反射调用时应用。

② 如果被代理类没有实现接口,那么Spring AOP会抉择应用CGLIB来动静代理指标类。CGLIB(Code Generation Library),是一个代码生成的类库,能够在运行时动静的生成指定类的一个子类对象,并笼罩其中特定办法并增加加强代码,从而实现AOP。CGLIB是通过继承的形式做的动静代理,因而如果某个类被标记为final,那么它是无奈应用CGLIB做动静代理的。

(3)动态代理与动静代理区别在于生成AOP代理对象的机会不同,相对来说AspectJ的动态代理形式具备更好的性能,然而AspectJ须要特定的编译器进行解决,而Spring AOP则无需特定的编译器解决。

IoC让相互协作的组件放弃涣散的耦合,而AOP编程容许你把遍布于利用各层的性能分离出来造成可重用的性能组件。

22.WebService如何与客户端交互

① webServices通过SOAP协定进行参数的接管与返回值的传递。
② SOAP协定在web上提供软件服务,应用WSDL文件进行阐明,通过UDDI进行注册
③ WSDL文件是一个XML文档,用于阐明一组SOAP音讯以及如何替换这些信息,大多数状况下由软件主动生成和应用
④ XML是一种扩大型可标记语言,面向短期长期数据和万维网络。
⑤ UDDI是一个次要针对web服务供应商和使用者的我的项目,在用户可能调用web服务之前,必须确定这个服务蕴含哪些商务办法,找到被调用的接口定义,还要服务端来编制软件;UDDI是一种依据形容文章来疏导零碎查找响应服务的机制,UDDI利用SOAP音讯机制来公布、编译、浏览及查找注册信息,它采纳XML格局来封装各种不同类型的数据,并且发送到注册核心来返回须要的数据。

23. 拦截器和过滤器的区别

① 拦截器inteceptor是基于java的反射机制实现的;
过滤器Filter是基于函数回调实现(filter接口中的doFilter办法是回调函数实现的)
② 拦截器不依赖于servlet容器;
过滤器filter依赖servlet,没有servlet无奈回调doFilter
③ 拦截器只能对action申请起作用;
而filter能够对所有申请起作用,filter过滤范畴比拦截器大
④ 拦截器能够拜访action上下文,值栈里的对象;
而过滤器filter不能;
⑤ 在action的生命周期中,拦截器能够屡次被调用;
而过滤器只能在容器初始化时被调用一次;
⑥ 拦截器能够获取IOC容器中的各个bean,而过滤器不行;

24. Spring MVC异样解决

1.应用@ExceptionHandler注解。

public class AccountController {      @ExceptionHandler      public void handleException() {}}

@ExceptionHandler是Controller级别的,不是整个应用程序全局无效。给每个controller增加对应的@ExceptionHandler办法会很繁琐。能够让所有Controller类继承BaseController类,在BaseController类外面增加@ExceptionHandler润饰的办法进行异样解决。

  1. 应用HandlerExceptionResolver能够实现一个对立的异样解决机制。Spring提供了以下HandlerExceptionResolver能够应用:
ExceptionHandlerExceptionResolver是@ExceptionHandler机制工作的外围组件。

DefaultHandlerExceptionResolver用于将规范的Spring异样解析为相应的http状态码。

ResponseStatusExceptionResolver次要用于把润饰自定义异样的@ResponseStatus注解映射对应异样到相应的http状态码。

SimpleMappingExceptionResolver和AnnotationMethodHandlerExceptionResolver

自定义 HandlerExceptionResolver能够返回一个ModelAndView对象,能够设置须要的任何内容。

  1. 新的@ControllerAdvice提供了一个全局的@ExceptionHandler 异样解决机制。
@ControllerAdvicepublic class ExceptionHandler {                        @ExceptionHandler(Exception.class)public Result handleException(Exception e)  {    // todo  }}

@ControllerAdvice容许把扩散在多个Controller的@ExceptionHandler合并到单个全局错误处理组件中。

25. Spring MVC进行传值的形式有哪些?

(1)、页面传值到控制器有三种形式:

应用Request传值的特点:间接,然而不能主动进行类型转换。

通过属性传值的特点:
第一、变量名必须和表单组件的name值雷同
第二、能够实现类型转换
第三、进行类型转换时可能会出现异常

应用Bean对象传值的特点:
第一、如果前端提交数据过多,倡议应用此形式
第二、把表单组件的name属性值封装到Bean类中,
第三、办法的参数传递封装类型的对象即可

(2)、控制器传值到页面有三种形式:

应用Request和Session对象

应用ModelAndView传值的特点:
第一、能够在ModelAndView构造方法中设置一个Map对象
第二、Map对象通过框架解决后,会把key-value设置到Request对象中。

ModelMap传值的特点:
第一、ModelMap是框架提供的Map汇合
第二、ModelMap同样被框架设置到Request对象中。

26.  Spring MVC如何进行乱码解决?

对于POST乱码,在web.xml文件中增加POST乱码过滤器——CharacterEncodingFilter
对于GET申请中文参数呈现乱码的状况,解决方案:
(1)、批改Tomcat配置文件,增加编码与工作编码统一
<Connector URLEncoding="utf-8" connectionTimeout="2000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

(2)、对参数进行从新编码
String userName=new String(request.getParamter("username".getBytes("ISO8859-1","utf-8")))
ISO8859-1是Tomcat默认编码,须要将Tomcat编码后的内容按utf-8编码。

26. Spring MVC拦截器的三个办法的执行机会是什么?

当两个拦截器都实现放行操作时,程序为preHanle1、preHandle2、postHandle2、postHandle1、afterCompletion2、afterCompletion1;
当第一个拦截器preHandle返回false,也就是对其进行拦挡时,第二个拦截器是齐全不执行的,第一个拦截器只执行preHandle局部。
当第一个拦截器preHandle返回True,第二个拦截器preHandle返回false,程序为preHandle1、preHandle2、afterCompletion1

27. 什么是ContextLoaderListener,它的作用是什么?

ContextLoaderListener是一个监听器,这有助于疏导Spring MVC的。顾名思义它加载并创立ApplicationContext,因而不用编写显式代码来创立它。应用程序上下文是Spring bean来到的中央。对于Web应用程序,有一个名为WebAppliationContext的子类。

ContextLoaderListener还将ApplicationContext的生命周期与ServletContext的生命周期分割起来。这能够应用getServletContext()办法从WebApplicationContext获取ServletContext。

28. 传入申请如何映射到控制器和办法?

有时也会问这个问题DispatcherServlet如何晓得哪个Controller应该解决申请?

Spring应用处理程序映射将控制器与申请相关联,两个罕用的处理程序映射是BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。

在BeanNameUrlHandlerMapping中,当申请url与bean的名称匹配时,bean定义中的类是将解决申请的控制器。

另一方面,在SimpleUrlHandlerMapping中,映射更明确。能够指定URL的数量,并且每个URL能够与控制器显式关联。

顺便说一句,如果你应用正文来配置Spring MVC,那么应该应用@RequestMapping正文将传入申请映射到控制器和处理程序办法。

还能够通过URI门路,查问参数,申请的HTTP办法以及申请中存在的HTTP标头配置@RequestMapping批注。

29. @RequestParam用于什么?

@RequestParam是一个Spring MVC正文,其被用于提取从URL中控制器的处理程序办法申请参数或查问参数,如下所示:

public String personDetail(@RequestParam(“id”)long id){  ....  return“personDetails”; } 

@RequestParam正文也反对数据类型转换,例如这里能够看到一个String被主动转换为long,但它也可能导致一个异样,如果查问参数不存在或类型不匹配的状况下 还能够应用requried = false使参数成为可选参数,例如@RequestParam(value =“id”,required = false)

30. SpringBoot、SpringMVC、Spring有什么区别?

Springboot是简化配置,将mybatis中的配置数据源,主配置文件等配置,spring、springMVC的配置文件都用springboot的yml文件配置,极大的简化了配置,使我的项目能够疾速的启动起来。

SpringMVC是通过(model),V(view),C(controller)的构造进行分层,从而实现前后端拆散的成果,而后通过前端控制器(DispatcherServlet),处理器映射器(HandlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver),将各层有机的组织起来,使每个人都有不同的分工从而放慢了开发的效率。

Spring是由Aop面向切面和IOC管制翻转(又称作DI依赖注入),面向切面是把主办法和其余的一些无关的办法拆散开来,从而达到升高耦合的成果,管制翻转是指将原先是由new创立的对象,各个类之间的依赖较强,将创建对象的权力交托给ioc容器后,由ioc容器来创建对象,使耦合度减小,进步了效率。

31. SpringMVC接口解释

(1)DispatcherServlet接口:
Spring提供的前端控制器,所有的申请都有通过它来对立散发。在DispatcherServlet将申请分发给Spring Controller之前,须要借助于Spring提供的HandlerMapping定位到具体的Controller。
(2)HandlerMapping接口:
可能实现客户申请到Controller映射。
(3)Controller接口:
须要为并发用户解决上述申请,因而实现Controller接口时,必须保障线程平安并且可重用。
Controller将解决用户申请,这和Struts Action表演的角色是统一的。一旦Controller解决完用户申请,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中蕴含了模型(Model)和视图(View)。
从宏观角度思考,DispatcherServlet是整个Web利用的控制器;从宏观思考,Controller是单个Http申请处理过程中的控制器,而ModelAndView是Http申请过程中返回的模型(Model)和视图(View)。
(4)ViewResolver接口:
Spring提供的视图解析器(ViewResolver)在Web利用中查找View对象,从而将相应后果渲染给客户。

我的项目举荐:

2000多G的计算机各行业电子资源分享(继续更新)

2020年微信小程序全栈我的项目之喵喵交友【附课件和源码】

Spring Boot开发小而美的集体博客【附课件和源码】

Java微服务实战296集大型视频-谷粒商城【附代码和课件】

Java开发微服务畅购商城实战【全357集大我的项目】-附代码和课件

最全最具体数据结构与算法视频-【附课件和源码】