【JAVA面试】java面试题整理(2)

                                           java面试题整理(2)

JAVA常考点总结2

目录

1、 JVM内存划分 1

2、 乐观锁与悲观锁 3

3、Spring的理解 3

4、SpringMVC的理解 7

5、SpringMVC常问面试题 8

5、 MyBatis理解 10

6、 Ajax的理解 16

7、 XML的三种解析 20

 

 

 

 

 

1、JVM内存划分

了解jvm内存区域的划分,有助于我们在内存泄露和内存溢出的时候快速排查错误。

 

jvm将内存划分为如下的几个区域:

 

(1)程序计数器(Program Counter Register)

当前线程所执行的字节码的行号指示器,或者说字节码指令指示器。

 

特点:

 

【1】线程独立。这个特点要从多线程的实现机制来谈,多线程是通过轮流获得CPU时间片的方式来实现的,那么,为了线程切换后能恢复到上一次指令运行的位置,就需要为每一个线程配备程序计数器。因此,程序计数器是线程隔离的。

 

【2】若当前线程执行的是java方法,程序计数器的内容就是正在执行的字节码指令的地址。

 

【3】若当前线程执行的是一个naive方法,即本地方法,那么程序计数器的内容为空。

 

【4】此块区域是唯一的一块没有内存溢出的区域

 

(2)虚拟机栈(VM Stack)

每个方法只执行的同时,都会在虚拟机栈中创建一个栈帧(Stack Frame)。

 

栈帧中存放的有:局部变量表、操作数栈、方法出口等

 

局部变量表中存放着基本数据类型和对象的引用

 

虚拟机栈的特点:

 

【1】虚拟机栈可以处在物理上不连续内存空间上

 

【2】线程隔离,每一个线程都拥有属于自己的虚拟机栈。

 

【3】大多数虚拟机栈都可以进行动态扩展,用来防止线程请求的栈深度过深,如果在进行扩展时,无法申请到足够的内存,就会引发OutOfMemoryError错误。

 

(3)本地方法栈(Native Method Stack)

与虚拟机栈类似,只不过虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机执行本地方法服务。

 

由于可使用的本地方法多样,因此,我们并没有对本地方法栈中使用到的语言,使用方式或者数据结构做出规定,不同的虚拟机可以自由地实现本地方法栈。

 

(4)堆(Heap) 

几乎所有的对象实例与数组都在堆上分配内存空间。

 

堆的特点:

 

【1】虚拟机启动时,则创建堆。

 

【2】线程共享

 

【3】堆可以处在物理上不连续的内存空间上,这一点与虚拟机栈很像。

 

【4】堆的实现可以是固定大小的,也可以是可扩展的。

 

(5)方法区(Method Area)

它用于存储已经被虚拟机加载的类信息、常量、静态变量、编译后的代码等数据。

 

特点:

 

【1】线程共享

 

【2】也可以进行垃圾收集,内存回收的主要目标是针对常量池的回收与类型的卸载。但类型卸载的条件十分苛刻,因此回收的效果不是太好。

 

【3】当方法区所需要的内存大于虚拟机所分配的内存时,将会引发OutOfMemoryError错误。

 

方法区中提到比较多的还有一个运行时常量池,存放编译期间或者运行期间动态创建的各种字面量和符号引用。字符串常量池也是运行时常量池的一部分。

 

 

2、乐观锁与悲观锁

(1)乐观锁

 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。

 

 version方式:一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

 

核心SQL代码:

 

update table set x=x+1, version=version+1 where id=#{id} and version=#{version};  

 

 CAS操作方式:即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。

 

(2)悲观锁

 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。

 

读取频繁使用乐观锁,写入频繁使用悲观锁。

 

 

 

3、Spring的理解

(1)Spring中AOP的应用场景、Aop原理、好处?

 

答:AOP--Aspect Oriented Programming面向切面编程;用来封装横切关注点,具体可以在下面的场景中使用:

 

Authentication 权限、Caching 缓存、Context passing 内容传递、Error handling 错误处理Lazy loading懒加载、Debugging调试、logging, tracing, profiling and monitoring 记录跟踪优化 校准、Performance optimization 性能优化、Persistence 持久化、Resource pooling 资源池、Synchronization 同步、Transactions 事务

 

