SSM框架的一些常见问题

18 篇文章 1 订阅
10 篇文章 0 订阅
  •  Spring

Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。
Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地`new`一个对象,而是让Spring框架帮你来完成这一切。

  • SpringMVC

SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。

  • mybatis

mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

 

 




mybatis


1.mybatis中#{}和${}的区别?
1.1 #{}会将参数转换为字符串(String)形式进行处理,${}不会,${}会以原格式进行处理
1.2 #{}会进行预编译,可以有效的防止sql注入,而${}不会
1.3 在排序(order by)的时候使用${}
1.4 在可以使用#{}时不要使用${}


2.mybatis开发环境搭建
2.1 导入mybatis相关jar包
2.2 编写mybatis-config.xml配置文件
2.3 编写mybatis的sql映射文件
2.4 运行测试


3.mybatis多参数入参有哪几种方式?
有4种方式
3.1 直接传参
3.2 使用数组方式传参
3.3 使用Map集合的方式传参
3.4 使用注解(@Param)的方式传参


4.mybatis 动态sql
4.1 if 利用if实现简单的条件判断
4.2 where 当它遇到AND或者OR这些就去除AND或者OR
4.3 trim 可以灵活的去除多余的关键字
4.4 set 解决动态更新语句
4.5 foreach 循环遍历,循环的对象当然主要是java容器和数组
4.6 choose choose通常和when一起用相当于Java里的switch


5.mybatis优缺点
mybatis优点:
5.1 与JDBC相比,减少了50%以上的代码量。
5.2 MyBatis是最简单的持久化框架,小巧并且简单易学。
5.3 MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。
5.4 提供XML标签,支持编写动态SQL语句。
5.5 提供映射标签,支持对象与数据库的ORM字段关系映射。
mybatis缺点:
5.1 SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。
5.2 SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。


6.mybatis和hibernate的区别?

难易度
Hibernate的真正掌握要比Mybatis困难,Hibernate比mybatis更加重量级一些。
Mybatis框架相对简单很容易上手,但也相对简陋些。
开发工作量
Mybatis需要我们手动编写SQL语句,回归最原始的方式,所以可以按需求指定查询的字段,提高程序的查询效率。
Hibernate也可以自己写SQL语句来指定需要查询的字段,但这样破坏了Hibernate封装以及简洁性。
数据库移植性
Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。
Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。
       缓存机制对比
相同点
Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。
不同点
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
两者比较
因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。而MyBatis在这一方面,使用二级缓存时需要特别小心。
如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。
两者对比总结
两者相同点
       Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的


Spring


1.请谈谈你对Spring两大核心组件的理解。(IOC/DI、AOP)
IOC控制反转 AOP面向切面
IOC:中文名(控制反转/依赖注入),可以看成是类实例的注入。(比如在action类里引用service层的类实例。之所以叫控制反转,是因为
原来要引用service中的类实例,要在action类里去通过关键字new,去新建一个service实例。这个新建的控制权在action类。spring的IOC
则是把新建service类实例的权利给了spring容器(通过注解的方式))。
AOP:
1.概念介绍:所谓AOP,即Aspect orientied program,就是面向方面的编程,
2.解释什么是方面:贯穿到系统的各个模块中的系统一个功能就是一个方面,
比如,记录日志,统一异常处理,事务处理,全限检查,这些功能都是软件系统
的一个面,而不是一点,在各个模块中都要出现。
3.什么是面向方面编程:把系统的一个方面的功能封装成对象的形式来处理
4.怎么进行面向方面编程:把功能模块对应的对象作为切面嵌入到原来的各个系统模块中,
采用代理技术,代理会调用目标,同时把切面功能的代码(对象)加入进来,所以,
用spring配置代理对象时只要要配两个属性,分别表示目标和切面对象(Advisor)。


2.IOC的实现方式以及参数注入方式
2.1 通过设值(setter)注入
2.2 通过构造方法的注入
2.3 使用P命名空间进行注入


3.设值注入和构造注入的区别
设值注入:
1.与传统的JavaBean的写法更相似,程序开发人员更容易理解、接受。通过setter方法设定依赖关系显得更加直观、自然。
               2.对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而是用设置注入可以避免这些问题。
                       3.尤其在某些属性可选的情况下,多参数的构造器更加笨重
