JavaWeb编程技术沈泽刚版教材习题参考答案.docx
《JavaWeb编程技术沈泽刚版教材习题参考答案.docx》由会员分享,可在线阅读,更多相关《JavaWeb编程技术沈泽刚版教材习题参考答案.docx(32页珍藏版)》请在冰豆网上搜索。
![JavaWeb编程技术沈泽刚版教材习题参考答案.docx](https://file1.bdocx.com/fileroot1/2023-2/7/54763b7b-78f1-439f-ba73-a852164bf641/54763b7b-78f1-439f-ba73-a852164bf6411.gif)
JavaWeb编程技术沈泽刚版教材习题参考答案
JavaWeb编程习题解析
4.1第1章习题解析
1.略。
2.答:
URL称为统一资源定位符,URL通常由4部分组成:
协议名称、页面所在主机的DNS名、可选的端口号和资源的名称。
URI称为统一资源标识符,是以特定语法标识一个资源的字符串。
URI由模式和模式特有的部分组成,它们之间用冒号隔开,一般格式如下:
schema:
schema-specific-part
URI是URL和URN的超集。
3.答:
①是URL,①和②都是URI,③是URN
4.答:
动态Web文档技术包括服务器端动态文档技术和客户端动态文档技术,前者包括CGI技术、服务器扩展技术和HTML页面中嵌入脚本技术。
其中HTML页面中嵌入脚本技术包括ASP、PHP和JSP技术。
最流行的客户端动态文档技术是在HTML页面中嵌入JavaScript脚本代码。
使用JavaScript可以设计交互式页面。
与服务器端动态文档不同,JavaScript脚本是在客户端执行的。
5.答:
Servlet是用ServletAPI开发的Java程序,它运行在Servlet容器中。
Servlet容器是运行Servlet的软件,主要用来扩展Web服务器的功能。
6.答:
开发Servlet的一般步骤包括:
(1)编写Servlet源程序;
(2)编译;(3)将Servlet部署到Servlet容器中;(4)访问执行Servlet。
7.答:
\lib\servlet-api.jar文件。
8.答:
部署描述文件名是web.xml,它是XML文件,应该存放在Web应用程序的\WEB-INF目录中。
9.答:
当服务器找不到用户请求的资源时将发生404错误。
10.答:
JSP页面是嵌入了Java脚本元素的HTML页面。
11.答:
Servlet主要用来实现业务逻辑和控制逻辑,JSP页面主要用来实现表示逻辑。
4.2第2章习题解析
1.答:
Servlet接口定义了下面5个方法:
publicvoidinit(ServletConfigconfig)
publicvoidservice(ServletRequestrequest,ServletResponseresponse)
throwsServletException,IOException
publicvoiddestroy()
publicServletConfiggetServletConfig()
publicStringgetServletInfo()
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.答:
E
14.答:
action="courseServlet.do"
HttpServlet
com.demo.CourseServlet
courseServlet
15.答:
①E②D③C④B⑤A
4.3第3章习题解析
1.答:
Web应用程序是运行在应用服务器之中的。
应用服务器为Web应用程序提供一种简单的和可管理的对系统资源的访问机制。
2.答:
web.xmlbankapp\WEB-INF
3.答:
D4.答:
A5.答:
D
6.答:
F7.答:
E8.答:
D
9.答:
getServletConfig().getServletContext()或getServletContext()
10.答:
B11.答:
B12.答:
D
13.答:
因为Applet只能运行在客户端,所以可以将它放在Web应用程序的文档根目录的任何位置,但不能将其放在WEB-INF目录或其子目录中。
14.答:
不能这样做,至少不能直接这样。
部署描述文件不允许为一个名称指定多个参数,所以必须像下面这样:
countries
Australia,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.4第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,D
9.答:
C10.答:
A,C11.答:
C
12.答:
C,D13.答:
B,C14.答:
C
15.答:
B16.答:
A17.答:
C
18.答:
A,B,D,F
19.答:
具有很大的影响。
该应用程序将不能维护用户的状态。
Servlet容器将为每个客户的每次请求都创建一个新的会话。
修改这个问题的唯一方法是修改Servlet代码加入URL重写功能。
4.5第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.答:
C
4.答:
正确声明应为:
<%!
inti=5;%>
<%!
intgetI(){returni;}%>
5.答:
B是合法的。
解析:
JSP表达式中百分号和等号之间不能有空格。
6.答:
D。
解析:
A中import的属性值中应该有等号。
B的import属性值应该在一个字符串中指定。
C,属性之间不允许有逗号。
E,bgcolor不是合法的属性名。
F,true不是buffer属性合法值。
G,指令名、属性名和值都是大小写敏感的,Page应为page。
7.答:
B,C
A.非法:
等号表明它是表达式,但表达式不能以分号结束,产生的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%>
输出结果将为:
ThevalueofiisThevalueofiisThevalueofiis3
10.答:
不能在japInit()方法中使用application对象。
11.答:
Thesumofxandyis9
变量x将被声明两次:
一次是作为类的全局变量,因为使用了<%!
intx=5;%>语句,另一次是在_jspService()方法中声明的局部变量,因为使用的代码是<%intx=3;%>。
12.答:
B13.答:
C,E
14.答:
②③⑥④①⑤
15.答:
out.write("
\r\n");
intcount=0;
out.write("Thepagecountisnow:
\r\n");
out.print(++count);
out.write("\r\n");
16.答:
Page改为page
<%!
intcount=0%>//声明缺少分号
<%count++;%>//去掉分号
17.答:
D
18.答:
<%Floatone=newFloat(88.88)%>小脚本
<%!
inty=3;%>声明
<%@pageimport="java.util.*"%>指令
includepage="foo.jsp"/>动作
<%=pageContext.getAttribute("foo")%>表达式
email:
${applicationScope.mail}EL表达式
19.答:
A,B,C,E20.答:
A,B,C,D
21.答:
D22.答:
C
23.答:
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()方法,该方法将依次在页面作用域、请求作用域、会话作用域和应用作用域中查找指定名称的属性。
4.6第6章习题解析
1.答:
B2.答:
⑤
3.答:
这两种表示等价,但第一种表示使用了JSP脚本元素,第二种表示使用的是动作。
它们的功能类似,但有一点细微的差别。
pageContext.include()方法在包含其他组件之前总是刷新当前页面的输出,而include>只有在flush属性值明确设置为true时才刷新当前页面的输出,如下所示:
includepage="other.jsp"flush="true"/>
4.答:
请求对象的getParameter()方法的返回值类型是String,因此display.jsp中的Integer应改为String。
使用param>和request.getParameter()机制只能传递和检索String类型的参数。
要传递其他对象类型的参数,必须在包含页面中使用request.setAttribute(),在被包含页面中使用request.getAttribute()。
5.答:
D6.答:
C7.答:
B
8.答:
可以。
页面customerDisplay.jsp文件可以使用getProperty>输出bean的属性值,只要它也包含一个与customerInput.jsp相同的useBean>声明并且该声明出现在getProperty>声明前面即可。
9.答:
<%@pageimport="com.model.CustomerBean,com.model.BusinessCustomerBean"%>
useBeanid="customer"class="com.model.BusinessCustomerBean"
type="com.model.CustomerBean"scope="application"/>
setPropertyname="customer"value="Smith@"/>
setPropertyname="customer"value=""/>
useBean>
10.答:
不能在同一个useBean>声明中同时使用beanName和class属性。
11.答:
必须使用property指定bean的属性。
param用来指定请求参数,并且不能在同一个setProperty>动作中同时指定param和value属性。
12.答:
使用代码段1是只有在指定作用域中找不到customer的bean对象时才执行标签体,使用代码段2在任何时候都执行属性设置标签。
13.答:
可以在一个动作中设置bean的全部属性:
setPropertyname="beanName"property="*"/>
但不能在一个动作中获得全部属性值。
14.答:
C
15.答:
MVC模式称为模型-视图-控制器模式。
该模式将Web应用的组件分为模型、视图和控制器,每种组件完成各自的任务。
该模型将业务逻辑和数据访问从表示层分离出来。
实现MVC模式的一般步骤:
(1)定义JavaBeans表示数据;
(2)使用Servlet处理请求;(3)填写JavaBeans对象数据;(4)将结果存储在作用域对象中;(5)将请求转发到JSP页面;(6)最后在JSP页面中从JavaBeans中取出数据。
4.7第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应用开发中建立数据库连接的首选方法。
这种方法是事先建立如干连接对象,存放在连接池中。
当应用程序需要一个连接对象时就从连接池中取