原理:AOP是面向切面编程,是通过动态代理的方式为程序添加统一功能,集中解决一些公共问题。

 

优点:  1.各个步骤之间的良好隔离性耦合性大大降低 

           2.源代码无关性,再扩展功能的同时不对源码进行修改操作 

 

(2)Spring中IOC的作用与原理?对象创建的过程。

 

答:IOC--Inversion of Control控制反转。当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例对象。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 直接使用。

 

(3)介绍spring框架

 

   它是一个一站式(full-stack全栈式)框架,提供了从表现层-springMVC到业务层-spring再到持久层-springdata的一套完整的解决方案。我们在项目中可以只使用spring一个框架,它就可以提供表现层的mvc框架,持久层的Dao框架。它的两大核心IoC和AOP更是为我们程序解耦和代码简洁易维护提供了支持。

 

(4)Spring常见创建对象的注解?

 

答:@Component@Controller@ Service@ Repository

 

(5)Spring中用到的设计模式

 

答:简单工厂、工厂方法、单例模式、适配器、包装器、代理、观察者、策略、模板方法

 

详细介绍:请参考本微博的:开发常用设计模式

 

(6)Spring的优点?

 

答:1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 

2.可以使用容易提供的众多服务,如事务管理,消息服务等 

3.容器提供单例模式支持 

4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 

5.容器提供了众多的辅助类,能加快应用的开发 

6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 

7.spring属于低侵入式设计,代码的污染极低 

8.独立于各种应用服务器 

9.spring的DI机制降低了业务对象替换的复杂性 

10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring 的部分或全部 

 

(7)Spring Bean的作用域之间有什么区别?

 

Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:

 

singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

 

prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。

 

request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

 

Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。

 

global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。

 

全局作用域与Servlet中的session作用域效果相同。

 

(8)Spring管理事务有几种方式?

 

答:有两种方式:

 

1、编程式事务,在代码中硬编码。(不推荐使用)

 

2、声明式事务,在配置文件中配置(推荐使用)

 

声明式事务又分为两种:

 

a、基于XML的声明式事务

 

b、基于注解的声明式事务

 

(9)spring中自动装配的方式有哪些?

 

答:1、 No:即不启用自动装配。

 

2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。

 

3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。

 

4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。

 

5、 autodetect:在byType和constructor之间自动的选择注入方式。

 

6、 default:由上级标签<beans>的default-autowire属性确定。

 

(10)spring中的核心类有那些,各有什么作用?

 

答:BeanFactory:产生一个新的实例,可以实现单例模式

 

BeanWrapper:提供统一的get及set方法

 

ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

 

(11)Bean的调用方式有哪些?

 

答:有三种方式可以得到Bean并进行调用:

使用BeanWrapper

HelloWorld hw=new HelloWorld();

BeanWrapper bw=new BeanWrapperImpl(hw);

bw.setPropertyvalue(”msg”,”HelloWorld”);

system.out.println(bw.getPropertyCalue(”msg”));

使用BeanFactory

InputStream is=new FileInputStream(”config.xml”);

XmlBeanFactory factory=new XmlBeanFactory(is);

HelloWorld hw=(HelloWorld) factory.getBean(”HelloWorld”);

system.out.println(hw.getMsg());

使用ApplicationConttext

ApplicationContext actx=new FleSystemXmlApplicationContext(”config.xml”);

HelloWorld hw=(HelloWorld) actx.getBean(”HelloWorld”);

System.out.println(hw.getMsg());

 

(12)什么是IOC,什么又是DI,他们有什么区别?

 

答:依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个 数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外 部以减少依赖

 

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所 以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

 

(13)spring有两种代理方式:

 

答: 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。

 

      优点:因为有接口,所以使系统更加松耦合

 

      缺点:为每一个目标类创建接口

 

若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

 

      优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。

 

      缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

 

4、SpringMVC的理解

(1)springMVC的流程?

 

答:1.用户发送请求至前端控制器DispatcherServlet

 

2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。

 

3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

 

4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

 

