zoukankan      html  css  js  c++  java
  • 【转】框架面试

    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-INFlib 中. 若要在 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窗口就可以运行

  • 相关阅读:
    github绑定host
    PHP安全过滤函数
    PHP界定符 <<<EOT
    file_get_contents模拟表单(POST/GET方式提交)
    排序算法(一)冒泡排序
    MySQL的limit查询优化
    SQL Server日期函数集合
    系统查找存储过程和触发器
    C#中跳转页面有那几种方法,简述其区别
    知道sql数据库中的哪个数据表最大
  • 原文地址:https://www.cnblogs.com/y654063871/p/6916564.html
Copyright © 2011-2022 走看看