💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**JSP Web应用程序开发教程习题答案** ## **第1篇  JSP基本技术** ## **第1章** **JSP运行环境** ### **思考题** 1\. 常用的代码混合动态网页编程技术有哪几种? 常用的代码混合动态网页编程技术有ASP、PHP、JSP三种。在页面中嵌入VB代码为ASP;嵌入PHP代码为PHP;嵌入Java代码为JSP。 2\. 通过URL向服务器传递数据的查询参数用什么字符标识其开始?简述其输入格式。 以半角问号“?”开始,格式为:?str=abc#a1 3\. 服务器返回404和500错误,分别表示什么意思? 404表示无法找到客户端所给地址的任何资源,即没有所请求的页面。主要原因是请求地址错误,此时应仔细核对输入的路径和文件名是否正确,是否存在这样的路径和文件;另一个原因是虚拟路径不起作用,即Web应用程序未加载,此时应仔细核对虚拟路径配置标记是否正确,Web应用程序的配置文件web.xml的格式是否正确,也可从服务器控制台显示的信息或日志文件中记录的信息查找原因。500表示程序逻辑有错误,此时应根据错误提示调试程序代码。 4\. 简述JSP动态网页的处理过程。 JSP Web服务器在处理JSP网页时,首先由JSP引擎将JSP文件转化为Servlet(一种Java类),其次将该Servlet编译为.class文件,然后调用Servlet引擎执行class文件,输出HTML网页发送到客户端的浏览器中显示。 5\. Tomcat服务器配置文件的路径和名称是什么? Tomcat安装目录/conf/server.xml 6\. Tomcat服务器的主目录是什么? Tomcat安装目录/webapps 7\. Tomcat服务器中设置所有网站通用配置项的配置文件的路径和名称是什么? Tomcat安装目录/conf/web.xml 8\. JSP Web应用程序配置文件的路径和名称是什么? Web应用程序的根目录/WEB-INF/web.xml 9\. 将JSP Web应用程序发布到Tomcat服务器有哪几种方式? 将Web应用程序发布到Tomcat服务器,有以下三种方法: (1)将Web应用程序目录复制到Tomcat的应用程序目录webapps下; (2)创建Web应用程序存档文件(WAR),将.war文件复制到应用程序目录webapps下; (3)建立虚拟路径。 10\. 如何在Tomcat服务器中配置虚拟目录? 编写Context标记的XML片断: 将这段XML片断放在服务器配置文件server.xml的Host标记中,(结束标记前即可)。或者将其保存为单独的一个XML文件中,放置在$TOMCAT\_HOME/conf/Catalina /localhost /目录下,其中文件名(除.xml扩展名部分)为虚拟目录名,此时path属性将不起作用。 ## **第2章** **JSP基本语法** ### **思考题** 1\. JSP页面主要由哪些元素构成? JSP页面主要由HTML网页及其中嵌入的Java代码构成。组成JSP页面的各元素有:普通网页内容,又称为模板元素;Java代码,又称为脚本元素;注释;指令;动作。 2\. JSP中导入Java类包使用page指令的什么属性? page指令的import属性,如: 3\. page指令的contentType属性与pageEncoding属性有何区别? pageEncoding属性指定的编码是JSP文件本身的编码,JSP网页编译时,根据pageEncoding设定的编码读取JSP文件,转化成统一的UTF-8编码的 Servlet源文件(一种Java类)。contentType属性指定的编码是服务器发送给客户端时的网页内容编码,是Servlet类输出网页时使用的编码。pageEncoding 和contentType的默认设置都是 ISO-8859-1. 而设定了其中一个, 另一个就跟着一样了。 4\. page指令的errorPage属性与isErrorPage属性如何协同进行网页的错误处理? 普通网页中使用page指令的errorPage属性,指定页面出错时将转向的错误处理页面,此页面的isErrorPage属性默认为false;错误处理页面中page指令的isErrorPage属性为true,表示其它网页出错时转向本页面。 5\. 简述include指令与include动作的异同。 include指令是静态包含、编译时包含,被包含的内容插入到Servlet类中;SP引擎将对所包含的文件进行语法分析,对各种类型的被包含文件都作为JSP文件对待。include动作是动态包含、运行时包含,资源的路径和名称不需要在编译前确定,可以动态的生成;被包含的内容插入到输出的网页中;JSP引擎不对所包含的文件进行语法分析,对被包含的JSP文件单独编译,而对其它类型的被包含文件只作为静态文件插入到输出的网页中。 6\. 简述声明中定义的变量与Scriptlet中定义的变量的区别。 声明中的变量和方法作为Servlet类的字段和方法,声明中定义的变量属类变量,是全局性的;而Scriptlet中定义的变量属于Service方法,是局部变量。 7\. 写出在网站配置文件(web.xml)中设定一部分网页自动包含序言和页脚内容的配置代码。 \*.jsp /header.jsp /footer.jsp 8\. JSP动作的 page属性指定转向地址时,如果以“/”开头,那么这个地址相对于什么路径? 相对于Web应用程序的根目录,即网站的根目录。 ## **第3章** **JSP内置对象** ### **思考题** 1\. JSP提供了哪几个内置对象? JSP中有9个内置对象:out、request、response、session、application、pageContext、config、page、exception。 2\. 在声明中可以使用内置对象吗?为什么? 声明中不能使用内置对象。JSP的内置对象定义在Servlet类的Service方法中,而声明中的内容位于Servlet类内。 3\. 内置对象out的输出方法print()和脚本中System.out.print()输出方法有什么不同? out.print()方法输出至客户端,通过互联网在远端显示;而System.out.print()方法输出至服务器的控制台,在本地显示。 4\. 比较request对象的getParameter()方法和getAttribute()方法的不同。 getParameter方法获取客户端提交的参数,这个数据只能是字符串类型的;getAttribute方法获取服务器端设置的属性,这个数据必须预先由setAttribute方法设置,不经过网络传输,可以是任何Java数据类型,getAttribute方法获取数据后全部作为Object类型,需强制转化为原来的类型进行处理。request对象没有也不需要setParameter方法。 5\. response.sendRedirect()方法和动作的页面转向有什么不同? response对象的sendRedirect方法与动作的作用都是页面转向,但二者有着显著的区别。动作转向前后的网页在同一个请求(request)作用域,只能在同一个应用程序间重定向,转向是在服务器端进行的,浏览器地址栏中的URL没有变化,转向地址参数最前面的“/”解析为当前Web应用程序根目录;response对象sendRedirect方法的转向过程是:服务器向浏览器发送重定向指令,将转向地址发送到客户端,由浏览器重新进行一次请求。转向前后的网页不在同一个请求上下文,转向地址可以在任何位置,浏览器地址栏中显示转向后的URL,转向地址参数最前面的“/”解析为当前服务器的根目录。 6\. 比较Cookie和Session技术的异同? Cookie和Session的作用一样,是为了弥补HTTP访问的无状态性,保持对客户端的状态跟踪,但Cookie将数据保存在客户端,只能是文本类型,以服务器名称+Cookie名称标识,开发厂家为Netscape,缺陷有安全隐患,占用网络带宽。Session将数据保存在服务器上,可以是复杂的对象类型,以SessionID来标识,开发厂家为Microsoft,缺陷为占用服务器资源,不易在多台服务器之间共享。SessionID通常要用Cookie保存在客户端。 7\. 写出网站配置文件(web.xml)中设置Session过期时间的代码。 30 8\. 标识用户Session的sessionID如何保存和传递? sessionID用于对各客户端进行标识,必须与各客户端联系起来,在许多服务器上,如果浏览器支持Cookie的话,就直接使用Cookie来传递和保存。如果不支持Cookie,或者将浏览器设置为不接受Cookie,就自动转化为URL-rewiting(重写URL,这个URL包含客户端的sessionID)。另一种保持客户端会话的技术是表单隐藏字段,也就是服务器自动修改表单,添加一个隐藏字段,以便在表单提交时能够把sessionID传递回服务器。 9\. JSP的4个作用域是什么? JSP规范定义了page、request、session、application 4个作用域,通俗地讲,作用域即是有效范围。每种作用域都对应一个上下文,在这个上下文中可以关联(存储)基本类型的数据和对象引用,以供享有同一个上下文的程序代码访问。这4个作用域的范围逐级包含,层层扩大。 10\. 比较pageContext对象的getAttribute()方法和findAttribute()方法的不同? getAttribute()和findAttribute()方法都是获取指定名称的属性值。getAttribute()方法默认在page作用域获取,其重载方法可用第2个参数指定具体的作用域,1:page、2:request、3:session、4:application。findAttribute()方法自动按照page、request、session、application顺序查找指定名称的属性值,返回最先找到的属性值,如果在4个作用域中都没有查找到,则返回null。 ## **第4章** **Servlet** ### **思考题** 1\. 简述Servlet的生命周期及其与Servlet接口中方法的对应关系。 Servlet加载和实例化后,在内存中的的生命周期有3个阶段,分别是初始化、服务、销毁,分别与javax.servlet.Servlet接口中的init()、service()和destroy()方法相对应。 2\. 简述GenericServlet类中的两个init方法的作用与关系。 GenericServlet类是一个抽象类,实现了Servlet接口和ServletConfig接口,给出了除service()方法外的其他4个方法的简单实现,定义了一个通用的、不依赖于具体协议的Servlet。在GenericServlet类中定义两个重载的init()方法,第一个带参数的init()方法是Servlet接口中init()方法的实现。在这个方法中,首先将ServletConfig对象的参数保存在一个transient实例变量中,然后调用第二个不带参数的init()方法。通常我们在编写继承自GenericServlet的Servlet类时,只需要重写第二个不带参数的init()方法就可以了。如果覆盖了第一个带参数init()方法,那么应该在子类的该方法中,包含一句super.init(config)代码的调用。 3\. HttpServlet类是如何封装Servlet接口的Service方法的? HttpServlet类是为了快速开发应用于HTTP协议而提供的一个抽象类,它继承自GenericServlet类,用于创建适合Web站点的HTTP Servlet。HttpServlet类中提供了 两个重载的service()方法,第一个public service()方法是GenericServlet类中service()方法的实现。在这个方法中,首先将req和res对象转换为HttpServletRequest(继承自ServletRequest接口)和HttpServletResponse(继承自ServletResponse接口)类型,然后调用第二个protected service方法,在该方法中首先调用HttpServletRequest对象的getMethod()方法,获取HTTP请求方法的名字,然后根据请求方法的类型,调用相应的doXxx ()方法。因此,我们在编写HttpServlet的派生类时,通常不需要去覆盖service()方法,而只需重写相应的doXxx()方法,对客户的请求进行处理。 4\. 简述Servlet与JSP之间的关系。 JSP与Servlet实质是一回事,Servlet是JSP的底层技术,JSP网页在运行时要转化为Servlet类,然后编译、执行,输出HTML网页文件。JSP是Servlet的简化设计,JSP简化了Servlet的编写。 5\. 简述JSP内置对象与Servlet规范中接口的对应关系。 JSP内置对象是Servlet API中某些接口或类的实例,其中request是javax.servlet.http.HttpServletReauest接口的实例;response是javax.servlet.http.HttpServletResponse接口的实例;session是javax.servlet.http.HttpSession接口的实例;application是javax.servlet.ServletContext接口的实例;config是javax.servlet.ServletConfig接口的实例。pageContext是javax.servlet.jsp.PageContext接口的实例;out是javax.servlet.jsp.JspWriter接口的对象;page是java.lang.Object类的实例;exception是java.lang.Throwable接口的实例。 6\. 简述Servlet的开发流程。 (1)编写Servlet源程序; (2)编译Servlet程序,并将编译后的class文件放置于网站特定的目录下; (3)配置Servlet,或者在Servlet程序中用注解标注; (4)请求运行Servlet. 7\. 包结构为jsp.info.lyu的Servlet,写出其class文件在网站中的放置路径。 网站根目录/WEB-INF/classes/jsp/info/lyu/ 8\. 若Servlet的访问路径为/servlet/antestsvt,需两个初始化参数:username="testuser";pwd="abc123"。写出其注解配置代码。 @WebServlet(urlPatterns={"/servlet/antestsvt "}, initParams={@WebInitParam(name="username",value="testuser"), @WebInitParam(name= "pwd", value="abc123") }) ## **第5章** **Java Bean** ### **思考题** 1\. Java Bean的索引属性与简单属性有什么区别? Simple属性:与一个简单类型的字段对应,仅是对此类型字段的读写操作;Indexed属性:与一个数组类型的字段对应。使用与该属性对应的set/get方法可取得数组中的一个值,或整个数组的值。此类属性可有两对set/get方法。 2\. Java Bean属性的读写性由什么决定? 属性的读写性由定义属性的设置器(setter方法)和获取器(getter方法)决定。只有获取器的属性为只读属性,只有设置器的属性为只写属性,设置器与获取器都具备的属性为可读写属性。 3\. Java Bean属性的Getter方法和Setter方法都有返回值和参数吗? Getter方法有返回值,没有参数; Setter方法都有参数,没有返回值。 4\. 写出动作的最常用的语法格式。 5\. 设置userBean的哪个属性,属性值从何处而来? 设置id值为userBean的所有属性,属性值为客户端提交的、与属性同名的参数值,没有提交同名的参数时,相应的属性设置为null。 6\. 写出动作的语法格式。 ## **第6章** **JDBC** ### **思考题** 1\. 简述交互式和嵌入式两种访问数据库方式。 SQL统一和简化了对各种关系型数据库管理系统(RDBMS)的操作。SQL语言有两种使用方式:一种是在终端(数据库专用的客户端程序)交互方式下使用,称为交互式SQL;另一种是嵌入在高级语言的程序中使用,称为嵌入式SQL。 2\. 简述ODBC与JDBC的基本原理。 ODBC基于SAG的调用级接口规范CLI。ODBC基本上分为三层:应用层、驱动程序管理器、驱动程序。应用层为开发者或用户提供标准的接口函数、语法和错误代码等;驱动程序管理器是ODBC技术的核心,由ODBC实现,建立应用层的功能调用与驱动程序的连接;驱动程序由微软、DBMS厂商或第三方开发商提供,它必须符合ODBC的规范。这个驱动对应用程序的开发者是透明的,并允许根据不同的DBMS采用不同的技术加以优化实现。ODBC技术借鉴了现代操作系统设备管理的思想,ODBC驱动程序管理器类似于操作系统的设备管理器,数据库驱动程序类似于外部设备的驱动程序,ODBC应用层接口类似于操作系统提供的有关设备的API。应用程序利用ODBC访问数据库类似于使用打印机等外部设备,尽管打印机的种类千差万别,但在应用程序中调用的API是一致的。ODBC为用户提供了简单、标准、透明的数据库访问方式。 JDBC是Java数据库连接(Java DataBase Connectivity)的简称,是Java语言访问数据库的API,JDBC还是SUN公司的注册商标。JDBC的原理与ODBC基本上一致,总体上分为三个层次,应用层为开发者提供统一的编程接口,驱动程序管理器加载和管理数据库驱动程序,并将应用层的调用对应于相应的驱动程序操作,驱动程序面向数据库厂商,为驱动程序的开发提供统一的接口。JDBC在实现上克服了ODBC没有面向对象的特性、底层功能与高级功能混杂、复杂难学等缺点,以Java语言的风格和优点为基础进行了优化,所以JDBC十分简洁和易于使用。 JDBC和ODBC都是基于X/Open SQL的调用级接口,是继SQL之后,数据库领域又一重要的标准化技术成果。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。 3\. JDBC核心API在什么位置?包结构是什么? JDBC API为Java开发者使用数据库提供了统一的编程接口,它由一组Java类和接口组成,包括在java.sql包中,该程序包位于JRE安装目录lib子目录下的rt.jar文件中。 4\. JDBC核心API有哪些常用的接口和类? JDBC核心API有常用的接口和类有Driver接口、DriverManager类、Connection接口、Statement接口、ResultSet接口。 5\. 简述JDBC访问数据库的过程。 (1)加载JDBC驱动:Class.forName("package.DriverName"); (2)建立与数据库的连接:Connection con=DriverManager.getConnection("url","root",""); (3)创建语句对象:Statement stmt=con.createStatement(); (4)通过语句对象执行SQL语句返回结果集:ResultSet rst=stmt.executeQuery(“SQL"); (5)结果处理:String str=rst.getString(“1”); 6\. 使用DriverManager类的getConnection(“url”)方法建立与数据库连接时,传递的参数:连接字符串url,可以提供哪些信息? 数据库服务器的URL地址、端口号、数据库名、用户名和密码等。 7\. 数据库的JDBC驱动程序.jar文件通常要放在网站的什么位置? 网站根目录/WEB-INF/lib目录下。 8\. 对于64位Windows操作系统,32位ODBC配置程序的路径与名称是什么? 对于64位Windows操作系统,64位ODBC配置程序为:C:\\Windows\\system32\\ odbcad32.exe,32位ODBC配置程序为:C:\\Windows\\SysWOW64\\odbcad32.exe,从“控制面板\-管理工具”打开的ODBC数据源是64位的ODBC数据源,即使ODBC数据源标题名称中有32字样。要配置32位ODBC数据源需运行SysWOW64文件夹下的odbcad32.exe程序。 9\. JDBC访问数据库时通常用Statement对象的哪个方法执行SQL查询语句,用哪个方法执行SQL更新语句? executeQuery()方法执行SQL查询语句;executeUpdate()方法执行SQL更新语句。 10\. 简述ORM模式的原理。 ORM(Object Relation Map)即对象关系映射,是Java对象与关系数据库之间的映射模式。其思想是用一个Java Bean对象表示关系数据库表中的一条记录,其中Bean的一个属性值对应于记录的一个字段值;用多个Java Bean对象组成的一个集合对象表示关系数据库中的一个表,其中集合中的一个Bean对象对应于表中的一条记录。利用这种映射关系,允许应用程序以面向对象的方式,通过对Java对象的操作而达到对数据库对象操作的目的。 11\. JDBC执行存储过程的语句对象是什么?指定存储过程的语法格式是什么? JDBC执行存储过程的语句对象是CallableStatement,CallableStatement对象为所有的DBMS提供了一种以标准形式调用存储过程的方法。所调用的存储过程包含于CallableStatement对象中。这种调用是用Statement对象支持的一种换码语法来实现的。换码语法告诉驱动程序其中的代码应该以不同方式处理。驱动程序将扫描任何换码语法,并将它转换成特定数据库可理解的代码。这使得换码语法与 DBMS无关,并允许程序员使用在没有换码语法时不可用的功能。换码子句由花括号和关键字界定:{keyword . . . parameters . . . },关键字指示转义子句的类型。 12\. Tomcat服务器的局部数据源如何配置?主要设置哪些连接信息? 局部数据源只与特定的Web应用相关,在该Web应用对应的Context(上下文)中配置。例如,为jspex Web应用配置局部数据源,修改Tomcat安装目录下conf\\Catalina\\localhost下的jspex.xml文件,为Context元素增加一个Resources子元素,详细代码如下: <Resource name="jspex/conpool" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/jspex\_utf8?useUnicode=true&characterEncoding =UTF-8" username="root" password="" type="javax.sql.DataSource" maxActive="10" maxIdle="4" maxWait="-1" auth="Container" description="jspex DataBase Connection pool" /> ## **第7章** **Eclipse** ### **思考题** 1\. 下载Eclipse选择具体的程序包时应考虑哪几个因素? (1)选择针对相应操作系统平台的发布程序:取决于用户的操作系统,Windows操作系统选择Release for Windows的程序。 (2)安装版与非安装版的选择:安装版是Eclipse Installer安装包,下载文件的扩展名为.exe,下载后双击安装。非安装版为扩展名为.zip的压缩文件,下载后解压即可运行,无须安装。非安装版还需选择不同用途的程序包,安装版只有一个程序包,在安装时进行功能选择。推荐下载非安装版。 (3)32位与64位的选择:取决于系统中安装的JSDK,32位JSDK只能运行32位的Eclipse;64位的JSDK只能运行64位的Eclipse。 (4)新版与旧版的选择:取决于系统中安装的JSDK版本,较新版本的JSDK可选择当前新版的Eclipse,旧版的JSDK应选择Eclipse的历史版本,具体见下载页面的提示(Hint)或参阅Eclipse的发布文档。 (5)选择合适的功能发布包:取决于应用目的,对于Java Web应用开发,应下载Eclipse IDE for Java EE Developers发布包。当然下载经典发布版,或者其它功能的发布版,通过安装相关的插件也能实现对应的功能。因为Java Web开发需要的Eclipse插件较多,如果有此任务的话,强烈建议下载Eclipse IDE for Java EE Developers发布包,增加其它开发功能时再安装相应的插件。 2\. 在dropins目录中安装插件,对插件目录结构有何要求? dropins目录与插件的子目录features和plugins之间只能分隔一层目录(或者没有也行),目录名自定义,通常取插件名称,或者以传统的“eclipse”命名。 3\. 简述Eclipse中视图与透视图的关系。 视图是界面中的基本单元,它是一个功能窗口,以图表形式直观的显示项目中的某类数据。视图右上方有下拉菜单,可以设置视图的属性,或者进行与视图相关的一些操作。透视图是包含一系列视图和编辑器的可视容器。透视图起到一个组织工作界面的作用,每个透视图都有自己的视图集及布局和可见的菜单、工具栏项。 4\. 使用Eclipse IDE for Java EE Developers开发JSP,基本设置项有哪些?设置位置在何处? (1)JRE(Java Runtime Environment) 配置Java运行环境以及编译时依赖的类库,配置路径:Preferences -> Java -> Installed JREs; (2)Workspace 设置Eclipse工作空间的路径,Eclipse中的项目默认保存在该目录下。修改Workspace目录,从菜单项File -> Switch Workspace -> Other打开Workspace Launcher对话框,设置好Workspace目录,点击“OK”按钮,Eclipse将重启并更换新的Workspace目录。 (3)Server Web服务器设置,是Java Web开发的基本设置项。配置路径:Preferences -> Server -> Runtime Environment。 5\. Eclipse内嵌的Tomcat服务器,默认设置下其主目录的物理路径是什么?假设Eclipse的Workspace路径设置为D:\\workspace。 D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps,如果建立过多个服务器,倒数第二级目录也可能为tmp1或tmp2等。 6\. 简述使用Eclipse IDE for Java EE Developers开发JSP的基本流程。 设置一下Server参数(JSDK可从环境变量中获取,Workspace目录在启动时提示设置);建立动态Web项目框架;建立目录、包;编辑接口、类、JSP等各类文件,其中接口、类等Java源程序在保存时可自动进行编译(默认选择菜单项Project -> Build Automatically);调试运行;打包发布。 ## **第2篇  JSP应用开发专题** ## **第8章** **页面之间数据的传递** ### **思考题** 1\. 对于同一个用户会话,在不同的页面之间传递数据的方法有哪些? (1)通过URL; (2)通过表单隐藏域; (3)通过Cookie; (4)通过session; (5)通过ServletContext对象; (6)通过application; (7)通过文件系统或者数据库。 2\. 在不同用户之间共享数据的方法有哪些? (1)通过ServletContext对象; (2)通过application; (3)通过文件系统或者数据库。 ## **第9章** **JSP中文问题** ### **思考题** 1\. 简述ASCII码与GB2312编码的关系? GB2312是一个在ASCII码基础上派生的简体中文字符集。GB2312采用双字节编码,为了与系统中基本的ASCII字符集区分开,所有汉字编码的每个字节的第一位都是1。其编码规则为:第一个字节的值在0x81到0xFE之间,第二个字节的值在0x40到0xFE之间。 2\. 简述Unicode、UCS、UTF-8编码的关系? Unicode和UCS是全世界文字的统一编码格式。Unicode固定使用16 bits(两个字节)来表示一个字符,共可以表示65536个字符。UCS是国际标准ISO 10646定义的通用字符集(Universal Character Set, UCS),使用32位(四个字节)表示一个字符。UCS分三个实现级别(对组合字符的支持度不同),UCS的16位子集称为基本多语言面(Basic Multilingual Plane, BMP),被编码在16位BMP以外的字符都属于非常特殊的字符(比如象形文字)。Unicode标准严密地包含了ISO 10646-1实现级别3的基本多语言面。1991年前后,Unicode和UCS这两个项目合并双方的工作成果, 并为创立一个单一编码表而协同工作。从Unicode 2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。UTF-8(UCS Transformation Format)是UCS的简化或压缩编码格式,UTF-8以多字节来表示字符的UCS编码。 3\. 简述Java源程序编译为class文件过程中的编码转换。 Java源程序编译为.class文件时,编译器(javac.exe)使用\-encoding参数接收用户指定的Java源程序的编码格式,将源程序中的字符按指定的编码格式转换为Unicode编码,保存时再转换为UTF-8。如果编译时用户没有指定\-encoding参数的值,则编译器使用JSDK的默认文件编码对源程序进行处理,JSDK的默认文件编码保存在file.encoding属性中,这个属性值获取至操作系统默认采用的编码格式(WindowsXP的值为GBK)。 4\. 简述JSP程序转化为Servlet源程序,再编译为class文件过程中的编码转换。 JSP解析器(JSPC)按JSP页面中设定的字符集解释JSP文件中出现的所有字符,包括中文字符和ASCII字符,然后把这些字符转换成Unicode字符进行处理,再转化成UTF-8格式存为Servlet(.java)文件;编译后的类(.class)文件,在内存中为Unicode编码,保存时仍用UTF-8格式;执行.class文件时的输出,使用JSP设定的字符集。 JSP文件中page指令的contentType属性指定的编码用于第一步转化,pageEncoding属性指定的编码用于最后的.class文件输出。如果这两个属性只指定一个,则另一个也取同样的值。如果在JSP文件中未指定任何编码,则使用服务器默认的编码ISO-8859-1对源文件进行解析和最后的页面输出。与Java程序的编译不同,服务器处理JSP文件所采用的默认编码与操作系统的默认编码无关。 5\. 页面使用UTF-8编码来编写和保存,设置页面编码为UTF-8,以UTF-8编码来传递和处理数据,接收客户端POST的中文参数前,如何设置request内置对象的编码,才不会出现乱码? request.setCharacterEncoding("UTF-8"); 6\. 页面和数据库都使用UTF-8编码来编写和保存,以UTF-8编码来传递和处理数据,MySQL数据库连接字符串需加哪些参数,中文才不会乱码? jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8。 ## **第10章** **JSP应用程序的安全性** ### **思考题** 1\. 简述Servlet服务器的内置安全机制。 Web服务器提供的可控安全机制,通过在配置文件web.xml中设置Web资源的安全约束、验证方式、用户、角色等实现页面的访问控制。这种可配置的安全机制使应用程序的维护和扩展变得容易灵活。从Servlet2.2规范开始就内置了安全机制,服务器提供的这些安全特性,为Web应用程序的安全性提供了简单和有力的保证。 2\. 用什么元素、如何配置安全约束规则? 元素用于定义Web资源的安全约束,指明Web应用程序中的哪些资源受保护,哪些角色可以访问这些受保护的资源。        administration     administration pages     /admin/\*     POST     GET           access by authorised administrators     admin    以上安全约束声明表示,客户以GET、POST方式访问/admin/下的资源时要进行安全验证,只有属于admin角色的用户才可以通过验证。 :声明受保护的资源。 :定义受保护的资源的名称。 :说明性描述 //可以包含多个子元素,即指定多个资源路径。 :指定受保护的资源的路径。 :指定受保护的HTTP方法,如GET、POST、PUT。如果没有定义此属性,则所有的HTTP方法都受保护。如果设定了某种方法,例如GET,则表示客户通过该方法访问资源要进行安全验证。 :声明允许访问受保护资源的角色,可以包含多个子元素,即可以指定多个角色。 :指定可以访问该资源的角色。 3\. 用什么元素、如何配置角色? 元素用于声明Web应用程序中的安全角色。   an administrator role   admin 4\. 用什么元素、如何配置验证方式。 元素用于定义验证方式。目前JSP支持的验证方式有4种,HTTP基本身份验证BASIC,HTTP概要身份验证DIGEST,HTTPS客户端身份验证CLIENT-CERT,基于表单的身份验证FORM。   BASIC   BASIC authentication test! 5\. 基于表单的身份验证,JSP规范要求表单的动作(action)属性值是什么?用户名、密码输入框的名称(name)属性值分别是什么? 基于表单的身份验证,需要设计一个表单页面和一个错误提示页面。JSP规范要求表单的动作是j\_security\_check,用户名和密码域分别命名为j\_username和j\_password。错误提示页面可以是任何形式,但最常用的是页面,用来说明用户输入了无效的用户名或密码。 6\. Tomcat服务器内置安全机制中,应用程序的用户及其角色等安全信息有哪几种保存形式? Tomcat服务器有4种类型的安全域: (1)内存域:在初始化阶段,从XML文件中读取安全验证信息,并把它们以一组对象的形式放在内存中。 (2)数据库域:安全信息存放在数据库中,通过配置JDBC访问数据库中保存的安全信息。 (3)数据源域:通过JNDI数据源访问存放在数据库中的安全信息。 (4)JNDI域:通过JNDI访问存放于LDAP目录服务器中的安全验证信息。 7\. 数据库域保存用户及角色和数据表及字段有哪些? 数据库安全域使用数据库来存储用户信息,其中保存用户与角色的数据库、数据表及其各个字段都是可配置的。数据库中必须两个数据表:第一个为用户表(表名由userTable属性指定),表中每一行对应这个安全域能识别的每个有效用户,用户表至少包含两栏:username(用户名,由userNameCol属性指定)和password(密码,由userCredCol属性指定)。第二个表为角色表(表名由roleTable属性指定),表中每一行对应于为每个特定用户指定的每个有效角色,表中至少包含2栏:用户名(字段名同用户表)和角色名(由roleNameCol属性指定)。 8\. 如何配置数据库域? 数据库安全域使用数据库来存储用户信息,配置代码示例如下: <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/jspex" connectionName="root" connectionPassword=""         userTable="realm\_users"         userNameCol="username"         userCredCol="password"         userRoleTable="user\_roles"         roleNameCol="rolename" /> ## **第3篇  JSP高级技术** ## **第11章** **Servlet监听器** 1\. ServletContextListener接口中有哪些方法?对应哪些事件的处理? ServletContextListener接口用于监听ServletContext的创建和删除。该接口提供了2个方法,它们被称为“Web应用程序的生命周期方法”。 (1)ContextInitialized(ServletContextEvent event)方法:通知正在收听的对象,应用程序已加载及初始化。 (2)ContextDestroyed(ServletContextEvent event)方法:通知正在收听的对象,应用程序已卸载。 2\. HttpSessionActivationListene接口中有哪些方法?对应哪些事件的处理? HttpSessionActivationListener接口用来监听HTTP会话Active、Passivate情况。该接口提供2个方法。 (1)SessionDidActivate(HttpSessionEvent event)方法:通知正在收听的对象,它的Session已经变为有效状态。 (2)SessionWillPassivate(HttpSessionEvent event)方法:通知正在收听的对象,它的Session已经变为无效状态。 3\. ServletRequestAttributeListener接口中有哪些方法?对应哪些事件的处理? ServletRequestListener接口用来监听客户端的请求。该接口提供了2个方法: (1)RequestInitalized(ServletRequestEvent event)方法:通知正在收听的对象ServletRequest已经被加载及初始化。 (2)RequestDestroyed(ServletRequestEvent event)方法:通知正在收听的对象ServletRequest已经被卸载。 4\. 简述Web监听程序的设计步骤。 (1)编写一个实现相关Listener接口的Java类。 (2)针对相应的事件动作,在Listener接口的相应方法中实现程序逻辑。 (3)在Web应用程序中配置监听器。监听器只有部署到网站中,并且有相应的事件发生后,监听器中的相应方法才会执行。 5\. 写出web.xml中配置Web监听程序的代码。 Web监听程序的部署代码:        package.ListenerName    6\. Servlet 3.0规范中监听器配置的注解符是什么? Servlet 3.0规范中关于监听器配置的注解符为@WebListene。@WebListene作用于类,使用时标注在监听器类定义语句之前。@WebListene注解符的属性只有value,String类型,且是可选的,value属性值为监听器的描述信息。 ## **第12章** **Servlet过滤器** 1\. 简述过滤器的生命周期及其与Filter接口中方法的对应关系。 过滤器程序必须实现Filter接口,它有3个方法,与过滤器的生存周期密切相关。 public void init(FilterConfig filterConfig) throws ServletException init()方法进行初始化操作,获取容器传递来的FilterConfig对象,通过该对象提供的方法获取应用程序的ServletContext对象和初始化参数。 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException doFilter()方法包含过滤器业务逻辑,在其中进行所有的过滤器工作。每当应用程序请求处理时,容器都将调用这个方法。 public void destroy() 当服务器不需要使用过滤器时,容器调用destroy()方法进行清理工作。 2\. 比较Filter接口与FilterChain接口中两个doFilter()方法的不同作用。 Filter接口的doFilter()方法包含过滤器业务逻辑,在其中进行所有的过滤器工作。每当应用程序请求处理时,容器都将调用这个方法。Filter接口的doFilter()方法取一个FilterChain对象作为它的一个参数,在其中调用FilterChain对象的doFilter()方法时,激活下一个相关的过滤器,该方法之后的代码为过滤器的后处理逻辑,在网页资源处理后才执行。 FilterChain接口中的doFilter()方法,启动过滤器链中下一个过滤器(Filter接口)的doFilter()方法。如果调用的过滤器是链中最后一个过滤器,则开始真正的资源处理。只有当其后所有的过滤器都从其doFilter()方法调用中返回时,该方法才会返回。FilterChain接口中的doFilter()方法,在Filter接口的doFilter()方法中调用。 3\. 过滤器类doFilter()方法中哪些代码是请求的预处理逻辑?哪些代码是应答的后处理逻辑? Filter接口的doFilter()方法中调用FilterChain接口中的doFilter()方法之前的代码是请求的预处理逻辑,之后的代码是应答的后处理逻辑。 4\. 简述过滤器程序的设计步骤。 (1)建立一个实现Filter接口的类。这个类需要实现3个方法,分别是:doFilter()、init()和destroy()。doFilter()方法包含主要的过滤行为。init()方法初始化Filter,而destroy()方法释放Filter占用的资源。 (2)在doFilter()方法中编写过滤代码。 (3)调用FilterChain对象的doFilter()方法。Filter接口的doFilter()方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter()方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。chain.doFilter()方法之前的代码为请求的预处理逻辑,而之后的代码则是请求的后处理逻辑。 (4)配置和映射过滤器。 5\. 写出web.xml中配置过滤器程序的代码。    filter1 Description filter1 DisplayName filter1     packages.FilterName initial param1 value of param1 filter1 Initial Parameter             filter1     /filter/\* REQUEST FORWARD    6\. Servlet 3.0规范中过滤器配置的注解符是什么? Servlet 3.0规范中关于过滤器配置的注解符有@WebFilter和@WebInitParam。@WebFilter是核心注解符,该注解符作用于类,使用时标注在Filter类定义语句之前;@WebInitParam注解符嵌套在@WebFilter内标注一个初始化参数。 ## **第13章** **表达式语言** 1\. 写出EL的基本语法格式。 EL是一种简单语言,其基本语法格式:${Expr} 2\. JSP页面中引入了名称为user的Java Bean,写出访问其name属性的EL语句。 ${user.name} 或:${user\["name"\]} 3\. 写出访问用户提交的请求参数param1的EL语句。 ${param\['param1'\]} 4\. 写出访问请求作用域中attr1属性的EL语句。 ${pageContext.request.attr1} 或:${requestScope\[‘attr1’\]} 5\. 写出访问会话作用域中session1属性的EL语句。 ${sessionScope.session1} 6\. 表达式${userName}会返回哪个作用域中的userName属性? 在page、request、session、application对象中顺序查询userName属性,找到该属性,就返回其值;如果在所有作用域中都没有找到这个属性,那么返回null。 ## **第14章** **自定义标签** 1\. 简述JSP基本语法之一的动作元素与自定义标签的关系? 自定义标签是对JSP标记的一种扩展,执行自定义的操作。每个自定义标签都与一个Java类相关联,这个类定义了相应标签的执行逻辑,称为标签处理类或标签处理程序。当一个含有自定义标签的JSP页面被JSP引擎编译成Servlet时,自定义标签被转化成了对标签处理类的操作。JSP中内置的动作标签,实质是系统预定义的标签。 2\. JSP taglib指令的格式与作用是什么? 3\. 简述Tag接口的运行流程。 当容器创建一个新的标签实例后,通过setPageContext()设置标签的页面上下文。标签处理程序可以通过javax.servlet.jsp.PageContext来与JSP交互,通过PageContext对象,标签处理程序可以访问JSP中的request、session和application对象。 使用setParent()方法设置这个标签的上一级标签。如果没有上一级标签,设置为null。标签可以互相嵌套,内层的标签处理程序可以通过它的parent属性来访问上层的标签处理类。 调用相应的属性设置器(set方法)设置标签的属性。属性设置器在标签处理程序中定义,属性值在JSP页面中赋予,属性在标签库描述文件中声明。如果没有定义属性,就不调用此类方法。 调用doStartTag()方法处理开始标签。这个方法可以返回EVAL\_BODY\_INCLUDE和SKIP\_BODY。当返回EVAL\_BODY\_INCLUDE时,就处理标签的Body;如果返回SKIP\_BODY,则忽略标签的Body。 调用doEndTag()方法处理结束标签,这个方法可以返回EVAL\_PAGE和SKIP\_PAGE。当返回EVAL\_PAGE时,容器在标签结束后将继续处理JSP页面的其它部分;如果返回SKIP\_PAGE,标签结束后容器将不再处理JSP页面的其它部分。 4\. 简述SimpleTag接口的运行流程。 (1)容器每次遇到标签时,创建新的标签处理程序实例。 (2)调用setJspContext()和setParent()方法设置上下文环境。JspContext类是JSP 2.0 API中增加的,作为PageContext的父类。它将PageContent类中的信息抽象化,使简单标签可以在Servlet的请求应答环境之外运行。setParent()方法保存其父标志处理器的引用,以便嵌套的标志之间可以相互联系和合作。只有这个标签在另一个标签之内时,才调用setParent()方法。 (3)调用每个属性的setter方法以设置这些属性。 (4)调用setJspBody()方法设置正文内容。标签的正文内容用JspFragment对象表示,该对象由容器创建,通过setJspBody()方法传递给标志。JspFragment只能包含模板元素和动作元素,不允许包含脚本或脚本表达式。当页面中无动作元素时,setJspBody()方法不会被调用。JspFragment类中的方法有: abstract JspContext getJspContext():返回与JspFragment对象关联的JspContext对象 abstract void invoke(Writer out):运行JspFragment中保存的内容,并输出至参数指定的java.io.Writer对象中, (5)调用doTag()方法,所有的标签逻辑、迭代和对Body的处理等都在该方法中进行。 (6)在doTag()方法返回后,标签处理结束。 5\. 写出tld文件中声明一个标签的基本代码。     hello1     jspex.tag.HelloTag1     empty     Simple Tag   6\. 简述自定义标签的开发步骤。 (1)创建自定义标签,首先需要创建一个标签处理程序,标签处理程序是一个执行自定义标签操作的Java类,必须实现特定的接口。 (2)其次要创建标签库描述文件.tld;标签库描述文件是一个XML文件,在其中声明标签名称及其与标签处理程序的对应,以及属性、变量等。 (3)在JSP文件中使用自定义标签时,要用taglib指令导入标签库 —— 即一组标签/标签处理程序对。 7\. 嵌套的自定义标签,子标签处理程序中如何获取父标签处理类的引用? 在子标志处理程序中通过getParent()方法获取服务器传递的父标志处理类的引用,进而直接访问父标志处理器实例或调用其上的方法。 8\. 简述标志文件中属性与变量的区别。 标志文件中属性与变量的区别是:属性在页面中赋值,在.tag文件中获取使用,变量在.tag文件中赋值,在页面中获取使用。 ## **第15章** **标准标签库** 1\. 简述JSTL与自定义标签的关系。 JSTL (Java Server Pages Standard Tag Library)是由JCP (Java Commnunity Process)所制定的标准规范,它封装了JSP开发中常见的功能,给Java Web开发人员提供一个标准的通用标签库。是已标准化的自定义标签。 2\. JSP中使用JSTL需要哪些类库包? JSTL需要的jstl.jar、standard.jar 3\. 写出JSP页面中使用JSTL核心标签库时的taglib指令。 4\. 写出JSTL中格式化日期的标签格式。 " pattern="yyyy年MM月dd日HH点mm分ss秒" /> 5\. 写出JSTL中格式化数字的标签格式。 //该结果被保存在"money"变量中,并将根据Locale环境显示当地的货币格式。  //-- $12.00 ## **第4篇  JSP常用组件** ## **第16章** **文件上传和下载组件** 1\. 文件上传时对于选择文件的表单Form有什么要求? 上传文件时,对于选择文件的Form表单,有两个要求: (1)METHOD应用POST,即METHOD="POST"。 (2)增加属性:ENCTYPE="multipart/form-data" 2\. SmartUpload完成上传和保存功能的方法是什么? SmartUpload的upload()方法上传文件到服务器;save()方法保存上传的文件。 3\. 如何控制上传文件的类型和大小? SmartUpload的setAllowedFilesList()、setDeniedFilesList()、setMaxFileSize()方法可以控制上传文件的大小,如: // 只允许上传htm/html/txt类型文件 mySmartUpload.setAllowedFilesList("htm,html,txt"); // 设置不允许上传的文件类型 // 禁止上传带有exe, bat, jsp扩展名的文件和没有扩展名的文件。 mySmartUpload.setDeniedFilesList("exe,bat,jsp,,"); // 设置允许上传文件的大小限制 mySmartUpload.setMaxFileSize(50000); 4\. 如何控制文件的下载? SmartUpload的setContentDisposition()方法,设定contentDisposition为null,以禁止浏览器自动打开文件,保证点击链接后是下载文件。 ## **第17章** **日志组件** 1\. Log4j的输出级别设置为哪一级时,程序中的fatal()、error()和warn()方法会被执行,而info()、debug()和trace()方法不会被执行? Log4j的输出级别设置为WARN时,程序中的fatal()、error()和warn()方法会被执行,而info()、debug()和trace()方法不会被执行。 2\. 在属性文件中定义输出级别为Error,输出至appender1,名称为logger1的Logger,写出其配置代码。 log4j.logger.logger1\=ERROR,appender1 3\. 在属性文件中定义输出到文件log.txt,输出格式为HTMLLayout,名称为appender1的Appender,写出其配置代码。 log4j.appender. appender1\=org.apache.log4j.FileAppender log4j.appender. appender1.File=log.txt log4j.appender. appender1.layout=org.apache.log4j.HTMLLayout 4\. 使用属性文件.property配置Log4j日志,在程序中如何加载配置文件?使用XML文件配置又如何加载? 在应用程序中,通常使用PropertyConfigurator.configure()方法加载属性配置文件,使用DOMConfigurator.configure()方法加载XML配置文件,对Log4j进行初始化。如果创建Logger实例前,Log4j没有被初始化,静态初始化程序根据log4j.configuration属性的默认值,自动查找/WEB-INF/classes/目录下的log4j.xml或者log4j.properties。如果找到任一配置文件,调用相应的configure()方法,加载配置文件,并初始化Log4j。 5\. 简述commons-logging的LogFactory.getLog()方法查找底层日志工具的过程。 LogFactory.getLog()方法启动一个发现过程,即找出必需的底层日志记录功能的实现,具体的发现过程如下: (1)commons-logging首先在类路径中寻找一个commons-logging.properties文件。这个属性文件必须定义org.apache.commons.logging.Log属性,它的值应该是上述任意Log接口实现的完整限定名称。 (2)如果上面的步骤失败,commons-logging检查系统属性 org.apache.commons.logging.Log。 (3)如果没有设置org.apache.commons.logging.Log系统属性,commons-logging将在类路径中寻找Log4j的类,如果找到了,commons-logging就使用Log4j。其中,Log4j本身的属性仍要通过log4j.properties文件正确配置。 (4)如果上述查找均没找到适当的Logging API,但应用程序正运行在JRE1.4或更高版本上,则默认使用JRE1.4的日志记录功能。 (5)最后,如果上述操作都失败,则将使用内建的SimpleLog,把所有日志信息直接输出到System.err。 6\. 简述应用程序使用commons-logging进行日志记录的步骤。 (1)建立配置文件commons-logging.properties,在其中指定使用Log4j作为底层日志组件。该文件应放置于/WEB-INF/classes/目录下。 (2)建立Log4j的配置文件。 (3)在应用程序中使用commons-logging API记录日志。