5.执行处理器(Controller,也叫后端控制器)。

 

6.Controller执行完成返回ModelAndView

 

7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

 

8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器

 

9.ViewReslover解析后返回具体View

 

10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

 

11.DispatcherServlet响应用户

 

(2)Springmvc的优点

 

答:1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.

 

2.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)

 

3. 可以任意使用各种视图技术,而不仅仅局限于JSP

 

4 . 支持各种请求资源的映射策略

 

5 .它应是易于扩展的

 

 

5、SpringMVC常问面试题

f-sm-1. 讲下SpringMvc和Struts1,Struts2的比较的优势

  性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差不多,比Struts1要高

 

f-sm-2. 讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么

  SpringMvc的是DispatchServlet,Struts1的是ActionServlet,Struts2的是StrutsPrepareAndExecuteFilter

 

f-sm-3. SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决

  是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能的,解决方案是在控制器里面不能写字段

 

f-sm-4. SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代

  一般用@Controller注解,表示是表现层,不能用用别的注解代替.

 

f-sm-5. @RequestMapping注解用在类上面有什么作用

  用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

 

f-sm-6. 怎么样把某个请求映射到特定的方法上面

  直接在方法上面加上注解@RequestMapping,并且在这个注解里面写上要拦截的路径

 

f-sm-7. 如果在拦截请求中,我想拦截get方式提交的方法,怎么配置

  可以在@RequestMapping注解里面加上method=RequestMethod.GET

 

f-sm-8. 如果在拦截请求中,我想拦截提交参数中包含"type=test"字符串,怎么配置

  可以在@RequestMapping注解里面加上params="type=test"

 

f-sm-9. 我想在拦截的方法里面得到从前台传入的参数,怎么得到

  直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样

 

f-sm-10. 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象

  直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面

 

f-sm-11. 怎么样在方法里面得到Request,或者Session

  直接在方法的形参中声明request,SpringMvc就自动把request对象传入

 

f-sm-12. SpringMvc中函数的返回值是什么.

  返回值可以有很多类型,有String, ModelAndView,当一般用String比较好

 

f-sm-13. SpringMvc怎么处理返回值的

  SpringMvc根据配置文件中InternalResourceViewResolver的前缀和后缀,用前缀+返回值+后缀组成完整的返回值

 

f-sm-14. SpringMVC怎么样设定重定向和转发的

  在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.baidu.com"

 

f-sm-15. SpringMvc用什么对象从后台向前台传递数据的

  通过ModelMap对象,可以在这个对象里面用put方法,把对象加到里面,前台就可以通过el表达式拿到

 

f-sm-16. SpringMvc中有个类把视图和数据都合并的一起的,叫什么

  叫ModelAndView

 

f-sm-17. 怎么样把ModelMap里面的数据放入Session里面

  可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key

 

f-sm-18. SpringMvc怎么和AJAX相互调用的

  通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象

  具体步骤如下

  1.加入Jackson.jar

  2.在配置文件中配置json的映射

  3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解

 

f-sm-19. 当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理

  要加上@ResponseBody注解

 

f-sm-20. SpringMvc里面拦截器是怎么写的

  有两种写法,一种是实现接口,另外一种是继承适配器类,然后在SpringMvc的配置文件中配置拦截器即可:

  <!-- 配置SpringMvc的拦截器 -->

<mvc:interceptors>

    <!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 -->

    <bean id="myInterceptor" class="com.et.action.MyHandlerInterceptor"></bean>

 

    <!-- 只针对部分请求拦截 -->

    <mvc:interceptor>

       <mvc:mapping path="/modelMap.do" />

       <bean class="com.et.action.MyHandlerInterceptorAdapter" />

    </mvc:interceptor>

</mvc:interceptors>

 

f-sm-21. 讲下SpringMvc的执行流程

       系统启动的时候根据配置文件创建spring的容器, 首先是发送http请求到核心控制器disPatherServlet,spring容器通过映射器去寻找业务控制器,

使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,数据放在model中,用map传递数据进行页面显示。

 

 

 

 

5、MyBatis理解

1、#{}和${}的区别是什么?

 

#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理${}时,就是把${}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性。

 

