【转】框架面试

Struts2与Struts1的面试题

###1.Struts2与Struts1的联系与区别?为什么要用Struts2?

struts1与struts2都是mvc框架的经典实现模式。

Struts2不是从Struts1升级而来,而是由WebWork改名而来,而WebWork只是Xwork加了很多WEB拦截器而已

 

区别:

1.核心控制器改成了过滤器(过滤器比Servlet的级别要高,因为程序运行时是先进入过滤器再进入Servlet)

2.struts1严重依赖于Servlet(因为太过于依赖于api的HttpServletRequest与HttpServletResponse的两个参数),

struts2就则脱离了Servlet的API。

3.管理Action时struts1是单例模式,struts2是每个请求产生一个实例。

4.在表达式的支持上struts2不仅有jstl,还有功能更加强大的ognl表达式。

5.struts1的类型转换是单向的(页面到ActionForm),struts2是双向的(页面到Action再到页面回显)

6.校验,struts1没有针对具体方法的校验,struts2提供了指定某个方法进行效验,还有框架校验。

7.struts2提供了拦截器,利用拦截器可以在访问Action之前或之后增加如权限拦截等功能。

8.struts2提供了全局范围,包范围,Action范围的国际化资源文件管理实现。

9.struts2支持多种视图类型

###2.Struts2的核心是什么,体现了什么思想?

Struts2的核心是拦截器,基本上核心功能都是由拦截器完成,拦截器的实现体现了AOP(面向切面编程)思想

 

###3.为何继承ActionSupport

因为ActionSupport实现了Action接口,提供了国际化,校验的功能。

ActionSupport实现了国际化功能:因为它提供了一个getText(String key)方法实现国际化,该方法从资源文件上获取国际化信息。

Action接口提供了五个常量(success,error,login,input,none)。

