• 144.61 KB
  • 2022-04-22 11:20:50 发布

《JavaWeb编程技术》课后习题答案.docx

  • 20页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'JavaWeb编程习题解析第1章习题解析1.略。什么是URL,什么是URI,它们都由哪几个部分组成,URL和URI之间有什么关系?2.答:URL称为统一资源定位符,URL通常由4部分组成:协议名称、页面所在主机的DNS名、可选的端口号和资源的名称。URI称为统一资源标识符,是以特定语法标识一个资源的字符串。URI由模式和模式特有的部分组成,它们之间用冒号隔开,一般格式如下:schema:schema-specific-partURI是URL和URN的超集。3.答:①是URL,①和②都是URI,③是URN动态web文档技术有哪些?服务器端动态文档技术的客户端动态文档技术有何不同?4.答:动态Web文档技术包括服务器端动态文档技术和客户端动态文档技术,前者包括CGI技术、服务器扩展技术和HTML页面中嵌入脚本技术。其中HTML页面中嵌入脚本技术包括ASP、PHP和JSP技术。最流行的客户端动态文档技术是在HTML页面中嵌入JavaScript脚本代码。使用JavaScript可以设计交互式页面。与服务器端动态文档不同,JavaScript脚本是在客户端执行的。什么是Servlet?什么是Servlet容器?它的主要作用是什么?5.答:Servlet是用ServletAPI开发的Java程序,它运行在Servlet容器中。Servlet容器是运行Servlet的软件,主要用来扩展Web服务器的功能。简述开发一个Servlet的上体步骤6.答:开发Servlet的一般步骤包括:(1)编写Servlet源程序;(2)编译;(3)将Servlet部署到Servlet容器中;(4)访问执行Servlet。要使一个Servlet能够正确编译的运行,应该将什么文件加到CLASSPATH环境变量中?7.答:libservlet-api.jar文件。web应用程序的部署描述文件名是什么?它是什么类型的文件?应该存放在什么目录中? 8.答:部署描述文件名是web.xml,它是XML文件,应该存放在Web应用程序的WEB-INF目录中。什么是404错误?9.答:当服务器找不到用户请求的资源时将发生404错误。什么是JSP页面?它与HTML页面有什么关系?10.答:JSP页面是嵌入了Java脚本元素的HTML页面。Servlet与JSP各适用于什么场合?11.答:Servlet主要用来实现业务逻辑和控制逻辑,JSP页面主要用来实现表示逻辑。第2章习题解析Servlet接口中定义了哪几个方法?1.答:Servlet接口定义了下面5个方法:publicvoidinit(ServletConfigconfig)publicvoidservice(ServletRequestrequest,ServletResponseresponse)throwsServletException,IOExceptionpublicvoiddestroy()publicServletConfiggetServletConfig()publicStringgetServletInfo()简述Servlet的生命周期,生命周期方法有哪几个?2.答:Servlet是在容器中运行的组件,有一个从创建到销毁的过程,其中包括加载和实例化、初始化、提供服务以及销毁几个阶段。其中生命周期方法有init()、service()和destroy()等3个。发生哪些事件,浏览器会向服务器发出请求?3.答:发生下列事件,浏览器向服务器发出请求。(1)用户点击了HTML页面中的超链接;(2)用户在HTML页面中填写一个表单并点击提交按钮;(3)用户在浏览器的地址栏中输入URL并按回车键。4.答:查询串5.答:HTTP请求结构由请求行、请求头、空行和请求数据组成。请求行由方法名、请求资源的URI和使用的HTTP版本3部分组成。6.答:HTTP响应结构由状态行、响应头和响应数据3部分组成。状态行由HTTP版本、状态码和简短描述3部分组成。7.答:GET请求主要用来从服务器检索资源,POST请求主要用来向服务器发送数据。它们的详细比较请参阅教材的表2.8。8.答:在ServletRequet接口中定义了setAttribute()、getAttribute()、getAttributeNames()和removeAttribute()方法来处理请求作用域的属性。9.答:forward()方法转发请求是服务器端控制权的转向,客户端地址栏中不显示转发 后的资源地址。sendRedirect()方法是服务器向浏览器发送302状态码,它使浏览器连接到新的位置,浏览器地址栏可看到地址的变化。使用重定向,资源不能位于WEB-INF目录中。10.答:可先通过请求对象的getParameterNames()方法得到Enumeration对象,然后在其上得到每个请求参数名,再通过getParameter()得到请求参数值。11.答:A12.答:B13.答:E14.答:action="courseServlet.do"HttpServletcom.demo.CourseServletcourseServlet15.答:①E②D③C④B⑤A第3章习题解析1.答:Web应用程序是运行在应用服务器之中的。应用服务器为Web应用程序提供一种简单的和可管理的对系统资源的访问机制。2.答:web.xmlbankappWEB-INF3.答:D4.答:A5.答:D6.答:F7.答:E8.答:D9.答:getServletConfig().getServletContext()或getServletContext()10.答:B11.答:B12.答:D13.答:因为Applet只能运行在客户端,所以可以将它放在Web应用程序的文档根目录的任何位置,但不能将其放在WEB-INF目录或其子目录中。14.答:不能这样做,至少不能直接这样。部署描述文件不允许为一个名称指定多个参数,所以必须像下面这样:countriesAustralia,Brazil,India,UK,US然后在Servlet中解析param-value串的值并解释字符串中列出的多个值。15.答:packagecom.demo;importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;publicclassHelloCounterServletextendsHttpServlet{privateIntegervisits=0;publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{ response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();visits=visits+1;try{Thread.sleep(2000);}catch(InterruptedExceptione){log("Exceptionduringsleeping.");}out.println("");out.println("欢迎您!