2、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

 

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致

 

    <select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>

       select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};

    </select>

 

第2种: 通过<resultMap>来映射字段名和实体类属性名的一一对应的关系

 

    <select id="getOrder" parameterType="int" resultMap="orderresultmap">

        select * from orders where order_id=#{id}

    </select>

   <resultMap type=”me.gacl.domain.order” id=”orderresultmap”>

        <!–用id属性来映射主键字段–>

        <id property=”id” column=”order_id”>

        <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–>

        <result property = “orderno” column =”order_no”/>

        <result property=”price” column=”order_price” />

    </reslutMap>

 

3、 模糊查询like语句该怎么写?

 

(1)第1种:在Java代码中添加sql通配符。

 

    string wildcardname = “%smi%”;

    list<name> names = mapper.selectlike(wildcardname);

 

    <select id=”selectlike”>

     select * from foo where bar like #{value}

    </select>

 

(2)第2种:在sql语句中拼接通配符,会引起sql注入

 

    string wildcardname = “smi”;

    list<name> names = mapper.selectlike(wildcardname);

 

    <select id=”selectlike”>

     select * from foo where bar like "%"#{value}"%"

    </select>

 

4、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

 

Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

 

Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

 

Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

 

5、Mybatis是如何进行分页的?分页插件的原理是什么?

 

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

 

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

 

6、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

 

答:第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

 

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

 

7、如何执行批量插入?

 

(1)首先,创建一个简单的insert语句:

 

    <insert id=”insertname”>

     insert into names (name) values (#{value})

    </insert>

 

(2)然后在java代码中像下面这样执行批处理插入:

 

    list<string> names = new arraylist();

    names.add(“fred”);

    names.add(“barney”);

    names.add(“betty”);

    names.add(“wilma”);

 

    // 注意这里 executortype.batch

    sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);

    try {

     namemapper mapper = sqlsession.getmapper(namemapper.class);

     for (string name : names) {

     mapper.insertname(name);

     }

     sqlsession.commit();

    } finally {

     sqlsession.close();

    }

 

8、如何获取自动生成的(主)键值?

 

insert 方法总是返回一个int值 - 这个值代表的是插入的行数。

而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。

示例:

 

    <insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>

     insert into names (name) values (#{name})

    </insert>

 

    name name = new name();

    name.setname(“fred”);

 

    int rows = mapper.insertname(name);

    // 完成后,id已经被设置到对象中

    system.out.println(“rows inserted = ” + rows);

    system.out.println(“generated key value = ” + name.getid());

 

 

9、在mapper中如何传递多个参数?

 

(1)第1种:

 

//DAO层的函数

 

Public UserselectUser(String name,String area);  

 

//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。

 

<select id="selectUser"resultMap="BaseResultMap">  

    select *  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}  

</select>  

 

(2)第2种:    使用 @param 注解:

 

    import org.apache.ibatis.annotations.param;

        public interface usermapper {

         user selectuser(@param(“username”) string username,

         @param(“hashedpassword”) string hashedpassword);

        }

 

然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):

 

    <select id=”selectuser” resulttype=”user”>

         select id, username, hashedpassword

         from some_table

         where username = #{username}

         and hashedpassword = #{hashedpassword}

    </select>

 

10、Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?

 

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能。

Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。

其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

 

11、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

 

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。

 

原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

 

12、为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

 

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

 

13、 一对一、一对多的关联查询 ?

 

<mapper namespace="com.lcb.mapping.userMapper">  

    <!--association  一对一关联查询 -->  

    <select id="getClass" parameterType="int" resultMap="ClassesResultMap">  

        select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}  

    </select>  

    <resultMap type="com.lcb.user.Classes" id="ClassesResultMap">  

        <!-- 实体类的字段名和数据表的字段名映射 -->  

        <id property="id" column="c_id"/>  

        <result property="name" column="c_name"/>  

        <association property="teacher" javaType="com.lcb.user.Teacher">  

            <id property="id" column="t_id"/>  

            <result property="name" column="t_name"/>  

        </association>  

    </resultMap>  

 

    <!--collection  一对多关联查询 -->  

    <select id="getClass2" parameterType="int" resultMap="ClassesResultMap2">  

        select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id}  

    </select>  

    <resultMap type="com.lcb.user.Classes" id="ClassesResultMap2">  

        <id property="id" column="c_id"/>  

        <result property="name" column="c_name"/>  

        <association property="teacher" javaType="com.lcb.user.Teacher">  

            <id property="id" column="t_id"/>  

            <result property="name" column="t_name"/>  

        </association>  

        <collection property="student" ofType="com.lcb.user.Student">  

            <id property="id" column="s_id"/>  

            <result property="name" column="s_name"/>  

        </collection>  

    </resultMap>  

 