(s?k'ses,er?(r) n?n

 

###4.模型驱动与属性驱动是什么 模型驱动使用时注意什么问题

答:模型驱动与属性驱动都是用来封装数据的。

 

1.模型驱动:在实现类中实现ModelDriven<T>接口使用泛型把属性类封装起来,重写getModel()方法,然后在实现类里创建一个属性类的实例,

2.属性驱动:在实现类里定义属性,生成get与set方法,通过属性来拿值。

 

###5.Struts2是怎样进行值封装的?

struts2的值封装实际上是采用了ognl表达式.

 

###6.Struts2如何进行校验

1.每个Action类有一个校验文件,命名 Action类名-validation.xml,且与Action类同目录,这是对action里面所有的方法进行校验。

 

2.对Action里面的指定方法做校验使用Action的类名-访问路径_方法名-validation.xml。

在效验文件里又分为两种:

字段校验:字段用什么校验器来校验。

非字段校验:是用校验器校验什么字段。

 

###7.谈谈Struts2 的国际化

在struts2中是使用了拦截器来实现国际化。

具体是先配置属性文件,格式是文件名_语言_国家名.properties,然后放的位置有Action同包位置,

package位置,全局位置(要在常量里面配置), 然后页面通过s:text或者key属性去访问

###8.OGNL是什么你在项目中如何使用它

OGNL是:对象图形导航语言。

在struts2中的作用:

ognl的实现关系:ActionConetxt。

ognl 3个常用的符号 # $ %

#

 

1 构造map,list集合。 2 取ognl上下文的值。 3 用来过滤集合。 $

1 在校验框架中取资源文件中的值。

2 可以在配置文件中传递参数。

 

%

使用百分号可以进行转义。

 

###9.Strust2如何访问Servlet API

1:通过ActionContext可以获得request,application,session三个作用域(struts2实际上是通过适配器

来把servlet的api转换为一个map,并把这些map放在ActionContext里面)。 2:通过ActionContext的子类ServletActionContext去获取原滋原味的API。

3:可以通过实现ServletRequestAware接口,重写里面的setServletRequest方法可以获

得request,实际上是通过set的依赖注入。

 

###10.什么是拦截器 说说Struts2用拦截器来干什么 说出6个拦截器来

解释:在访问类的某个方法或者属性之前执行,拦截的是Action的请求,进行拦截然后在方法的执行前或者之后加入某些操作。

作用:国际化,权限,效验等与源代码无关的操作。

拦截器:

国际化,表单重复提交,类型转换,自动装配,数据封装,异常处理,模型驱动,请求参数,处理类型转换错误,日志拦截器。

 

###11.如何实现自定义拦截器? 需要注意什么?

实现:

1.可以实现Interceptor接口,重写doIntercept方法指定某个方法进行拦截,或者继承AbstractInterceptor类,重写intercept方法。

2.在xml配置文件中定义自定义拦截器,然后注入到拦截器栈中,再把拦截器引用到action中。

3.可以配置到某个action单独使用,也可以配置到包下面的所有action使用。 注意:

要把默认的拦截器栈重新引用,否则会被覆盖。

###12. ActionContext是用来干什么的

ActionContext是Action的上下文。

 

###13.为什么要继承默认的包?

因为在Strtus2里面默认有很多的常量,拦截器,还有一些bean,如果继承默认的包,这些默认值和常量就会继承过来,

###14.常见的有哪几种结果集类型?

dispatcher:指得是转发,默认的结果集类型

redirect:重定向,

redirectAction:重定向到一个Action

stream:是返回一个流,一般用在文件下载上面

 

###15.开发项目时struts2在页面怎样拿值?

从值栈中或者是ognl的上下文

###16.怎么样用Struts2进行文件的上传或者下载

上传:

1.在jsp用了s:file标签,把s:from的enctype 属性设置为 multipart/form-data

2.在action里面定义三个字段 File file ,String [file]ContentType,String [file] FileName

3.用输出流转化成硬盘上面的文件

下载:

1.在struts.xml中配置result为stream的类型

2.在action定义四个属性,默认的有个是InputStream 的类型叫inputStream的,从硬盘上面读取文件到这个流赋值即可.

contentType; contentLength; contentDisposition; inputStream;

 

###17.简单讲下struts里面的标签,说不少于5个

s:if

s:form

s:url

s:property

s:iterater

 

###18.默认struts2里面的标签取值都是从那里取值的

默认都是从OGNL值栈里面取值的

###19.ValueStack分为那两部分,组成部分是什么,分别怎么访问

 

分为:

对象栈和ContextMap

访问:

1.对象栈前台可以直接访问

2.ContextMap访问的时候前面加#

 

###20.标签<s:property>和el表达式有什么区别,

相同:

都可以从值栈里面取值

区别:

el表达式只能取属性有get set方法的简单数据类型

s:property标签:取得数组的一些方法等复杂数据对象类型

###21.说下重复提交的解决思路,Struts2是怎么样解决重复提交的

1.在页面表单域加入一个隐藏的s:token字段,然后在session里面也加入同样的值

2.当用户第一次请求的时候,把request的值和session对比,相同就通过请求,执行下面拦截器,并且移除Session里面的值

3.如果第二次请求时候,Session已经没有这个值,那么就阻断当前请求,定位重复提交 Struts2是通过s:token标签来完成重复提交思路的

 

spring的面试题部分

 

###1.Spring的aop你怎样实现?

 

用动态代理和cglib实现,有接口的用动态代理,无接口的用cglib

 

###2.Spring在SSH起什么作用

 

为大部分框架提供模版,常见的核心类提供初始化,并且整合三层框架

 

###3.Spring容器内部怎么实现的

 

内部用Map实现,或者说HashMap

 

###4.怎么样理解IOC与AOP

 

IOC是一种控制反转的思想,降低了对象的耦合度,AOP是面向切面编程,非侵入式编程,实现了非业务性编程(公共功能),譬如日志,权限,事务等等

 

###5.Spring的事务,事务的作用。

 

Spring里面的事务分为编程式事务和声明式事务,一般用声明式事务,用来控制数据操作的完整性,一致性

 

###6.Spring的IOC和AOP你在项目中是怎么使用的?

 

IOC主要来解决对象之间的依赖问题,把所有的bean的依赖关系通过配置文件或者注解关联起来,降低了耦合度,AOP一般用来整合框架时候都可以用得到,

事务用的最多,还有个别日志,权限功能也可以用到

 

###7Spring主要使用了什么模式?

 

工厂模式-->每个Bean的创建通过方法

 

单例模式-->默认的每个Bean的作用域都是单例

 

代理模式-->关于AOP的实现是通过代理,体现代理模式

 

###8.Spring bean的作用域.

 

Scope作用域有4种,常见的有单例或者多例,默认是单例

 

###9.Spring的事务是如何配置的?

 

1.先配置事务管理器TransactionManager,不同的框架有不同属性

 

2.再配置事务通知和属性,通过tx:advice

 

3.配置<aop:config>,设置那些方法或者类需要加入事务

 

###10.Spring的配置文件最好使用什么文件?

 

xml,因为它是最简单,最流行的数据格式

 

###11.你使用过Spring中的哪些技术?

 

bean的管理,AOP技术,IOC技术 ,事务等

 

 

###12.为什么要用Spring

 

降低对象耦合度,让代码更加清晰,提供一些常见的模版

 

###13.说下Spring的注解

1.bean的标记注解

 

@Component 通用注解 @Repository 持久层注解 @Service 业务层注解 @Controller:表现层注解

 

2.bean的自动装配注解

 

@AutoWired 默认是按照类型装配,如果有多个类型实现可以用Qualifier来指定名

@Resource 默认是按照名称来装配,是JDK里面自带的注解,默认情况下用@AutoWired注解

 

###15.写过类似Spring AOP的操作吗?

 

简单的写过,譬如前置通知,后置通知的方法,环绕通知,事务就是典型的AOP的实现

###16.Spring中的AOP在你项目中是怎么使用的,用在哪里?

 

Struts2和hibernate整合时候都可以用得到, 事务用的最多,还有个别日志,权限功能也可以用到

 

###17.Spring的事务(传播属性,隔离级别)。

 

七大传播属性,四大隔离级别

###19.Spring DI的几种方式

 

setter注入和构造器注入,一般用setter注入

 

###20.依赖注入的原理

 

就是通过反射机制生成想要的对象注入

 

###21.说一下整合Spring的核心监听器。

 

这个是在SSH整合的时候使用,是整个WEB项目启动的时候初始化Spring的容器. 具体是在web.xml里面配置的ContextLoaderListener

Spring配置文件中的核心是个监听器,是用来初始化Spring的容器

 

###22.Spring你们为什么用配置文件而不使用注解?

 

配置文件耦合度低,容易维护,尤其是在切面或者事务的时候,只配置一次就可以让很多代码拥有事务,

 

###23.Spring和Hibernate的事务有什么区别?

 

Spring的事务提供了统一的事务处理机制,包含了JDBC,Hibernate,IBatis等事务实现,而Hibernate只处理自己事务

 

###24.Struts2与Spring整合先启动那个容器。

 

先启动监听器,因为先要初始化容器,初始化容器了以后Action才能从容器里面获得

###26.让你写Spring的容器,你是怎样实现的?

 

我们可以写一个HashMap,如果并发考虑的话要写并发的Map,把bean的名字放在map的key,bean的实现map的value

 

###27.谈谈Spring的IOC和AOP,如果不用Spring,怎么去实现这两个技术。

 

ioc用反射实现 ,AOP用动态代理实现

 

###28.Spring事务和Hibernate事务的操作上面的区别?

 

hibernate的事务只能手动显示代码的方式控制创建事务与提交事务以及回滚。

Spring可以通过配置文件设定一类class事务的创建与提交以及回滚,也可以显示代码方式控制。

 

###29.讲下Spring的七大事务传播

 

有七个,常用有两个REQUIERD, REQUIRED_NEW,REQUIERD表示两个事务的方法调用的时候,前面的时候和后面的合并成一个事务,REQUIRED_NEW是重启一个事务,各干各的

###30.在同一进程里,有A,B两个方法都对不同的表进行更新数据,假如A方法出异常了,若要B方法执行,怎样配置事务级别,若不要B方法执行,又该怎样配置?

 

前者用REQUIRED_NEW,后者用REQUIRED

 

###31.事务并发会引起什么问题,怎么解决

事务并发会引起脏读,幻读,不可重复读等问题,设定事务的隔离级别就可以解决

###32.事务的隔离级别

 

Spring定义有四种,但是常见的是READ_COMMIT,Oralce有两种实现,MySQL有四种

###33.Spring的IOC容器与工厂类有什么区别?

 

IOC(Inversion of Control)对Bean的控制能力更强,能控制对象自动注入,还可以控制生命周期,而工厂类只是简单的创建一个对象,没有什么控制能力

 

###34.事务的安全问题:锁机制的实现原理及在项目中的使用

 

锁有悲观锁和乐观锁,悲观锁一般假设每个人都会修改数据,默认情况下把数据都锁住,影响性能,但安全性高.

 

乐观锁是假设每个人都只读下数据,不会修改数据,性能比较高,但是安全性较低,一般通过增加类似于版本控制里面版本号来解决问题

###35.讲下BeanFactory和ApplicationContext的区别

 

BeanFactory是Spring容器顶级核心接口,比较早,但功能比较少,getBean就是BeanFactory定义的,

 

ApplicationContext是Spring里面的另外一个容器顶级接口,它继承于BeanFactory,但是提供的功能譬如校验,国际化,监听,

对Bean的管理功能比较多,一般使用ApplicationContext

 

###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方式提交的方法,怎么配置

springMVC模式的面试题部分

可以在@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,List,Set等,一般用String比较好,如果是AJAX请求,返回的可以是一个集合

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

 

SpringMvc根据配置文件中InternalResourceViewResolver(内部资源视图解析器)的前缀和后缀,用前缀+返回值+后缀组成完整的返回值

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

 

在返回值前面加"forward:"就可以让结果转发,譬如"forward:user.do?name=method4" 在返回值前面加"redirect:"就可以让返回值重定向,譬如"redirect:http://www.uu456.com" ###f-sm-15. SpringMvc用什么对象从后台向前台传递数据的

 

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

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

 

ModelAndView

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

 

可以声明一个request,或者session先拿到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请求到核心控制器DispatcherServlet,spring容器通过映射器去寻找业务控制器,

使用适配器找到相应的业务类,在进业务类时进行数据封装,在封装前可能会涉及到类型转换,执行完业务类后使用ModelAndView进行视图转发,

数据放在model中,用map传递数据进行页面显示。

 

### 1.讲下MyBatis和Hibernate的区别?

 

MyBatis是JDBC的轻量级封装,把Sql和java代码独立出来,性能相对比较高,写SQL语句相对于比较灵活,并且容易调试,一般用在大型项目中.

 

Hibernate是JDBC的重量级封装,开发速度比较快,但是性能比较低,调试不方便,一般适合对进度要求的比较高的中小型项目

 

###2.什么是MyBatis的接口绑定,有什么好处

接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,

这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置.

 

###3.接口绑定有几种实现方式,分别是怎么实现的?

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select MyBatis的面试题部分

 

 

@Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下,

要指定xml映射文件里面的namespace必须为接口的全路径名.

 

###4.什么情况下用注解绑定,什么情况下用xml绑定

当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多

###5.MyBatis实现一对一有几种方式?具体怎么操作的

 

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置

###6.如果要查询的表名和返回的实体Bean对象不一致,那你是怎么处理的?

 

在MyBatis里面最主要最灵活的的一个映射对象的ResultMap,在它里面可以映射键值对, 默认里面有id节点,result节点,它可以映射表里面的列名和对象里面的字段名. 并且在一对一,一对多的情况下结果集也一定要用ResultMap

 

###7.MyBatis里面的动态Sql是怎么设定的?用什么语法?

MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,

where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉

 

###8.MyBatis在核心处理类叫什么

MyBatis里面的核心处理类叫做SqlSession

 

###9.IBatis和MyBatis在细节上的不同有哪些

在sql里面变量命名有原来的#变量# 变成了#{变量} 原来的$变量$变成了${变量}, 原来在sql节点里面的class都换名字交type

原来的queryForObject queryForList 变成了selectOne selectList

原来的别名设置在映射文件里面放在了核心配置文件里

 

###10.讲下MyBatis的缓存

MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,

默认是打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>

 

###11.MyBatis(IBatis)的好处是什么

ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的

维护带来了很大便利。

ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数据库编程的重复工作。

因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,

因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。 ###12.MyBatis里面怎么处理分页

用插件分页

 

###13.MyBatis里面怎么样获得刚插入的主键

 

把insert节点的useGeneratedKeys=true设置先生成主键,然后keyProperty="id",把生成的主键指向属性.

 

###1. 为什么要用自定义标签?

 

①Jsp中写代码比较混乱,难以维护

②把一些重复的功能都抽取出来,方便复用。

 

###2. 自定义标签分为几个步骤.

 

1.编写标签处理器类(SimpleTagSupport的实现类)

重写doTag()

2.编写标签库文件(WEB-INF/xxx.tld)

整个文件的定义: <short-name> <uri>

标签的定义: <tag>

3.在jsp页面使用标签:

导入标签库(xxx.tld/)

使用标签

 

###3. 自定义标签类要继承哪个类?

 

SimpleTagSupport类

sim·ple tag s?'p?rt

 

###4. 怎么配置自定义标签的属性

 

在.tld文件<tag>标签中添加<attribute>,

通过<name>标签设定自定义标签的标签名。 JSTL &EL的面试题部分

###5. 为什么要用EL表达式,有什么好处

 

1.在页面中用js脚本和jsp表达式来获取数据显示比较麻烦

a:需要条件判断

b:可能需要强转

2.好处是EL表达式简单易用,默认可访问所有的JSP隐藏对象。

 

###6. EL表达式的语法是什么?

 

美元符号加大括号 ---> ${ EL表达式 }

###7. EL有哪两种访问格式,有什么区别?

 

EL 提供“.“和“[ ]“两种运算符来存取数据。

当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:

${ user. My-Name}应当改为${user["My-Name"]}

如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如: ${sessionScope.user[data]}中data 是一个变量。

 

###8. EL表达式中有哪些隐藏对象,举几个例子?

 

pageContext : JSP页面的上下文

param : 参数

paramValues : 参数值

header : 头信息

headerValues : 头的值

cookie : 缓存

initParam : 初始化参数

 

###9. EL表达式中怎么样拿到request,session里面的值?

 

例 :

可以通过它的隐藏对象RequestScope来获取到Request范围的属性名称所对应的值。 可以通过它的隐藏对象sessionScope来获取到session范围的属性名称所对应的值。

###10. EL表达式怎么样拿到用户请求的参数?

 

可以用${param.name} 来获取用户请求的参数

 

###11. EL表达式怎么样得到上下文路径?

 

${pageContext.request.contextPath}

###12. EL表达式怎么样拿到request?

 

RequestScope

 

###13. JSTL全称是什么?

 

java服务器页面标准标签库

(JavaServer Pages Standard Tag Library)

 

###14. JSTL是怎么使用的?

 

将jstl.jar、standard.jar 复制到 Tomcat 的 WEB-INF\lib 中. 若要在 JSP 网页中使用 JSTL 时,一定要先做下面这行声明: < %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

主要提供给 Java Web 开发人员一个标准通用的标签函数库。Web 程序开发人员能够利用 JSTL 和 EL 来开发 Web 程序,

取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性。

 

###15. JSTL分为几个标签库?

 

①核心标签库

②国际化标签库

③数据库标签库

④XML标签库

⑤函数标签库

 

###16. JSTL里面判断标签是什么?

 

1. <c:if>

2. <c:choose>

<c:when></c:when>

<c:otherwise></c:otherwise>

</c:choose>

 

###17. JSTL里面的属性是否可以从EL表达式获取?

 

可以${xxxScope.attribute}

 

###18. JSTL里面的循环标签有几种,各是怎么用的?

 

1. <c:forEach> 用于迭代数字或集合;

2. <c:forTokens> 用于迭代字符串标记。

 

###19.怎么样得到循环标签里面的状态值,譬如index,count等?

在forEach循环标签中加入varStatus="s",然后直接用EL表达式: <c:forEach items="${atts}" var="item" varStatus="s">

<c:if test="${s.last}">

------

</c:if>

 

index:${s.index}<br/> count:${s.count}<br/> first:${s.first}<br/> last:${s.last}<br/> ${item}<br/><br/> </c:forEach>

###1.为什么要用自定义标签

自定义标签其实是一个Java类,他封装了一些标签代码,形成一个

具有某个功能的新标签。

1.增加了可扩展性。

2.增加了可复用性。

 

###2.自定义标签分为几个步骤.

1.创建标签的处理类(Tag Handler Class)

2.创建标签库描述文件(Tag Library Descrptor File)

3.在JSP文件中引入标签库

 

###3.自定义标签类要继承那个类

TagSupport

 

###4.怎么配置自定义标签的属性

在.tld 文件里配置

 

集合类面试题

###1.请讲下Java里面的容器

 

分两大类,Map和Collection。而Collection又有子接口List

(数据存储顺序和插入顺序是一样的)、Set(里面的元素具有唯一性)

 

 

Map是存储键值对的,里面的健不可以重复,但值可以重复 List主要有ArrayList和LinkedList两种实现。实现的数据结构不同, 所以主要的区别也都是和数据结构相关的。 ArrayList基于数组,随机访问快, 而对于中间元素的插入删除效率比较低,而且需要考虑扩容问题。 LinkedList,则 基于链表,和ArrayList提到的正相反,随机访问慢, 但对于中间元素的插入和删除更有效率。 Set也是一种Collection,和List比起来主要体现在元素唯一性。

###2.请说下Iterator的作用

 

迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素 特性:在遍历集合时 可判断是否有下一个元素

###3.说下ArrayList和LinkedList的区别和联系,并说明什么情况下用它们

 

区别:ArrayList用于对象的随机访问速度快,没有顺序

LinkedList实现机制是链表式的,和顺序有关,速度比ArrayList慢

--->联系:ArrayList和LinkedList都是List接口的实现类

当要快速获取一个值时,用ArrayList,用于顺序插入操作时,用LinkedList.

 

###4.说下List,Set,Map三种集合各有什么特征

 

List集合中的元素可以重复,

Set集合中的元素不可以重复

Map集合用键-值映射存放对象,Map容器中的键对象不能重复,值对象可以重复

###5.HashSet和TreeSet有什么区别,什么时候用它们

 

区别:HashSet中的元素不能重复,没有顺序

TreeSet中的元素不能重复,但有顺序

当集合中的元素需要排序时,用TreeSet

一般情况下用HashSet,因为不需要排序,速度比TreeSet快

 

###6.什么是泛型,怎么使用的,有什么好处?

 

答案

泛型又分为:方法泛型和类泛型。

定义一个集合时,可以知道里面定义的是什么类型

使用:在集合类型后面加< 数据类型 >

使用泛型后,从集合中取得元素后就不用再用强转

 

###7.什么是for each循环,它可以循环那些数据类型

 

答案

 

通过对象拿到集合里的值 可以用来循环集合和数组

###8.写一个for each循环看看

 

for(Object object : list){

System.out.println(object);

}

 

###9. 什么是强转怎么写的,有什么优缺点,一般要多用还是少用,为什么?

 

一般在继承的基础上用. Person person=new Student(); Student student=(Student)person; 把运行期的强转为编译期的. 编译期不会出错.运行期容易出错.所以一般少用

###10.HashMap和Hashtable有什么区别,一 般情况下常用那个?

 

HashMap的键-值都可以为空(null)

Hashtable的键-值都不可以为空(null),线程安全 ,

一般情况下用HashMap

 

###11.Hashtable名字为什么没有驼峰命名

 

Hashtable的由来比较古老,当时还没有命名规范

###12.Collections和Collection有什么区别

 

Collections是一个工具类,可以直接调用List和Set的方法

Collection是一个接口,是List和Set集合的父接口

 

###13.写出Collections的6个方法,并详细解释

 

sort():对集合进行排序

shuffle():打乱集合中的元素顺序

addAll():将一个集合添加到另一个集合中

max():判断集合中的最大值

min():判断集合中的最小值

copy():将一个集合中的元素复制到另一个集合中去

fill():将一个集合中的元素全部替换成指定的元素

 

###14.Arrays类是做什么的,写出它的常用6个方法

 

Arrays是数组的一个工具类

sort():对数组进行排序

binarySearch():搜索数组指定元素的下标

copyOf():复制数组中指定长度的元素

deepEquals():比较两个数组的深度

fill():把数组中的所有元素替换成指定元素

equals():比较指定两个数组的元素是否相等

hashcode():将指定数组的指定范围复制到一个新数组。

 

###15.比较下集合和数组的优缺点

 

集合是多个对象的容器,可以将不同数据类型的多个对象组织在一起

数组类型是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的

 

###16.如何对一个对象排序,有几种方法

 

把对象放入List集合中,用Collections工具类调用sort()方法进行排序,

但是这个类必须实现Compareble接口才行

把对象放在Set集合中,用TreeSet()实现类对集合直接排序

 

###17.在集合里面怎么判断两个对象相等,要实现什么方法

 

重写equals方法

###18.怎么样把集合转化成数组,或把数组转化为集合

把集合转为数组,可以用toArray()方法

把数组转为集合时, for each循坏,先把数组中的元素转为String型,再放到集合里

###19.分别写出List,Set,Map里面的5个常用方法

 

List:

add()新增 clear()清除 contains()判断是否包含某个元素

indexOf()一个元素在集合中首次出现的位置

set()把指定下标的元素替换成自定义元素

Set:

add()新增 clear()清除 contains()判断是否包含某个元素

 

remove():把集合中指定下标的元素删掉 size():返回集合长度 Map: containsKey()是否包含指定key containsValue()是否包含指定value keySet()返回所有key put()添加元素 Remove()移除

###20.HashMap与LinkedHashMap,和TreeMap的区别。

共同点:HashMap,LinkedHashMap,TreeMap都属于Map的实现类.

不同点: 1.HashMap里面存入的键值对在取出的时候是随机的,

TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.

 

###21.HashMap怎么实现有序

可以转化放入TreeMap里面,或者把key放入LinkedList里面。

 

###22.在List里面怎么去掉重复的数?

 

通过把List里面的数据放入HashSet可以去除重复

 

###23.在List里面有几种排序?

 

答:两种:实现Comparable<Article>接口,实现里面的CompareTo方法进行排序。 还有调用Collections.sort()方法排序!

###24.说一下链表跟数组的区别

 

链表:用一组任意储存单元存放线性表的数据元素,并且通过指针链相接结点的序列称为链表。

是一种常见的数据组织形式,它采用了动态分配内存的形式实现。

需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放, 不会造成内存空间的浪费。不靠数组实现,没有下标。

数组必须事先定义固定的长度,不能适应数据动态增减的情况。当数据增加时,

可能超出原先定义的元素个数;当数据减少时,造成数据浪费。在使用的时候还要数组初始化,

注意数组的下标越界。

 

###25.HashSet的理解

 

HashSet实现了Set接口,HashSet不保证集合的迭代顺序,允许使用Null元素。

HashSet的底层使用了HashMap,使用HashMap实列进行对集合的元素进行操作,然后再封装成HashSet的操作。

 

###26.什么类可以实现有序存储(除ArrayList以外)?

一种按照插入的顺序排序,譬如LinkedList,LiskedHashMap,

另外一种是插入后重新排序TreeSet,TreeMap

 

###27.HashMap和ArrayList是不是都是线程不安全的?

 

ArrayList是线程不安全的;HashMap是线程不安全的; 还有我们常见的一些JAVA集合都是线程不安全,这样做是为了提高性能

在JDK5以后提供了线程安全的并发包java.util.concurrent并发包,譬如里面的类CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap等

 

###28.HashMap和TreeMap的区别?

 

TreeMap实现Map接口,能够把它保存的记录根据键排序,默认是按键值的升序排序, 也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。 hashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,hashMap不支持线程的同步,

即同一时刻可以有多个线程同时写hashMap.可能会导致数据的不一致。 TreeMap不仅可以保持顺序,而且可以用与排序。

HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,

如果你需要得到一个有序的结果你就使用TreeMap.

 

###29.ArrayList集合加入1万条数据,应该怎么提高效率

 

因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,

所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能

 

###30.你知道HashMap底层是怎么实现的吗?

 

简单的说是一个数组,因为数组的性能比较好,数组里面放的是Entry类,HashMap类有一个叫做Entry的

内部类。这个Entry类包含了key-value作为实例变量。当存储或者获取对象的时候, 就根据哈希算法,对象的hashCode调用得到这个下标,以便实现快速访问.

 

###31.怎样遍历List Set,Map

 

List 和Set可以通过一般for循环,迭代器循环,或者增强型循环来遍历, 其中一般for循环性能最快,

迭代器循环可以判断和得到下一个值,for each增强型循环扩展性强,但性能稍低.

Map循环可以通过keySet得到Key的Set集合,然后遍历这个集合就可以得到所有的Value

 

 

###32.Set为什么是不允许重复的。

set的实现机制不允许重复的

 

###33.ArrayList为什么要用for循环,为什么要用迭代器,又有什么好处。

 

for循环通过对象拿到集合里的值

迭代器可以实现Collection接口的方法,可以一个一个地获取集合中的元素 在遍历集合时 可判断是否有下一个元素

 

###34.你对与队 列了解多少你是怎么用的。

 

答:队列是一种数据结构,FIFO 先进先出有点类似与栈,只是在队列中第一个插入的数据项也会被最先删除,

队列的两个基本操作:

一个是插入一个数据项,即把一个数据项放入队尾

另一个是移除一个数据项,即移除队头的数据项.

 

###35.如果我要存取很多的数据,但是又不需要重复的,要选择什么容器,说一下为什么使用它,它是哪个的子类?

 

答:Set容器,它是不允许重复的,它是collection的子类

 

###36.哪种方法可以得到Map的Key?

 

keySet()方法 面向对象的面试题部分

###1) 面向对象的优点?

 

答案

 

易扩展 易维护 面向对象是相对面向过程的

 

###2) 如何声名一个静态块?

 

答案

 

在类中方法外声明 static关键字+代码块

 

###3) 接口与抽象类的区别?

 

答案

 

类是单继承的,但是可以实现多个接口

抽象类里的方法可以有实例方法也可以有抽象方法

接口里面只能有抽象方法。

!!!注意:关注一个事物的本质的时候,用抽象类;当你关注一个行为的时候,用接口。

###4) 用于类和接口的关键字

 

答案 定义类的是class,如类文件的开头都是:public class 类名{ } 定义接口的是interface,如public interface 接口名{ } 用于实现接口的是implements。

###5) 如何创建数组?

 

答案 数组是new出来的 或者直接可以声明, 举个例子 String[] array={"1","2"}; 或者String[] array=new String[10];

###6) 如何创建一个构造方法对象的格式?要注意哪些?

 

答案

 

构造器是为了创建一个类的实例Platypus p1 = new Platypus();

注意:方法名与类名一致

 

###7) 类的组成 和执行顺序

 

答案

 

属性

 

方法

 

静态块

非静态块

执行顺序: 先父类,后子类,静态块 静态字段 非静态块 非静态字段 构造器 方法

###8) main方法必须被什么修饰?

 

答案 方法名必须是main 是被public static void 修饰 传入String数组

###9) 如何理解面向对象

 

答案

 

世间万物皆对象,对象有具体的的实例化,任何方法或者属性都要写在对象(类)里面

###10) 构造方法可否能被重写:

 

答案 构造方法不能被继承,因此不能重写,但能被重载。

###11) 静态方法中能有静态的变量吗?

 

答案

 

不能 静态变量是类变量 不可以定义在方法里

 

###12) String与StringBuffer的区别:

 

答案

String 是不可变的 可以直接使用它的方法 用来创建字符串

而 Stringbuffer无论怎么修改都是一个对象

如果在字符串改变,或者迭代改变的情况下Stringbuffer比String运行快

 

###13) 重载(overloading)与重写(override)的区别:

 

答案

 

1.重载发生在同一个类。 重写发生在父子类中。

2.重载参数签名不同,而重写相同且返回类型相同。

3.方法名相同,重写override是父类与子类之间多态性的一种表现,重载overload是一个类中多态性的一种表现。

 

###14) (= =)与equals()的区别:

 

答案

 

 

如果是基本类型比较,那么只能用==来比较,不能用 equals 对象间的比较使用equals ==比较的是对象中的地址 而equals比较的对象 的内容

###15) Abstract与interface的区别:

 

答案

 

Abstract是用来声明抽象类抽象方法,而interface是接口 抽象类可以有

变量,有方法的实现,接口内只能有常量和抽象方法

 

###16) StringBuilder和StringBuffer的区别:

 

答案 StringBuilder比StringBuffer更加快捷,但是StringBuilder线程不安全

###17) JRE,JDK,JVM分别是什么,它们有什么联系:

 

答案

 

jre 运行时环境,jvm虚拟机 jdk java开发工具包 jvm是jre的一部分

 

###18) 普通类继承抽象类为什么一定要重写其中的抽象方法?

 

答案

必须要实现的,也就是要重写,如果不实现,子类无法对象实例化。

 

###19) 什么是拆箱和装箱?

 

答案

 

装箱就是将基本类型转换为对象类型

拆箱就是将对象类型转换为基本类型。

 

###20) 继承与实现的区别?

 

答案

 

继承针对类,实现针对接口。

单继承、多实现的。

实现要重写接口里面的方法,而继承不需要。

 

###21) Abstract为什么不能与,private,final,同时使用?

 

答案

 

抽象方法需要被子类重写 所以不能够用private final修饰

 

###24) 继承最大好处?

 

答案 可以对父类的方法进行重用,节省时间

###25) 写出String类常见的5个方法,并详细解释?

 

答案 indexOf()返回指定字符串在该字符串出现的序列 startsWith()判断该字符串是否以指定字符开始 concat() 将指定字符串连接在该字符串的结尾 length()返回字符串的长度 substring返回该字符串从索引开始 结束于字符串末尾 或者指定索引的一个子字符串

###27) 普通方法的方法名可以与类名一致吗?

 

答案

 

可以,构造器就是

 

###28) 在什么情况下局部变量会覆盖全局变量?

 

答案

当局部变量名与全局变量名相同 类型相同

 

###29) static 修饰的方法可否支持多态?

 

答案

 

不支持多态,如果父类声明一个对象,子类实现这边变量,那么调用static修饰的时候会调用父类的,而不是子类的.

除了工具类。用static修饰的变量会发生一处改变则全部改变。

 

###30) 使用数组前应该注意的什么?

 

答案 数组下标是否越界 对数组进行初始化

###31) 如果一个类继承了父类,父类里有一个静态块,子类里也有个静态块 ,对子类进行实例,父类的静态块先执行还是子类的先执行?

 

答案

 

父类的静态块先于子类的静态块的执行

 

###32) Java语言最大的特点?

 

答案 跨平台性(一次编译,多次执行)

###33) 请你说说byte short char之间可以互相转换吗?为什么?

 

答案

 

可以通过强转

 

###34) 请说说引用和对象?

 

答案

对象和引用是分不开的,对象生成一个地址,引用则指向了这个地址

A a=new A();

a为引用 等号右边的是对象

 

###35) 怎样将一个String添加到另一个String的后面?

 

答案

 

(StringBuffer ,StringBuilder)的append方法

concat

 

###36) 有几种数据类型?

 

答案

 

JAVA数据类型分基本数据类型和引用对象类型。

 

###37) 传参有几种类型?有几种特殊类型?

 

答案

 

基本数据类型 引用对象类型

 

###38) 什么是匿名类,有什么好处

 

答案 匿名类没有名字的类 ,封装性好,比较安全用了一次便可以丢弃 接口不能new,但语法中的匿名类却和new一个接口的的语法结构很相似。

###39) jar是什么格式的文件,有什么好处

 

答案

它允许将许多class文件组合成一个压缩文件,方便管理class文件

###40) java和javac,javaw各有什么作用

 

答案 java:运行程序 javac:编译java文件至class文件 javaw: 不需要打开dos窗口就可以运行

posted @ 2017-05-28 20:27  一笑奈何莫洛兮  阅读(203)  评论(0编辑  收藏  举报