"+"该Servlet已被访问"+visits+"次。");out.println("");}}修改后的Servlet如下:packagecom.demo;importjavax.servlet.*;importjavax.servlet.http.*;importjava.io.*;publicclassHelloCounterServletextendsHttpServlet{privateIntegervisits=0;privateStringdbPath=null;publicvoidinit(){try{dbPath=getServletContext().getRealPath("/WEB-INF/counter.db");FileInputStreamfis=newFileInputStream(dbPath);DataInputStreamdis=newDataInputStream(fis);visits=dis.readInt();dis.close();}catch(Exceptione){log("Errorloadingpersistentcounter",e);}}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();synchronized(this){visits=visits+1;out.println("");out.println("欢迎您!
"+"该Servlet已被访问"+visits+"次。");out.println("");}}publicvoiddestroy(){try{FileOutputStreamfos=newFileOutputStream(dbPath);DataOutputStreamdos=newDataOutputStream(fos); dos.writeInt(visits);dos.close();}catch(Exceptione){log("Errorstoringpersistentcounter",e);}}}第4章习题解析1.答:使用请求对象(即HttpServletRequest接口)的getSession()方法。2.答:如果客户在指定时间内没有访问服务器,则该会话超时。对超时的会话对象,服务器使其失效。通过会话对象的setMaxInactiveInterval()方法设置会话最大超时时间。web.xml文件使用元素的子元素设置最大超时时间,如下所示。20这里的最大超时时间是对整个应用程序的所有会话有效,元素指定的时间单位是分钟。setMaxInactiveInterval()方法参数单位是秒。3.答:有些客户浏览器可能不支持Cookie或用户阻止所有的Cookie,此时不能用Cookie实现会话。4.答:使用响应对象(即HttpServletResponse接口)的encodeURL()方法或encodeRedirectURL()方法。5.答:不能。因为许多用户是通过代理服务器访问Internet的,此时服务器得到的是代理服务器的IP地址而不是实际用户的IP地址,因此这些用户的IP地址不唯一。6.答:D7.答:A,B8.答:A,D9.答:C10.答:A,C11.答:C12.答:C,D13.答:B,C14.答:C15.答:B16.答:A17.答:C18.答:A,B,D,F19.答:具有很大的影响。该应用程序将不能维护用户的状态。Servlet容器将为每个客户的每次请求都创建一个新的会话。修改这个问题的唯一方法是修改Servlet代码加入URL重写功能。第5章习题解析1.答:包含JSP指令、JSP小脚本和JSP表达式。2.答:合法的JSP表达式:<%=500%><%=anInt*3.5/100-500%> <%=aBool%><%=false%><%=!false%><%=getChar()%><%=Math.random()%><%=aFloatObj%><%=aFloatObj.floatValue()%><%=aFloatObj.toString()%>不合法的JSP表达式:<%=aVector%><%=aBool;%><%=inti=20%><%=sBuff.setLength(12);%>3.答:C4.答:正确声明应为:<%!inti=5;%><%!intgetI(){returni;}%>5.答:B是合法的。解析:JSP表达式中百分号和等号之间不能有空格。6.答:D。解析:A中import的属性值中应该有等号。B的import属性值应该在一个字符串中指定。C,属性之间不允许有逗号。E,bgcolor不是合法的属性名。F,true不是buffer属性合法值。G,指令名、属性名和值都是大小写敏感的,Page应为page。7.答:B,CA.非法:等号表明它是表达式,但表达式不能以分号结束,产生的Servlet代码将发生语法错误。out.print(myObj.m1(););B.合法:<%=x=y%>将被转换成:out.print(x=y);//y的值5赋给x并将其打印输出C.合法:这是合法的小脚本,因为在方法调用语句的后面有分号。即使该方法返回一个值,它也是合法的,因为返回的值将被忽略。8.答:不能在小脚本中定义方法。上面代码一旦被转换成Servlet,_jspService()方法就会像下面这样:publicvoid_jspService(...){//其他代码intx=0;intincr(){return++x;}out.write("Thevalueofxis");out.print(incr());}由于incr()方法定义在_jspService()方法内,所以代码不能编译。9.答:Thevalueofiis3 注意:如果代码写成下面形式:<%inti;%><%for(i=0;i<3;i++)%>Thevalueofiis<%=i%>输出结果将为:ThevalueofiisThevalueofiisThevalueofiis310.答:不能在japInit()方法中使用application对象。11.答:Thesumofxandyis9变量x将被声明两次:一次是作为类的全局变量,因为使用了<%!intx=5;%>语句,另一次是在_jspService()方法中声明的局部变量,因为使用的代码是<%intx=3;%>。12.答:B13.答:C,E14.答:②③⑥④①⑤15.答:out.write("rn");intcount=0;out.write("Thepagecountisnow:rn");out.print(++count);out.write("rn");16.答:Page改为page<%!intcount=0%>//声明缺少分号<%count++;%>//去掉分号17.答:D18.答:<%Floatone=newFloat(88.88)%>小脚本<%!inty=3;%>声明<%@pageimport="java.util.*"%>指令动作<%=pageContext.getAttribute("foo")%>表达式email:${applicationScope.mail}EL表达式19.答:A,B,C,E20.答:A,B,C,D21.答:D22.答:C23.答:request(javax.servlet.http.HttpServletRequest)response(javax.servlet.http.HttpServletResponse)out(javax.servlet.jsp.JspWriter)session(javax.servlet.http.HttpSession)application(javax.servlet.ServletContext)config(javax.servlet.ServletConfig)exception(java.lang.Throwable)pageContext(javax.servlet.jsp.PageContext) page(java.lang.Object)24.答:共有4个作用域对象:application、session、request和pageContext。用setAttribute()方法和getAttribute()方法在这些对象上设置和获得属性。在application作用域上的对象可以被Servlet容器的所有的Web应用程序访问。25.答:可以使用pageContext的findAttribute()方法,该方法将依次在页面作用域、请求作用域、会话作用域和应用作用域中查找指定名称的属性。第6章习题解析1.答:B2.答:⑤3.答:这两种表示等价,但第一种表示使用了JSP脚本元素,第二种表示使用的是动作。它们的功能类似,但有一点细微的差别。pageContext.include()方法在包含其他组件之前总是刷新当前页面的输出,而只有在flush属性值明确设置为true时才刷新当前页面的输出,如下所示:4.答:请求对象的getParameter()方法的返回值类型是String,因此display.jsp中的Integer应改为String。使用和request.getParameter()机制只能传递和检索String类型的参数。要传递其他对象类型的参数,必须在包含页面中使用request.setAttribute(),在被包含页面中使用request.getAttribute()。5.答:D6.答:C7.答:B8.答:可以。页面customerDisplay.jsp文件可以使用输出bean的属性值,只要它也包含一个与customerInput.jsp相同的声明并且该声明出现在声明前面即可。9.答:<%@pageimport="com.model.CustomerBean,com.model.BusinessCustomerBean"%>10.答:不能在同一个声明中同时使用beanName和class属性。11.答:必须使用property指定bean的属性。param用来指定请求参数,并且不能在同一个动作中同时指定param和value属性。12.答:使用代码段1是只有在指定作用域中找不到customer的bean对象时才执行标签体,使用代码段2在任何时候都执行属性设置标签。13.答:可以在一个动作中设置bean的全部属性:但不能在一个动作中获得全部属性值。14.答:C 15.答:MVC模式称为模型-视图-控制器模式。该模式将Web应用的组件分为模型、视图和控制器,每种组件完成各自的任务。该模型将业务逻辑和数据访问从表示层分离出来。实现MVC模式的一般步骤:(1)定义JavaBeans表示数据;(2)使用Servlet处理请求;(3)填写JavaBeans对象数据;(4)将结果存储在作用域对象中;(5)将请求转发到JSP页面;(6)最后在JSP页面中从JavaBeans中取出数据。第7章习题解析1.答:两层模型即客户机/服务器模型,在两层模型中应用程序直接通过JDBC驱动程序访问数据库。三层模型是浏览器/应用服务器/数据库服务器结构,在该结构中浏览器向应用服务器发出请求,应用服务器通过JDBC驱动程序访问数据库。2.答:传统的数据库连接的一般步骤是:(1)加载JDBC驱动程序。(2)建立连接对象。(3)创建语句对象,语句对象有3种:Statement、PreparedStatement和CallableStatement。(4)执行SQL语句得到结果集对象,调用ResultSet的有关方法就可以完成对数据库的操作。(5)关闭建立的各种对象。缺点是每次访问数据库都要建立连接对象,请求结束需关闭连接对象。这将耗费大量的时间,可能导致增大请求的响应时间。3.答:连接Oracle数据库代码如下。Class.forName("oracle.jdbc.driver.OracleDriver");Stringdburl="jdbc:oracle:thin:@127.0.0.1:1521:ORCL";Connectionconn=Drivermanager.getConnection(dburl,"scott","tiger");上述代码中,oracle.jdbc.driver.OracleDriver为JDBC驱动程序名,jdbc:oracle:thin:@127.0.0.1:1521:ORCL为JDBCURL。4.答:使用数据源是目前Web应用开发中建立数据库连接的首选方法。这种方法是事先建立如干连接对象,存放在连接池中。当应用程序需要一个连接对象时就从连接池中取出一个,使用完后再放回连接池。这样就可避免每次请求都创建连接对象,从而降低请求的响应时间,提高效率。使用数据源建立连接是通过JNDI技术实现的。这需要首先配置数据源(可以是局部数据源或全局数据源),然后在应用程序中通过Context对象查找数据源对象。假设已经配置了名为sampleDS的数据源,建立连接代码如下:Contextcontext=newInitialContext();DataSourcedataSource=context.lookup("java:comp/env/jdbc/sampleDS");ConnectiondbConnection=dataSource.getConnection();5.答:可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录,还可以向后访问结果集中的记录。可更新的ResultSet是指不但可以访问结果集中的记录,还可以通过结果集对象更新数据库。要创建可滚动、可更新的ResultSet对象,必须使用Connection对象的带两个参数的createStatement()方法创建的Statement,第一个参数用下面两个常量之一: ·ResultSet.TYPE_SCROLL_SENSITIVE·ResultSet.TYPE_SCROLL_INSENSITIVE第二个参数使用下面常量:·ResultSet.CONCUR_UPDATABLE6.参考程序如下:packagecom.control;importjava.io.*;importjava.sql.*;importjavax.servlet.*;importjavax.servlet.http.*;publicclassBookQueryServletextendsHttpServlet{Connectiondbconn;publicvoidinit(){Stringdriver="org.postgresql.Driver";Stringdburl="jdbc:postgresql://127.0.0.1:5432/bookstore";Stringusername="bookstore";Stringpassword="bookstore";try{Class.forName(driver);dbconn=DriverManager.getConnection(dburl,username,password);}catch(ClassNotFoundExceptione1){}catch(SQLExceptione2){}}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType("text/html;charset=gb2312");PrintWriterout=response.getWriter();out.println("");out.println("");try{Stringsql="SELECT*FROMbooks";Statementstmt=dbconn.createStatement();ResultSetrst=stmt.executeQuery(sql);while(rst.next()){out.println("");out.println("");out.println("");out.println("");out.println("");}}catch(SQLExceptione){e.printStackTrace();}out.println("
"+rst.getString(1)+""+rst.getString(2)+""+rst.getString(3)+""+rst.getString(4)+""+rst.getDouble(5)+"
");out.println("");} publicvoiddestroy(){try{dbconn.close();}catch(Exceptione){e.printStackTrace();}}}7.JSP页面如下:<%@pagecontentType="text/html;charset=gb2312"%><%@pageimport="java.sql.*,java.io.*"%><%Stringdriver="org.postgresql.Driver";Stringdburl="jdbc:postgresql://127.0.0.1:5432/bookstore";Stringusername="bookstore";Stringpassword="bookstore";try{Class.forName(driver);Connectiondbconn=DriverManager.getConnection(dburl,username,password);DatabaseMetaDatadbmd=dbconn.getMetaData();out.println("数据库名:"+dbmd.getDatabaseProductName()+"
");out.println("数据库版本:"+dbmd.getDatabaseProductVersion()+"
");out.println("连接的用户:"+dbmd.getUserName()+"
");out.println("数据库URL:"+dbmd.getURL()+"
");out.println("驱动程序名:"+dbmd.getDriverName()+"
");out.println("驱动程序版本:"+dbmd.getDriverVersion()+"
");}catch(ClassNotFoundExceptione1){out.println(e1);}catch(SQLExceptione2){out.println(e2);}%>8.JSP页面如下:<%@pagecontentType="text/html;charset=gb2312"%><%@pageimport="java.sql.*,java.io.*"%><%Stringdriver="org.postgresql.Driver";Stringdburl="jdbc:postgresql://127.0.0.1:5432/bookstore";Stringusername="bookstore";Stringpassword="bookstore";try{Class.forName(driver);Connectiondbconn=DriverManager.getConnection(dburl,username,password); Stringsql="SELECT*FROMpublic.books";Statementstmt=dbconn.createStatement();ResultSetrst=stmt.executeQuery(sql);ResultSetMetaDatarstmd=rst.getMetaData();out.println("结果集列数:"+rstmd.getColumnCount()+"
");out.println("第3列标题:"+rstmd.getColumnLabel(3)+"
");out.println("第3列名:"+rstmd.getColumnName(3)+"
");out.println("第3列类型:"+rstmd.getColumnType(3)+"
");out.println("第3列类型名:"+rstmd.getColumnTypeName(3)+"
");}catch(ClassNotFoundExceptione1){out.println(e1);}catch(SQLExceptione2){out.println(e2);}%>9.按教材7.7.2节建立局部或全局数据源sampleDS。创建程序7.9的CustomerBean.java程序和程序7.10的SampleDAO.java程序。SelectCustomerServlet.java代码如下:packagecom.control;importjava.io.*;importjava.sql.*;importjava.util.*;importjavax.servlet.*;importjavax.servlet.http.*;importcom.model.CustomerBean;importcom.model.SampleDAO;publicclassSelectCustomerServletextendsHttpServlet{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{SampleDAOdao=newSampleDAO();ArrayListcusts=dao.selectCustomer();request.setAttribute("custs",custs);RequestDispatcherview=getServletContext().getRequestDispatcher("/displayCustomer.jsp");view.forward(request,response);}}displayCustomer.jsp页面代码如下:<%@pagecontentType="text/html;charset=gb2312"%><%@pageimport="com.model.CustomerBean,java.util.*"%>DisplayCustomer<%ArrayListcusts= (ArrayList)request.getAttribute("custs");for(CustomerBeancb:custs){out.println(cb.getCustName()+""+cb.getEmail()+""+cb.getPhone()+"
");}%>10.首先在SampleDAO类中定义下面两个字符串常量:privatestaticfinalStringDELETE_SQL="DELETEFROMcustomerWHEREcustName=?";privatestaticfinalStringUPDATE_SQL="UPDATEcustomerSETemail=?,phone=?WHEREcustName=?";下面是删除客户和修改客户的方法://按姓名删除客户记录publicbooleandeleteCustomer(StringcustName){Connectionconn=null;PreparedStatementpstmt=null;ResultSetrst=null;CustomerBeancustomer=null;try{conn=dataSource.getConnection();pstmt=conn.prepareStatement(DELETE_SQL);pstmt.setString(1,custName);intn=pstmt.executeUpdate();if(n==1){returntrue;}else{returnfalse;}}catch(SQLExceptionse){returnfalse;}finally{try{pstmt.close();conn.close();}catch(SQLExceptionse){}}}//修改客户记录publicbooleanupdateCustomer(CustomerBeancustomer){Connectionconn=null;PreparedStatementpstmt=null;try{conn=dataSource.getConnection();pstmt=conn.prepareStatement(UPDATE_SQL);pstmt.setString(1,customer.getEmail());pstmt.setString(2,customer.getPhone()); pstmt.setString(3,customer.getCustName());intn=pstmt.executeUpdate();if(n==1){returntrue;}else{returnfalse;}}catch(SQLExceptionse){returnfalse;}finally{try{pstmt.close();conn.close();}catch(SQLExceptionse){}}}11.首先在PostgreSQL数据库中创建一个求整数阶乘的函数my_factorial(),代码如下:CREATEORREPLACEFUNCTIONmy_factorial(valueinteger)RETURNSintegerAS$$DECLAREarginteger;BEGINarg:=value;IFargISNULLORarg<0THENRAISENOTICE"InvalidNumber";RETURNNULL;ELSEIFarg=1THENRETURN1;ELSEDECLAREnext_valueinteger;BEGINnext_value:=my_factorial(arg-1)*arg;--函数递归调用RETURNnext_value;END;ENDIF;ENDIF;END;$$LANGUAGE"plpgsql";创建JSP页面compute.jsp,连接数据库,调用存储过程:<%@pagecontentType="text/html;charset=gb2312"%><%@pageimport="java.sql.*,java.io.*"%>请输入一个整数: <%Stringdriver="org.postgresql.Driver";Stringdburl="jdbc:postgresql://127.0.0.1:5432/bookstore";Stringusername="bookstore";Stringpassword="bookstore";try{Class.forName(driver);Connectiondbconn=DriverManager.getConnection(dburl,username,password);Integernum=0;if(request.getParameter("param")!=null)num=Integer.parseInt(request.getParameter("param"));Stringsql="{?=callmy_factorial(?)}";CallableStatementcstmt=dbconn.prepareCall(sql);cstmt.setInt(2,num);cstmt.registerOutParameter(1,java.sql.Types.INTEGER);cstmt.execute();intresult=cstmt.getInt(1);request.setAttribute("result",result);}catch(ClassNotFoundExceptione1){out.println(e1);}catch(SQLExceptione2){out.println(e2);}catch(NumberFormatExceptione3){out.println("输入不合法!");}%>