</mapper>  

 

 

 

6、Ajax的理解

1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识)

 

什么是ajax:

 

AJAX是“Asynchronous JavaScript and XML”的缩写。他是指一种创建交互式网页应用的网页开发技术。

 

Ajax包含下列技术:

 

基于web标准(standards-basedpresentation)XHTML+CSS的表示;

使用 DOM(Document ObjectModel)进行动态显示及交互;

使用 XML 和 XSLT 进行数据交换及相关操作;

使用 XMLHttpRequest 进行异步数据查询、检索;

使用 JavaScript 将所有的东西绑定在一起。

 

为什么要用ajax:

 

Ajax应用程序的优势在于:

 

1. 通过异步模式,提升了用户体验

2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用

3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

 

2、AJAX最大的特点是什么。

 

Ajax可以实现动态不刷新(局部刷新)

就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。

 

3、请介绍一下XMLhttprequest对象。

 

Ajax的核心是JavaScript对象XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。通过XMLHttpRequest对象,Web开发人员可以在页面加载以后进行页面的局部更新。

 

4、AJAX技术体系的组成部分有哪些。

 

HTML,css,dom,xml,xmlHttpRequest,javascript

 

5、AJAX应用和传统Web应用有什么不同。

 

在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。

因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。

使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。

通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),展示给用户的还是通一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应。

 

6、AJAX请求总共有多少种CALLBACK。

 

Ajax请求总共有八种Callback

 

onSuccess

onFailure

onUninitialized

onLoading

onLoaded

onInteractive

onComplete

onException

 

7.Ajax和javascript的区别。

 

javascript是一种在浏览器端执行的脚本语言,Ajax是一种创建交互式网页应用的开发技术 ,它是利用了一系列相关的技术其中就包括javascript。

Javascript是由网景公司开发的一种脚本语言,它和sun公司的java语言是没有任何关系的,它们相似的名称只是一种行销策略。

在一般的web开发中,javascript是在浏览器端执行的,我们可以用javascript控制浏览器的行为和内容。

在 Ajax应用中信息是如何在浏览器和服务器之间传递的

      通过XML数据或者字符串

 

8、在浏览器端如何得到服务器端响应的XML数据。

 

XMLHttpRequest对象的responseXMl属性

 

9、 XMLHttpRequest对象在IE和Firefox中创建方式有没有不同。

 

  有,IE中通过new ActiveXObject()得到,Firefox中通过newXMLHttpRequest()得到

 

10、介绍一下XMLHttpRequest对象的常用方法和属性。

 

 open(“method”,”URL”) 建立对服务器的调用,第一个参数是HTTP请求    方式可以为GET,POST或任何服务器所支持的您想调用的方式。

 第二个参数是请求页面的URL。

    send()方法,发送具体请求

    abort()方法,停止当前请求

    readyState属性   请求的状态 有5个可取值0=未初始化 ,1=正在加载

    2=以加载,3=交互中,4=完成

    responseText 属性  服务器的响应,表示为一个串

    reponseXML 属性 服务器的响应,表示为XML

    status   服务器的HTTP状态码,200对应ok  400对应not found

 

12、什么是XML

 

 XML是扩展标记语言,能够用一系列简单的标记描述数据

 

13、XML的解析方式

 

常用的用dom解析和sax解析。dom解析是一次性读取xml文件并将其构造为DOM对象供程序使用,优点是操作方便,但是比较耗内存。Sax是按事件驱动的方式解析的,占用内存少,但是编程复杂

 