构造注入:
1.构造注入可以再构造器中决定依赖关系的注入顺序,有限依赖的优先注入。例如,组件中其它依赖关系的注入,常常需要依赖于Datasource的注入。采用构造注入,可以在代码中清晰地决定注入顺序。
                       2.对于依赖关系无需变化的Bean,构造注入更加有用。因为没有setter方法,所有的依赖关系全部在构造器内设定。因此,无需担心后续代码对依赖关系的破坏。
                       3.依赖关系只能在构造器中设定,则只有组建的创建者才能改变组建的依赖关系。队组建的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。

 

 


4.AOP的原理是什么,实现AOP的方式有哪些?如何实现?
AOP原理:在不改变源代码的基础上添加新的功能
实现AOP的方式:
1.利用代理模式动态的实现AOP,从具体的技术细节又可以分为静态代理,动态代理,CGLIB生成子类代理。
AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器。
优点:被织入的类性能不受影响。
缺点:不够灵活
2.使用预编译的方法静态进行代理。
Java从1.3引入动态代理。实现原理是为被代理的业务接口生成代理类,将AOP逻辑写入到代理类中,在运行时动态织入AOP,使用反射执行织入的逻辑。 主要实现方式依赖java.lang.reflect包下的InvocationHandler和Proxy类。
优点:Java标准库原生支持,使用简单,无需引用额外的包。相对于静态AOP更灵活。
缺点:带代理的类必须是接口,灵活性受到一些限制;使用反射会影响一些性能
3.使用自定义加载器的方法动态进行代理。
可以考虑javassist来实现。Javassist 是一个编辑字节码的框架,可以让你很简单地操作字节码。它可以在运行期定义或修改Class。使用Javassist实现AOP的原理是在字节码加载前直接修改需要切入的方法。
优点:可以对绝大部分类织入。
缺点:如果用到了其他类加载器,则这些类将不被织入

AOP术语

2.1横切关注点:从每个方法中抽取出来的同一类非核心业务。
2.2切面(Aspect):封装横切关注点信息的类,每个关注点体现为一个通知方法。
2.3通知(Advice):切面必须要完成的各个具体工作
2.4目标(Target):被通知的对象
2.5代理(Proxy):向目标对象应用通知之后创建的代理对象
2.6连接点(Joinpoint)
横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。例如:类某个方法调用前、调用后、方法捕获到异常后等。
在应用程序中可以使用横纵两个坐标来定位一个具体的连接点:
2.7切入点(pointcut):

定位连接点的方式。每个类的方法中都包含多个连接点,所以连接点是类中客观存在的事物。如果把连接点看作数据库中的记录,那么切入点就是查询条件——AOP可以通过切入点定位到特定的连接点。切点通过org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

为了方便理解以上专业术语,给出下图:

 

 

 

 


5.Spring声明式事务实现有哪些方式?如何使用注解实现Spring事务?
实现方式共有两种:编码方式;声明式事务管理方式。
实现注解Spring事务
     1. 必须引入Aop相关的jar文件
        2. bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类
             3. 在需要添加事务控制的地方,写上: @Transactional
       @Transactional注解:
             1. 应用事务的注解
             2. 定义到方法上: 当前方法应用spring的声明式事务
             3. 定义到类上:   当前类的所有的方法都应用Spring声明式事务管理;
             4. 定义到父类上: 当执行父类的方法时候应用事务。


6.bean的作用域有哪些?之间有什么区别?
Spring的 bean有5种作用域分别是:singleton、prototype、request、session和globalSession
作用域包括:
singleton:全局只有一个实例
prototype:每次调用产生一个新的实例
request:每次请求产生一个bean
session:每个用户session可以产生一个新的bean,不同用户之间的bean互相不影响
globalSession:作用和session类似,只是使用portlet的时候使用。


SpringMVC


1.请描述SpringMVC的请求处理流程
1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),
web容器将请求转交给DispatcherServlet.
2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)
以及HandlerMapping的配置找到处理请求的处理器(Handler)。
3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),
再由具体的HandlerAdapter对Handler进行具体的调用。
5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。
6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。


2.SpringMVC如何进行参数传递?
使用Model Map<key,value> HttpRequest


3.SpringMVC中Controller为何采用单例模式设计?
1、为了性能。  
2、不需要多例


4.如何进行静态资源处理?
激活Tomcat的defaultServlet来处理静态文件
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
       <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>