<%=request.getParameter("param")%>的阶乘为:<%=request.getAttribute("result")%>

该页面的运行结果如下:12.略。第8章习题解析1.答:表达式语言是JSP页面中使用的一种简洁的数据访问语言。它定义了运算符实现算术、关系等运算;可以对作用域变量、JavaBeans对象、集合的元素、请求参数、Cookie等进行简单的访问;还可以访问Java语言定义的函数(静态方法)。2.答:使用点(.)运算符可以访问Map对象一个键的值和bean对象的属性值。使用 方括号([])运算符还可以List对象和数组对象的元素。3.答:(1)作用域变量;(2)JavaBeans的属性;(3)访问集合元素;(4)访问隐含变量。4.答:(1)定义public类和静态方法;(2)创建标签库描述文件(TLD);(3)在JSP页面中访问EL函数。5.答:将page指令的isELIgnored属性设置为true,如下所示:<%@pageisELIgnored="true"%>6.答:A7.答:A8.答:E9.答:B,E10.答:B11.答:由于paramValues返回的是包含String[]的Map,所以需要访问数组的单个元素。使用${paramValues.result[0]}和${paramValues.result["0"]}都可以,但使用${paramValues.result.0}不可以。记住,paramValues和headerValues返回String[]的Map对象。12.答:A,C13.答:C14.答:A15.答:D16.答:B17.答:${(5+3>0)?true:false}18.参考程序如下:(1)定义Java函数packagecom.demo;publicclassFunctions{publicstaticbooleanpalindrome(Strings){intlow=0;inthigh=s.length()-1;while(lowASimpleTagLibrary1.0SimpleTagLibraryhttp://www.mydomain.com/sample checkpalindromepalindromecom.demo.Functionsbooleanpalindrome(java.lang.String)(3)在JSP页面中访问函数,palindrome.jsp。<%@pagecontentType="text/html;charset=gb2312"%><%@taglibprefix="demo"uri="http://www.mydomain.com/sample"%>UsingFunction

判断字符串是否是回文

输入字符串:字符串:${param.x}${demo:palindrome(param.x)?"是":"不是"}回文。第9章习题解析1.答:自定义标签的开发步骤:(1)创建标签处理类;(2)创建标签库描述文件TLD;(3)在JSP页面中引入标签库和使用标签。2.答:下面按容器调用的顺序列出SimpleTag接口定义的方法:publicvoidsetJspContext(JspContextpc)publicvoidsetParent(JspTagparent)publicvoidsetJspBody(JspFragmentjspBody)publicJspTaggetParent()publicvoiddoTag()throwsJspException,IOException3.答:C4.答:C5.答:B6.答:D7.答:D8.答:A9.答:B10.答:mimerandomthingsadviceusertrue11.答:F12.答:B,D13.答:B14.答:B,C15.答:B,F16.答:A17.答:在TLD文件中定义标签代码如下:http://www.mydomain.com/sampleechotag beans.EchoAttributesTagemptytrue在JSP页面echoattribute.jsp中使用该标签:<%@pagecontentType="text/html;charset=gb2312"%><%@taglibprefix="demo"uri="http://www.mydomain.com/sample"%>

动态属性的使用

第10章习题解析1.答:获得JSTL有两种方法。(1)到http://jakarta.apache.org下载,下载的文件名是jakarta-taglibs-standard-1.1.2.zip,将该文件解压到一个目录中,将其中lib目录中的jstl.jar文件和stantard.jar文件复制到应用程序的WEB-INFlib目录中即完成安装。(2)从Tomcat安装目录的webappsexamplesWEB-INFlib目录中将上述两个文件复制到应用程序的WEB-INFlib目录中。2.答:不需要。因为TLD文件包含在standard.jar文件中,容器能够自动找到该文件。3.答:通用目的的标签:。条件控制标签:。循环控制标签:。URL处理标签:。4.答:D。简单标签的标签体中不能包含脚本元素。5.答:在浏览器中输出下面一行。0369121518212427306.答:C7.答:E8.答:B9.答:D,E10.答:①varStatus②test③value④when,test,otherwise11.答:B12.答:将example.tag标签文件存放在/WEB-INF/tags目录中。下面的页面使用该标签文件。<%@taglibprefix="fibo"tagdir="/WEB-INF/tags"%>13.答:C 第11章习题解析1.答:3个对象上可发生事件:ServletContext、HttpSession和HttpRequest。针对不同的事件,应实现不同的监听器接口。如对ServletContextEvent应实现ServletContextListener接口。注册事件监听器在web.xml文件中使用元素及其子元素实现。2.答:Web应用程序启动时将通知ServletContextListener事件监听器。3.答:B4.答:MyServletRequestListener5.答:C6.答:A,C,D7.答:E8.答:D第12章习题解析1.答:Web应用的安全性主要包括4个方面:(1)身份验证;(2)授权;(3)数据完整性;(4)数据保密性。进入大楼出示证件属于身份验证。2.答:验证用户的机制包括:(1)HTTP基本验证。优点:实现简单。缺点:用户名和口令没有加密。(2)HTTP摘要验证。优点:用户名和口令加密,比基本验证安全。(3)HTTPS客户证书验证。优点:是罪安全的。缺点:需要授权机构的证书。(4)基于表单的验证。优点:实现容易。缺点:用户名和口令不加密。3.答:声明式安全和程序式安全是Web应用实现安全性的两种方法。声明式安全是在程序外配置安全信息,程序式安全是在程序内实施安全措施。4.答:D5.答:C6.答:E,F,H7.答:A,D8.答:A,C9.答:①j_security_check②j_username③FORM④form-login-page⑤/form-login-page10.答:A,C第13章习题解析1.答:Struts框架主要由核心控制器(ActionServlet)、表单bean、动作对象、JSP页面和配置文件(struts-config.xml)、Struts标签等组成。2.答:在Struts框架中MVC的模型使用JavaBeans实现,视图使用JSP页面实现, 控制器有ActionServlet和用户定义的Action动作类。3.答:在Struts框架中所有的请求都发送到ActionServlet,它根据配置文件struts-config.xml确定请求由哪个Action动作对象处理。如果请求有关联表单,系统将查找或创建表单bean对象,然后用请求参数填充表单bean,接下来调用表单bean的validate()方法验证表单数据,系统根据该方法返回的ActionErrors对象的值确定验证是否成功,若返回null或空,表示验证通过,否则验证没有通过。4.答:要上传文件应将
的method属性值指定为“post”。5.答:在表单bean类中为每个上传文件定义一个FormFile类型的属性,然后通过其访问方法得到每个FormFile对象就可以实现一次上传多个文件。6.答:使用Tiles框架设计页面布局的原理是:首先使用Tiles标签创建一个布局页面,然后在需要使用该布局的JSP页面中引用该布局页面即可。请参阅教材中程序13.17和程序13.18的实现。第14章习题解析1.答:Ajax是英文AsynchronousJavaScriptandXML的首字母缩写,意思为异步JavaScript与XML。Ajax实际是多种技术的综合应用,其中包括JavaScript脚本语言、XHTML、CSS、DOM、XML、XSTL以及最重要的XMLHttpRequest对象。2.答:XMLHttpRequest对象常用的属性有onreadystatechange、responseText、responseXML、readyState等,常用的方法有open()、send()、abort()等。该对象的完整属性和方法列表请参阅教材的表14.1和表14.2。3.答:Ajax的工作原理如教材中图14.1所示。具体步骤如下:(1)客户在页面中触发一个事件。(2)程序调用JavaScript函数,在函数中创建XMLHttpRequest对象(3)使用该对象向服务器发出异步请求,同时需要设置回调函数。(4)服务器处理请求并返回响应。(5)通过回调函数处理结果并更新HTMLDOM对象。4.答:参见教材14.2.6节叙述。5.答:参见教材14.3节叙述。'