【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(一)

1.Struts2中,Action通过什么方式获取用户从页面输入的数据,又是通过什么方法把数据传给视图层显示的?

答:(1)Action从页面获取数据的方式有三种:

        ①通过Action属性接收参数;(例:${pageContext.request.contextPath}/***.action? id=xxxx)

        ②通过域模型获取参数;(例:ServletActionContext.getRequest().getParameter(arg0))

        ③通过模型驱动获取参数(例:extends ModelDriven<T>)

(2)Action将数据存入值栈(Value Stack)中,视图可以通过表达式语言(EL)从值栈中获取;

2.阐述Struts2中的Action如何编写,是否采用单例?

答:(1)Struts2的Action有三种写法:

       ①POJO类——无继承无实现;

       ②实现Action接口,重写execute()方法;

       ③继承ActionSupport(常用);

   (2)Action没有像Servlet一样,使用单实例多线程的工作方式,很明显,每一个Action要接收不同用户的请求参数,这就意味着Action是有状态的,因此在设计上使用了,每一个请求对应一个Action的处理方式,所以是多例的。

3.Struts2中,Action并没有直接收到用户的请求,那它为什么可以处理用户的请求?又凭什么知道一个请求到底交给哪一个Action来处理?

答:(1)Struts2的核心过滤器收到用户的请求后,会对用户的请求进行简单的预处理(如解析、封装参数),然后通过反射来创建Action实例,并调用Action中指定的方法来处理用户请求。

    (2)通知具体调用哪个Action来处理请求的方式,有两种:

      ①利用配置文件,Struts.xml中配置的<action>标签来确定;

      ②利用约定,Struts2中可以使用约定(convention)插件。例如:约定xxx总是对应XxxAction,这是对约定优于配置理念的践行;

4.简述Struts2异常处理机制?

答:Struts2提供了声明式的异常处理机制,可以在配置文件中加入如下代码:

/WEB-INF/pages/error.jsp

5.简述拦截器的工作原理?
答:在Struts2中,可以实现Interceptor接口或继承AbstractInterceptor类,来自定义拦截器。
①接口中的init()方法,在拦截器被创建后立即被调用,它在拦截器的生命周期内只被调用一次,可以在该方法中对相关资源进行必要的初始化;
②每拦截一个请求,intercept()方法就会被调用一次;
③destory()方法将在拦截器销毁之前被调用。
6.谈一下拦截器和过滤器的区别?
答:拦截器和过滤器都可以用来实现横切关注功能,其区别主要在于:
①拦截器是基于JAVA反射机制的,而过滤器是基于函数回调的
②过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
③拦截器只能对Action请求起作用(Action中的方法),而过滤器可以对几乎所有的请求起作用(CSS JSP JS)
7.谈一下你的项目选择Struts2的理由?
答:①Action是POJO类,没有依赖Servlet API,具有良好的可测试性;
②强大的拦截器,简化了开发的复杂度;
③支持多种表现层技术:JSP、Freemarker等;
④灵活的验证方式;
⑤国际化(I18N)支持
⑥声明式异常管理;
⑦通过JSON插件简化Ajax;
⑧通过Spring插件跟Spring整合;
8.Struts2中如何访问HttpServletRequest、HttpSession和ServletContext三个域对象?
答:有两种方式:
①通过ServletActionContext的方法获得;
②通过ServletRequestAware、SessionAware和ServletContextAware接口注入。
9.Struts2中的默认包struts-default有什么作用?
答:它定义了Struts2内部的众多拦截器和Result类型,而Struts2很多核心的功能是通过这些内置的拦截器实现,如:从请求中把参数封装到action、文件上传和数据校验等等,都是通过拦截器实现的。在Struts2的配置文件中,自定义的包,继承了struts-default包,就可以使用Struts2为我们提供这些功能。
10.简述值栈的原理和生命周期?
答:Value-Stack贯穿整个Action的生命周期,保存在request作用域中,所以它和request的生命周期一样。当Struts2接受一个请求时,会创建ActionContext、Value-Stack和Action对象,然后把Action存放进Value-Stack,所以Action的实例变量可以通过OGNL访问。由于Action是多实例的,和使用单例的Servlet不同,每个Action都有一个对应的Value-Stack,Value-Stack存放的数据类型是该Action的实例,以及该Action中的实例变量,Action对象默认保存在栈顶。
11.SessionFactory是线程安全的吗?Session是线程安全的吗?两个线程能共享一个Session吗?
答:(1)SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例的模式进行封装以便于访问。
(2)Session是一个轻量级非线程安全的对象(线程间不能共享Session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用TreadLocal来获取当前的session,无论你调用多少次getCurrentSession()方法,返回的都是同一个session。
12.Session的load和get方法区别是什么?
答:①如果没有找到符合条件的记录,get方法返回null值,而load方法会抛出异常;
②get方法直接返回实体类对象,load方法返回实体类对象的代理;
③在Hibernate3之前,get方法只在一级缓存(内部缓存)中进行数据查找,如果没有找到对应的数据则越过二级缓存,直接发出SQL语句完成数据的读取;load方法则可以充分利用二级缓存中现有数据,进行延迟加载。当然从Hibernate3开始,get方法不再是对二级缓存只写不读,它也是可以访问二级缓存的;
简单的是,对于load()方法,hibernate认为该数据在数据库中一定存在,可以放心的使用代理来实现延迟加载,如果没有数据,就会抛出异常,而通过get()方法去取数据,是可以不存在的。
13.阐述Session加载实体对象的过程?
答:①Session在调用数据查询功能之前,首先会在缓存中进行查询,在一级缓存中,通过实体类型和主键进行查询,如果一级缓存查找命中且数据状态合法,则直接返回;
②如果一级缓存没有命中,接下来Session会在当前NonExists记录(相当于一个查询黑名单,如果出现重复的无效查询可以迅速判断,从而提升性能)中进行查询,如果NonExists中存在同样的查询条件,则返回null;
③对于load方法,如果一级缓存查询失败,则查询二级缓存,如果二级缓存命中则直接返回;
④如果之前的查询都未命中,则发出sql语句,如果查询未发现对应的记录,则此次查询添加到Session的NonExists中加以记录,并返回null;
⑤根据映射配置和sql语句,得到ResultSet,并创建对应的实体对象;
⑥将对象纳入Session(一级缓存)管理;
⑦执行拦截器的onload方法(如果有对应的拦截器);
⑧将数据对象纳入二级缓存;
⑨返回数据对象。
14.Query接口的list方法和iterate方法有什么区别?
答:①list()方法返回的每个对象都是完整的(对象中的每个属性都被表中的字段填充上了),list方法无法利用缓存,它对一级缓存只写不读;
②iterate方法可以充分利用一级缓存,它所返回的对象中仅包含了主键值(标识符),只有当你对iterator中的对象进行操作时,Hibernate才会向数据库再次发送SQL语句来获取该对象的属性值;
②list方法不会引起N+1查询问题,而iterate方法会引起N+1查询问题。
15.Hibernate如何实现分页查询?
答:通过Hibernate实现分页查询,开发人员只需要提供HQL语句、查询起始行数(setFirstResult()方法)和最大查询行数(setMaxResult()方法),并调用Query接口的list()方法,Hibernate会自动生成分页查询的SQL语句。

原文地址:http://blog.51cto.com/13919357/2162132

时间: 2024-10-08 02:10:24

【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(一)的相关文章

【JAVA秒会技术之秒杀面试官】秒杀Java面试官——集合篇(一)

[JAVA秒会技术之秒杀面试官]秒杀Java面试官--集合篇(一) [JAVA秒会技术之秒杀面试官]JavaEE常见面试题(三) http://blog.csdn.net/qq296398300/article/category/6876287

【JAVA秒会技术之秒杀面试官】JavaSE常见面试题(二)

21.在Java中,如何跳出当前的多重嵌套循环? 答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环.(Java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好) 22.构造器(constructor)是否可被重写(override)? 答:构造器不能被继承,因此不能被

【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(五)

51.事务的特性? 答:①原子性(Atomicity) 指事务是一个不可分割的工作单位,事务中的操作要么全都发生,要么全不发生: ②一致性(Consistency) 事务前后数据的完成性必须保持一致:(例:转账前后的,两个人的金额总数是不变的) ③隔离性(Isolation) 指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发事务之间要项目隔离: ④持久性(Durability) 指一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来即使数据库发生故障,也不应该

面试准备——selenium常见面试题及答案(java)

自动化测试面试——selenium基础篇 目的:考察求职者在自动化测试岗位的selenium工具的熟悉程度 1.怎么判断元素是否存在? 判断元素是否存在和是否出现不同, 判断是否存在意味着如果这个元素压根就不存在, 就会抛出NoSuchElementException 这样就可以使用try catch,如果catch到NoSuchElementException 就返回false.通常在项目中会把这个功能封装在isElementPresent方法中. 2.如何判断元素是否出现? 判断元素是否出现

献给 2018 还在艰苦奋斗的 Java 程序员,Java 常见面试题及答案!

1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被编译成能被 Java 虚拟机执行的字节码文件. Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译. Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性. 2.JDK和JRE的区别是什么? JDK: java开发工具包,包含了JRE.编译器和其它工具(如:jav

Java 并发基础常见面试题总结

Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程. 如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行). 1.2

JAVA的基本数据类型以及常见面试题

一.JAVA基本数据类型介绍 基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将 从面试中常考的. 几个方面来回顾一下与基本类型相关的知识. 基本类型共有八种,它们分别都有相对应的包装类.关于它们的详细信息请看下表: 基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte.short.int.long.float.double.数值类型又可以分为整数类型byte. shor

【转载】JAVA常见面试题及解答(精华)

JAVA常见面试题及解答(精华) 1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { transient int a;  //不需要维持 int b;  //需要维持 } 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存. volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变.在多线程程序中,有时两个或更多的线程共

JAVA常见面试题及解答-java开发

JAVA常见面试题及解答 Java的垃圾回收总结  浅谈Java中的内部类 1)transient和volatile是java关键字吗? 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { transient int a;  //不需要维持 int b;  //需要维持 } 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存. volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变.在多