发布新日志

  • 自动化测试框架设计指南

    FLY000 发布于 2008-06-24 09:46:40

    Tarun Lalwani在《Guidelines for Automation Framework Design》一文中提出了自动化测试框架设计时应该考虑的20个方面:

    (1)选择合适的框架类型。
    (2)不要重复发明轮子。
    (3)可重用性。
    (4)支持对不同版本的程序的测试。
    (5)脚本的版本控制。
    (6)脚本的开发调试与发布环境应该分离。
    (7)外部可配置。
    (8)自适应性。
    (9)测试对象改变时,框架所需的修改应该最小化。
    (10)框架的执行。
    (11)状态监视。
    (12)报告。
    (13)修改框架时应该尽量不依赖自动化测试工具。
    (14)框架应该易于调试。
    (15)
    日志
    (16)易使用性。
    (17)灵活性。
    (18)性能。
    (19)开发框架配套的外部工具。
    (20)代码标准和规范。

  • 基于 IBM Rational Robot 的自动化功能测试框架(转)

    yexu 发布于 2007-02-02 13:25:31

     

    陈 国伟 (chenguow@cn.ibm.com), 高级软件工程师, IBM 中国软件开发中心实验室

    2006 年 9 月 28 日

    本文介绍了构建在 IBM Rational Robot 基础之上的自动化功能测试框架,来帮助组织更好的进行自动化的功能测试。

    1. 前言

    测试本身就是一项异常艰苦的工作,而成功的进行自动化的功能测试,对很多软件开发组织来讲,更是困难重重。本文介绍了构建在IBM Rational Robot基础之上的自动化功能测试框架,来帮助组织更好的进行自动化的功能测试。

    2. 现实的挑战

    2.1 自动化测试的迫切需求

    随着业务的变化,软件产品的种类越来越多,软件产品的升级越来越快,在很多的软件开发组织中,测试部门承受着巨大的压力,他们一方面要测试越来越多的软件产品,一方面要应对越来越短的测试时间,同时,还要面对捉襟见肘的测试资源。

    每个版本发布都包括新增加的功能和已有的功能,已有的功能已经在以前的版本中进行过测试,但是还需要在此版本中执行回归测试。在这种情况下,测试部门往往会考虑到,既然回归测试的测试用例都已经存在并且已经在上一个版本中执行过,那么在新版本中能否自动的执行这些测试?如果能这样的话,将极大的节省时间和资源,将有限的资源投入到新功能的测试上,缓解测试的压力。

    通常情况下,软件开发组织会使用自动化测试工具,使用录制回放方式来进行功能测试的自动化。但是录制回放方式并不能解决全部问题。

    2.2 录制回放中存在的问题

    业界的经验表明,虽然录制回放方式能够快速的生成测试,但是仅仅单纯的使用录制回放是不够的。

    首先,也是最主要的原因,就是使用录制回放方式,往往需要耗费时间和资源来调试、维护脚本。这些工作量随着脚本数量的增加,可能会增大到几乎不可能再对脚本进行有效维护的地步;其次,使用录制回放方式,要求应用已经开发完成并且在录制中不出现错误,但是往往当应用达到此条件时已经没有足够的时间进行测试;最后,使用录制回放方式,要求每个测试人员均会使用测试脚本语言“编程”,而当前大多数软件开发组织测试人员专注于业务,往往没有兴趣和精力来“编程”。

    所以,录制回放方式并不能解决所有的问题,在自动化的功能测试上,需要有测试框架的支持。

    3. 解决之道

    3.1 概述

    IBM Rational Robot是一款优秀的自动化测试工具,自动化功能测试框架是基于Robot之上构建的。如下图:

    图 1. 基于Robot的自动化功能测试框架

    业务测试人员类似于当前软件开发组织中使用手工执行测试的测试人员。可以看到,在解决方案中,除传统的业务测试人员外,增加了技术测试人员角色。技术测试人员偏重于自动化测试相关技术,实际上并不直接执行测试。

    解决方案的核心是使用Robot的SQABasic脚本开发的Robot测试技术框架。此Robot测试技术框架以表驱动为指导思想,读入动态结构,解释并执行动态结构中的每一项,是自动化测试的引擎。同时,为了提高Robot测试技术框架的易用性,在解决方案中还包括测试设计工具,它是使用其它编程语言,比如JAVA、Dephi等开发的应用程序。在测试设计工具中,测试技术人员首先建立和待测试应用一一对应的静态结构,此静态结构以页面为单位,随后业务测试人员从静态结构中选择不同的页面,组成测试动态结构,即测试用例,随后,此动态结构被Robot测试技术框架读入并解释执行。

    3.2 Robot测试技术框架

    3.2.1 表驱动介绍

    Robot测试技术框架是基于表驱动测试思想。表驱动测试就是预先在表中定义清楚代表每一步执行操作的关键字,然后由脚本读入表中的每一行,根据关键字来执行对应的动作。以CQ Web登录界面为例:

    图 2. ClearQuest Web登录界面

    当要自动执行“登录”按钮时,可以如下图来定义此表:

    登录

    然后在Robot的脚本中,打开表,读入此行并执行。这样的话,Robot便去点击界面上的“登录”按钮了。

    '打开文件
    Dim sData() as string
    InFileName = getExcelFileName
    ReadExcelData InFileName, sData()
    ===============================
    ‘解释并执行
    Select Case (sKeyWord)
    Case "登录"
    Window SetContext, "currentwindow", "" PushButton Click, "Text=登录", ""

    以上是表驱动的简单示例。在自动化测试中,基于表驱动,还需要解决以下问题:对象识别、验证点、数据池、分支执行、数据关联、日志记录、调用其它脚本、脚本结束。本节将分别展示其在Robot测试技术框架中的实现方式。

    3.2.2 对象识别

    根据IBM Rational Robot识别对象并执行操作的要求,如果要让Robot找到界面上的对象并执行相关动作,需要给Robot指定每个对象的对象类型、对象标志、执行动作和数据,如下图所示。

    图 3. 为Robot指定每个对象的对象类型、对象标志、执行动作和数据

    以按钮举例来讲,如果要让Robot自动点击某个按钮,那么首先要告诉Robot需要在“Button”这种类型的对象上进行操作;其次要告诉Robot,在此类型的对象上要执行什么操作,比如click;第三要告诉Robot要click那个具体的按钮上,比如要click“登录”按钮。

    表 2:对象识别表

    动作类型对象类型 对象标志 执行动作 数据

    G

    Button

    确定

    Click

    G

    EditBox

    姓名

    Click

    Jack

    G

    ComboBox

    角色列表

    Click

    系统管理员

    G

    RadioButton

    区域

    Click

    在Robot测试技术框架中,相应的处理为:

    '打开文件
    Dim sData() as string
    InFileName = getExcelFileName
    ReadExcelData InFileName, sData()
    ===============================
    ‘对文件中每一行
    Select Case (sObjType)
    Case "Button"
    ProcessButton(sObjAction, sObjData, sData)
    Case “EditBox”
    ProcessEditBox(sObjAction, sObjData, sData)
    Case “ComboBox”
    ProcessComboBox(sObjAction, sObjData, sData)
    Case “RadioButton”
    ProcessRadioButton(sObjAction, sObjData, sData)
    ===============================
    ‘对按钮执行的动作
    Select Case(sObjAction)
    Case “Click”
    Window SetContext, "currentwindow", "" PushButton Click, "Text=" & sObjData, ""
    ===============================
    ‘对文本框执行的动作
    Select Case(sObjAction)
    Case “Click”
    EditBox Click, "Name=" & sObjData, ""
    InputKeys "^+{HOME}{DELETE}" InputKeys sData
    ===============================
    ‘对组合框执行的动作
    Select Case(sObjAction)
    Case “Click”
    ComboBox Click, "Name=" & sObjData, ""
    ComboListBox Click, "Name=" & sObjData, "Text=" & sData
    ===============================
    ‘对单选按钮执行的动作
    Select Case(sObjAction)
    Case “Click”
    RadioButton Click, "Name=" & sObjData

    要强调的是,以按钮为例,虽然在表中需要为界面上每一个具体的按钮定义一行,但是在测试技术框架中,所有按钮处理的代码都是一样的。

    3.2.3 验证点

    没有验证点的自动化测试就不能称之为测试。从这句话中就可以看到验证点在自动化测试中的重要性。对于验证点来讲,因为不同的测试、不同的应用验证点都不相同,所以Robot测试技术框架仅仅提供了扩展的机制,不同的验证点可以通过扩展机制加入到测试技术框架中。

    加入验证点之后,表的定义如下:

    表 3:对象识别表

    动作类型对象类型 对象标志 执行动作 数据

    G

    Button

    确定

    Click

    G

    HTMLLink

    链接

    Click

    G

    ComboBox

    角色列表

    Click

    系统管理员

    G

    RadioButton

    区域

    Click

    V

    VP

    VP_SUM

    VP_SUM

    24

    最后一行是加入的验证点。所有的验证点其对象类型均为VP,不同的验证点有不同的对象标志,上表中的验证点是VP_SUM,验证点的基线数据为24。

    在Robot测试技术框架中,处理如下:

    ‘对文件中每一行
    Select Case (sObjType)
    Case ……
    Process……
    Case “VP”
    ProcessVP(sObjAction, sData)
    ===============================
    ‘对验证点执行的动作
    g_VP_SUM_Baseline = sData
    Callscrīpt sObjAction
    ===============================
    ‘验证点脚本的处理
    sData = g_VP_SUM_Baseline
    SQAGetProperty “”, “”, sActual
    if sData = sActual then
    ……
    else
    ……
    end if

    将验证点的基线数据放入全局变量g_VP_SUM_Baseline中,然后使用Callscrīpt函数来调用验证点的脚本。对每一个验证点单独的创建一个脚本文件,脚本文件的名字和验证点的标志相同,都是VP_SUM。虽然各个验证点脚本的内容都不相同,但是一般的步骤是首先从全局变量g_VP_SUM_Baseline中取出基线数据,然后使用SQAGetProperty函数从界面上取实际的数据,再比较实际数据和基线数据。

    3.2.4 数据池

    往往需要使用不同的数据来运行同一个测试,在自动化测试中是使用数据池来实现的。数据池的增加比较简单,就是往表中增加表示数据的列,每一列代表一次测试执行所需要的数据。如下表:

    表 4:数据池表a

    动作类型对象类型 对象标志 执行动作 数据1

    G

    Button

    确定

    Click

    G

    HTMLLink

    链接

    Click

    G

    ComboBox

    角色列表

    Click

    系统管理员

    普通管理员

    G

    RadioButton

    区域

    Click

    V

    VP

    VP_SUM

    VP_SUM

    24

    24

    从上表中看到,“数据1”这一列代表一次测试的执行所需要的数据,“数据2”代表另外一次测试的执行所需要的数据。

    在Robot测试技术框架中,加入循环,按照数据列的数量来进行循环,每一个循环均从第一行执行到最后一行。

    3.2.5 执行分支

    在测试中,往往是同一个业务或者功能,但是因为输入的数据、选择的条件不同,而具有不同的执行流程。执行分支的处理比较简单,就是在相应的数据列的位置上,填写代表忽略的特殊标志,比如“IGNORE”,当测试执行到此动作时,判断其数据是否是“IGNORE”,如果是,就不执行此动作而到下一个动作。对应的表如下:

    表 5:数据池表b

    动作类型对象类型 对象标志 执行动作 数据1

    G

    Button

    确定

    Click

    G

    HTMLLink

    链接

    Click

    G

    ComboBox

    角色列表

    Click

    系统管理员

    普通管理员

    G

    RadioButton

    区域

    Click

    V

    VP

    VP_SUM

    VP_SUM

    24

    IGNORE

    从上表中看到,第一次执行会执行VP_SUM验证点,但是第二次执行,因为验证点相应的数据是“IGNORE”,所以就不会执行VP_SUM验证点。

    在Robot测试技术框架中,在每次执行动作时,先判断其数据是否是“IGNORE”即可。

    3.2.6 数据关联

    在测试中,需要处理数据关联这种情况。数据关联是指前一个动作执行完成后,应用产生新的数据,此数据在随后的动作中需要用到。因为这些数据是在执行的过程中由程序产生的,所以没有办法预先在表中准备。在这种情况下对应的表如下:

    表 6:数据池表c

    动作类型对象类型 对象标志 执行动作 数据1

    G

    Button

    确定

    Click

    G

    HTMLLink

    链接

    Click

    G

    ComboBox

    角色列表

    Click

    系统管理员

    普通管理员

    G

    RadioButton

    区域

    Click

    V

    VP

    VP_SUM

    VP_SUM 

    24

    IGNORE

    G

    DC

    DC_GETID

    DC_GETID

    G

    EditBox

    交易号

    Click

    DC_GETID

    DC_GETID

    从上表可以看到,首先使用DC_GETID来将要关联的数据取出来,然后在需要使用此数据的地方,再使用DC_SETID赋值回去。

    在Robot测试技术框架中,取数据的处理如下:

    ‘对文件中每一行
    Select Case (sObjType)
    Case ……
    Process……
    Case “DC”
    ProcessDC(sData)
    ===============================
    ‘对数据关联执行的动作
    Callscrīpt sData
    ===============================
    ‘数据关联中,获取数据脚本的处理
    SQAGetProperty “”, “”, g_DC_ID

    对每一个数据关联,取数据单独的创建一个脚本文件,脚本文件的名字和数据关联的名字相同,都比如说都叫DC_GETID。虽然数据关联取数据脚本的内容各不相同,但是一般的步骤是使用SQAGetProperty函数从界面上取得数据,放入全局变量g_DC_ID中。

    在Robot测试技术框架中,赋值回去的处理如下:

    ‘对文件中每一行
    Select Case (sObjType)
    Case ……
    Process……
    Case “EditBox”
    ProcessEditBox(sObjAction, sObjData, sData)
    ===============================
    ‘对文本框执行的动作
    Select Case(sObjAction)
    Case “Click”
    EditBox Click, "Name=" & sObjData, ""
    InputKeys "^+{HOME}{DELETE}" InputKeys g_DC_ID

    即从全局变量g_DC_ID中取出数据,再输入到文本框中。

    3.2.7 其它处理

    其它处理包括日志记录、调用其它脚本以及脚本结束,相应的表如下:

    表 7:数据池表d

    动作类型对象类型 对象标志 执行动作 数据1

    G

    Button

    确定

    Click

    G

    HTMLLink

    链接

    Click

    G

    ComboBox

    角色列表

    Click

    系统管理员

    普通管理员

    G

    RadioButton

    区域

    Click

    V

    VP

    VP_SUM

    VP_SUM 

    24

    IGNORE

    G

    DC

    DC_GETID

    DC_GETID

    G

    EditBox

    交易号

    Click

    DC_GETID

    DC_GETID

    L

    输入交易号

    输入交易号

    S

    Order

    Order

    X

    可以看到,在动作类型这一列,使用使用“L”代表记录日志,日志的内容存放在这一行的数据列中,比如上表中的“输入交易号”;使用标志“S”代码调用其它脚本,要调用的脚本名称存放在这一行的数据列中,比如上表中的“Order”;使用标志“X”代表脚本结束。

    在Robot测试技术框架中,相应的处理如下:

    ‘对文件中每一行
    Select Case (sActType)
    Case “G”
    Process……
    Case “L”
    Log(sData)
    Case “S”
    Callscrīpt sData
    Case “X”
    Exit

    3.3 测试设计工具

    测试设计工具的最主要的目的就是为了提高Robot测试技术框架的易用性,帮助测试人员生成表驱动所需要的表。另外,测试设计工具通过使用数据库,能够在工具级别为测试重用提供支持。测试设计工具主要包括两方面的功能:供技术测试人员创建测试的静态结构;供业务测试人员创建测试的动态结构。

    测试的静态结构要求和应用保持一致,以页面为单位。即应用中各个功能的层次结构是如何来安排的,就相应的在测试设计工具中按照这种安排来建立静态结构,直到每个页面为止。这样来设计的好处是:首先,静态结构和应用保持一致,将来应用发生变化,比较容易定位到静态结构中需要修改的地方;其次,建立静态结构,应用是什么样子,就建立成什么样子,照搬即可,不需要很多的业务知识,比较适合于技术测试人员;最后,静态结构和应用保持一致,将来业务测试人员设计测试的动态结构时,能够方便的根据应用在静态结构中找到相应的页面。

    以下是已经建好的静态结构的示例:

    图 4. 静态结构示例

    可以看到,左边是和应用功能组织保持一致的树形结构。点开“集团理财”节点,可以在右边的上半部分看到此页面中的元素,页面上每一个元素都按照Robot技术框架的要求输入必要的信息,比如对象类型、对象标志、执行动作等。这些内容是由技术测试人员根据页面来输入的。如果不希望人工输入的话,那么也可以开发相应的工具去解析页面,来自动的生成每个页面的元素,或者是使用IBM Rational Functional Tester(简称RFT)的对象映射功能,由RFT去页面上抓取对象来生成。

    测试的动态结构和测试的要求有关。在创建测试用例的过程中,测试用例的每一个步骤,均是选自静态结构中的一个页面,将页面加入到测试用例中之后,还可以指定此次测试用例要测试页面上那些元素。另外,在测试的动态结构中,还可以指定测试数据、验证点、数据关联等操作。当设计完成后就直接生成真正可以被Robot测试技术框架所执行的表。

    以下是已经建好的动态结构的示例:

    图 5. 动态结构示例

    可以看到,左边是和按照测试的要求组织起来的测试用例。点开“票据托管”这个测试用例,可以在右边的上半部分看到此测试用例的执行步骤,比如第一步是“登录”,第二步是“票据托管导航”,依次下来是“票据托管”和“退出”,这些步骤都是从静态结构中选出来的。当点击测试步骤中“票据托管”这个页面,在下方将此页面的元素显示出来,业务测试人员可以为每一个测试元素输入数据、指定数据关联、添加验证点等。

    当业务测试人员设计好测试用例后,就可以将测试用例传递给Robot测试技术框架,又测试技术框架解释并执行。

    4. 结论

    可以看到,使用IBM Rational Robot提供的强大功能所搭建起来的自动化功能测试框架,能够帮助软件开发组织成功的实施自动化的功能测试。

    1. 通过重用已有的静态结构和动态结构,能够有效的促进测试的重用,并且在IBM Rational Robot的支持下,可以自动的执行这些测试

    2. 通过使用测试设计工具来生成动态配置,可以看到除测试技术框架的SQABasic脚本外,不需要再维护任何其它的脚本,降低了脚本调试、维护的工作量。并且将来的维护是基于测试设计工具来进行,也降低了自动化测试整体的维护工作量

    3. 通过使用测试设计工具来生成静态配置,能够做到根据界面的设计来进行配置,而不需要等到待测试应用完全可用,就使得及早测试成为可能

    4. 通过支持业务、技术测试人员的分工,在测试技术框架中封装自动化测试技术细节,使得业务测试人员不需要自动化测试技术的相关知识,只需要通过测试设计工具,就能够简单、直观的进行测试的设计和执行,降低了自动化测试的实施难度

    另外,在实施自动化功能测试框架中,还发现两个有趣的现象。第一,因为可以去自动化的执行测试,所以业务测试人员更多的在使用测试设计工具,从而导致测试设计在整个测试中所占的比重有显著的提高,有效的提升测试的质量;第二,因为统一、一致的界面操作方式、提示方式和表达方式有利于自动化测试的进行,所以也间接的促使开发团队在设计、开发过程中更加注重界面的规范性以及界面控件的可测试性。

    参考资料

    关于作者

    陈国伟,IBM中国软件开发中心实验室服务高级软件工程师,专注于Rational软件。目前主要致力于为客户提供软件工程的方法、技术和工具的服务与支持,关注的领域有JAVA开发、RUP实施、用例建模、OOAD、测试以及配置和变更管理。在加入IBM之前,参与ERP、保险、电信等大型软件项目的管理和开发,拥有6年软件开发经验。

     

     

  • Selenium RC 开发框架

    lamuda 发布于 2010-03-08 22:49:22

    Selenium 相比QTP而言,更像是个半成品,使用时要根据需要进行加工,如果直接使用,会导致相当大的维护量。

    通过1个多月的使用和总结,我认为Selenium RC + Junit 开发框架至少应该分为3层:

    第一层,也是最底层,封装appobject,便于统一管理页面元素。

    第二层,中间层,封装一些方法,test task。

    第三城,testcase 层,调用test task 完成测试用例。

    selenium 虽然有个UI element的东西来做页面元素封装,但是我觉得不如直接封装在java类里头方便。TestNG可以考虑在做data drive的时候加入到框架中,但是不如在exce里头管理data 方便。

    个人感觉如果做data drive还是用QTP方便,如果是侧重于流程的测试,selenium是强项。

  • 软件测试自动化流程与框架设计

    sunshinelius 发布于 2007-12-03 22:31:18

    一. 为何需要软件自动化测试框架
      软件测试框架是软件测试自动化规模发展到一定阶段的必然需求,因为自
    动化测试将会面临如下问题:
    1. 如何定义脚本的规范,使之具有良好的可复用性和可维护性。
    2. 众多脚本的管理问题,如何管理不同版本的测试脚本以及测试脚本之间
    的关联关系。
    3. 众多脚本的执行问题,如何无人值守地执行测试脚本,以节约测试时间
    4. 如何获得最大的自动化测试收益,怎样调整测试策略来达到最高的automation效益。
    目前在微软,IBM等自动化测试比较成熟的公司,都已经实现并应用了软件自动化测试框架。可以说,框架是自动化测试的趋势。

    二.软件自动化测试框架架构思想

    其实MS也好,IBM也好,自动化测试框架虽然形式各有不同,但思想却大同小异。总体来说,成熟的自动化测试框架必须提供以下几个功能:
    1. controller-agent的拓扑结构。此点最妙之处是扩展性极强,在空间上能够兼容各种类型测试程序及脚本,在时间上能够并发执行测试任务。
    2. 内嵌灵活的自动化测试案例的管理策略。此处可根据企业实际具体应用定义相应的测试组件
    3. 强大的测试报告和日志展现。一份好的自动化测试报告能满足不同人的口味和需要,比如给老板以清晰直观的测试图表分析;给开发人员以强大的日志debug分析;给测试人员以bug自动关联作用。

    下面以automation center为例,分析一下自动化测试框架的设计


    展现层:
    给终端用户提供基于Web页面的四大功能模块
    ·  测试任务
     发起安装/测试任务,并对任务状态进行实时监控
    ·  测试结果
     展现测试结果,生成测试报告,邮件通知,提交bug全程自动化
    ·  日志分析
     SMB协议访问日志服务器,轻松获得automation执行时的日志和抓图
    ·  AC管理
       脚本管理策略
       测试组件策略
       测试实例生成
       Agent 资源管理,添加/删除
       Server资源管理,添加/删除
       AC核心设置
    控制层:
    controller是AC核心,负责如下工作
    ·  接收并处理用户发送的任务请求
    ·  管理和控制安装/测试Agent
    ·  分析和整理测试结果
    ·  内嵌测试报表/邮件逻辑
    ·  连接数据库,日志服务器和脚本服务器
    Agent层:
    Agent 安装在任务机上,负责:
    ·  执行安装任务
    ·  执行测试任务
    ·  生成log/抓图数据,供后续分析

    框架应用策略
    1. 自动化测试框架是代码,流程,策略的集合(这句话已经耳熟能详了,但能深刻理解并能成功地用到工作实践中却不容易)
    2. 当你有超过10个自动化测试案例时,就应该开始考虑自动化测试框架的实施了(规范,管理,执行策略等等)
    3. 实现框架的语言以编译语言为优先选择(我看过用vbscrīpt编写的上万行的框架代码,惨不忍睹,维护和扩展那是相当滴困难)
    4. 在设计时,框架和案例要分工清楚明确(框架,纲举目张也,不宜管得太多太细,否则案例丧失了灵活性,框架推广起来就步履维艰了,嘿嘿)

     

  • xpath最通俗的教程-zt

    fairylly 发布于 2009-01-14 17:16:49

    xpath最通俗的教程-zt

    实例 1
    基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始那么该路径就表示到一个元素的绝对路径

    /AAA

    选择根元素AAA


         <
    AAA
              <BBB/> 
              <CCC/> 
              <BBB/> 
              <BBB/> 
              <DDD
                   <BBB/> 
              </DDD
              <CCC/> 
         </
    AAA>

     

    /AAA/CCC

    选择AAA的所有CCC子元素


         <AAA
              <BBB/> 
              <
    CCC/> 
              <BBB/> 
              <BBB/> 
              <DDD
                   <BBB/> 
              </DDD
              <
    CCC/> 
         </AAA>

     

    /AAA/DDD/BBB

    选择AAA的子元素DDD的所有子元素


         <AAA
              <BBB/> 
              <CCC/> 
              <BBB/> 
              <BBB/> 
              <DDD
                   <
    BBB/> 
              </DDD
              <CCC/> 
         </AAA>

     

     

    实例 2

    如果路径以双斜线 // 开头则表示选择文档中所有满足双斜线//之后规则的元素(无论层级关系)

     

    //BBB

    选择所有BBB元素


         <AAA
              <
    BBB/> 
              <CCC/> 
              <
    BBB/> 
              <DDD
                   <
    BBB/> 
              </DDD
              <CCC
                   <DDD
                        <
    BBB/> 
                        <
    BBB/> 
                   </DDD
              </CCC
         </AAA>

     

    //DDD/BBB

    选择所有父元素是DDDBBB元素


         <AAA
              <BBB/> 
              <CCC/> 
              <BBB/> 
              <DDD
                   <
    BBB/> 
              </DDD
              <CCC
                   <DDD
                        <
    BBB/> 
                        <
    BBB/> 
                   </DDD
              </CCC
         </AAA>

     

     

    实例 3

    星号 * 表示选择所有由星号之前的路径所定位的元素

     

    /AAA/CCC/DDD/*

    选择所有路径依附于/AAA/CCC/DDD的元素


         <AAA
              <XXX
                   <DDD
                        <BBB/> 
                        <BBB/> 
                        <EEE/> 
                        <FFF/> 
                   </DDD
              </XXX
              <CCC
                   <DDD
                        <
    BBB/> 
                        <
    BBB/> 
                        <
    EEE/> 
                        <
    FFF/> 
                   </DDD
              </CCC
              <CCC
                   <BBB
                        <BBB
                             <BBB/> 
                        </BBB
                   </BBB
              </CCC
         </AAA>

     

    /*/*/*/BBB

    选择所有的有3个祖先元素的BBB元素


         <AAA
              <XXX
                   <DDD
                        <
    BBB/> 
                        <
    BBB/> 
                        <EEE/> 
                        <FFF/> 
                   </DDD
              </XXX
              <CCC
                   <DDD
                        <
    BBB/> 
                        <
    BBB/> 
                        <EEE/> 
                        <FFF/> 
                   </DDD
              </CCC
              <CCC
                   <BBB
                        <
    BBB
                             <BBB/> 
                        </
    BBB
                   </BBB
              </CCC
         </AAA>

     

    //*

    选择所有元素


         <
    AAA
              <
    XXX
                   <
    DDD
                        <
    BBB/> 
                        <
    BBB/> 
                        <
    EEE/> 
                        <
    FFF/> 
                   </
    DDD
              </
    XXX
              <
    CCC
                   <
    DDD
                        <
    BBB/> 
                        <
    BBB/> 
                        <
    EEE/> 
                        <
    FFF/> 
                   </
    DDD
              </
    CCC
              <
    CCC
                   <
    BBB
                        <
    BBB
                             <
    BBB/> 
                        </
    BBB
                   </
    BBB
              </
    CCC
         </
    AAA>

     

     

     

    实例 4

    方块号里的表达式可以进一步的指定元素其中数字表示元素在选择集里的位置last()函数则表示选择集中的最后一个元素.

     

    /AAA/BBB[1]

    选择AAA的第一个BBB子元素


         <AAA
              <
    BBB/> 
              <BBB/> 
              <BBB/> 
              <BBB/> 
         </AAA>

     

    /AAA/BBB[last()]

    选择AAA的最后一个BBB子元素


         <AAA
              <BBB/> 
              <BBB/> 
              <BBB/> 
              <
    BBB/> 
         </AAA>

     

     

     

    实例 5

    //@id

    选择所有的id属性


         <AAA
              <BBB
     id = "b1"/> 
              <BBB
     id = "b2"/> 
              <BBB name = "bbb"/> 
              <BBB/> 
         </AAA>

     

    //BBB[@id]

    选择有id属性的BBB元素


         <AAA
              <
    BBB id = "b1"/> 
              <
    BBB id = "b2"/> 
              <BBB name = "bbb"/> 
              <BBB/> 
         </AAA>

     

    //BBB[@name]

    选择有name属性的BBB元素


         <AAA
              <BBB id = "b1"/> 
              <BBB id = "b2"/> 
              <
    BBB name = "bbb"/> 
              <BBB/> 
         </AAA>

     

    //BBB[@*]

    选择有任意属性的BBB元素


         <AAA
    查看(1577) 评论(1) 收藏 分享 管理

  • Selenium命令列表

    yuxiao 发布于 2007-08-02 23:11:39

     

    Author:袁琳
    MSN:testwin@sohu.com

    一、  Commands (命令)

    • Action
      对当前状态进行操作
      失败时,停止测试
    • Assertion
      校验是否有产生正确的值
    • Element Locators
      指定HTML中的某元素
    • Patterns
      用于模式匹配

    1. Element Locators (元素定位器)

    • id=id
      id locator 指定HTML中的唯一id的元素 
    •  name=name
      name locator指定 HTML中相同name的元素中的第一个元素
    •  identifier=id
      identifier locator 首先查找HTML是否存在该id的元素, 若不存在,查找第一个该name的元素 
    • dom=javascrīptExpression
      dom locator用Javascrīpt表达式来定位HTML中的元素,注意必须要以"document"开头
      例如:
      dom=document.forms['myForm'].myDropdown
      dom=document.images[56]
    •  xpath=xpathExpression
      xpath locator用 XPath 表达式来定位HTML中的元素,必须注意要以"//"开头
      例如:
      xpath=//img[@alt='The image alt text']
      xpath=//table[@id='table1']//tr[4]/td[2]
    •  link=textPattern
      link locator 用link来选择HTML中的连接或锚元素
      例如:
      link=The link text
    • 在没有locator前序的情况下 Without a locator prefix, Selenium uses:
      如果以"document."开头,则默认是使用 dom locator,如果是以"//"开头,则默认使用xpath locator,其余情况均认作identifier locator

    2. String Matching Patterns (字符串匹配模式)

    • glob:patthern
      glob模式,用通配符"*"代表任意长度字符,"?"代表一个字符
    • regexp:regexp
      正则表达式模式,用Javascrīpt正则表达式的形式匹配字符串
    • exact:string
      精确匹配模式,精确匹配整个字符串,不能用通配符
    • 在没有指定字符串匹配前序的时候,selenium 默认使用golb 匹配模式

    3. Select Option Specifiers (Select选项指定器)

    • label=labelPattern
      通过匹配选项中的文本指定选项
      例如:label=regexp:^[Oo]ther
    • value=valuePattern
      通过匹配选项中的值指定选项
      例如:value=other
    • id=id
      通过匹配选项的id指定选项
      例如: id=option1
    • index=index
      通过匹配选项的序号指定选项,序号从0开始
      例如:index=2
    • 在没有选项选择前序的情况下,默认是匹配选项的文本

    二、 Actions
    描述了用户所会作出的操作。
    Action 有两种形式: action和actionAndWait, action会立即执行,而actionAndWait会假设需要较长时间才能得到该action的相响,而作出等待,open则是会自动处理等待时间。

    • click
      click(elementLocator)
      - 点击连接,按钮,复选和单选框
      - 如果点击后需要等待响应,则用"clickAndWait"
      - 如果是需要经过Javascrīpt的alert或confirm对话框后才能继续操作,则需要调用verify或assert来告诉Selenium你期望对对话框进行什么操作。
      click aCheckbox  
      clickAndWait submitButton  
      clickAndWait anyLink  
    • open
      open(url)
      - 在浏览器中打开URL,可以接受相对和绝对路径两种形式
      - 注意:该URL必须在与浏览器相同的安全限定范围之内
      open /mypage  
      open http://localhost/  
    • type
       type(inputLocator, value)
      - 模拟人手的输入过程,往指定的input中输入值
      - 也适合给复选和单选框赋值
      - 在这个例子中,则只是给钩选了的复选框赋值,注意,而不是改写其文本
      type nameField John Smith
      typeAndWait textBoxThatSubmitsOnChange newValue
    • select
      select(dropDownLocator, optionSpecifier)
      - 根据optionSpecifier选项选择器来选择一个下拉菜单选项
      - 如果有多于一个选择器的时候,如在用通配符模式,如"f*b*",或者超过一个选项有相同的文本或值,则会选择第一个匹配到的值
      select  dropDown Australian Dollars
      select  dropDown index=0
      selectAndWait currencySelector value=AUD
      selectAndWait currencySelector label=Auslian D*rs
    •  goBack,close
      goBack()
      模拟点击浏览器的后退按钮
      close()
      模拟点击浏览器关闭按钮
    • selectWindow
      select(windowId)
      - 选择一个弹出窗口
      - 当选中那个窗口的时候,所有的命令将会转移到那窗口中执行
      selectWindow myPopupWindow  
      selectWindow null  
    • pause
      pause(millisenconds)
      - 根据指定时间暂停Selenium脚本执行
      - 常用在调试脚本或等待服务器段响应时
      pause 5000  
      pause 2000  
    • fireEvent
       fireEvent(elementLocatore,evenName)
      模拟页面元素事件被激活的处理动作
      fireEvent textField focus
      fireEvent dropDown blur
    • waitForCondition
      waitForCondition(JavascrīptSnippet,time)
      - 在限定时间内,等待一段Javascrīpt代码返回true值,超时则停止等待
      waitForCondition var value="/selenium.getText(""foo"); value.match(/bar/); 3000
    • waitForValue
      waitForValue(inputLocator, value)
      - 等待某input(如hidden input)被赋予某值,
      - 会轮流检测该值,所以要注意如果该值长时间一直不赋予该input该值的话,可能会导致阻塞
      waitForValue finishIndication isfinished
           
    • store,stroreValue
      store(valueToStore, variablename)
      保存一个值到变量里。
      该值可以由自其他变量组合而成或通过Javascrīpt表达式赋值给变量
      store Mr John Smith fullname
      store $.{title} $.{firstname} $.{suname} fullname
      store javascrīpt.{Math.round(Math.PI*100)/100} PI
      storeValue inputLocator variableName

      把指定的input中的值保存到变量中

      storeValue userName userID
      type userName $.{userID}
    • storeText, storeAttribute
      storeText(elementLocator, variablename)
      把指定元素的文本值赋予给变量
      storeText currentDate expectedStartDate
      verifyValue startDate $.{expectedStartDate}

      storeAttribute(.{}elementLocator@attributeName,variableName.{)
      把指定元素的属性的值赋予给变量

      storeAttribute input1@class  classOfInput1
      verifyAttribute input2@class $.{classOfInput1}
    • chooseCancel.., answer..
      chooseCancelOnNextConfirmation()
      - 当下次Javascrīpt弹出confirm对话框的时候,让selenium选择Cancel
      - 如果没有该命令时,遇到confirm对话框Selenium默认返回true,如手动选择OK按钮一样
      chooseCancelOnNextConfirmation     

      - 如果已经运行过该命令,当下一次又有confirm对话框出现时,也会同样地再次选择Cancel
      answerOnNextPrompt(answerString)
      - 在下次Javascrīpt弹出prompt提示框时,赋予其anweerString的值,并选择确定

      answerOnNextPrompt Kangaroo  

    三、 Assertions
    允许用户去检查当前状态。两种模式: Assert 和 Verify, 当Assert失败,则退出测试;当Verify失败,测试会继续运行。

    • assertLocation, assertTitle
      assertLocation(relativeLocation)
      判断当前是在正确的页面
      verifyLocation /mypage  
      assertLocation /mypage  
    • assertTitle(titlePattern)
      检查当前页面的title是否正确
      verifyTitle My Page  
      assertTitle My Page  
    • assertValue
      assertValue(inputLocator, valuePattern)
      - 检查input的值
      - 对于 checkbox或radio,如果已选择,则值为"on",反之为"off"
      verifyValue nameField John Smith
      assertValue document.forms[2].nameField John Smith
    • assertSelected, assertSelectedOptions
      assertSelected(selectLocator, optionSpecifier)
      检查select的下拉菜单中选中的选型是否和optionSpecifer(Select选择选项器)的选项相同
      verifySelected dropdown2 John Smith
      verifySelected dorpdown2 value=js*123
      assertSelected document.forms[2].dropDown label=J*Smith
      assertSelected document.forms[2].dropDown index=0
    • assertSelectOptions(selectLocator, optionLabelList)
      - 检查下拉菜单中的选项的文本是否和optionLabelList相同
      - optionLabelList是以逗号分割的一个字符串
      verifySelectOptions dropdown2 John Smith,Dave Bird
      assertSelectOptions document.forms[2].dropdown Smith,J,Bird,D
    • assertText
      assertText(elementLocator,textPattern)
      - 检查指定元素的文本
      - 只对有包含文本的元素生效
      - 对于Mozilla类型的浏览器,用textContent取元素的文本,对于IE类型的浏览器,用innerText取元素文本
      verifyText statusMessage Successful
      assertText //div[@id='foo']//h1 Successful
    • assertTextPresent, assertAttribute
      assertTextPresent(text)
      检查在当前给用户显示的页面上是否有出现指定的文本
      verifyTextPresent You are now logged in  
      assertTextPresent You are now logged in  
    • assertAttribute(.{}elementLocator@attributeName.{, ValuePattern)
      检查当前指定元素的属性的值
      verifyAttribute txt1@class bigAndBlod
      assertAttribute document.images[0]@alt alt-text
      verifyAttribute //img[@id='foo']/alt alt-text
    • assertTextPresent, etc.
      assertTextPresent(text)
      assertTextNotPresent(text)
      assertElementPresent(elementLocator)
       verifyElementPresent   submitButton   
       assertElementPresent   //img[@alt='foo']    assertElementNotPresent(elementLocator)
    • assertTable
      assertTable(cellAddress, valuePattern)
      - 检查table里的某个cell中的值
      - cellAddress的语法是tableName.row.column, 注意行列序号都是从0开始
      verifyTable myTable.1.6 Submitted
      assertTable results0.2 13
    • assertVisible, nonVisible
      assertVisible(elementLocator)
      - 检查指定的元素是否可视的
      - 隐藏一个元素可以用设置css的'visibility'属性为'hidden',也可以设置'display'属性为'none'
      verfyVisible postcode  
      assertVisible postcode  
    • assertNotVisible(elementLocator)
       verfyNotVisible   postcode   
       assertNotVisible   postcode   
    • Editable, non-editable
      assertEditable(inputLocator)
      检查指定的input是否可以编辑
      verifyEditable shape  
      assertEditable colour  
    • assertNotEditable(inputLocator)
      检查指定的input是否不可以编辑
    • assertAlert
      assertAlert(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的alert对话框
      - alert产生的顺序必须与检查的顺序一致
      - 检查alert时会产生与手动点击'OK'按钮一样的效果。如果一个alert产生了,而你却没有去检查它,selenium会在下个action中报错。
      - 注意:Selenium 不支持 Javascrīpt 在onload()事件时 调用alert();在这种情况下,Selenium需要你自己手动来点击OK.
    • assertConfirmation
      assertConfirmation(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的confirmation对话框和alert情况一样,confirmation对话框也必须在它们产生的时候进行检查
      - 默认情况下,Selenium会让confirm() 返回true, 相当于手动点击Ok按钮的效果。你能够通过chooseCancelOnNextConfirmation命令让confirm()返回false.同样地,如果一个cofirmation对话框出现了,但你却没有检查的话,Selenium将会在下个action中报错
      - 注意:在Selenium的环境下,confirmation对话框框将不会再出现弹出显式对话框
      - 注意:Selenium不支持在onload()事件时调用confirmation对话框,在这种情况下,会出现显示confirmatioin对话框,并需要你自己手动点击。
    •  assertPrompt
      assertPrompt(messagePattern)
      - 检查Javascrīpt是否有产生带指定message的Prompt对话框
      - 你检查的prompt的顺序Prompt对话框产生的顺序必须相同
      - 必须在verifyPrompt之前调用answerOnNextPrompt命令
      - 如果prompt对话框出现了但你却没有检查,则Selenium会在下个action中报错
      answerOnNextPrompt Joe  
      click id=delegate  
      verifyPrompt Delegate to who?  

    四、 Parameters and Variables
    参数和变量的声明范围由简单的赋值到Javascrīpt表达式赋值。
    Store,storeValue 和storeText 为下次访问保存值。
    在Selenium内部是用一个叫storeVars的map来保存变量名。

    • Variable Substitution 变量替换
      提供了一个简单的方法去访问变量,语法 $.{xxx}
      store Mr title
      storeValue nameField surname
      store $.{title} $.{suname} fullname
      type textElement Full name is: $.{fullname}
    •  Javascrīpt Evaluation Javascrīpt赋值
      你能用Javascrīpt来构建任何你所需要的值。
      这个参数是以javascrīpt开头,语法是 javascrīpt.{'with a trailing'}。
      可以通过Javascrīpt表达式给某元素赋值。
      store javascrīpt.{'merchant'+(new Date()).getTime()} merchantId
      type textElement javascrīpt.{storedVars['merchantId'].toUpperCase()}
    • Generating Unique values 产生唯一值.  
      问题:你需要唯一的用户名
      解决办法: 基于时间来产生用户名,如'fred'+(new Date().getTime())  
  • Selenium RC的安装,配置和交互

    printing2nd 发布于 2009-02-13 18:10:55

    【转载】

    Hi All,
     
    In this article I will tell you how you can install and use Selenium RC(the best open source web testing tool and multi browser testing). I have been using Selenium RC for a while now and found it very useful to test web based applications. I have found that there is no installation and user guide for Selenium RC.
     
    First download selenium-remote-control-1.0-SNAPSHOT i.e. the nightly build from the http://seleniumrc.openqa.org/download.html. There is some issue with Version 1.0 beta 1 (run time error when running on IE browser).
     
    This is a zip file so, unzip the file and save it in ur c drive (Folder selenium-remote-control-1.0-SNAPSHOT).  Create a folder called Seleniumin your c drive and a sub folder called tests in c:\Selenium. Save all you selenium scrīpts in C:\Selenium\Tests\. 
     
    Before runing first thing is close all Firefox browser windows and follow the instructions given below.
     
    Open the Windows "Start" menu, select "Run" (on Windows Vista, use "Start Search" or enable the Run box, as described here) then type and enter one of the following:

        * firefox.exe -profilemanager
        * firefox.exe -P
     
    For more details go to http://kb.mozillazine.org/Profile_Manager
     
    When creating the profile manager you will have to create it under  a new folder C:\Firefoxselenium.
     
    Once the profile manager is created you will have to create two batch file (.bat); one for IE and the other for Firefox.
     
    This is an example of the SeleniumFirefox.bat file.
     
    cd
    \ cd C:\selenium-remote-control-1.0-SNAPSHOT\selenium-server-1.0-SNAPSHOT
    java -jar selenium-server.jar -port 4545 -firefoxProfileTemplate C:\Firefoxselenium -htmlSuite chrome http://www.yourtestwebsite.com// C:\selenium\G_alltestff.html* C:\selenium\*Results.html*
    pause 
     
    This is an example of the SeleniumIE.bat file.
     
    cd
    \ cd C:\selenium-remote-control-1.0-SNAPSHOT\selenium-server-1.0-SNAPSHOT
    java -jar selenium-server.jar -port 4545  -htmlSuite iehta http://www.yourtestwebsite.com// C:\selenium\G_alltestie.html* C:\selenium\*Results.html*
    pause 
     
    Next step is to create G_alltestff.html (For Firefox)
     
    <html>
    <head>
    <meta content="text/html; charset=ISO-8859-1"
    http-equiv="content-type">
    <title>Test Suite</title>
    </head>
    <table id="suiteTable"    cellpadding="1"
               cellspacing="1"
               border="1"
               class="selenium">
            <tbody>
                            <tr><td><b>Test Suite</b></td></tr>
                                <tr><td><a href=".\Tests\Name of you selenium scrīpt.html">Name of the scrīpt</a></td></tr>
        </tbody>
      </table>
    </body>
    </html>
     
    Next step is to create G_alltestie.html (For Firefox)
     
    <html>
    <head>
    <meta content="text/html; charset=ISO-8859-1"
    http-equiv="content-type">
    <title>Test Suite</title>
    </head>
    <table id="suiteTable"    cellpadding="1"
               cellspacing="1"
               border="1"
               class="selenium">
            <tbody>
                            <tr><td><b>Test Suite</b></td></tr>
                                <tr><td><a href="C:\Selenium\Tests\Name of you selenium scrīpt.html">Name of the scrīpt</a></td></tr>
        </tbody>
      </table>
    </body>
    </html>
     
    Once you have done this you are all set to rock and roll. To run Selenium RC on Firefox double click on  SeleniumFirefox.bat file and to run Selenium RC on IE double click on  SeleniumIE.bat. Selenium RC is a very useful tool and I feel it’s very stable that Selenium IDE.
     
    I would also like to thank my colleague Wedi Wun for helping me write the Selenium RC installation and user guide.To know more about Selenium RC/IDE Data driven testing see my article Data Driven Selenium using Excel Macros.
     
    Cheers
    Pavan Puddupakkam

  • IBM Rational AppScan 7.8破解

    minifirefly 发布于 2011-01-24 12:45:45

    IBM Rational AppScan 7.8破解

    首先 在下载的时候要屏蔽所有的杀毒软件,要不然 会把patch 删除掉的

    然后运行 patch 会有提示 点击确认之后  找到安装路径中的DLL 文件 确定

    然后运行 keygen 就生成 了license

  • java 生成jar包

    abedd 发布于 2011-05-03 00:01:27

    1、编译生成.class文件;

    2、做一个配置文件,随意取个名字如conf.txt,在该文件内输入一行:

      Main-Class: packageName.Class_FileName(回车)

      注意:文件开头必须顶格写,不可有空格,Main-Class:后有一个空格,另外,该行必须以一个

    回车结束。该配置文件给出了双击Jar文件时运行其中的哪个类。

    3、输入一下命令制作JAR文件:

      Jar cmf conf.txt jar_name.jar packageName/*.class

      这里的conf.txt和jar_name.jar两个文件分别对应的参数是m和f。conf.txt的作用是配置

    manifest.mf文件。因为要创建可执行的jar文件包,光靠指定一个manifest.mf是不够的,因为MAINFEST

    是jar文件是和不可执行的JAR文件都包含MANIFEST。关键在于可执行的JAR文件包的MANIFEST,其内容包

    含Main-Class项
    参考http://topic.csdn.net/u/20090710/10/4c15a651-2ed3-48ed-8508-eac15ba71871.html
  • Java学习从入门到精通.

    harold 发布于 2007-03-14 11:01:01Top 1

    老东西了,高手们一定都看过了,不过看很多新手还是问一些相关问题就发上来了。作者是谁我忘了,是在《程序员》上看到的,在些感谢一下。
    大家觉得好就顶一下,帮助新手。

    Java学习从入门到精通

    一、 JDK (Java Development Kit)
    JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。

    1、 JDK的下载和安装
    JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html ;,JDK当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html。

    下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。

    2、 JDK的命令工具
    JDK的最重要命令行工具:
    java: 启动JVM执行class
    javac: Java编译器
    jar: Java打包工具
    javadoc: Java文档生成器
    这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。

    二、 JDK Documentation

    Documentation在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。

    三、 应用服务器(App Server)

    App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:

    1、 Tomcat
    Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置Tomcat的介绍:

    Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:http://jakarta.apache.org/tomcat/ ;,Tomcat最新版本是Tomcat4.1.27,软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ ;。

    下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:

    JAVA_HOME=C:\j2sdk1.4.2
    CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)

    这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。

    Tomcat提供了两个Web界面的管理工具,URL分别是:
    http://localhost:8080/admin/index.jsp ;
    http://localhost:8080/manager/html ;
    在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件,加入如下几行:

    <role rolename="manager"/>
    <role rolename="admin"/>
    <user username="robbin" password="12345678" roles="admin,manager,tomcat"/>

    这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后,你就可以使用该用户来登陆如上的两个管理工具,通过Web方式进行Tomcat的配置和管理了。

    2、 BEA Weblogic
    Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版,License可以免费使用1年时间,其实这已经完全足够了。Weblogic的下载连接:http://commerce.bea.com/index.jsp,Weblogic的在线文档:http://edocs.bea.com/ ;。

    3、 IBM Webshpere
    Websphere同样可以下载到免费的试用版本,到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料,developerWorks中文网站的连接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ;,Websphere的下载连接:http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html ;。

    4、 Jboss
    Jboss是免费开源的App Server,可以免费的从Jboss网站下载:http://www.jboss.org/index.html,然而Jboss的文档是不免费,需要花钱购买,所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档,可以用来参考:http://www.jdon.com/idea.html ;

    四、 Java应用的运行环境

    Java的应用可以简单分为以下几个方面:

    1、 Java的桌面应用
    桌面应用一般仅仅需要JRE的支持就足够了。

    2、 Java Web应用
    Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:
    Browser层:浏览器显示用户页面
    Web层:运行Servlet/JSP
    DB层:后端数据库,向Java程序提供数据访问服务

    3、 Java企业级应用
    企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:
    Browser层:浏览器显示用户页面
    Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互
    Web层:运行Servlet/JSP
    EJB层:运行EJB,完成业务逻辑运算
    DB层:后端数据库,向Java程序提供数据访问服务

    4、 Java嵌入式应用
    Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。

    Java Learning Path(二)、书籍篇

    学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。

    在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。

    对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。

    对于Java的入门书籍,蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。

    在所有的Java书籍当中,其实最最有用的,并不是O′reilly的 Java Serials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation,什么其他的书籍都不需要了。

    对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O′reilly的《Java Server Pages 》这本书来学习Web 编程。

    EJB的书籍当中,《Enterprise JavaBeans, 2nd Edition》是一本很不错的书, EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种App Server的具体实现,所以在学习EJB的同时,必须同步的学习某种App Server,而这本书相关的出了三本书,分别是Weblogic6.1,Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。

    但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。

    如果是结合Weblogic来学习J2EE的话,《J2EE应用与BEA Weblogic Server》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。

    在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。

    Java Learning Path(三)过程篇

    每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。

    学习Java的第一步是安装好JDK,写一个Hello World,? 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。

    第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。

    第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。

    第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是
    java.lang.*;
    java.io.*;
    java.util.*;
    java.sql.*;

    这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O′reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:
    首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。

    对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That′all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。

    第五步,通过上面的学习,如果学的比较扎实的话,就打好了Java的基础了,剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步,Java的自学能力已经被培养出来了,可以到了直接学习Documentation的水平了。除了要做GUI编程之外,JDK里面其他会有用处的包是这些:
    java.text.*;
    java.net.*;
    javax.naming.*;
    这些包里面真正用的比较多的类其实很少,只有几个,所以不需要花很多时间。

    第六步,Java Web 编程
    Web编程的核心是HTTP协议,HTTP协议和Java无关,如果不熟悉HTTP协议的话,虽然也可以学好Servlet/JSP编程,但是达不到举一反三,一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话,又有了Java编程的良好的基础,学习Servlet/JSP简直易如反掌,我学习Servlet/JSP就用了不到一周的时间,然后就开始用JSP来做项目了。

    在Servlet/JSP的学习中,重头仍然是Servlet Documentation。Servlet API最常用的类很少,花比较少的时间就可以掌握了。把这些类都看一遍,多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP,还需要熟悉几个常用JSP的标记,具体的写法记不住的话,临时查就是了。

    此外Java Web编程学习的重点要放在Web Application的设计模式上,如何进行业务逻辑的分析,并且进行合理的设计,按照MVC设计模式的要求,运用Servlet和JSP分别完成不同的逻辑层,掌握如何在Servlet和JSP之间进行流程的控制和数据的共享,以及Web Application应该如何配置和部署。

    第七步,J2EE编程
    以上的学习过程如果是比较顺利的话,进行到这一步,难度又陡然提高。因为上面的知识内容都是只涉及一个方面,而像EJB,JMS,JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶,所以掌握起来难度比较大。

    首先一定要学习好JNDI,JNDI是App Server定位服务器资源(EJB组件,Datasouce,JMS)查找方法,如果对JNDI不熟悉的话,EJB,JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包,运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置,就需要看看专门的文档规范了,比如web.xml的写法,ejb-jar.xml的写法等等。针对每种不同的App Server,还有自己的服务资源配置文件,也是需要熟悉的。

    然后可以学习JTA,主要是要理解JTA对于事务的控制的方法,以及该在什么场合使用JTA。这里可以简单的举个例子,我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit()),做为一个原子操作,但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作,你能做的到吗?这时候只能用JTA了。假设操作过程是先往A数据库插一条记录,然后删除B数据库另一个记录,我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话,由App Server来完成控制。

    在学习EJB之前要学习对象序列化和RMI,RMI是EJB的基础。接着学习JMS和EJB,对于EJB来说,最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的,以及在什么情况下要用到EJB。

    在学习完EJB,JMS这些东西之后,你可能会意识到要急不可待学习两个领域的知识,一个是UML,另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计,一个好的软件框架是软件开发成功的必要条件。在这个时候,应该开始把学习的重点放在设计模式和框架的学习上,通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。

    J2EE规范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外还有很多很多的企业技术,这里不一一进行介绍了。

    另外还有一个最新领域Web Services。Web Services也完全没有任何新东西,它像是一种黏合剂,可以把不同的服务统一起来提供一个统一的调用接口,作为使用者来说,我只要获得服务提供者给我的WSDL(对服务的描述),就够了,我完全不知道服务器提供者提供的服务究竟是EJB组件,还是.Net组件,还是什么CORBA组件,还是其他的什么实现,我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式,实现了整个Internet服务的共享,是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍,但是可以通过在网络上面查资料的方式来学习。

    Java Learning Path(四) 方法篇

    Java作为一门编程语言,最好的学习方法就是写代码。当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类的方法,看看运行结果,这样非常直观的把类给学会了,而且记忆非常深刻。然后不应该满足把代码调通,你应该想想看如果我不这样写,换个方式,再试试行不行。记得哪个高人说过学习编程就是个破坏的过程,把书上的例子,自己学习Documentation编写的例子在运行通过以后,不断的尝试着用不同的方法实现,不断的尝试破坏代码的结构,看看它会有什么结果。通过这样的方式,你会很彻底的很精通的掌握Java。

    举个例子,我们都编过Hello World

    public class HelloWorld {
    public static void main(String[] args) {
    System.out.println("Hello World");
    }
    }

    很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args),能不能不这样写?包括我刚学习Java的时候也有这样的疑问。想知道答案吗?很简单,你把main改个名字运行一下,看看报什么错误,然后根据出错信息进行分析;把main的public取掉,在试试看,报什么错误;static去掉还能不能运行;不知道main方法是否一定要传一个String[]数组的,把String[]改掉,改成int[],或者String试试看;不知道是否必须写args参数名称的,也可以把args改成别的名字,看看运行结果如何。

    我当初学习Java的时候就是这样做的,把Hello World程序反复改了七八次,不断运行,分析运行结果,最后就彻底明白为什么了main方法是这样定义的了。

    此外,我对于staic,public,private,Exception,try{ }catch {}finally{}等等等等一开始都不是很懂,都是把参考书上面的例子运行成功,然后就开始破坏它,不断的根据自己心里面的疑问来重新改写程序,看看能不能运行,运行出来是个什么样子,是否可以得到预期的结果。这样虽然比较费时间,不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行,看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。

    其中特别值得一提的是JDK有一个非常棒的调试功能,-verbose
    java ?Cverbose
    javac ?Cverbose 以及其它很多JDK工具都有这个选项
    -verbose 可以显示在命令执行的过程中,JVM都依次加载哪里Class,通过这些宝贵的调试信息,可以帮助我们分析出JVM在执行的过程中都干了些什么。

    另外,自己在学习过程中,写的很多的这种破坏例程,应该有意识的分门别类的保存下来,在工作中积累的典型例程也应该定期整理,日积月累,自己就有了一个代码库了。遇到类似的问题,到代码库里面 Copy & Paste ,Search & Replace,就好了,极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层,形成一个通用的类库,封装好。那么可复用性就更强了。

    所以我觉得其实不是特别需要例程的,自己写的破坏例程就是最好的例子,如果你实在对自己写的代码不放心的话,我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip,解开来就可以完整的看到整个JDK基础类库,也就是rt.jar的Java源代码,你可以参考一下Sun是怎么写Java程序的,规范是什么样子的。我自己在学习Java的类库的时候,当有些地方理解的不是很清楚的时候,或者想更加清晰的理解运作的细节的时候,往往会打开相应的类的源代码,通过看源代码,所有的问题都会一扫而空。

    Java Learning Path(五)资源篇

    1、 http://java.sun.com/ ;(英文)
    Sun的Java网站,是一个应该经常去看的地方。不用多说。

    2、 http://www-900.ibm.com/developerWorks/cn/ ;
    IBM的developerWorks网站,英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站,也是Web Services,Java,Linux极好的网站。强烈推荐!!!

    3、 http://www.java-cn.com/ ;(中文)
    JAVA中文站,目前国内资料最全、会员最多的JAVA技术网站,人气极高。有《JAVA电子书库》、《JAVA视频库》(国内唯一)、《JAVA技术文摘库》、《JAVA源代码库》、《JAVA工具库》、《招聘求职广场》等主要栏目,还有一些专家栏目。目前会员有5万多,VIP会员近1000人。无论是菜鸟还是老鸟,都能在此网站中找到自己所需要的东东!! 最强烈推荐!!!!!!

    4、 http://www.javaworld.com/ ;(英文)
    关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用,这里比较好。

    5、 http://dev2dev.bea.com.cn/index.jsp ;
    BEA的开发者园地,BEA作为最重要的App Server厂商,有很多独到的技术,在Weblogic上做开发的朋友不容错过。

    6、 http://www.huihoo.com/ ;
    灰狐动力网站,一个专业的中间件网站,虽然不是专业的Java网站,但是在J2EE企业应用技术方面有深厚的造诣。

    7、 http://www.theserverside.com/home/ ;(英文)
    TheServerSide是一个著名的专门面向Java Server端应用的网站。

    8、 http://www.javaresearch.org/ ;
    Java研究组织,有很多优秀的Java方面的文章和教程,特别是在JDO方面的文章比较丰富。

    9、 http://www.cnjsp.org/ ;
    JSP技术网站,有相当多的Java方面的文章和资源。

    10、 http://www.jdon.com/ ;
    Jdon论坛,是一个个人性质的中文J2EE专业技术论坛,在众多的Java的中文论坛中,Jdon一个是技术含量非常高,帖子质量非常好的论坛。

    11、 http://sourceforge.net/ ;
    SourgeForge是一个开放源代码软件的大本营,其中也有非常非常丰富的Java的开放源代码的著名的软件。
  • JAVA程序员面试宝典

    caianying 发布于 2007-01-11 16:18:08

    程序员面试之葵花宝典


    面向对象的特征有哪些方面 
     
    1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题,而6. 只是选择其中的一部分,7. 暂时不8. 用部分细节。抽象包括两个方面,9. 一是过程抽象,10. 二是数据抽象。

    11. 继承:继承是一种联结类的层次模型,12. 并且允许和鼓励类的重用,13. 它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,14. 这个过程称为类继承。新类继承了原始类的特性,15. 新类称为原始类的派生类(子类),而16. 原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,17. 并且类可以修改或增加新的方法使之更适合特殊的需要。

    18. 封装:封装是把过程和数据包围起来,19. 对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,20. 即现实世界可以被描绘成一系列完全自治、封装的对象,21. 这些对象通过一个受保护的接口访问其他对象。

    22. 多态性:多态性是指23. 允许不同24. 类的对象对同25. 一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,26. 很好的解决了应用程序函数同27. 名28. 问题。

    2、String是最基本的数据类型吗?
    基本数据类型包括byte、int、char、long、float、double、boolean和short。
    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类

    3、int 和 Integer 有什么区别
    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
    原始类型封装类booleanBoolean  charCharacter  byteByte  shortShort  intInteger  longLong  floatFloat  doubleDouble
    引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

    4、String 和StringBuffer的区别
    JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

    5、运行时异常与一般异常有何异同?
    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

    6、说出Servlet的生命周期,并说出Servlet和CGI的区别。
    Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

    7、说出ArrayList,Vector, LinkedList的存储性能和特性
    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

    8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
        EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。
    SessionBean在J2EE应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他EJB组件。EntityBean被用来代表应用系统中用到的数据。
    对于客户机,SessionBean是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
    对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,EJB Container 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。

    9、Collection 和 Collections的区别。 Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

    10、&和&&的区别。 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。


    11、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算法都大概一样,所以性能不会有很大的差异。

    12、final, finally, finalize的区别。 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

    13、sleep() 和 wait() 有什么区别? sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

    14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
    方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。

    15、error和exception有什么区别?
    error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

    16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
    如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

    17、abstract class和interface有什么区别?声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

    18、heap和stack有什么区别。栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素

    19、forward 和redirect的区别forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。

    20、EJB与JAVA BEAN的区别?Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。

    21、Static Nested Class 和 Inner Class的不同。 Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

    22、JSP中动态INCLUDE与静态INCLUDE的区别?动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面<%@ include file="included.htm" %>

    23、什么时候用assert。  assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

    24、GC是什么? 为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

    25、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)  short s1 = 1; s1 += 1;(可以正确编译)

    26、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?  Math.round(11.5)==12  Math.round(-11.5)==-11  round方法返回与参数最接近的长整数,参数加1/2后求其floor.

    27、String s = new String("xyz");创建了几个String Object?    两个

    28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
    以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。
    public class ThreadTest1{private int j;  public static void main(String args[]){  ThreadTest1 tt=new ThreadTest1();  Inc inc=tt.new Inc(); Dec dec=tt.new Dec();  for(int i=0;i<2;i++){  Thread t=new Thread(inc);  t.start();  t=new Thread(dec);  t.start();  } }   private synchronized void inc(){  j++;  System.out.println(Thread.currentThread().getName()+"-inc:"+j);  }
      private synchronized void dec(){ j--;  System.out.println(Thread.currentThread().getName()+"-dec:"+j);  }
    class Inc implements Runnable{  public void run(){  for(int i=0;i<100;i++){  inc();  } }  } class Dec implements Runnable{public void run(){  for(int i=0;i<100;i++){ dec(); } }  } }

    29、Java有没有goto?  java中的保留字,现在没有在java中使用。

    30、启动一个线程是用run()还是start()?启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

    31、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
    SessionBean:Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例。EntityBean:Entity Beans能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在,Entity beans就一直存活。而不是按照应用程序或者服务进程来说的。即使EJB容器崩溃了,Entity beans也是存活的。Entity Beans生命周期能够被容器或者 Beans自己管理。EJB通过以下技术管理实务:对象管理组织(OMG)的对象实务服务(OTS),Sun Microsystems的Transaction Service(JTS)、Java Transaction API(JTA),开发组(X/Open)的XA接口。

    32、应用服务器有那些?
    BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat

    33、给我一个你最常见到的runtime exception。
    ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException

    34、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
    接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

    35、List, Set, Map是否继承自Collection接口?  List,Set是,Map不是

    36、说出数据连接池的工作机制是什么?
    J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。

    37、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?  都不能

    38、数组有没有length()这个方法? String有没有length()这个方法?数组没有length()这个方法,有length的属性。String有有length()这个方法。

    39、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
    Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

    40、构造器Constructor是否可被override?构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

    41、是否可以继承String类?String类是final类故不可以继承。

    42、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。

    43、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?会执行,在return前执行。

    44、编程题: 用最有效率的方法算出2乘以8等於几? 2 << 3

    45、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?不对,有相同的hash code。

    46、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

    47、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
    不能,一个对象的一个synchronized方法只能由一个线程访问。

    48、编程题: 写一个Singleton出来。
    Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。一般Singleton模式通常有几种种形式:第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。public class Singleton {private Singleton(){} private static Singleton instance = new Singleton();  public static Singleton getInstance() {  return instance;   }  }  第二种形式: public class Singleton {  private static Singleton instance = null;  public static synchronized Singleton getInstance() { if (instance==null) instance=new Singleton();
    return instance;   } }   其他形式:  定义一个类,它的构造函数为private的,所有方法为static的。一般认为第一种形式要更加安全些

    49、Java的接口和C++的虚类的相同和不同处。
    由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。

    50、Java中的异常处理机制的简单原理和应用。
    当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

    51、垃圾回收的优点和原理。并考虑2种回收机制。
    Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收

    52、请说出你所知道的线程同步的方法。
    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

    53、你所知道的集合类都有哪些?主要方法?最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。

    54、描述一下JVM加载class文件的原理机制?JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

    55、char型变量中能不能存贮一个中文汉字?为什么?
    能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的

    56、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
    多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 ,同步的实现方面有两种,分别是synchronized,wait与notify

    57、JSP的内置对象及方法。
    request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法,response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法(如cookies,头信息等)
    out对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。 pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。  session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息  applicaton 表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息  config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。  page表示从该页面产生的一个servlet实例

    58、线程的基本概念、线程的基本状态以及状态之间的关系线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

    59、JSP的常用指令<%@page language=”java” contenType=”text/html;charset=gb2312” session=”true” buffer=”64kb” autoFlush=”true” isThreadSafe=”true” info=”text” errorPage=”error.jsp” isErrorPage=”true” isELIgnored=”true” pageEncoding=”gb2312” import=”java.sql.*”%>isErrorPage(是否能使用Exception对象),isELIgnored(是否忽略表达式) <%@include file=”filename”%><%@taglib prefix=”c”uri=”http://……”%>

    60、什么情况下调用doGet()和doPost()?Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。

    61、servlet的生命周期web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。

    62、如何现实servlet的单线程模式  <%@ page isThreadSafe=”false”%>

    63、页面间对象传递的方法  request,session,application,cookie等

    64、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
    JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。

    65、四种会话跟踪技术 cookie,url重写,session,隐藏域

    65,jsp的四种范围
    page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面
    request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)
    session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求
    application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域

    66、Request对象的主要方法:
    setAttribute(String name,Object):设置名字为name的request的参数值
    getAttribute(String name):返回由name指定的属性值
    getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例
    getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
    getCharacterEncoding():返回请求中的字符编码方式
    getContentLength():返回请求的Body的长度
    getHeader(String name):获得HTTP协议定义的文件头信息
    getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例
    getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例
    getInputStream():返回请求的输入流,用于获得请求中的数据
    getMethod():获得客户端向服务器端传送数据的方法
    getParameter(String name):获得客户端传送给服务器端的有name指定的参数值
    getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
    getParameterValues(String name):获得有name指定的参数的所有值
    getProtocol():获取客户端向服务器端传送数据所依据的协议名称
    getQueryString():获得查询字符串
    getRequestURI():获取发出请求字符串的客户端地址
    getRemoteAddr():获取客户端的IP地址
    getRemoteHost():获取客户端的名字
    getSession([Boolean create]):返回和请求相关Session
    getServerName():获取服务器的名字
    getServletPath():获取客户端所请求的脚本文件的路径
    getServerPort():获取服务器的端口号
    removeAttribute(String name):删除请求中的一个属性

    67、J2EE是技术还是平台还是框架?J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
    J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。

    68、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
      Public String translate (String str) {  String tempStr = "";  try { tempStr = new String(str.getBytes("ISO-8859-1"), "GBK"); tempStr = tempStr.trim(); } catch (Exception e) {  System.err.println(e.getMessage());  } return tempStr;  }

    69、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。区别主要答两点:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型b.逻辑操作不会产生短路

    70、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
    a: 两种形式 dtd  schema,b: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),c:有DOM,SAX,STAX等  DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问  SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 STAX:Streaming API for XML (StAX)

    71、简述synchronized和java.util.concurrent.locks.Lock的异同 ?
    主要相同点:Lock能完成synchronized所实现的所有功能主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

    72、EJB的角色和三个对象
    一个完整的基于EJB的分布式计算结构由六个角色组成,这六个角色可以由不同的开发商提供,每个角色所作的工作必须遵循Sun公司提供的EJB规范,以保证彼此之间的兼容性。这六个角色分别是EJB组件开发者(Enterprise Bean Provider) 、应用组合者(Application Assembler)、部署者(Deployer)、EJB 服务器提供者(EJB Server Provider)、EJB 容器提供者(EJB Container Provider)、系统管理员(System Administrator)三个对象是Remote(Local)接口、Home(LocalHome)接口,Bean类

    73、EJB容器提供的服务主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。

    74、EJB规范规定EJB中禁止的操作有哪些? 1.不能操作线程和线程API(线程API指非线程对象的方法如notify,wait等),2.不能操作awt,3.不能实现服务器功能,4.不能对静态属生存取,5.不能使用IO操作直接存取文件系统,6.不能加载本地库.,7.不能将this作为变量和返回,8.不能循环调用。

    75、remote接口和home接口主要作用remote接口定义了业务方法,用于EJB客户端调用业务方法。home接口是EJB工厂用于创建和移除查找EJB实例

    76、bean 实例的生命周期对于Stateless Session Bean、Entity Bean、Message Driven Bean一般存在缓冲池管理,而对于Entity Bean和Statefull Session Bean存在Cache管理,通常包含创建实例,设置上下文、创建EJB Object(create)、业务方法调用、remove等过程,对于存在缓冲池管理的Bean,在create之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在Cache管理的Bean则通过激活和去激活机制保持Bean的状态并限制内存中实例数量。

    77、EJB的激活机制 以Stateful Session Bean 为例:其Cache大小决定了内存中可以同时存在的Bean实例的数量,根据MRU或NRU算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个EJB实例业务方法时,如果对应EJB Object发现自己没有绑定对应的Bean实例则从其去激活Bean存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的ejbActive和ejbPassivate方法。

    78、EJB的几种类型会话(Session)Bean ,实体(Entity)Bean 消息驱动的(Message Driven)Bean  ;会话Bean又可分为有状态(Stateful)和无状态(Stateless)两种;实体Bean可分为Bean管理的持续性(BMP)和容器管理的持续性(CMP)两种

    79、客服端调用EJB对象的几个基本步骤设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用Create方法创建Remote接口,通过Remote接口调用其业务方法。

    80、如何给weblogic指定大小的内存? 在启动Weblogic的脚本中(位于所在Domian对应服务器目录下的startServerName),增加set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为32M,最大200M

    81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true。

    82、如何启动时不需输入用户名与密码?修改服务启动文件,增加 WLS_USER和WLS_PW项。也可以在boot.properties文件中增加加密过的用户名和密码.

    83、在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中?保存在此Domain的config.xml文件中,它是服务器的核心配置文件。

    84、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然的在浏览器上就可打入http://主机:端口号//helloword.jsp就可以看到运行结果了? 又比如这其中用到了一个自己写的javaBean该如何办?
    Domain目录\服务器目录\applications,将应用目录放在此目录下将可以作为应用访问,如果是Web应用,应用目录需要满足Web应用目录要求,jsp文件可以直接放在应用目录中,Javabean需要放在应用目录的WEB-INF目录的classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。

    85、在weblogic中发布ejb需涉及到哪些配置文件不同类型的EJB涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xmlCMP实体Bean一般还需要weblogic-cmp-rdbms-jar.xml

    86、如何在weblogic中进行ssl配置与客户端的认证配置或说说j2ee(标准)进行ssl的配置缺省安装中使用DemoIdentity.jks和DemoTrust.jks  KeyStore实现SSL,需要配置服务器使用Enable SSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trust keystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。

    87、如何查看在weblogic中已经发布的EJB?可以使用管理控制台,在它的Deployment中可以查看所有已发布的EJB

    88、CORBA是什么?用途是什么? CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。

    89、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
      Session Facade Pattern:使用SessionBean访问EntityBean;Message Facade Pattern:实现异步调用;EJB Command Pattern:使用Command JavaBeans取代SessionBean,实现轻量级访问;Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特性;Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供特性;Business Interface:通过远程(本地)接口和Bean类实现相同接口规范业务逻辑一致性;EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。

    90、说说在weblogic中开发消息Bean时的persistent与non-persisten的差别persistent方式的MDB可以保证消息传递的可靠性,也就是如果EJB容器出现问题而JMS服务器依然会将消息在此MDB可用的时候发送过来,而non-persistent方式的消息将被丢弃。

    91、Servlet执行时一般实现哪几个方法?public void init(ServletConfig config);public ServletConfig getServletConfig();public String getServletInfo();public void service(ServletRequest request,ServletResponse response);public void destroy()

    92、常用的设计模式?说明工厂模式。 Java中的23种设计模式:Factory(工厂模式),Builder(建造模式), Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)。工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

    93、EJB需直接实现它的业务接口或Home接口吗,请简述理由。远程接口和Home接口不需要直接实现,他们的实现代码是由服务器产生的,程序运行中对应实现类会作为对应接口类型的实例被使用。

    94、排序都有哪几种方法?请列举。用JAVA实现一个快速排序。排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
    快速排序的伪代码。/ /使用快速排序方法对a[ 0 :n- 1 ]排序,从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点,
    把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点,递归地使用快速排序方法对left 进行排序,递归地使用快速排序方法对right 进行排序,所得结果为l e f t + m i d d l e + r i g h t。

    95、请对以下在J2EE中常用的名词进行解释(或简单描述)web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

    96、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
    Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。用try来指定一块预防所有“异常”的程序。紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。throw语句用来明确地抛出一个“异常”。throws用来标明一个成员函数可能抛出的各种“异常”。Finally为确保一段代码不管发生什么“异常”都被执行一段代码。可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try语句,“异常”的框架就放到堆栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,堆栈就会展开,直到遇到有处理这种“异常”的try语句。

    97、一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?可以。必须只有一个类名与文件名相同。

    98、MVC的各个部分都有那些技术来实现?如何实现? MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

    99、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

    100、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
    字节流,字符流。字节流继承于InputStream \ OutputStream,字符流继承于InputStreamReader \ OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。

    101、java中会存在内存泄漏吗,请简单描述。会。如:int i,i2;  return (i-i2);   //when i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。

    102、java中实现多态的机制是什么?方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

    103、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

    104、静态变量和实例变量的区别?static i = 10; //常量; class A a;  a.i =10;//可变

    105、什么是java序列化,如何实现java序列化?
    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

    106、是否可以从一个static方法内部发出对非static方法的调用?不可以,如果其中包含对象的method();不能保证对象初始化.

    107、写clone()方法时,通常都有一行代码,是什么?Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。

    108、在JAVA中,如何跳出当前的多重嵌套循环?用break; return 方法。

    109、List、Map、Set三个接口,存取元素时,各有什么特点?List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

    110、J2EE是什么?J2EE是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

    111、UML方面 标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。

    112、说出一些常用的类,包,接口,请各举5个常用的类:BufferedReader  BufferedWriter  FileReader  FileWirter  String  Integer;常用的包:java.lang  java.awt  java.io  java.util  java.sql;常用的接口:Remote  List  Map  Document  NodeList

    113、开发中都用到了那些设计模式?用在什么场合? 每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。

    114、jsp有哪些动作?作用分别是什么? JSP共有以下6种基本动作 jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

    115、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 可以继承其他类或完成其他接口,在swing编程中常用此方式。

    116、应用服务器与WEB SERVER的区别?应用服务器:Weblogic、Tomcat、Jboss; WEB SERVER:IIS、 Apache

    117、BS与CS的联系与区别。C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQL Server。客户端需要安装专用的客户端软件。B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或 SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。C/S 与 B/S 区别: 1.硬件环境不同: C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务; B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行 2.对安全要求不同 :C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。3.对程序架构不同 : C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑. B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟. 4.软件重用不同: C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好. B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子 。5.系统维护不同  :C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统, B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级. 6.处理问题不同 :C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统,B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小. 7.用户接口不同: C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高,B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.
    8.信息流不同 : C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低,B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

    118、LINUX下线程,GDI类的解释。LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。 GDI类为图像设备编程接口类库。

    119、STRUTS的应用(如STRUTS架构) Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能: 一.包含一个controller servlet,能将用户的请求发送到相应的Action对象。 二.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。 三.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

    120、Jdo是什么? JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

    121、内部类可以引用他包含类的成员吗?有没有什么限制?一个内部类对象可以访问创建它的外部类对象的内容

    122、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 Web ServiceWeb Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。 UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

    JAVA代码查错
    abstract class Name { private String name; public abstract boolean isStupidName(String name) {}}大侠们,这有何错误?答案: 错。abstract method必须以分号结尾,且不带花括号。

    2.public class Something { void doSomething () {  private String s = "";  int l = s.length(); } }有错吗?答案: 错。局部变量前不能放置任何访问修饰符 (private,public,和protected)。final可以用来修饰局部变量(final如同abstract和strictfp,都是非访问修饰符,strictfp只能修饰class和method而非variable)。

    3.abstract class Something { private abstract String doSomething ();}这好像没什么错吧?答案: 错。abstract的methods不能以private修饰。abstract的methods就是让子类implement(实现)具体细节的,怎么可以用private把abstract method封锁起来呢? (同理,abstract method前不能加final)。

    4.public class Something { public int addOne(final int x) { return ++x; }}这个比较明显。
    答案: 错。int x被修饰成final,意味着x不能在addOne method中被修改。

    5.public class Something { public static void main(String[] args) { Other o = new Other(); new Something().addOne(o); }  public void addOne(final Other o) {  o.i++; }}  class Other { public int i;}和上面的很相似,都是关于final的问题,这有错吗?
    答案: 正确。在addOne method中,参数o被修饰成final。如果在addOne method里我们修改了o的reference,(比如: o = new Other();),那么如同上例这题也是错的。但这里修改的是o的member vairable(成员变量),而o的reference并没有改变。

    6.class Something { int i; public void doSomething() {  System.out.println("i = " + i); }} 有什么错呢? 看不出来啊。答案: 正确。输出的是"i = 0"。int i属於instant variable (实例变量,或叫成员变量)。instant variable有default value。int的default value是0。

    7.class Something { final int i; public void doSomething() { System.out.println("i = " + i); }}和上面一题只有一个地方不同,就是多了一个final。这难道就错了吗?答案: 错。final int i是个final的instant variable (实例变量,或叫成员变量)。final的instant variable没有default value,必须在constructor (构造器)结束之前被赋予一个明确的值。可以修改为"final int i = 0;"。

    8.public class Something { public static void main(String[] args) { Something s = new Something();  System.out.println("s.doSomething() returns " + doSomething());  }  public String doSomething() {  return "Do something ..."; }} 看上去很完美。答案: 错。看上去在main里call doSomething没有什么问题,毕竟两个methods都在同一个class里。但仔细看,main是static的。static method不能直接call non-static methods。可改成"System.out.println("s.doSomething() returns " + s.doSomething());"。同理,static method不能访问non-static instant variable。

    9.此处,Something类的文件名叫OtherThing.javaclass Something { private static void main(String[] something_to_do) {  System.out.println("Do something ..."); }} 这个好像很明显。
    答案: 正确。从来没有人说过Java的Class名字必须和其文件名相同。但public class的名字必须和文件名相同。

    10.interface  A{  int x = 0;}  class B{ int x =1;}  class C extends B implements A { public void pX(){ System.out.println(x); } public static void main(String[] args) { new C().pX(); }}答案:错误。在编译时会发生错误(错误描述不同的JVM有不同的信息,意思就是未明确的x调用,两个x都匹配(就象在同时import java.util和java.sql两个包时直接声明Date一样)。对于父类的变量,可以用super.x来明确,而接口的属性默认隐含为 public static final.所以可以通过A.x来明确。
    11.interface Playable { void play();}  interface Bounceable { void play();}  interface Rollable extends Playable, Bounceable {  Ball ball = new Ball("PingPang");} class Ball implements Rollable { private String name; public String getName() { return name;} public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); }}这个错误不容易发现。答案: 错。"interface Rollable extends Playable, Bounceable"没有问题。interface可继承多个interfaces,所以这里没错。问题出在interface Rollable里的"Ball ball = new Ball("PingPang");"。任何在interface里声明的interface variable (接口变量,也可称成员变量),默认为public static final。也就是说"Ball ball = new Ball("PingPang");"实际上是"public static final Ball ball = new Ball("PingPang");"。在Ball类的Play()方法中,"ball = new Ball("Football");"改变了ball的reference,而这里的ball来自Rollable interface,Rollable interface里的ball是public static final的,final的object是不能被改变reference的。因此编译器将在"ball = new Ball("Football");"这里显示有错。

    JAVA编程题
    1.现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
    import java.util.*;
    public class bycomma{ public static String[] splitStringByComma(String source){ if(source==null||source.trim().equals(""))   return null; StringTokenizer commaToker = new StringTokenizer(source,",");  String[] result = new String[commaToker.countTokens()]; int i=0;  while(commaToker.hasMoreTokens()){  result[i] = commaToker.nextToken();  i++; }  return result;}
     public static void main(String args[]){ String[] s = splitStringByComma("5,8,7,4,3,9,1"); int[] ii = new int[s.length]; for(int i = 0;i<s.length;i++){ ii[i] =Integer.parseInt(s[i]); }  Arrays.sort(ii); //asc  for(int i=0;i<s.length;i++){  System.out.println(ii[i]);  }  //desc  for(int i=(s.length-1);i>=0;i--){  System.out.println(ii[i]);  } }}

    2.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)->(一千零一拾一元整)输出。
    package test.format;import java.text.NumberFormat;import java.util.HashMap;public class SimpleMoneyFormat {
      public static final String EMPTY = "";public static final String ZERO = "零";public static final String ōNE = "壹";public static final String TWO = "贰";public static final String THREE = "叁";public static final String FOUR = "肆"; public static final String FIVE = "伍";public static final String SIX = "陆";public static final String SEVEN = "柒"; public static final String EIGHT = "捌"; public static final String NINE = "玖"; public static final String TEN = "拾"; public static final String HUNDRED = "佰"; public static final String THOUSAND = "仟";  public static final String TEN_THOUSAND = "万"; public static final String HUNDRED_MILLION = "亿"; public static final String YUAN = "元"; public static final String JIAO = "角"; public static final String FEN = "分";  public static final String DOT = "."; private static SimpleMoneyFormat formatter = null;private HashMap chineseNumberMap = new HashMap();  private HashMap chineseMoneyPattern = new HashMap();  private NumberFormat numberFormat = NumberFormat.getInstance();  private SimpleMoneyFormat() {  numberFormat.setMaximumFractionDigits(4);   numberFormat.setMinimumFractionDigits(2);  numberFormat.setGroupingUsed(false);  chineseNumberMap.put("0", ZERO); chineseNumberMap.put("1", ONE);  chineseNumberMap.put("2", TWO); chineseNumberMap.put("3", THREE); chineseNumberMap.put("4", FOUR); chineseNumberMap.put("5", FIVE); chineseNumberMap.put("6", SIX);  chineseNumberMap.put("7", SEVEN);  chineseNumberMap.put("8", EIGHT); chineseNumberMap.put("9", NINE);  chineseNumberMap.put(DOT, DOT); chineseMoneyPattern.put("1", TEN); chineseMoneyPattern.put("2", HUNDRED); chineseMoneyPattern.put("3", THOUSAND);  chineseMoneyPattern.put("4", TEN_THOUSAND); chineseMoneyPattern.put("5", TEN);  chineseMoneyPattern.put("6", HUNDRED); chineseMoneyPattern.put("7", THOUSAND); chineseMoneyPattern.put("8", HUNDRED_MILLION); }
     public static SimpleMoneyFormat getInstance() {  if (formatter == null)  formatter = new SimpleMoneyFormat(); return formatter; }
      public String format(String moneyStr) {   checkPrecision(moneyStr);  String result; result = convertToChineseNumber(moneyStr);  result = addUnitsToChineseMoneyString(result);   return result;  } public String format(double moneyDouble) { return format(numberFormat.format(moneyDouble)); }  public String format(int moneyInt) {  return format(numberFormat.format(moneyInt));
      }  public String format(long moneyLong) {  return format(numberFormat.format(moneyLong)); }
     public String format(Number moneyNum) {   return format(numberFormat.format(moneyNum)); }
     private String convertToChineseNumber(String moneyStr) {  String result; StringBuffer cMoneyStringBuffer = new StringBuffer(); for (int i = 0; i < moneyStr.length(); i++) {   cMoneyStringBuffer.append(chineseNumberMap.get(moneyStr.substring(i, i + 1))); }
        //拾佰仟万亿等都是汉字里面才有的单位,加上它们 int indexOfDot = cMoneyStringBuffer.indexOf(DOT);  int moneyPatternCursor = 1;  for (int i = indexOfDot - 1; i > 0; i--) {   cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor));   moneyPatternCursor = moneyPatternCursor == 8 ? 1 : moneyPatternCursor + 1;  }  String fractionPart = cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf("."));  cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."), cMoneyStringBuffer.length()); while (cMoneyStringBuffer.indexOf("零拾") != -1) {
          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"), cMoneyStringBuffer.indexOf("零拾") + 2, ZERO);
        } while (cMoneyStringBuffer.indexOf("零佰") != -1) {
          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"), cMoneyStringBuffer.indexOf("零佰") + 2, ZERO);
        }while (cMoneyStringBuffer.indexOf("零仟") != -1) {
          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"), cMoneyStringBuffer.indexOf("零仟") + 2, ZERO);
        }while (cMoneyStringBuffer.indexOf("零万") != -1) {
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"), cMoneyStringBuffer.indexOf("零万") + 2, TEN_THOUSAND);
        } while (cMoneyStringBuffer.indexOf("零亿") != -1) {
          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"), cMoneyStringBuffer.indexOf("零亿") + 2, HUNDRED_MILLION); } while (cMoneyStringBuffer.indexOf("零零") != -1) {
          cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"), cMoneyStringBuffer.indexOf("零零") + 2, ZERO);
        } if (cMoneyStringBuffer.lastIndexOf(ZERO) == cMoneyStringBuffer.length() - 1) cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.length());  cMoneyStringBuffer.append(fractionPart);
      result = cMoneyStringBuffer.toString();  return result; }private String addUnitsToChineseMoneyString(String moneyStr) {  String result; StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr); int indexOfDot = cMoneyStringBuffer.indexOf(DOT);  cMoneyStringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN); cMoneyStringBuffer.insert(cMoneyStringBuffer.length() - 1, JIAO); cMoneyStringBuffer.insert(cMoneyStringBuffer.length(), FEN); if (cMoneyStringBuffer.indexOf("零角零分") != -1)//没有零头,加整
      cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零角零分"), cMoneyStringBuffer.length(), "整"); else  if (cMoneyStringBuffer.indexOf("零分") != -1)//没有零分,加整   cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零分"), cMoneyStringBuffer.length(), "整");
        else { if(cMoneyStringBuffer.indexOf("零角")!=-1)
            cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("零角"),cMoneyStringBuffer.indexOf("零角")+2);
         tmpBuffer.append("整"); }  result = cMoneyStringBuffer.toString(); return result; } private void checkPrecision(String moneyStr) {
    int fractionDigits = moneyStr.length() - moneyStr.indexOf(DOT) - 1;  if (fractionDigits > 2)  throw new RuntimeException("金额" + moneyStr + "的小数位多于两位。"); //精度不能比分低  }public static void main(String args[]) {  System.out.println(getInstance().format(new Double(10010001.01))); }}

    3、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
    答:父类: package test;
    public class FatherClass { public FatherClass() { System.out.println("FatherClass Create"); } }
    子类: package test; import test.FatherClass; public class ChildClass extends FatherClass { public ChildClass() { System.out.println("ChildClass Create"); } public static void main(String[] args) { FatherClass fc = new FatherClass(); ChildClass cc = new ChildClass(); } } 输出结果: C:>java test.ChildClass  FatherClass Create   FatherClass Create   ChildClass Create

    4、内部类的实现方式? 答:示例代码如下: package test; public class OuterClass { private class InterClass { public InterClass() {
    System.out.println("InterClass Create"); } } public OuterClass() { InterClass ic = new InterClass(); System.out.println("OuterClass Create"); } public static void main(String[] args) { OuterClass ōc = new OuterClass(); } } 输出结果: C:>java test/OuterClass
    InterClass Create   OuterClass Create 再一个例题: public class OuterClass { private double d1 = 1.0;
    //insert code here }
    You need to insert an inner class declaration at line 3. Which two inner class declarations are valid?(Choose two.)
    A. class InnerOne{ public static double methoda() {return d1;} }
    B. public class InnerOne{ static double methoda() {return d1;} }
    C. private class InnerOne{ double methoda() {return d1;} }
    D. static class InnerOne{ protected double methoda() {return d1;} }
    E. abstract class InnerOne{ public abstract double methoda(); }
    说明如下: 一.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。 故 A、B 错 二.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;return d1 出错。故 D 错 三.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确 四.答案为C、E

    5、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?
    答:Server端程序: package test; import java.net.*; import java.io.*; public class Server { private ServerSocket ss; private Socket socket;
    private BufferedReader in; private PrintWriter out; public Server() { try { ss=new ServerSocket(10000); while(true) { socket = ss.accept();
    String RemoteIP = socket.getInetAddress().getHostAddress(); String RemotePort = ":"+socket.getLocalPort(); System.out.println("A client come in!IP:"+RemoteIP+RemotePort); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = in.readLine(); System.out.println("Cleint send is :" + line); ōut = new PrintWriter(socket.getOutputStream(),true); out.println("Your Message Received!"); out.close(); in.close(); socket.close(); } }catch (IOException e) { out.println("wrong"); } } public static void main(String[] args) { new Server(); } }
    Client端程序: package test; import java.io.*; import java.net.*; public class Client { Socket socket; BufferedReader in; PrintWriter out; public Client() { try { System.out.println("Try to Connect to 127.0.0.1:10000"); socket = new Socket("127.0.0.1",10000); System.out.println("The Server Connected!"); System.out.println("Please enter some Character:"); BufferedReader line = new BufferedReader(new InputStreamReader(System.in)); ōut = new PrintWriter(socket.getOutputStream(),true);
    Out

    3、 接口和内部类、抽象类的特征答:接口:在一个类里,只有申明没有实现。内部类:是在一个类的内部定义的一个类;抽象类:是以abstract 定义的,里面至少有一个抽象方法。

    4、 文件读写的基本类
    答:File Reader 类和FileWriter类分别继承自Reader类和Writer类。FileReader类用于读取文件,File Writer类用于将数据写入文件,这两各类在使用前,都必须要调用其构造方法创建相应的对象,然后调用相应的read()或 write()方法。

    6、 线程的基本概念、线程的本状态以及状态之间的关系
    •新建 (Born) : 新建的线程处于新建状态•就绪 (Ready) : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用•运行 (Running) : 线程在开始执行时进入运行状态•睡眠 (Sleeping) : 线程的执行可通过使用 sleep() 方法来暂时中止。在睡眠后,线程将进入就绪状态•等待 (Waiting) : 如果调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发运行时。•挂起 (Suspended) : 在临时停止或中断线程的执行时,线程就处于挂起状态。•恢复 (Resume) : 在挂起的线程被恢复执行时,可以说它已被恢复。•阻塞 (Blocked) – 在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。•死亡 (Dead) – 在 run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。 5、 串行化的注意事项以及如何实现串行化答:如果有循环引用是不可以串行化的。对象输出流的WriteObject方法和 对象输入流的ReadObect 方法
    7、 线程的同步、如何实现线程的同步答:当两个或多个线程同时访问同一个变量,并且以个线程需要修改这个变量。就要用到线程同步。在Java 中,同步是通过 synchronized 关键字来定义的。 诺是想同步化某程序段,可以使用 synchronized(object){}方法,其中{}内的程序语句被同步化。

    9、 socket通信(tcp/udp区别及JAVA的实现方式)TCP——传输控制协议,具有极高的可靠性,保证数据包按照顺序准确到达,但其也有着很高的额外负担。UDP——使用者数据元协议,并不能保证数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。大多数我们会使用TCP,偶尔才会动用UDP,如声音讯号,即使少量遗失,也无        关紧要。

    10、 JAVA的事件委托机制和垃圾回收机制
    java 事件委托机制的概念,一个源产生一个事件并将它送到一个或多个监听器那里。在这种方案中,监听器简单的等待,直到它收到一个事件。一旦事件被接受,监听器将处理这个事件,然后返回。垃圾回收机制 垃圾收集是将分配给对象但不在使用的内存回收或释放的过程。如果一个对象没有指向它的引用或者其赋值为null,则次对象适合进行垃圾回收

    11、 JDBC调用数据库的基本步骤导入必要的类,装入JDBC驱动程序,识别数据源,分配一个Connection对象,分配一个Statement对象,使用Statement执行一个查询,从返回的ResultSet对象中检索数据,关闭ResultSet,关闭Statement对象,关闭Connection对象

    12、 解析XML文件的几种方式和区别答:Dom解析 在内存中创建一个DOM树,能随机访问文件内容,也可以修改原文件内容SAX解析 线性解析,不能随机访问,也无法修改原文件Dom解析要先用SAX解析创建DOM树

    13、 JAVA的四种基本权限的定义public private protected 默认

    14、 JAVA的国际化  答:Java 中提供了诺干国际化明感类,来实现国际化的。例如:dateformat  timezone 等等。

    2、 forward和rederect的区别答:redirect重定向到另外一个页面,重新开始一个请求forward跳转到另外一个页面, 请求不断开

    3、 jsp的

  • JAVA运行环境和J2EE运行环境的搭建

    lixia 发布于 2006-12-18 14:23:16


    [ 2005-10-31 17:38:09 | Author: Poplat ]

    很多人不能够很好的进行JAVA编程,原因就在于对JAVA运行环境的不了解或是了解得不够透彻。如果连一个普通的JAVA程序运行环境都搭建不好。就更不要说理解J2EE的运行环境搭建了。故本文首先介绍如何搭建普通JAVA程序的运行环境,再介绍如何在这个基础上进一步搭建J2EE运行环境。 一、什么是JDK? 学JAVA的人都应该知道SUN公司的JAVA 技术平台按其应用环境的不同有三个非常著名的版本,他们是J2SE(用于普通桌面应用程序的开发),J2EE(用于企业级应用程序的开发)和J2ME(用于移动设备及其他消费类电子产品的应用程序开发),SUN公司为这三个版本分别提供了相应的开发工具包(SDK:SoftWare Development Kits),下载的网址在http://www.sun.com/downloads 不过可能因为全世界太多人登录的原故,网页经常出现打不开的现象,其实大家在国内一些常用的资料下载网站同样可以DOWN到这些工具包的。在此不一一列举了。顺便提一下J2SE和J2EE目前最新的SDK版本是: ● J2SE 5.0 JDK ● J2EE 1.4 SDK 值得一提的是我们通常所说的JDK工具包指的是J2SE的SDK。目前一般学习者用得最多的也就是这个工具包了。大家还要注意一点,SUN公司为不同的操作系统提供了不同的JDK文件,而且这些文件又有脱机版(OFFLINE)与在线安装版(ONLINE)之分,所以在下载的时候要注意选择正确的文件。 那么JDK这个工具包里到底有些什么东东呢?其实这里面包括了JAVA程序的开发工具(JAVAC命令等)、运行环境(JAVA命令等)和核心类包。可想而知要想运行JAVA程序。就必须安装好JDK工具包。 二、如何安装JDK? 当我们从网络上DOWN下J2SE 5.0 JDK以后(是一个可执行文件,文件名叫做jdk-1_5_0-windows-i586.exe,当然这个名字会因为对应操作系统的不同而有所区别的,我使用的操作系统就是WINDOWS,大家发现了吗?),双击他就开始安装了。需要注意的就是选择安装路径的问题,通常我们将它安装在C盘根目录下(这也是安装程序默认的路径),其他的工作就是一个接一个地按NEXT啦。 三、搭建运行和开发环境 是不是当我们装完JDK以后就可以编写代码,准备编译运行了呢?别忙。大家还是跟着我一起检查一下吧: 1、 点击操作系统桌面上左下角的‘开始’菜单,选择‘运行’,然后在打开对话框里输入CMD,看到了吧,我们进入了命令提示符窗口,我们爱叫他DOS界面。 2、 现在大家在窗口里应该看到提示符了吧,通常会是这样:C:\Documents and Settings\Administrator> 3、 下面让我们在提示符后面敲上这样一个命令:JAVA,出现了这样的提示了吗? Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) …… 这是JAVA命令的帮助信息,如果有,那么成功一半了。 4、 接下来,继续试一下:在命令提示符处敲:JAVAC。同样也出现了JAVAC的命令帮助提示了吗?我想应该没有吧。你看到的也许会是这样: ‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件。 为什么出现这样的情况呢? 这是因为我们的操作系统在执行一个命令时,首先会到当前目录下去查找这个命令文件。如果在当前目录下找不到,他就会按照系统变量PATH所指示的多条路径里去搜索,直到找到为止。如果在这两个地方都找不到他就会报上面大家看到的错误。 在C:\Documents and Settings\Administrator这个路径下我们当然找不到JAVAC命令啦。我们的JDK不是安装在C盘根目录下吗?而我们的JAVAC、JAVA命令则在JDK目录下的BIN文件夹里,这个夹子里还有许多其他宝贝命令。如下图所示: 怎样才能让操作系统找到JAVAC命令呢?很简单!我们需要修改一下系统变量PATH,这样就不用每次要运行这个命令时都得跑到C:\j2sdk1.4.2_02\bin这个路径下面去了。怎样修改PATH,我们在第四个专题里来介绍。 5、 当我们在PATH变量里加了一条路径:C:\j2sdk1.4.2_02\bin以后,再到命令提 示符状态下输入JAVAC,就会出现帮助提示了。这就说明我们可以开始写JAVA程序了。 6、 让我们写一个Hello.java测试一下吧,我在E:\LESSON1这个文件夹下创建 了一个文本文件,输入如下一段代码,并且将之保存为Hello.java。 public class Hello { public static void main(String args[]) { System.out.println("Hello World!"); } } 7、 好现在我们又回到命令提示符状态下。在提示符处输入:JAVAC Hello.java,命 令又出错了。为什么?因为文件是建在E:\LESSON1下面,而我们的当前目录却不是它。在提示符处敲入:‘E:’,然后再敲:‘cd lesson1’,进入JAVA文件所在的那个目录后,现在再敲JAVAC Hello.java,文件成功编译。注意成功编译后会在当前目录下生出一个名叫:Hello.class的字节码文件。但是屏幕上没有任何提示。 8、 再试着运行一下‘java Hello‘这个命令,可以运行吗?当然不行。为什么, 因为我们的字节码文件是在JAVA虚拟机里运行的,所有关于虚拟机要使用的字节码文件的路径必须在一个叫做CLASSPATH的操作系统变量里找得到。否则我们的虚拟机就无法找到这个字节码文件,从而也就无从执行了。 9、 怎么办?先运行如下命令:set classpath=%classpath%;E:\lesson1,然后再运 行 java Hello 这个命令。屏幕上终于出现了亲切的问候:Hello world! 不过奇怪的事情又发生了。当我们重新启动一个命令提示符窗口再运行这个JAVA文件时,又无法执行了,屏幕提示:Exception in thread "main" java.lang.NoClassDefFoundError: Hello。还是老问题,虚拟机又找不到字节码文件了。WHY?其实我们在DOS窗口中设置的系统变量只对当前窗口有效。要想让我们的变量设置对任何一个DOS窗口都有效,还得到桌面上去做。我们仍然将在第四个专题里讲述CLASSPATH这个JAVA环境变量的设置。 四、PATH系统变量与CLASSPATH环境变量的设置 为什么需要设置PATH和CLASSPATH变量我们在前面的专题已经介绍过了。下面我们讲一下具体如何设置: 1、 右键单击我的电脑,选‘属性’菜单,在弹出的对话框里选择‘高级‘选项卡。然后在高级选项卡页按下‘环境变量’按钮。 2、 在弹出的环境变量窗口里我们将会看到它分为两个部分。一部分是谁谁用户的变量,如:Administrator的用户变量。一部分是系统变量。通常情况下我们在命令提示符下能够使用的变量数目是用户变量+系统变量数目之和。那我们不管用户变量。直接到系统变量格里去寻找PATH变量吧。通常情况下系统装好后PATH变量在这里是早就存在了的。但是CLASSPATH变量则没有。 环境变量窗口见图示: 3、 找到PATH变量后,双击这个变量名称后,将会弹出编辑系统变量窗口。将光标停到变量值对话框的最后,然后加上‘;C:\j2sdk1.4.2_02\bin ’。注意分号后的路径就是JAVA和JAVAC命令所在的路径。见图示: 4、 找不到CLASSPATH变量该怎么办呢?很简单。按下系统变量框下的新建按钮。然后在弹出的新建系统变量对话框里输入你要加的变量名称:CLASSPATH,在变量值对话框里输入你要运行的字节码文件所在的路径。如图示: 大家在以后的学习中会发现,只要是虚拟机运行所需的字节码文件(即类文件),包括SUN公司提供给我们的类。都需要将这些文件所在的路径放到CLASSPATH下。否则,程序在编译过程中会经常找不着所需要的类包。那可是很头疼的事。比如说:JDK安装目录下的LIB目录下就有许多*.jar文件。当我们的程序要使用到这些压缩文件里的类时,就需要把这些文件所在的路径加到CLASSPATH里,比如说:C:\j2sdk1.4.2_02\lib\dt.jar。 注意添加*.jar包和直接添加*.class文件的路径是有一点小小区别的,前者要包含JAR包的名字。而后者只需文件路径。 五、J2EE运行环境的搭建 开发企业级的应用程序需要搭建好J2EE的运行环境。其实也就是到SUN公司的网站上去DOWN下J2EE 1.4 SDK开发工具包。然后双击安装文件,如果你下载的版本与我的一样。那么这个安装文件就会是这个名字:j2eesdk-1_4-dr-windows-eval.exe。同样的我们也将J2EE SDK安装在C盘根目录下。 需要特别提醒大家的是:J2EE运行环境的搭建是以J2SE运行环境的搭建为基础的。其实想也想得到为什么。如果没有JDK,哪里来的编译和运行命令呢(JAVA和javac)。安装完J2EE 1.4 SDK包后,具体的设置与测试步骤如下: 1、 首先右往PATH变量里添加J2EE SDK的BIN目录。如:C:\j2sdkee1.3.1\bin。如何往里面添加,前面已经讲过。 2、 然后新建两个变量:一个是JAVA_HOME,变量值为:JDK的安装目录。另一个是J2EE_HOME,变量值为J2EE SDK的安装目录。如图示: 3、 最后往CLASSPATH变量里添加一个关键的JAR包。它就是J2EE.JAR包。比如我添加的就是:C:\j2sdkee1.3.1\lib\j2ee.jar。 4、 所有的工作做完以后。大家可以通过以下方式验证一下我们的J2EE环境是否已经搭建成功。在命令提示符状态下输入命令:J2EE -Verbose。如果屏幕的最下面看到了这样一句话J2EE server startup complete.那就表示J2EE服务器成功启动了。在我们的J2EE程序要布署和运行的过程中。服务器将一直启动着。 另外提一下,如果你需要停止J2EE服务器,必须再开一个命令窗口,并运行如下命令:J2EE ?STOP。成功运行后,将会有提示语句。再去看看启动服务器的那个窗口,你将可以看到提示符了。 5、 这样做了还不够,我们还需要到网页里去测试一下服务器默认页面是否能够正常显示,这样才能保证我们能够进WEB程序的开发。双击IE浏览器的图标,在地址栏里输入:http://localhost:8000,如果你能看到以下窗口中的内容,那就说明你的J2EE环境已经搭建成功。需要说明一点,在localhost:后的是J2EE服务器提供的WEB服务端口号。 需要提醒大家的是:当你打开网页之前,确认你的J2EE服务器是启动着的。如果你机器上没有安装网卡,或是网卡安装不正确,也会导致无法打开J2EE服务器默认页面。 六、在JCreater中开发程序需做的配置 大多数初学者使用的的集成开发环境都是Jcreator。这是一个很适合学习者使用的开发工具。但是使用时需注意以下几点: 1、 最好是先装好J2SE SDK和J2EE SDK之后再去安装Jcreator。这样关于JDK的设置Jcreator会自动完成。 2、 那如果不幸先装了Jcreator,后装的JDK也不要紧。可以这样做,完成配置:选择’Configure’菜单。选择Options菜单:如图示 然后选中JDK Profiles。点击NEW按钮,弹出如下对话框: 选中J2sdk1.4.2_02目录。然后点击确定按钮。 接下来将会弹出下面的对话框: 我们会发现这个目录下及子目录下几乎所有的JAR包都在窗口里显示出来了。这样就不怕JAVA虚拟机找不到所需的类了。再点OK吧。 回到OPTIONS窗口继续点OK就回到Jcreator的主界面了。 3、 上面的工作做完以后我们进行普通JAVA程序的开发是没有问题了。不过要进行企业级开发。还得加几个JAR包。重新打开上面看到的Options窗口。选择JDK Profiles,选中J2SDK1.4.2_02,再点击EDIT按钮。 将会弹出PROFILES窗口,点击ADD按钮。选择ADD ARCHIVE选项。在弹出的对话框里选择J2EE SDK的安装路径,并且进入LIB目录。选中所有的JAR文件。如图示: 点击打开按钮。OK两次后回到Jcreator主界面下。 做完这件事后我们可以在JCREATOR中写J2EE代码了。 到这里,JAVA和J2EE运行环境的搭建就介绍完了。大家开始加油编写代码吧。告诉大家学习JAVA和J2EE唯一的办法就是敲代码,唯有抄代码抄出心得以后,你才可以写出自己的漂亮的程序。


  • 数据库常用面试题(SQL Server)

    shiker2003 发布于 2008-10-04 22:47:33


      问题描述:

      为管理岗位业务培训信息,建立3个表:

      S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄

      C (C#,CN ) C#,CN 分别代表课程编号、课程名称

      SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩

      1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名

      --实现代码:

      Select SN,SD FROM S

      Where [S#] IN(

      Select [S#] FROM C,SC

      Where C.[C#]=SC.[C#]

      AND CN=N'税收基础')

      2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位

      --实现代码:

      Select S.SN,S.SD FROM S,SC

      Where S.[S#]=SC.[S#]

      AND SC.[C#]='C2'

      3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位

      --实现代码:

      Select SN,SD FROM S

      Where [S#] NOT IN(

      Select [S#] FROM SC

      Where [C#]='C5')

      4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位

      --实现代码:

      Select SN,SD FROM S

      Where [S#] IN(

      Select [S#] FROM SC

      RIGHT JOIN

      C ON SC.[C#]=C.[C#] GROUP BY [S#]

      HAVING COUNT(*)=COUNT([S#]))

      5. 查询选修了课程的学员人数

      --实现代码:

      Select 学员人数=COUNT(DISTINCT [S#]) FROM SC

      6. 查询选修课程超过5门的学员学号和所属单位

      --实现代码:

      Select SN,SD FROM S

      Where [S#] IN(

      Select [S#] FROM SC

      GROUP BY [S#]

      HAVING COUNT(DISTINCT [C#])>5)

    题目2

      问题描述:

      已知关系模式:

      S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名

      C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师

      SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩

      1. 找出没有选修过“李明”老师讲授课程的所有学生姓名

      --实现代码:

      Select SNAME FROM S

      Where NOT EXISTS(

      Select * FROM SC,C

      Where SC.CNO=C.CNO

      AND CNAME='李明'

      AND SC.SNO=S.SNO)

      2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

      --实现代码:

      Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)

      FROM S,SC,(

      Select SNO

      FROM SC

      Where SCGRADE<60

      GROUP BY SNO

      HAVING COUNT(DISTINCT CNO)>=2

      )A Where S.SNO=A.SNO AND SC.SNO=A.SNO

      GROUP BY S.SNO,S.SNAME

      3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名

      --实现代码:

      Select S.SNO,S.SNAME

      FROM S,(

      Select SC.SNO

      FROM SC,C

      Where SC.CNO=C.CNO

      AND C.CNAME IN('1','2')

      GROUP BY SNO

      HAVING COUNT(DISTINCT CNO)=2

      )SC Where S.SNO=SC.SNO

      4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号

      --实现代码:

      Select S.SNO,S.SNAME

      FROM S,(

      Select SC1.SNO

      FROM SC SC1,C C1,SC SC2,C C2

      Where SC1.CNO=C1.CNO AND C1.NAME='1'

      AND SC2.CNO=C2.CNO AND C2.NAME='2'

      AND SC1.SCGRADE>SC2.SCGRADE

      )SC Where S.SNO=SC.SNO

      5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩

      --实现代码:

      Select S.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]

      FROM S,(

      Select SC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE

      FROM SC SC1,C C1,SC SC2,C C2

      Where SC1.CNO=C1.CNO AND C1.NAME='1'

      AND SC2.CNO=C2.CNO AND C2.NAME='2'

      AND SC1.SCGRADE>SC2.SCGRADE

      )SC Where S.SNO=SC.SNO
  • JAVA面试题

    aries1979 发布于 2007-06-21 20:23:24

    1.抽象类与接口?
    答:抽象类与接口都用于抽象,但是抽象类(JAVA)可以有自己的部分实现,而接口则完全是一个标识(同时有多重继承的功能)

    2STRINGSTRINGBUFFER的区别。
    答:STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffertoString()方法

    3jsp有哪些内置对象?作用分别是什么?
    :JSP共有以下9种基本内置组件(可与ASP6种内部组件相对应):
     request 用户端请求,此请求会包含来自GET/POST请求的参数
    response
    网页传回用户端的回应
    pageContext
    网页的属性是在这里管理
    session
    与请求有关的会话期
    application servlet
    正在执行的内容
    out
    用来传送回应的输出
    config servlet
    的构架部件
    page JSP
    网页本身
    exception
    针对错误网页,未捕捉的例外

    4jsp有哪些动作?作用分别是什么?
    :JSP共有以下6种基本动作
    jsp:include
    :在页面被请求的时候引入一个文件。
    jsp:useBean
    :寻找或者实例化一个JavaBean
    jsp:setProperty
    :设置JavaBean的属性。
    jsp:getProperty
    :输出某个JavaBean的属性。
    jsp:forward
    :把请求转到一个新的页面。
    jsp:plugin
    :根据浏览器类型为Java插件生成OBJECTEMBED标记

    5、JSP中动态INCLUDE与静态INCLUDE的区别?
    答:动态INCLUDEjsp:include动作实现
    <jsp:include page="included.jsp" flush="true" />
    它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数
    静态INCLUDEinclude伪码实现,定不会检查所含文件的变化,适用于包含静态页面
    <%@ include file="included.htm" %>

    6
    、两种跳转方式分别是什么?有什么区别?
    答:有两种,分别为:
    <jsp:include page="included.jsp" flush="true">
    <jsp:forward page= "nextpage.jsp"/>
    前者页面不会转向include所指的页面,只是显示该页的结果,主页面还是原来的页面。执行完后还会回来,相当于函数调用。并且可以带参数.后者完全转向新页面,不会再回来。相当于go to 语句。

    7、说一说Servlet的生命周期?
    :servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,servicedestroy方法表达。

    8JAVA SERVLET APIforward() redirect()的区别?
    :前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。

    9
    Servlet的基本架构
    public class ServletName extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws
    ServletException, IOException {
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
    ServletException, IOException {
    }
    }

    10EJBJAVA BEAN的区别?
    :Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如WebspereWebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。

    11MVC的各个部分都有那些技术来实现?如何实现?
    :MVCModelViewController的简写。"Model" 代表的是应用的业务逻辑(通过JavaBeanEJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

    12J2EE是什么?
    :Je22Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。




  • 腾讯公司的面试题 (转)

    v_v 发布于 2007-06-14 22:56:27

    腾讯公司的面试题

    1 、对 MMORPG 的 CLIENT/SERVER 使用白盒和黑盒的方法进行集成和系统测试; 2 、编写测试计划完成测试任务。
    工作要求: 1、了解C/S结构,并熟悉TCP/IP、UDP协议; 2、掌握常用的软件测试工具、测试流程 ,熟悉软件工程; 3、熟悉C++或Delphi Windows编程; 4、了解游戏客户端程序设计和服务器架构方式;

    此题是腾讯招聘游戏测试人员的题目!
    通知偶去面试!
    今天上午偶p点p点的就去坐了公交,一个半小时后到了公司总部,(附:公司总部是受其他城市的委托来面试我的)

    主考是北方人,我也是北方人,于是很快就出题了!如下!


    1,网络游戏交易的流程,用Oracl,sql,叙述出来
    2,找到交易这个流程之间的测试点

    然后问偶,能写出来吗?
    偶说,能,
    问:需要多久?
    偶:20分钟
    然后对表!
    关门,
    偶开始狂写狂画,之后偶觉的思路没理清,
    换张纸,慢慢画,急切间服务器的英文---server忘记了,而且字体超级烂,偶本来字很好看的,,,毕业至今没写过几个字哈,生疏了,也紧张。
    终于在20分钟内大概画了个流程图针对于第一题,并附上测试用例!
    第二题,偶只写出了两个测试点!
    门开,主考进来,看偶的纸,说,我要的就是这个,然后问:软件测试最重要的是什么?
    偶觉的哪个阶段都重要啊,不厌其烦也很重要,于是偶就头晕晕的很笃定的说功能测试最重要!
    又问些对游戏的感受和了解,就ok了!最后问偶愿意去另外的城市工作吗?给偶一个考虑的机会,
    偶呆了一秒说:您知道,我刚来这里,是自己来的,无牵无挂,只要是xx公司,哪个城市都行!
    于是结束了面试!
    偶本来以为不会这么良好吧,偶的第一次面试!

    刚刚从公交上下来,准备回住的地洗澡澡,电话响了,是那个城市的分部打来的电话,说是要电话面试我,由于大街上很嘈杂,狂跑到小区的里面蹲在草坪上接受面试,呵呵!

    问的问题跟上午面试的题一样,不过交易变成了组队,偶还照我上午的思路说了下,但是人家说那不对,然后自己说了下去,可惜我没听清楚他说的什么,因为那会信号不好,然后我跟他口风说对对,是那样,然后继续问我第2个问题:玩过什么游戏,对游戏的熟悉程度,以及你认为的游戏测试包括那些?

    我的回答:因为本人接触游戏很早,从传奇到奇迹,到现在的3d,天堂2,魔兽世界,英雄,热血江湖,只要是rpg的基本上都玩过,不管是q版的还是武侠魔幻的,还有休闲类的,比如泡泡堂,疯狂坦克等等,强调了我的测试经验是休闲类的游戏,包括大富翁,泡泡龙,主要负责功能测试,立足于用户角度,包括键盘的操作,指令的确认返回,可玩性测试等,[这期间他还问我竞技类游戏呢?比如cs,我说呵呵,cs以前是我的最爱]
    然后他问:你对可玩性测试是怎么认识的
    偶回答:包括色彩的显示,画面的连接,服务器的流畅度,以及游戏平衡性的设置,举例来说,以前的奇迹比传奇操作简单一点,这是一个方面,奇迹的装备很华丽能够吸引人,泡泡堂的角色造型很可爱,容易吸引女孩子,这些都是可玩性方面的

    第三个问题:你认为象早期的超级玛丽游戏上面的按键怎么做测试?
    偶回答:超级玛丽的游戏的键盘很简单,手柄上面的跳,走,跑,和四个方向键,四个方向键可以用枚举的方法测试,看其输入跟确认结果是否一样,不一样了就是问题所在,同样的功能键--跑跳走等也是这样!
    (其实偶回答的应该是属于测试目的,和测试脚本,与测试执行,测试平估之间的联系~渴望高手指点一下偶这样的思路正确与否?)
    他问:有没有想到测试时候同时按几个键,或者乱按键会出现什么结果?
    偶回答:当然需要这样的测试,站在用户的角度来说,我们做测试应该尽全力的进行全方位的思考和测试!
    第四个问题:给你一个测试脚本,你怎么制定测试计划?你的测试目标是什么?
    偶回答:测试目标我想应该有个最高测试目的,游戏测试和软件测试的不同也包含有这一点,游戏测试的最终目标是让普通大众去把握和接受,而软件有没这个普遍性,所以制定测试计划的时候也应该跟随脚本向这个目标走。然后就是个人认为测试过程是随着软件游戏的开发过程而进行的,每个阶段都应该有不同的开发过程和测试过程,所以每个阶段的测试计划和测试目的是不同的,我不知你问的具体指哪个方面,而我以前从事的是功能测试,就是黑盒测试!
    这时还问偶一个问题:你做的功能测试是怎么发现并提交bug的?
    偶的回答:我以前的测试过程是每天的测试内容侧重点是不同的,要根据leader发布的测试计划走,提交bug一般要形成图文并茂,再现bug出现场景,有理有据,形成文档,提交!
    然后就是他说:那好,今天就问到这里,有其他联系了会有别的人给你其他的面试。
    最后我问一点:我想问一下,我记得你们招收的学历是本科,可是我是大专,所以我想感谢你们给我面试的机会!
    他笑到,这个没什么的,学历我们并不看中,老总是想把你外聘的,好的,就这样,一起学习!呵呵

    当时我就傻了~~~
    外聘,,,就是打工扫地也好啊,不管是不是正式,有个工作就行!!!

    本人今天的面试就是这样!

  • 测试面试题

    v_v 发布于 2007-05-28 18:35:22


    测试管理职位面试题

    •  ( TM )请列举你曾经担任的测试工作职位

    •  ( TM )你认为项目测试经理的工作职责和内容是什么?

    •  ( TM )请描述如果你是测试队伍的负责人,你如何提高测试队伍的技术能力?

    •  ( TM )你认为测试工程师的工作职责和内容是什么?

    •  ( TM )请画图描述项目测试过程与开发、配置管理、质量管理这三个过程之间的关系

    •  ( TM )某个项目为长期外包测试,测试人员长期派驻客户现场执行测试工作,你作为一个现场的项目测试经理如何维持组中测试工程师的稳定性?可从任意方面分析

    •  ( TM )如何解决测试需求、测试用例等测试信息的版本控制问题?

    •  ( TE )请列举你曾经做过的测试(你认为有技术含量的或者提高了测试管理能力的),并描述你从中如何受益

    •  ( TE )请列举至少 5 个项目测试过程中可能存在的实施风险,并给出每项风险的规避方法

    •  ( TE )在完整的测试过程中,你选择在何时进行自动化功能测试?为什么?

    •  ( TE )在完整的测试过程中,你选择在何时进行性能测试?为什么?



    功能测试职位面试题


    •  ( FT )请比较 Rational TestManager 与 MI TestDirector 的优缺点

    •  ( FT )请描述黑盒测试、白盒测试、灰盒测试

    •  ( FT )请描述如何进行测试需求的跟踪分析?

    •  ( FT )请列举至少三种测试用例的设计方法,并说明其基本的原理

    •  ( FT )请画出一个缺陷的生命周期示意图

    •  ( FT )请列举至少三种缺陷统计分析的方法,并说明每个方法的作用

    •  ( FT )请画出一个单元测试、集成测试、系统测试、验收测试的流程示意图


    自动测试职位面试题


    •  ( AT )请列举你曾经做过的自动化功能测试项目的经验

    •  ( AT )你认为适合进行自动化功能测试的时机是什么?请解释原因

    •  ( AT )请列举至少三个自动化测试在实现过程中会遇到的难点

    •  ( AT )请问:怎么在自动测试中实现数据驱动?

    •  ( AT )你会计算自动测试工程的投入回报比吗?怎么计算?

    •  ( AT )请比较 Rational Robot 与 MI QTP 的优缺点

    •  ( AT )你认为 Robot 在数据参数化的时候有什么不便之处吗?

    •  ( AT )请问 QTP 中如何不用录制的方法启动 IE ,并对 IE 窗口进行操作

    •  ( AT )在用自动测试工具制作测试脚本的时候,当需要对某个界面上的对象进行操作时,如何保证操作成功?

    •  ( TP )请选择一个自动功能测试工具并用该测试工具的脚本语言写一个脚本:每天早上 9 点弹出对话框,提示“现在 9 点了”。说明在测试工具中使用你的脚本的方式


    性能测试职位面试题


    •  ( PT )请列举你曾经做过的性能测试项目,包括被测系统名称、硬件架构、应用架构和性能测试工具

    •  ( PT )给你一个 J2EE 的 Web 应用系统,请描述完整的性能测试流程

    •  ( PT )请描述如何有效的监控 WEBLOGIC 应用服务器的性能情况

    •  ( PT )请描述如何有效的监控 Oracle 数据库服务器的性能情况

    •  ( PT )请问:当操作系统的 PageFaults/s 数值很大且频繁波动,说明什么?

    •  ( PT )请问:在性能测试的时候,怎样判断网络存在瓶颈?

    •  ( PT )请描述性能测试报告中应该包含的主要内容

    •  ( PT )请比较 Rational 性能测试工具与 MI LoadRunner 的优缺点

    •  ( PT )在性能测试时,如果被测系统没有带界面的客户端,你有什么办法?

    •  ( TP )请说明在性能测试中用测试工具进行数据关联是什么意思,解决什么问题?


    英语能力面试题

    •  ( English )翻译下面的内容

    An important special case of overlooking bugs is checking that the product does what it's supposed to do, but not that it doesn't do what it isn't supposed to do. As an example, suppose you have a program that updates a health care service's database of family records. A test adds a second child to Dawn Marick's record. Almost all testers would check that, after the update, Dawn now has two children. Some testers - those who are clever, experienced, or subject matter experts - would check that Dawn Marick's spouse, Brian Marick, also now has two children. Relatively few testers would check that no one else in the database has had a child added. They would miss a bug where the programmer over-generalized and assumed that all "family information" updates should be applied both to a patient and to all members of her family, giving Paul Marick (aged 2) a child.
        Ideally, every test should check that all data that should be modified has been modified and that all other data has been unchanged. With forethought, that can be built into automated tests. Complete checking may be impractical for manual tests, but occasional quick scans for data that might be corrupted can be valuable.

    •  ( English )根据下面的中文内容写一个缺陷报告

    我们正在给国外的一家软件公司的“ klsoft ”软件做测试,你发现了一个 bug ,在“ Mkbox ”对话框中输入八位的数字点“ save ”按钮,再次查询后该数字就会变成另外一个数字,而且任何什么规则,如果输入小于八位或者大于八位的数字就不会出现此问题。这个问题在 Win2000 professional 系统存在,其他系统不存在。现在该软件已经投入使用了,所以你感觉到问题的严重性,现在要求你写一封英文的 email 给美国公司的 Simen ,希望他可以帮助转达给相关的负责人员,引起注意,记住 Simen 并不是这部分的负责人,而且他工作很忙,所以要注意措辞。
  • 2007-01-10 | 软件测试面试题整理

    caicai1724 发布于 2007-04-27 21:56:58

    面试题目:
    01. 为什么要在一个团队中开展软件测试工作?
    因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比ISO质量认证一样,测试同样也需要质量的保证,这个时候就需要在团队中开展软件测试的工作。在测试的过程发现软件中存在的问题,及时让开发人员得知并修改问题,在即将发布时,从测试报告中得出软件的质量情况。
    02. 您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?
    我曾经做过web测试,后台测试,客户端软件,其中包括功能测试,性能测试,用户体验测试。最擅长的是功能测试
    03. 您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同04. 的测试类型的区别与联系(如功能测试、性能测试……)
    测试类型有:功能测试,性能测试,界面测试。
    功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错误推测、因果图和综合策略。
    性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
    界面测试,界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。
    区别在于,功能测试关注产品的所有功能上,要考虑到每个细节功能,每个可能存在的功能问题。性能测试主要关注于产品整体的多用户并发下的稳定性和健壮性。界面测试更关注于用户体验上,用户使用该产品的时候是否易用,是否易懂,是否规范(快捷键之类的),是否美观(能否吸引用户的注意力),是否安全(尽量在前台避免用户无意输入无效的数据,当然考虑到体验性,不能太粗鲁的弹出警告)?做某个性能测试的时候,首先它可能是个功能点,首先要保证它的功能是没问题的,然后再考虑该功能点的性能测试
    05.  请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。
    黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
    白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。
      软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误:
    1、是否有不正确或遗漏的功能?
    2、在接口上,输入是否能正确的接受?能否输出正确的结果?
    3、是否有数据结构错误或外部信息(例如数据文件)访问错误?
    4、性能上是否能够满足要求?
    5、是否有初始化或终止性错误?
      软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查:
    1、对程序模块的所有独立的执行路径至少测试一遍。
    2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。
    3、在循环的边界和运行的界限内执行循环体。
    4、测试内部数据结构的有效性,等等。
    单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
          单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。
    集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。
    系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。(常见的联调测试)
           系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统设计。
    验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
    验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。
    06. 测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?
    软件测试计划是指导测试过程的纲领性文件,包含了产品概述、测试策略、测试方法、测试区域、测试配置、测试周期、测试资源、测试交流、风险分析等内容。借助软件测试计划,参与测试的项目成员,尤其是测试管理人员,可以明确测试任务和测试方法,保持测试实施过程的顺畅沟通,跟踪和控制测试进度,应对测试过程中的各种变更。
    测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。所以其中最重要的是测试测试策略和测试方法(最好是能先评审)
    07. 您认为做好测试计划工作的关键是什么?
    1. 明确测试的目标,增强测试计划的实用性
    编写软件测试计划得重要目的就是使测试过程能够发现更多的软件缺陷,因此软件测试计划的价值取决于它对帮助管理测试项目,并且找出软件潜在的缺陷。因此,软件测试计划中的测试范围必须高度覆盖功能需求,测试方法必须切实可行,测试工具并且具有较高的实用性,便于使用,生成的测试结果直观、准确
    2.坚持“5W”规则,明确内容与过程
    “5W”规则指的是“What(做什么)”、“Why(为什么做)”、“When(何时做)”、“Where(在哪里)”、“How(如何做)”。利用“5W”规则创建软件测试计划,可以帮助测试团队理解测试的目的(Why),明确测试的范围和内容(What),确定测试的开始和结束日期(When),指出测试的方法和工具(How),给出测试文档和软件的存放位置(Where)。
    3.采用评审和更新机制,保证测试计划满足实际需求
    测试计划写作完成后,如果没有经过评审,直接发送给测试团队,测试计划内容的可能不准确或遗漏测试内容,或者软件需求变更引起测试范围的增减,而测试计划的内容没有及时更新,误导测试执行人员。
    4. 分别创建测试计划与测试详细规格、测试用例
    应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。
    08. 您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。
    1.等价类划分
    划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类.
    2.边界值分析法
      边界值分析方法是对等价类划分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.
      使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.
    3.错误推测法
      基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法.
      错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结. 还有, 输入数据和输出数据为0的情况. 输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况. 可选择这些情况下的例子作为测试用例.
    4.因果图方法
      前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型). 因果图方法最终生成的就是判定表. 它适合于检查程序输入条件的各种组合情况. 
    08.您认为做好测试用例设计工作的关键是什么?
    白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果
    黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题
    09. 请以您以往的实际工作为例,10. 详细的描述一次测试用例设计的完整的过程。
    就说最近的这次网站功能的测试吧
    首先:得到相关文档(需求文档和设计文档),理解需求和设计设计思想后,想好测试策略(测试计划简单点就OK了),考虑到测试环境,测试用例,测试时间等问题。
    第二步:设计测试用例,测试策略是:把网站部分的功能点测试完,然后在进行系统测试(另外个模块呢有另一个测试人员负责,可以进行联调测试),网站模块的测试基本是功能测试和界面测试(用户并发的可能性很小,所以不考虑):这次的网站的输入数据呢是使用数据库中的某张表记录,如果表中某一数据记录中新加进来的(还没有被处理的,有个标志位),网站启动后会立刻去刷那张表,得到多条数据,然后在进行处理。处理过程中,会经历3个步骤,网站才算完成了它的任务。有3个步骤呢,就可以分别对这3个步骤进行测试用例的设计,尽量覆盖到各种输入情况(包括数据库中的数据,用户的输入等),得出了差不多50个用例。界面测试,也就是用户看的到的地方,包括发送的邮件和用户填写资料的页面展示。
    第三步:搭建测试环境(为什么这个时候考虑测试环境呢?因为我对网站环境已经很熟了,只有有机器能空于下来做该功能测试就可以做了),因为网站本身的环境搭建和其他的系统有点不同,它需要的测试环境比较麻烦,需要web服务器(Apache,tomcat),不过这次需求呢,网站部分只用到了tomcat,所以只要有tomcat即可
    第四步:执行测试
    11. 您以往是否曾经从事过性能测试工作?如果有,12. 请尽可能的详细描述您以往的性能测试工作的完整过程。
    是的,曾经做过网站方面的性能测试,虽然做的时间并不久(2个月吧),当时呢,是有位网站性能测试经验非常丰富的前辈带着我一起做。
    性能测试类型包括负载测试,强度测试,容量测试等
          负载测试:负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。
          强度测试: 强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况。
          容量测试:确定系统可处理同时在线的最大用户数  
    在网站流量逐渐加大的情况下,开始考虑做性能测试了,首先要写好性能测试计划,根据运营数据得出流量最大的页面(如果是第一次的话,一般是首页,下载页,个人帐户页流量最大,而且以某种百分比),
    Web服务器指标指标:
    * Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;
    * Successful Rounds:成功的请求;
    * Failed Rounds :失败的请求;
    * Successful Hits :成功的点击次数;
    * Failed Hits :失败的点击次数;
    * Hits Per Second :每秒点击次数;
    * Successful Hits Per Second :每秒成功的点击次数;
    * Failed Hits Per Second :每秒失败的点击次数;
    * Attempted Connections :尝试链接数;

    13. 您在从事性能测试工作时,14. 是否使用过一些测试工具?如果有,15. 请试述该工具的工作原理,16. 并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。
    17. 您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?
    18. 在您以往的工作中,19. 一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    20. 您以往所从事的软件测试工作中,21. 是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,22. 请结合该工具描述软件缺陷(Bug)跟踪管理的流程。
    23. 您认为在测试人员同24. 开发人员的沟通过程中,25. 如何提高沟通的效率和改善沟通的效果?维持测试人员同26. 开发团队中其他成员良好的人际关系的关键是什么?
    27. 在您以往的测试工作中,28. 最让您感到不29. 满意或者不30. 堪回首的事情是什么?您是如何来对待这些事情的?
    31. 在即将完成这次笔试前,32. 您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面)
    33.     你对测试最大的兴趣在哪里?为什么?
    最大的兴趣就是测试有难度,有挑战性!做测试越久越能感觉到做好测试有多难。曾经在无忧测试网上看到一篇文章,是关于如何做好一名测试工程师。一共罗列了11,12点,有部分是和人的性格有关,有部分需要后天的努力。但除了性格有关的1,2点我没有把握,其他点我都很有信心做好它。
    刚开始进入测试行业时,对测试的认识是从无忧测试网上了解到的一些资料,当时是冲着做测试需要很多技能才能做的好,虽然入门容易,但做好很难,比开发更难,虽然当时我很想做开发(学校专业课我基本上不缺席,因为我喜欢我的专业),但看到测试比开发更难更有挑战性,想做好测试的意志就更坚定了。
    不到一年半的测试工作中,当时的感动和热情没有减退一点(即使环境问题以及自身经验,技术的不足,做测试的你一定也能理解)。
    我觉得做测试整个过程中有2点让我觉得很有难度(对我来说,有难度的东西我就非常感兴趣),第一是测试用例的设计,因为测试的精华就在测试用例的设计上了,要在版本出来之前,把用例写好,用什么测试方法写?(也就是测试计划或测试策略),如果你刚测试一个新任务时,你得花一定的时间去消化业务需求和技术基础,业务需求很好理解(多和产品经理和开发人员沟通就能达到目的),而技术基础可就没那么简单了,这需要你自觉的学习能力,比如说网站吧,最基本的技术知识你要知道网站内部是怎么运作的的,后台是怎么响应用户请求的?测试环境如何搭建?这些都需要最早的学好。至少在开始测试之前能做好基本的准备,可能会遇到什么难题?需求细节是不是没有确定好?这些问题都能在设计用例的时候发现。
    第二是发现BUG的时候了,这应该是测试人员最基本的任务了,一般按测试用例开始测试就能发现大部分的bug,还有一部分bug需要测试的过程中更了解所测版本的情况获得更多信息,补充测试用例,测试出bug。还有如何发现bug?这就需要在测试用例有效的情况下,通过细心和耐心去发现bug了,每个用例都有可能发现bug,每个地方都有可能出错,所以测试过程中思维要清晰(测试过程数据流及结果都得看仔细了,bug都在里面发现的)。如何描述bug也很有讲究,bug在什么情况下会产生,如果条件变化一点点,就不会有这个bug,以哪些最少的操作步骤就能重现这个bug,这个bug产生的规律是什么?如果你够厉害的话,可以帮开发人员初步定位问题。
    34. 你的测试职业发展是什么?
    测试经验越多,测试能力越高。所以我的职业发展是需要时间累积的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年累积测试经验,按如何做好测试工程师的11,12点要求自己,不断的更新自己改正自己,做好测试任务。
    35. 你自认为测试的优势在哪里?
    优势在于我对测试坚定不移的信心和热情,虽然经验还不够,但测试需要的基本技能我有信心在工作中得以发挥。
    36. 你以前工作时的测试流程是什么?
    公司对测试流程没有规定如何做,但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正(自己总结,吸取同行的方法)后的流程吧。需求评审(有开发人员,产品经理,测试人员,项目经理)->需求确定(出一份确定的需求文档)->开发设计文档(开发人员在开始写代码前就能输出设计文档)->想好测试策略,写出测试用例->发给开发人员和测试经理看看(非正式的评审用例)->接到测试版本->执行测试用例(中间可能会补充用例)->提交bug(有些bug需要开发人员的确定(严重级别的,或突然发现的在测试用例范围之外的,难以重现的),有些可以直接录制进TD)->开发人员修改(可以在测试过程中快速的修改)->回归测试(可能又会发现新问题,再按流程开始跑)。
    37. 当开发人员说不38. 是BUG时,39. 你如何应付?
    开发人员说不是bug,有2种情况,一是需求没有确定,所以我可以这么做,这个时候可以找来产品经理进行确认,需不需要改动,3方商量确定好后再看要不要改。二是这种情况不可能发生,所以不需要修改,这个时候,我可以先尽可能的说出是BUG的依据是什么?如果被用户发现或出了问题,会有什么不良结果?程序员可能会给你很多理由,你可以对他的解释进行反驳。如果还是不行,那我可以给这个问题提出来,跟开发经理和测试经理进行确认,如果要修改就改,如果不要修改就不改。其实有些真的不是bug,我也只是建议的方式写进TD中,如果开发人员不修改也没有大问题。如果确定是bug的话,一定要坚持自己的立场,让问题得到最后的确认。
    23.你为什么想离开目前的职务?
    因为公司运作情况并不理想,公司需要调整部门体系,公司考虑到缩减部门人员,所以大批量的裁员(有6,7个),这是我的第一份工作,对公司也有较深的感情,因为在这里我找到了职业理想(就是测试),所以公司需要精简人员,我自愿退出。虽然很舍不得,但我将会有新的发挥能力的舞台。
      24:你对我们公司了解有多少?

      25:你找工作时,最重要的考虑因素为何?
    工作的性质和内容是否能让我发挥所长,并不断成长。
    26:为什么我们应该录取你?
    您可以由我过去的工作表现所呈现的客观数据,明显地看出我全力以赴的工作态度。
      27:请谈谈你个人的最大特色。
    我的坚持度很高,事情没有做到一个令人满意的结果,绝不罢手。
    28.白箱测试和黑箱测试是什么?什么是回归测试?
        29。单元测试、集成测试、系统测试的侧重点是什么?
        30。设计用例的方法、依据有那些?
        31。一个测试工程师应具备那些素质和技能?
        32.集成测试通常都有那些策略?
        33.你用过的测试工具的主要功能、性能及其他?
        34.一个缺陷测试报告的组成
        35.基于WEB信息管理系统测试时应考虑的因素有哪些?
    36.软件测试项目从什么时候开始,?为什么?
         37.需求测试注意事项有哪些?
         38.简述一下缺陷的生命周期
         39.测试分析测试用例注意(事项)?
    你在你所在的公司是怎么开展测试工作的?是如何组织的?
    你认为理想的测试流程是什么样子?
    你是怎样工作的?
    软件测试活动的生命周期是什么?
    请画出软件测试活动的流程图?
    针对缺陷采取怎样管理措施?
    什么是测试评估?测试评估的范围是什么?
    如果能够执行完美的黑盒测试,还需要进行白盒测试吗?为什么?
    测试结束的标准是什么?
    软件验收测试除了alpha,beta测试以外,还有哪一种?
    做测试多久了?
    以前做过哪些项目?
    你们以前测试的流程是怎样的?
    <答:测试计划-测试用例设计-测试执行-测试分析报告>
    用过哪些测试工具?
    为什么选择测试这行?
    <答:它是一个新兴的行业,有发展潜力,而且很锻炼人,需要掌握更多的技能,比做开发要更难>
    为什么值得他们公司雇用?
    如果我雇用你,你能给部门带来什么贡献?
    如何从工作中看出你是个自动自觉的人
    你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么)
    通常你对于别人批评你会有什么样的反应
    如果明知这样做不对,你还会依主管的指过去做吗
    如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理
    你觉得什么样的人最难相处
    为什么值得他们公司雇用?
          帮助公司提高软件质量和测试部门的技术水平
    如果我雇用你,你能给部门带来什么贡献?
          分享我的测试经验和测试技能,提高测试部门技术水平
    如何从工作中看出你是个自动自觉的人
         自动自觉范围太广
          1. 工作成果
          2. 工作质量  
    你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么)
          在有足够的资源和合理的工作量的情况下,完全可以按时完成,并能比一般人做的更好
    通常你对于别人批评你会有什么样的反应
      有错即改,无措勉之
    如果明知这样做不对,你还会依主管的指过去做吗
         在公司内部下级是否有申诉渠道?
    如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理
        为什么抱怨?是怎么样的问题?
         如果是客服问题,提交客服部门解决
        如果是质量问题,分析原因,下一版本改进
    你觉得什么样的人最难相处
         自以为是的人
    什么叫单元测试?
    请就软件测试人员应该具备什么样的基本素质说说你的看法。
    请就如何在开发中进行软件质量控制说说你的看法
     简述软件测试的意义,以及软件测试的分类

    1、功能测试,性能测试,界面测试,安全测试(可以简单点,比如只涉及到COOKIES里的内容),压力测试(商业性质的网站) 等等,B/S软件也要根据其具体功能采用不同的测试策略。
    2、态度、责任心、自信、敏锐的观察力、良好的发散思维
    3、先设计后开发模式,加强单元测试,加强代码走查,有一套完整的白盒测试方法。关键是加强开发人员的质量意识,增进程序员向工程师水平发展。
    4、意义嘛,就自己想吧。软件测试的分类,这个很多人都按各种方法去分。无明确答案给你。

    对测试的理解——基本的测试知识,对测试是否认可? 75。
       3、谈一谈过去自己的工作——了解经历、提供进一步提问的素材,表达能力  
    测试技能
    测试设计的方法并举例说明——测试技术的使用
    测试工具——熟悉程度,能否与当前工作匹配?
    如何做计划?如何跟踪计划?——日常工作能力
    如果开发人员提供的版本不满足测试的条件,如何做?——与开发人员协作的能力
    熟悉unix系统、oracle数据库吗?——是否具备系统知识
    做过开发吗?写过哪些代码?——开发技能
    阅读英语文章,给出理解说明?——部分英语能力
    文档的意义——是否善于思考?(最简单的概念,不同层次的理解)
    假如进入我们公司,对我们哪些方面会有帮助?——讲讲自己的特长
    随便找一件物品,让其测试——测试的实际操作能力
    软件测试的方法有?
    软件测试的过程?
    有一个新的软件,假如你是测试工程师,该如何做?
    软件测试分哪两种方法?分别适合什么情况?
    2。一套完整的测试应该由哪些阶段组成?分别阐述一下各个阶段。
    3。软件测试的类型有那些?分别比较这些不同的测试类型的区别与联系。
    4。测试用例通常包括那些内容?着重阐述编制测试用例的具体做法
    5。在分别测试winform的C/S结构与测试WEB结构的软件是,应该采取什么样的方法分别测试?他们存在什么样的区别与联系?
    6。在测试winform的C/S结构软件时,发现这个软件的运行速度很慢,您会认为是什么原因?您会采取哪些方法去检查这个原因?
    7。描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程
    你在五年内的个人目标和职业目标分别是什么?
      分析这个问题是用来了解你的计划能力的,通过这个问题,面试人同时还可以知道你的目标是否符合企业对你的安排。
      错误回答我想在将来的某个时候考虑这个问题。如今企业的领导者更换频繁,我认为做太多的个人计划是荒谬可笑的,不是吗?
      评论这种回答属于令人反感的一类。首先,当有人想了解你的目标时,"将来的某个时候"这种通俗说法并不奏效。其次,认为企业很脆弱,领导者更换频繁,这种说法毫无疑问会令人反感,而且也是不合理的。最后,认为做计划可笑,看不起这个问题,而且反问面试人,这些都注定了这样的求职者最终会失败。
      正确回答从现在起的五年之内,我希望能够在一个很好的职位上待几年,而且最好有一次晋升,然后就期待着下一步。不管是向上提升,还是在企业内横向调动,对我个人来说,我希望找到一家企业——一家愿意做相互投入的企业——待上一段时间。
      评论这个问题没有回答得过分具体(那样可能会产生漏洞),而且它表明你有雄心,并且思考过在企业中的成长方式。通过表达横向调动和向上提升的愿望,表明你是一个有灵活性的人。
     问题23 你怎样做出自己的职业选择?
      分析 面试人提出这个问题是为了了解求职者的动机,看看他(她)应聘这份工作是否有什么历史渊源,是否有职业规划,是不是仅仅在漫无目的地申请很多工作。
      错误回答 我一直都想在企业界工作。自孩提时代起,我就梦想自己至少也要成为大企业的副总裁。
      评论 除了难以令人相信之外,这种回答还存在一个问题:它表明求职者会对副总裁以下的职位不感兴趣。
      正确回答 在上大学四年级前的那个夏天,我决定集中精力在某一领域谋求发展。尽管我是学商业的,但是我不知道自己最终会从事哪一行业的工作。我花了一定的时间考虑自己的目标,想清楚了自己擅长做的事情以及想从工作中得到的东西,最后我得出了一个坚定的结论,那就是这个行业是最适合我的。
      评论 这种回答表明,求职者认真地做过一些计划,缩小了自己的关注点,而且也认准了前进的方向。这种回答还表明,求职者理解个人职业规划的重要性,并且有能力做出认真的个人决策。
    1. 你都用什么测试方法
    2.怎么编写案例
    3.怎么才能够全面的测试到每一个点
    1. 你都用什么测试方法
    针对不同的产品或者系统或者模块,有不同的测试方法。总体而言有白盒测试和黑盒测试。
    2.怎么编写案例
    案例的编写与测试阶段的定义有很大的关系。系统测试和unit测试的案例可能不同。总体而言测试案例根据系统的需求而定。
    3.怎么才能够全面的测试到每一个点
    测试的全面性主要需要在设计测试计划的时候考虑,从测试策略,产品需求等等多个角度考虑从而定义全部的测试点。
    1、谈谈软件测试技术,以及如何提高
    2、谈谈软件测试职业发展,以及个人的打算
    3、谈谈软件测试在企业的地位,也可以结合软件生命周期来谈
    有可能清晰的思路比确切的答案更重要
    在这里,主要说下笔试和面试的问题,希望大家共同参考。
        1,一般公司里实际的软件测试流程是什么样的?你们公司又是怎样的?
        2,软件工程师要具有那些素质?
        3,你会哪些测试工具?怎么操作?
        4,你能不能说下你的3到5年的职业计划(规划)
        5,你觉得你来应聘有那些优势?
    其余的还好说,但就第4个问题,我感到不好说哦!希望大家给个意见
    第一关:首先要自我介绍,自己的性格怎么样,目前的工作经历积累了一些什么经验取得了些什么值得一说的成果。然后要说说对软件测试怎么看?还有对于软件测试有什么自己的想法。为什么会想到要做这行(因为我的简历上的工作经历没有关于测试方面的)。哦,还有期望薪资。
    第二关:认为软件测试人员所要具备的基本素质,如果遇到问题会怎样处理,如果得不到研发人员的配合(就是研发说这个不是问题)你又会怎么处理?然后就是一些基本概念,比如软件测试的流程有哪些?如果我上任了,首先会怎么开始自己的工作计划。
    (前两关通过了后面这个就好过多了)
    第三关:像我介绍了一下公司的情况,告诉我主要针对什么内容的测试,会不会使用数据库。告诉我大概要做哪些内容,详细的可以上岗以后慢慢熟悉。
    大概就这么多了,这对没有经过这一关的不知道有没有帮助,仅供参考吧
    我觉得就像李波说的,关键是要给对方留下好印象:)

    面试官最后会问你有什么问题要问吗。作为应聘者的你一般不要说没问题问,这会给面试官留下你不太重视这份工作的坏印象。所以如果你想得到这份工作的话应该抓住这最后的表现自己的机会:
    你可以问:
    1.        贵公司近期和远期的发展目标是什么?
    2.        贵公司的主要竞争对手有哪些?
    3.        贵公司有多少开发人员有多少测试人员?
    4.        贵公司又进一步扩充测试人员的计划吗?
    5.        如果我有幸能进入贵公司的话,我有怎么样的发展?
    6.        测试人员的沟通能力很重要,贵公司有规范的沟通渠道吗?
    7.        请介绍一下贵公司的福利情况。
    8.        请问我什么时候能知道结果?

  • 英语面试相关

    zhangtieing 发布于 2007-04-23 00:14:30

    Prologue开场白

    It is a great pleasure for me to have this opportunity for the interview.

    我能有机会来参加面试感到非常荣幸。

    I am very happy that I am qualified for this interview.

    我非常高兴能获得这个面谈机会。

     

    1Educational Background

     How about your academic records at college?

    你大学的成绩如何?

     I have been doing quite well at college.

    我在大学时学习很好。

    My specialization at the university is just in line with the areas your institute deals with.

    我在大学所学的专业和你们研究所所涉及的范围刚好对口。

    I was one of the top students in the class.

    我是班里最优秀的学生之一。

     

    Key Word:

    major 主修课;主修的;主修  minor in 辅修 

    degree 学位  bachelor 文理学士

    a bachelor’s/ master’s /doctor’s degree

        学士学位、硕士学位、博士学位 

    honor 荣誉   award 奖励    scholarship 奖学金 

    注意几个关键的词语:degree(学位)、subject(科目)、department(系)、Bachelor’s degree(学士学位)、major(主修)、minor(辅修)。

     

     Which course did you like best? 你最喜欢哪门课程?

     在回答提问时要注意投其所好, 这时你最好回答和所应聘公司相关的科目,这会让他留下你很有潜力的印象。

     

    How have you been getting on with your studies so far

    A:  I have been doing quite well at college. According to the academic records I have achieved so far, I am confident that I will get my Bachelor of Computer Science and Technology this coming July.

     

    2 .Work experience 

    Key Words:

    个人发展(development)、机会(opportunitychance)、工作环境(working environmentposition   职位、responsibility 责任,职责

    be qualified for  适于担任    apply for  申请   advancement  提升,晋升 

    convenient  方便的   professional  专业的  

    background 背景      intern          实习生

    1.        Have you got any experience in programming?

    你有编程方面的经验吗?

    Yes, sir. I have been a software engineer in an software company.

    是的,先生,我一直在一家软件公司担任工程师工作。

    Although I have no experience in this field, I'm willing to learn.

    虽然在这方面我没有经验,但是我愿意学习

     

    2 . Thank you for your interest in this position. Why do you consider yourself qualified for this job?

    谢谢你对本公司的兴趣,为何你认为自己符合这职位的资格?

    My educational background and professional experience make me qualified for the job.

    我的教育背景和工作经验使我能够胜任这项工作。

     

    3. What‘s your career objective?

    你的事业目标是什么?

    I hope I could be a project manager of an energetic and aggressive team.

    我希望成为一支有活力、有进取心的队伍的项目经理。

     

    4. Why do you want to apply for a position in our company?你为什么想申请来我们公司?

    Because I think my major is suitable for this position.

    因为我认为我的专业适合这个职位。

        Because your operations are global, so I feel I can gain the most from working in this kind of environment.

    因为你们公司的运作是全球化的, 我觉得在这样一个环境中工作会收获最多。

     

    5. I:  Why do you think you are qualified for this position?

    为什么你认为你能胜任我们公司这个职位呢?

    A:   My educational background and professional experience make me qualified for the job. Besides, I am a team player and have great interpersonal skills.

    我的教育背景和工作经验使我能够胜任这项工作。而且我具有团队精神和出色的人际关系技能。

     

    6. I:  How would you describe your ideal job?

    A:  I think the job should make use of the professional experience I have obtained, and offer me opportunity for advancement.

    I: 你理想的工作是什么样的?

    A: 我认为应该能发挥我掌握的专业知识,而且能为我提供升职的机会

     

    Character and hobby

    Key  Words :

     

    open-minded 开明的,开放的  easy-going  容易相处的

    personality  个性,人格  enthusiastic  充满热情的

    leisure 空闲的,闲暇的  hobby  业余爱好

    优点 strong pointsstrengthsmerits

    缺点 shortcomingsweaknesses

    性格 character, personality

     

    1. What kind of character do you think you have?

       你认为自己是什么性格的人?

    I'm quite active and energetic. I approach things enthusiastically and I don't like leaving things half done.我积极而充满活力。我热诚对待每件事,不喜欢半途而废。

     

    2. What kind of person would you like to work with? 你喜欢和什么样的人一起工作呢?

    I like to work with people who are honest, dedicate to their work and have integrity.
    我喜欢和诚实、对工作投入、为人正直的人一起工作。

     

    1. Are you introverted or extroverted?

       你内向还是外向?

    I wouldn't call myself introverted though sometimes I'm reserved and enjoy staying all by myself, often and often I like sharing activities with others.

    我不算内向,尽管有时我沉默寡言,喜欢独处,但我经常和大家在一起活动。

     

    4. What kind of sports do you like most?

    你最喜欢什么运动?

    Football is a very exciting game because it keeps you alert and I also enjoy the team spirit of football.

    足球是一项极刺激的运动,它会使你保持灵敏,我也喜欢足球活动中的团队精神。

     

    5 What are your hobbies? How do you spend your spare time?

    你的业余爱好是什么?你的业余时间怎么度过?

    I have many hobbies. I like almost all kinds of sports and I also like to listen to classical music.
    我有很多爱好。我喜欢几乎各类运动,也喜欢听古典音乐。

     

    6 How do you get along with others?

    你和别人相处得怎样?

    I get on well with others.

    我和别人相处得很好。

     

    7. What are your weak points?

    你的缺点是什么?sometimes , I continually strive after perfection to do somethings.

    When I think something is right, I will stick to that. Sometimes it sounds a little stubborn but I am now trying to find a balance between insistence and compromise.

    若我认为某件事情是对的,我会坚持到底。有时候,这显得有点顽固,因此我正努力在执着与妥协之间寻求平衡。

    8. I:  What kind of character do you think you have?

    A:  Generally speakingl am an open-minded person.

    I:  What is your strongest trait

    A:  Cheerfulness and friendliness.

     

    9 .Were you involved in any club activities at your university?

    你在大学有没有参加过什么社团活动?

    Yes, I was on the chairman of college student union.

    有,我曾担任学生会主席。

    Yes ,I was a monitor of my class.

    有,我担任班长一职。

     

    Do you have any question? 你还有什么问题吗?

    外企的这个问题看上去可有可无,其实很关键,外企不喜欢说“没有问题”的人,因为其很注重员工的个性和创新能力。外企不喜欢求职者问个人福利之类的问题,如果有人这样问:贵公司对新入公司的员工有没有什么培训项目,我可以参加吗?或者说贵公司的晋升机制是什么样的?外企将很欢迎,因为体现出你对学习的热情和对公司的忠诚度以及你的上进心。

  • [论坛] Web Accessibility网页无障碍介绍

    janstony 发布于 2010-05-26 13:18:54


    WAI官方网址: http://www.w3.org/WAI/intro/accessibility.php

    什么是Web Accessibility
    Web Accessibility意味着残障人士可以使用Web。更确切的说,Web accessibility意味着残障人士可以感知,理解,浏览,和Web互动,他们也可以为Web做出贡献。Web Accessibility也为其他人士比如由于衰老手脚不灵活的老年人带来好处。

    Web accessibility涵盖所有影响Web访问的残疾,包括视觉,听觉,肉体,说话,认知和神经上的残疾。

    上百万的人由于残疾而影响了他们使用Web。现在大多数网站和Web软件都有访问障碍,从而使很多残障人士很难使用Web。随着越来越多的网站和软件变得可达,是残障人士也可以更有效的使用以及贡献到Web世界。

    Web accessibility也使没有残障的人们获得了益处。例如, Web accessibility的关键原则之一是网站设计和软件灵活的满足不同用户需求,参数选择和情况。这个灵活性也使没有残障的人们在一些特定情况下受益。例如,当人们使用很慢的网络时,就像是一个断了手臂的人或是老年人一样暂时残疾。

    为什么Web Accessibility这么重要

    Web是一个在生活的许多方面日益重要的资 源:教育,就业,政府,商业,保健,娱乐。所以为了为残障人士提供平等的访问和机会, Web的可达性非常重要。一个可访问的Web也帮助残障人士更有效地参与社会。

    Web为许多残障人士提供了前所未有的信息互动访问的可能性。也就是说,通过Web技术,显示,声音和可使媒体的访问屏障可以更容易的被克服。

    另外,Web Accessibility有时也是被法律和政治所要求的。

    使Web可访问

    使Web可访问可以是简单,也可以很复杂,取决于许多因素,例如内容,大小,Web的复杂程度以及开发的工具和环境。

    如果在开始开发或者重新设计Web的时候做出计划,许多Accessibility的功能可以很容易实现。解决网站的不可达,可能需要重大的努力,尤其是在网站原本没有用标准的XHTML开发,以及包含了各种类型的内容如多媒体的情况下。

    评估一个网站的可达性

    当开发和重新设计一个网站,早点在开发过程中评估,并且在整个开发过程中评估可达性可以更早,更容易发现可达性的问题,也更容易解决。简单的技术例如改变浏览器的设置可以决定一个网页是否符合一些Accessibility的标准。一个可以决定一个网站是否符合所有Accessibility标准的复杂评估就复杂多了。

    有一些评估工具可以帮助评估。然而,没有一个单独的工具可以决定一个网站是否符合Accessibility标准。有见识的人工评估是决定一个网站是否可达所必需的。

    无障碍的网络基本元件

    几个Web开发的组件互动工作来使残障人士访问网页是非常重要的。这些组件包括:

    ·         内容(content)网页或Web应用程序的信息,包括:

    o   自然信息,如文字,图片,声音等

    o   代码或者定义结构,显示的标志

    ·         Web浏览器(browser),媒体播放器(media player),或其他的代理

    ·         辅助技术 (assistive technologies)读屏器(Screen reader),替代键盘,电键(Switch),扫描软件等

    ·         用户(user)的知识,经验,使用Web的适应对策

    ·         开发人员(developer) 设计师,开发者,作者等,包括有残障的开发者和贡献内容的用户

    ·         创作工具(Authoring tool)  - 创建网站的软件

    ·         评估工具(evaluation tool) – Web Accessibility评估工具,HTML Validator, CSS Validator

     

    组件之间的互相依赖

    组件之间有重大的依赖,也就是说,组件必须为了使网页可达而共同工作。例如,对于图片上的Alt文字:

    ·         技术规格 制作替 代文本(例如,HTML定义的替代文字属性(ALT的图像元素(IMG

    ·         WAI指南 -WCAGATAGUAAG,下面描述 - 定义如何实现无障碍的不同组成部分的替代文字

    ·         开发人员提供适当的替代文字措词

    ·         创作工具,促进和推动在网页中提 供的替代文字

    ·         评估工具是用来帮助检查替代文字是否存在

    ·         用户代理提供人力和人机界面的替代文字

    ·         辅助技术提供人机界面,多 种方式的替代文字

    ·         用户知道如何从他们的用户代理或根据辅助技取得替代文字

    不同组件的指南

    World Wide Web Consortium (W3C) Web Accessibility Initiative (WAI) 为不同的组件层次开发了 Web accessibility 指南

    WAI 指南基于Web的基本的技术规格,配合W3C technical specifications (HTML, XML, CSS, SVG, SMIL, etc.)工作

     

    残障人士如何使用Web

    场景:

    ·         色盲在线购物:

    李先生想买一些新的衣服,器具和音乐。像他平常一样,他花一个晚上在线Shopping。他有一个普遍的视觉障碍:红绿色盲。

    他很难阅读许多网站上的文字。当他开始使用Web的时候,就发现似乎许多网站上的文字和图片使用很糟糕的颜色对比,因为他们似乎采用类似的棕色色调。他意识到是因为他的红绿色盲,所以颜色无法区分。在许多情况下,网站使用红色来提示折扣,但所有的颜色他看起来都像棕色。在另外一些情况,必填框用红色来提示,但是他看不出来哪个是红色。

    李先生发现他偏爱使用充分颜色对比以及为颜色使用冗余信息 网站。这些网站使用文字而不是颜色来提示。另一个经验是,李先生发现许多更新的站点使用样式表来控制颜色,他可以把浏览器的样式表关掉,使用自己的样式表来覆盖。但是有一些网站不能覆盖那些颜色。

    ·         重复性压力损伤的记者

    Mr. Jones是一个为在线杂志提交HTML文章的记者。在他20年的职业生涯中,他的手部和手臂得了重复性压力损伤(RSI),使他打字很疼痛。它使用语音识别和替代键盘来准备文章,但他不能使用鼠标。然而,某些使用音频流的网站无法使用语音识别,因为声卡冲突。

    他不可以和他的同事使用同样的Web创作软件,因为这套软件没有键盘替代操作,必须使用鼠标驱动。他不得不使用鼠标,而无法使用替代键盘和语音识别,这使他的手部再受损伤。它使用一套更新的,支持全键盘操作的软件,可以是双手更轻松。

    当他浏览网站的时候,很喜欢某些网页实现的access key的功能。使他可以使用快捷方式直接到达他要的链接

    ·         聋人在线学生

    Ms. Martinez在上几个物理学的远程教学课程。她是聋人。她在课程上有一些问题,直到大学升级了在线多媒体课件,使用了大量的音频讲座。该大学使用演讲抄写,并通过他们的Web提供声音版本。对于多媒体作品的介绍,使用了一个SMIL的多媒体同步的音频格式同步音频字幕的和视频的解释。学校信息管理人员很快发现这些资源一旦用文字作为字幕,可以很容易索引复杂的音频资源。

    该课程的教授还设立了聊天网站,让同学交流有关课程的想法。虽然她是一个聋人学生,但没有一个其他的学生知道手语。她很快发现,基于 Web的聊天格式,以及提供基于Web的文字评论,保证了她能跟上班级的进步

    ·         盲人会计

    Ms. Laitinen是一个盲人会计,她使用screen reader来翻译屏幕显示,产生语音输出和盲文输出。她使用语音输出,结合页面上的导航链接切换,快速的文件扫描。她使用盲文输出来检查文本的确切措辞,因为盲文让她更精确地阅读网页。

    网页的许多信息在Table内,使盲人很难阅读。然而,因为Tablescolumn headerrow header清楚地标志,所以她很容易在表格中找到信息。Screen reader在读到任何图片时,会读取替代性文字。因为会计代码有许多缩略词,Web使用ABBR ACRONYM 在第一次访问的时候可以更好的理解这些缩略词的意思。

     

    ·         读写障碍的学生

    Ms. Olsen, 中学生,非常喜欢文学课。她有读写障碍和注意力缺乏症。导致她阅读非常困难。她的学校最近采用在线课程来补充教科书。她尝试了文本到语音软件,是她阅读轻松了。

    她发现采用了图片的网页使她易于阅读,而采用动画的网页则很难阅读,她会关掉动画和滚动的文字。网页的不同搜索策略也使她更容易阅读了。


  • Accessibility testing(二)

    zgnmgly 发布于 2007-12-03 14:02:52

    6.3)High contrast support:对用户所有控件可以设置成高对比度.

    6.4)Inherit system setting for display:所有用户接口的控件继承系统的设置,字型,大小和颜色.

    6.5)Zoom option:可以对内容缩小和放大并能调整倍数.

    6.6)Turn off backgrounds:关闭文本后面的图案背景,可以更改为单一颜色的背景.

     

    7.1)Adjust response time:如果软件中有定时响应功能,可以调整响应时间到平均响应时间的五倍.

     

    7.2)Disable screen updates or flashing:提供选项减慢或关闭屏幕快速刷新和闪烁.

     

    8.1)Accessible formats for documentation:提供辅助式的文档,ASCII文本,PDFHTML.

     

    8.2)Document accessibility features:提供清晰和简洁的辅助文档.可以用关键字”accessibility”搜索出辅助文档.

     

    查看(768) 评论(0) 收藏 分享 管理

  • 852/5<12345>