欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    《大唐电信面试题》word版.docx

    • 资源ID:53949744       资源大小:228.50KB        全文页数:19页
    • 资源格式: DOCX        下载积分:11.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要11.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《大唐电信面试题》word版.docx

    8、abstract class和interface有什么区别? 注:这个答案是我见过的最详细的答案含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。(我:很多子类的应用都不用去实现每个抽象方法的,所以适配器这个东西出现了)接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。下面比较一下两者的语法区别:1.抽象类可以有构造方法,接口中不能有构造方法。2.抽象类中可以有普通成员变量,接口中没有普通成员变量3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。5. 抽象类中可以包含静态方法,接口中不能包含静态方法6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。7. 一个类可以实现多个接口,但只能继承一个抽象类。下面接着再说说两者在应用上的区别:接口更多的是在系统架构设计方面发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,伪代码如下:注:突然想起,普通的类也可以实现这种模式啊?我的答案:抽象类的作用有两个:一,因为有些方法父类没办法或者不需要去实现,因为子类的实现方式各有不同。这是在定义类的时候就知道的事情,所以父类去实现那个方法确实没有必要。二,有些父类方法必须要让子类去实现,这是规定,大家必须遵守!这个例子不错:public abstract class BaseServlet extends HttpServletpublic final void service(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException记录访问日志进行权限判断if(具有权限)trydoService(request,response);catch(Excetpion e)记录异常信息 protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException; /注意访问权限定义成protected,显得既专业,又严谨,因为它是专门给子类用的public class MyServlet1 extends BaseServletprotected void doService(HttpServletRequest request, HttpServletResponse response) throws IOExcetion,ServletException本Servlet只处理的具体业务逻辑代码 父类方法中间的某段代码不确定,留给子类干,就用模板方法设计模式。备注:这道题的思路是先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。我补充:3、ArrayList和Vector的区别答:这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素(本来题目问的与hashset没有任何关系,但为了说清楚ArrayList与Vector的功能,我们使用对比方式,更有利于说明问题)。接着才说ArrayList与Vector的区别,这主要包括两个方面:. (1)同步性:Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。(2)数据增长:ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。 总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。4、HashMap和Hashtable的区别(条理上还需要整理,也是先说相同点,再说不同点)HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable。 HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。就HashMap与HashTable主要从三方面来说。 一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 三.值:只有HashMap可以让你将空值作为一个表的条目的key或value 5、List 和 Map 区别?一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。JAVA中创建一个对象有哪几种方法,有什么区别?以String类为例第一种:String str = new String();第二种:String str = Class.forName(String).newInstance()两种方法创建的对象实体没有任何区别,如果硬说有区别的话,那就是第一种直接调用了本类的构造函数,如果本类有多个构造函数重载的话,可以添加参数。而第二种是调用这个类的默认构造函数,即不带任何参数的。第一种方法是最常用,最普遍的用法。第二种方法叫做工厂模式,是一种较安全的方法。我晓得的有两个一个是直接通过new另外一个是Class.forName(className).newInstance()两种方法的区别是,第一个new是一种静态的实例化一个对象。而第二种可以在方法种动态的实例化一个对象。多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么?答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify.50、Java中的异常处理机制的简单原理和应用。 异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为,Throwable下面又派生了两个子类:Error和Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try.catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try.catch处理或用throws声明,所以系统异常也称为unchecked异常。提示答题者:就按照三个级别去思考:虚拟机必须宕机的错误,程序可以死掉也可以不死掉的错误,程序不应该死掉的错误;java classloader原理初探 ClassLoader是用来处理类加载的类,它管理着具体类的运行时上下文。1.ClassLoader存在的模块意义:1)从java的package定义出发:classloader是通过分层的关联方式来管理运行中使用的类,不同的classloader中管理的类是不相同的,或者即便两个类毫无二致(除了路径)也是不同的两个类,在进行强制转换时也会抛出ClassCastException。所以,通过classloader的限制,我们可以建立不同的package路径以区别不同的类(注意这里的“不同”是指,命名和实现完全一致,但是有不同的包路径。)。那么也是因为有特定的classloader,我们可以实现具体模块的加载,而不影响jvm中其他类,即发生类加载的冲突。2)但是,如果两个在不同路径下的类(我们假定,这两个类定义中,不存在package声明,完全一样的两个类),经过不同的classloader加载,这两个类在jvm中产生的实例可以相互转换吗?答案是否定的。即便这两个类除了存在位置不同之外,都完全一样。经由不同classloader加载的两个类依然是不同的两个对象。通过Class.newInstance()或者Class.getConstructor().newInstance()产生的对象是完全不同的实例。以上两种情况,package可以使得我们的软件架构清晰,但那不是最终作用,如果跟classloader结合起来理解,效果更好。2.ClassLoader的类加载机制:ClassLoader作为java的一个默认抽象类,给我们带来了极大的方便,如果我们要自己实现相应的类加载算法的话。每个类都有一个对应的class与之绑定,并且可以通过MyClass.class方式来获取这个Class对象。通过Class对象,我们就能获取加载这个类的classloader。但是,我们现在要研究的是,一个类,是如何通过classloader加载到jvm中的。其中有几个关键方法,值得我们了解一番:protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException;我们可以假设一个实例在建立时,例如通过new方式,是经由如此步骤实现:ClassLoader.loadClass("classname",false).newInstance()。接下来需要考虑的是loadClass方法为我们做了哪些工作?如何跟对应的.class文件结合,如何将对应的文件变成我们的Class对象,如何获得我们需要的类?在ClassLoader类中,已经有了loadClass默认实现。我们结合源代码说明一下:protected synchronized Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException/ 首先检查,jvm中是否已经加载了对应名称的类,findLoadedClass(String )方法实际上是findLoadedClass0方法的wrapped方法,做了检查类名的工/作,而findLoadedClass0则是一个native方法,通过底层来查看jvm中的对象。Class c = findLoadedClass(name);if (c = null) /类还未加载try if (parent != null) /在类还未加载的情况下,我们首先应该将加载工作交由父classloader来处理。c = parent.loadClass(name, false); else /返回一个由bootstrap class loader加载的类,如果不存在就返回nullc = findBootstrapClassOrNull(name); catch (ClassNotFoundException e) / ClassNotFoundException thrown if class not found/ from the non-null parent class loaderif (c = null) / If still not found, then invoke findClass in order/ to find the class.c = findClass(name);/这里是我们的入手点,也就是指定我们自己的类加载实现if (resolve) resolveClass(c);/用来做类链接操作return c;在这段代码中,应该已经说明了很多问题,那就是jvm会缓存加载的类,所以,在我们要求classloader为我们加载类时,要先通过findLoadedClass方法来查看是否已经存在了这个类。不存在时,就要先由其parent class loader 来loadClass,当然可以迭代这种操作一直到找到这个类的加载定义。如果这样还是不能解决问题,对于我们自己实现的class loader而言,可以再交由system class loader来loadClass,如果再不行,那就让findBootstrapClassOrNull。经历了如此路程,依然不能解决问题时,那就要我们出马来摆平,通过自己实现的findClass(String)方法来实现具体的类加载。这段实现代码摘自Andreas Schaefer写的文章中的代码(这篇文章相当精彩)protected Class findClass( String pClassName )throws ClassNotFoundException try System.out.println( "Current dir: " + new File( mDirectory ).getAbsolutePath() );File lClassFile = new File( mDirectory, pClassName + ".class" );InputStream lInput = new BufferedInputStream( new FileInputStream( lClassFile ) );ByteArrayOutputStream lOutput = new ByteArrayOutputStream();int i = 0;while( ( i = lInput.read() ) >= 0 ) lOutput.write( i );byte lBytes = lOutput.toByteArray();return defineClass( pClassName, lBytes, 0, lBytes.length ); catch( Exception e ) throw new ClassNotFoundException( "Class: " + pClassName + " could not be found" );findClass方法主要的工作是在指定路径中查找我们需要的类。如果存在此命名的类,那么就将class文件加载到jvm中,再由defineClass方法(一个native方法)来生成具体的Class对象。一般来说,经过上述方式来加载类的话,我们的类可能都在一个classloader中加载完成。但是,再强调一下,那就是如果类有不同路径或者不同包名,那就是不同类定义。ClassLoader的工作原理 每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类 系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类 可以使用Thread.currentThread().setContextClassLoader(.);更改当前线程的contextClassLoader,来改变其载入类的行为 ClassLoader被组织成树形,一般的工作原理是: 1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类 2) contextClassLoader请求它的父ClassLoader来完成该载入请求 3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入 Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。 这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader 和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做System ClassLoader Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C+编写的,它用来加载核心类库,在JVM源代码中这样写道: static const char classpathFormat = "%/lib/rt.jar:" "%/lib/i18n.jar:" "%/lib/sunrsasign.jar:" "%/lib/jsse.jar:" "%/lib/jce.jar:" "%/lib/charsets.jar:" "%/classes" Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。 AppClassLoader用来加载Classpath的类,是和我们关系最密切的类。 URLClassLoader用来加载网络上远程的类 1 预先加载与依需求加载 Java 运行环境为了优化系统,提高程序的执行速度,在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载( pre-loading )的方法全部加载要内存当中,因为这些单元在 Java 程序运行的过程当中经常要使用的,主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。 当 java.exe 虚拟机开始运行以后,它会找到安装在机器上的 JRE 环境,然后把控制权交给 JRE , JRE 的类加载器会将 lib 目录下的 rt.jar 基础类别文件库加载进内存,这些文件是 Java 程序执行所必须的,所以系统在开始就将这些文件加载,避免以后的多次 IO 操作,从而提高程序执行效率。 相对于预先加载,我们在程序中需要使用自己定义的类的时候就要使用依需求加载方法( load-on-demand ),就是在 Java 程序需要用到的时候再加载,以减少内存的消耗,因为 Java 语言的设计初衷就是面向嵌入式领域的。 2 隐式加载和显示加载 Java 的加载方式分为隐式加载( implicit )和显示加载( explicit ),上面的例子中就是用的隐式加载的方式。所谓隐式加载就是我们在程序中用 new 关键字来定义一个实例变量, JRE 在执行到 new 关键字的时候就会把对应的实例类加载进入内存。隐式加载的方法很常见,用的也很多, JRE 系统在后台自动的帮助用户加载,减少了用户的工作量,也增加了系统的安全性和程序的可读性。 Java代码 1. Class c = Class.forName("TestClass"); 2.3. TestClass object = (TestClass)c.newInstance(); 4.5. object.method(); Class c = Class.forName("TestClass"); TestClass object = (TestClass)c.newInstance(); object.method(); 通过 Class 类的 forName (String s) 方法把自定义类 TestClass 加载进来,并通过 newInstance ()方法把实例初始化。事实上 Class 类还很多的功能,这里就不细讲了,有兴趣的可以参考 JDK 文档。 Class 的 forName() 方法还有另外一种形式: Class forName(String s, boolean flag, ClassLoader classloader) , s 表示需要加载类的名称, flag 表示在调用该函数加载类的时候是否初始化静态区, classloader 表示加载该类所需的加载器。 forName (String s) 是默认通过 ClassLoader.getCallerClassLoader() 调用类加载器的,但是该方法是私有方法,我们无法调用,如果我们想使用 Class forName(String s, boolean flag, ClassLoader classloader) 来加载类的话,就必须要指定类加载器,可以通过如下的方式来实现: Test test = new Test();/Test 类为自定义的一个测试类; ClassLoader cl = test. getClass().getClassLoader(); / 获取 test 的类装载器; Class c = Class.forName("TestClass", true, cl); 因为一个类要加载就必需要有加载器,这里我们是通过获取加载 Test 类的加载器 cl 当作加载 TestClass 的类加载器来实现加载的。 3 自定义类加载机制 之前我们都是调用系统的类加载器来实现加载的,其实我们是可以自己定义类加载器的。利用 Java 提供的 .URLClassLoader 类就可以实现。下面我们看一段范例: try URL url = new URL("file:/d:/test/lib/"); URLClassLoader urlCL = new URLClassLoader(new URLurl); Class c = urlCL.loadClass("TestClassA"); TestClassA object = (TestClassA)c.newInstance(); object.method(); catch(Exception e) e.printStackTrace(); 我们通过自定义的类加载器实现了 TestClassA 类的加载并调用 method ()方法。分析一下这个程序:首先定义 URL 指定类加载器从何处加载类, URL 可以指向网际网络上的任何位置,也可以指向我们计算机里的文件系统 ( 包含 JAR 文件 ) 。上述范例当中我们从 file:/d:/test/lib/ 处寻找类;然后定义 URLClassLoader 来加载所需的类,最后即可使用该实例了。 4 类加载器的阶层体系 讨论了这么多以后,接下来我们仔细研究一下 Java 的类加载器的工作原理: 当执行 java *.class 的时候, java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器 Bootstrap Loader , Bootstrap Loader 是由 C+ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。 这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类: BootstrapLoader : sun.boot.class.path ExtClassLoader: java.ext.dirs AppClassLoader: java.class.path 这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。1、MVC的各个部分都有那些技术来实现?如何实现? 答:MVC是ModelViewController的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。1、谈谈你对Struts的理解。答: 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。一个扩展知识点:struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀;2. ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(就是一个java类,这个类中的每个属性对应一个请求参数),封装成一个什么样的formbean对象呢?看配置文件。3.要说明的是, ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后才将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面由input属性指定,(看配置文件)作者为什么将这里命名为input属性,而不是error属性,我们后面结合实际的运行效果进行分析。4.action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionforward对象通过struts-config.xml配置文件中的配置关联到某个jsp页面,因为程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。你对struts可能还有自己的应用方面的经验,那也要一并说出1. jsp有哪些内置对象?作用分别是什么? 分别有什么方法? 答:JSP共有以下9个内置的对象: Request,Response,Out,Session,Application,Cookie,Config,Page,Exception。 1、Request对象 该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以获取用户提交的信息。 当Request对象获取客户提交的汉字字符时,会出现乱码问题,必须进行特殊处理。首先,将获取的字符串用ISO-88591进行编码,并将编码存发到一个字节数组中,然后再将这个数组转化为字符串对象即可。如下:String textContent=request.getParameter("boy");byte b=textContent.getBytes("ISO-8859-1");textContent=new String(b);Request常用的方法: getParameter(String strTextName) 获取表单提交的信息。 String strNamerequest.getParameter("name");2、Response对象对客户的请求做出动态的响应,向客户端发送数据。 2.1 动态响应contentType属性 当一个用户访问一个JSP页面时,如果该页面用page指令设置页面的contentType属性时text/html,那么JSP引擎将按照这个属性值做出反应。如果要动态改变这换个属性值来响应客户,就需要使用Response对象的setContentType(String s)方法来改变contentType的属性值。 格式:response.setContentType(String s);参数s可取text/html,application/x-msexcel,application/msword等。 2.2 Response重定向 在某些情况下,当响应客户时,需要将客户重新引导至另一个页面,可以使用Response的sendRedirect(URL)方法实现客户的重定向。例如:response.sendRedirect("index.jsp"); 3、Session对象 (1)什么是Session对象 Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几

    注意事项

    本文(《大唐电信面试题》word版.docx)为本站会员(wuy****n92)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开