14、你采用的是什么框架(架包)

 

 这题是必问的,一般也是最开始就会问到。

   在java中比较流行的有 dojo, Prototype , JQuery, Dwr, extjs  等等

 

15、如果熟悉某种ajax框架,他可能会问到怎样在程序中使用这种框架

 

DWR框架介绍

    DWR(DirectWeb Remoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).

   DWR的实现原理是通过反射,将java翻译成javascript,然后利用回调机制,从而实现了javascript调用Java代码

 

16、介绍一下Prototype的()函数,()函数,F()函数,$A()函数都是什么作用

 

$() 方法是在DOM中使用过于频繁的document.getElementById() 方法的一个便利的简写,就像这个DOM方法一样,这个方法返回参数传入的id的那个元素。

$F()函数是另一个大收欢迎的“快捷键”,它能用于返回任何表单输入控件的值,比如textbox,drop-down list。这个方法也能用元素id或元素本身做为参数。

$A()函数能把它接收到的单个的参数转换成一个Array对象。

 

17、介绍一下XMLHttpRequest对象

 

通过XMLHttpRequest对象,Web开发人员可以在页面加载以后进行页面的局部更新。

AJAX开始流行始于Google在2005年使用的”Google Suggest”。

“Google Suggest”就是使用XMLHttpRequest对象来创建动态的Web接口:

当用户开始输入google的搜索框,Javascript发送用户输入的字符到服务器,然后服务器返回一个建议列表。

XMLHttpRequest对象在IE5.0+, Safari 1.2, Mozilla1.0/Firefox, Opera 8+ 和NetScapt7 开始被支持。

 

18、AJAX的全称是什么? 介绍一下AJAX?

 

AJAX的全称是Asynchronous JavaScript And XML.

AJAX是2005年由Google发起并流行起来的编程方法, AJAX不是一个新的编程语言,但是它是一个使用已有标准的新的编程技术。

使用AJAX可以创建更好,更快,更用户界面友好的Web应用。

AJAX技术基于Javascript和HTTP Request.

 

19、Ajax主要包含了哪些技术?

 

Ajax(Asynchronous JavaScript + XML)的定义

基于web标准(standards-based presentation)XHTML+CSS的表示;

使用 DOM(Document Object Model)进行动态显示及交互;

使用 XML 和 XSLT 进行数据交换及相关操作;

使用XMLHttpRequest 进行异步数据查询、检索;

使用 JavaScript 将所有的东西绑定在一起。英文参见Ajax的提出者Jesse James Garrett的原文,原文题目(Ajax: A New Approach to Web Applications)。

类似于DHTML或LAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。事实上,一些基于AJAX的“派生/合成”式(derivative/composite)的技术正在出现,如“AFLAX”。

AJAX的应用使用支持以上技术的web浏览器作为运行平台。这些浏览器目前包括:Mozilla、Firefox、Internet Explorer、Opera、Konqueror及Safari。但是Opera不支持XSL格式对象,也不支持XSLT。

 

20、AJAX都有哪些优点和缺点?

 

1、最大的一点是页面无刷新,用户的体验非常好。

2、使用异步方式与服务器通信,具有更加迅速的响应能力。

3、可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,ajax的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。

4、基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。

ajax的缺点

1、ajax不支持浏览器back按钮。

2、安全问题 AJAX暴露了与服务器交互的细节。

3、对搜索引擎的支持比较弱。

4、破坏了程序的异常机制。

5、不容易调试。

 

 

7、XML的三种解析

(1)SAX

SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。

 

它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。

 

缺点是不能倒退。

 

(2)DOM

DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问 XML 文档的各个部分。

 

它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。

 

缺点是加载大文档时效率低下。

 

(3)PULL

Pull 内置于 Android 系统中。也是官方解析布局文件所使用的方式。

 

Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。

 

不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。

 

而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。

 

SAX、DOM、Pull 三者的比较:

 

内存占用:SAX、Pull比DOM要好;

 

编程方式:SAX 采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类 XML,就要编写一个新的适合该类XML的处理类。DOM 是 W3C 的规范,Pull 简洁。

 

访问与修改:SAX 采用流式解析,DOM 随机访问。

 

访问方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunAlwaysOnline

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值