SSM框架的⼀些常见问题
SSM常见问题?
mybatis
1.1 #{}会将参数转换为字符串(String)形式进⾏处理,${}不会,${}会以原格式进⾏处理
1.2 #{}会进⾏预编译,可以有效的防⽌sql注⼊,⽽${}不会
1.3 在排序(order by)的时候使⽤${}
1.4 在可以使⽤#{}时不要使⽤${}
2.1 导⼊mybatis相关jar包
2.2 编写l配置⽂件
2.3 编写mybatis的sql映射⽂件
2.4 运⾏测试
有4种⽅式
3.1 直接传参
3.2 使⽤数组⽅式传参
3.3 使⽤Map集合的⽅式传参
3.4 使⽤注解(@Param)的⽅式传参
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
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语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
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.怎么进⾏⾯向⽅⾯编程:把功能模块对应的对象作为切⾯嵌⼊到原来的各个系统模块中,
采⽤代理技术,代理会调⽤⽬标,同时把切⾯功能的代码(对象)加⼊进来,所以,ssm框架实现登录功能
⽤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,使⽤反射执⾏织⼊的逻辑。 主要实现⽅式依赖flect包下的InvocationHandler和Proxy类。
优点:Java标准库原⽣⽀持,使⽤简单,⽆需引⽤额外的包。相对于静态AOP更灵活。
缺点:带代理的类必须是接⼝,灵活性受到⼀些限制;使⽤反射会影响⼀些性能
3.使⽤⾃定义加载器的⽅法动态进⾏代理。
可以考虑javassist来实现。Javassist 是⼀个编辑字节码的框架,可以让你很简单地操作字节码。它可以
在运⾏期定义或修改Class。使⽤Javassist实现AOP的原理是在字节码加载前直接修改需要切⼊的⽅法。
优点:可以对绝⼤部分类织⼊。
缺点:如果⽤到了其他类加载器,则这些类将不被织⼊
5.Spring声明式事务实现有哪些⽅式?如何使⽤注解实现Spring事务?
实现⽅式共有两种:编码⽅式;声明式事务管理⽅式。
实现注解Spring事务
1. 必须引⼊Aop相关的jar⽂件
2. l中指定注解⽅式实现声明式事务管理以及应⽤的事务管理器类
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的请求映射路径(在l 中指定),
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格式。访问l时同理
7.SpringMVC如何实现⽂件上传。
1.添加相关jar包
2.配置MultipartResolver
3.编写⽂件上传表单页
4.编写控制器
5.优化⽂件上传表单提⽰
6.部署运⾏
8.SpringMVC
1.⾸先我们需要引⼊jar包
2.配置l
3.配置⼀个处理器controller
4.定义⼤配置l
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的⽣命周期中,可以多次被调⽤,⽽过滤器只能在容器初始化时被调⽤⼀次

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。