5.如何处理SpringMVC异常?
(1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
(2)实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
(3)使用@ExceptionHandler注解实现异常处理


6.如何配置SpringMVC多视图,实现以html、json、xml三种方式进行展示。
1、首先在springmvc配置文件中加入相关配置
2、需要导入spring  jar包 spring-oxm-3.2.0.RELEASE.jar
3、我们在Controller中给jsp页面返回一个对象
4、当我们访问 multiView.json 时,jsp会把该对象转换成json格式。访问mutiView.xml时同理


7.SpringMVC如何实现文件上传。
1.添加相关jar包
2.配置MultipartResolver
3.编写文件上传表单页
4.编写控制器
5.优化文件上传表单提示
6.部署运行


8.SpringMVC拦截器
1.首先我们需要引入jar包
2.配置web.xml
3.配置一个处理器controller
4.定义大配置applicationContext.xml
5.运行


9.SpringMVC和struts2的区别?
一、框架机制
           我们知道Struts2采用Filter实现,而SpringMVC则采用Servlet实现。
           Struts2使用StrutsPrepareAndExecuteFilter,而SpringMVC使用DispatcherServlet。Filter是一种特殊的Servlet。Filter在容器启动之后即初始化;服务停止以后坠毁,晚于Servlet。Servlet在是在调用时初始化,先于Filter调用;服务停止后坠毁。
二、拦截机制
      1、Struts2
      Struts2框架是类级别的拦截,每次请求就会创建一个Action,和spring整合时Struts2的Action Bean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注入到属性。
         Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过属性接收,这说明属性参数是让多个方法共享的。
      2、SpringMVC
      SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又何一个url对应,参数的传递是直接注入到方法中的,是方法所独有的。处理结果通过ModeMap返回给框架。     
      在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,有应为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改
3 Struts2有自己的拦截Interceptor机制,SpringMVC这是用的是独立的Aop方式。
三、性能方面
      SpringMVC实现了零配置,由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,所以决定了SpringMVC更加快于Struts2。

     


10.过滤器和拦截器的区别?
拦截器与过滤器的区别 :
         1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
    2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
         3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
         4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
         5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次


11.说说你所了解的设计模式有哪些?
1.单例模式(singleton)
2.简单工厂(StaticFactory Method)
3.工厂方法(Factory Method)和抽象工厂(Abstract Factory)
4.代理模式(Proxy)
5.命令模式(Command)
6. 策略模式(Strategy)
7.门面模式(Facade)
8.桥接模式(Bridge)
9.观察者模式(Observer)


12.SpringMVC中常用的注解有哪些?分别是什么作用?
1.@Controller
Controller控制器是通过服务接口定义的提供访问应用程序的一种行为,它解释用户的输入,将其转换成一个模型然后将试图呈献给用
2.@RequestMapping
我们可以 @RequestMapping 注解将类似 “/favsoft”这样的URL映射到整个类或特定的处理方法上。
3.@PathVariable
可以使用 @PathVariable 注解方法参数并将其绑定到URI模板变量的值上。
4.@RequestParam
equestParam将请求的参数绑定到方法中的参数上
5.@RequestBody
@RequestBody是指方法参数应该被绑定到HTTP请求Body上。
6.@ResponseBody
@ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。

7.@ModelAttribute
@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。

 


13.Spring整合mybatis/SSM框架的整合
  2.1导入相关jar包
Spring:spring-beans.jar、spring-expression.jar、spring-core.jar、spring-context.jar、
spring-aop.jar、aopalliance-1.0.jar、aspectjweaver-1.6.9.jar
SpringMVC:spring-web.jar、spring-webmvc.jar
MyBatis:mybatis.jar
Spring-Mybatis:mybatis-spring.jar
commons-dbcp.jar、commons-pool.jar
spring-jdbc.jar、spring-tx.jar
Logging:commons-logging.jar、log4j.jar
数据库驱动jar包:mysql-connecter.jar
  2.2编写配置文件
  mybatis-config.xml    (settings、typeAliases)
  applicationContext.xml    (整合mybatis)
  springmvc-servlet.xml    (配置Controller)
  web.xml    (SpringMVC核心控制器、Spring、过滤器)
  log4j.properties
  database.properties
  2.3编写程序代码
  pojo-dao-service-controller-view
  2.4运行测试
 

 

 

 

 

 

 

 

 

 

 

参考:https://blog.csdn.net/qq_39606116/article/details/79495672

 

 

 

 

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值