《JavaWeb编程技术》课后习题答案_第1页
《JavaWeb编程技术》课后习题答案_第2页
《JavaWeb编程技术》课后习题答案_第3页
《JavaWeb编程技术》课后习题答案_第4页
《JavaWeb编程技术》课后习题答案_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

[键入文字]

JavaWeb编程习题解析

习题解析

i.略。

什么是URL,什么是URL它们都由哪几个部分组成,URL和URI之间有什么关系?

2.答:URL称为统一资源定位符,URL通常由4部分组成:协议名称、页面所在主

机的DNS名、可选的端口号和资源的名称。URI称为统一资源标识符,是以特定语法标识

一个资源的字符串。URI由模式和模式特有的部分组成,它们之间用冒号隔开,一般格式

如下:

schema:schema-specific-part

URI是URL和URN的超集。

3.答:①是URL,①和②都是URL③是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.答:<fonjcaf-i”ss〃>\lib\servlet-api.jar文件。

web应用程序的部署描述文件名是什么?它是什么类型的文件?应该存放在什么

目录中?

8.答:部署描述文件名是web.xml,它是XML文件,应该存放在Web应用程序的

WEB-INF目录中。

什么是404错误?

9.答:当服务器找不到用户请求的资源时将发生404错误。

什么是JSP页面?它与HTML页面有什么关系?

10.答:JSP页面是嵌入了Java脚本元素的HTML页面。

Servlet与JSP各适用于什么场合?

11.答:Servlet主要用来实现业务逻辑和控制逻辑,JSP页面主要用来实现表示逻辑。

岁章习题解析

Servlet接口中定义了哪几个方法?

I.答:Servlet接口定义了下面5个方法:

publicvoidinit(ServletConfigconfig)

publicvoidservice(ServletRequestrequest,ServletResponseresponse)

throwsServletException,lOException

publicvoiddestroy()

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.答:E

14.答:

action=ncourseServlet.do"

HttpServlet

com.demo.CourseServlet

courseServlet

15.答:①E②D③C®B⑤A

驾章习题解析

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应用程序的文档根目

录的任何位置,但不能将其放在WEB4NF目录或其子目录中。

14.答:不能这样做,至少不能直接这样。部署描述文件不允许为一个名称指定多个

参数,所以必须像下面这样:

<init-param>

<param-name>countries</param-name>

<param-value>Australia,Brazil,India,UK,US</param-value>

<init-param>

然后在Servlet中解析param-value串的值并解释字符串中列出的多个值。

15.答:

packagecom.demo;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjava.io.

publicclassHelioCounterServletextendsHttpServlet{

privateIntegervisits=0;

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwslOException,ServletException{

response.setContentType(ntext/html;charset=gb2312");

PrintWriterout=response.getWriter();

visits=visits+1;

try(

Thread.sleep(2000);

}catch(InterruptedExceptione){

log(uExceptionduringsleeping.;

)

out.printin(H<html><body>n);

out.printin("欢迎您!<br>"+”该Servlet已被访问”+visits+”次。n);

out.printin(H</body></html>n);

}

}

修改后的Servlet如下:

packagecom.demo;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjava.io.*;

publicclassHelloCounterServletextendsHttpServlet{

privateIntegervisits=0;

privateStringdbPath=null;

publicvoidinit(){

try{

dbPath=getServletContext().getRealPath(n/WEB-INF/counter.dbn);

FileInputStreamfis=newFileinputstream(dbPath);

DataInputStreamdis=newDatalnputStream(fis);

visits=dis.readlnt();

dis.close();

}catch(Exceptione){

log(nErrorloadingpersistentcounter'1,e);

)

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwslOException,ServletException{

response.setContentType(ntext/html;charset=gb2312");

Printwriterout=response.getWriter();

synchronized(this){

visits=visits+1;

out.printIn(H<html><body>");

out.printin("欢迎您!<br>H+”该Servlet已被访问”+visits+”次。”);

out.printIn(n</body></html>n);

}

|

publicvoiddestroy(){

try{

FileOutputStreamfos=newFileOutputStream(dbPath);

DataOutputStreamdos=newDataOutputStream(fos);

dos.writelnt(visits);

dos.close();

}catch(Exceptione){

log(*'Errorstoringpersistentcounter'*,e);

}

)

}

号章习题解析

1.答:使用请求对象(即HttpServletRequest接口)的getSession。方法。

2.答:如果客户在指定时间内没有访问服务器,则该会话超时。对超时的会话对象,

服务器使其失效。通过会话对象的setMaxInactivelnterval。方法设置会话最大超时时间。

web.xml文件使用<session-config>元素的子元素vsession-timeouA设置最大超时时间,

如下所示。

<session-config>

<session-timeout>20</session-timeout>

</session-config>

这里的最大超时时间是对整个应用程序的所有会话有效,<session-timeout>元素指定的

时间单位是分钟。setMaxInactivelnterval。方法参数单位是秒。

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重写功能。

驾章习题解析

1.答:包含JSP指令、JSP小脚本和JSP表达式。

2.答:合法的JSP表达式:

<%=500%>

<%=anlnt*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.ml(););

B.合法:<%=x=y%>将被转换成:

out.print(x=y);//y的值5赋给x并将其打印输出

C.合法:这是合法的小脚本,因为在方法调用语句的后面有分号。即使该方法返回一

个值,它也是合法的,因为返回的值将被忽略。

8.答:不能在小脚本中定义方法。上面代码一旦被转换成Servlet,」spService()方法

就会像下面这样:

publicvoid_jspService(...){

//其他代码

intx=0;

intincr(){return++x;}

out.write(nThevalueofxis*');

out.print(incr());

)

由于incr()方法定义在」spService()方法内,所以代码不能编译。

9.答:Thevalueofiis3

注意:如果代码写成下面形式:

<%int1;%>

<%for(i=0;i<3;i++)%>Thevalueofiis<%=i%>

输出结果将为:

ThevalueofiisThevalueofiisThevalueofiis3

10.答:不能在japlnit()方法中使用application对象。

11.答:Thesumofxandyis9

变量x将被声明两次:一次是作为类的全局变量,因为使用了<%!由1*=5;%>语句,

另一次是在」spService。方法中声明的局部变量,因为使用的代码是<%intx=3;%>o

1答

24.卷:B13.答:C,E

口:②③⑥④①⑤

5.答

out.write(n<html><body>\r\nn);

intcount=0;

out.write(nThepagecountisnow:\r\nn);

out.print(++count);

out.write("</body>〈/html>\r\n");

16.答:

Page改为page

<%1intcount=0%>//声明缺少分号

<%count++;%>//去掉分号

17.答:D

18.答:

<%Floatone=newFloat(88.88)%>小脚本

<%!inty=3;声明

<%@pageimport='*java.util.*n%>}'旨令

<jsp:includepage=Mfoo.jsp"/>动作

<%=pageContext.getAttribute(ufoo")表达式

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。fflsetAttribute()

方法和getAltribute。方法在这些对象上设置和获得属性。在叩plication作用域上的对象可以

被Servlet容器的所有的Web应用程序访问。

25.答:可以使用pageContext的findAttribute。方法,该方法将依次在页面作用域、请

求作用域、会话作用域和应用作用域中查找指定名称的属性。

第。章习题解析

1.答:B2.答:⑤

3.答:这两种表示等价,但第♦种表示使用了JSP脚本元素,第二种表示使用的是动

作。它们的功能类似,但有一点细微的差别。pageContext.include。方法在包含其他组件之

前总是刷新当前页面的输出,而vjsp:include>只有在flush属性值明确设置为true时才刷新

当前页面的输出,如下所示:

<jsp:includepage="other.jsp*'flush=ntrueH/>

4.答:请求对象的getParameter。方法的返回值类型是String,因此display.jsp中的

Integer应改为String0使用vjsp:param>和request.getParameter()机制只能传递和梅索String

类型的参数。要传递其他对象类型的参数,必须在包含页面中使用request.setAttribute(),

在被包含页面中使用request.getAttribute()0

5.答:D6.答:C7.答:B

8.答:可以。页面customerDisplay.jsp文件可以使用vjsp:getProperty>输出bean的属性

值,只要它也包含一个与customerlnput.jsp相同的vjsp:useBean>声明并且该声明出现在

<jsp:getProperty>明前面即可。

9.答:

<%@pageimport=ncom.model.CustomerBean,com.model.BusinessCustomerBean'1%>

<jsp:useBeanid=ncustomerHclass=ncom.model.BusinessCustomerBean**

type=ncom.model.CustomerBean”scope=Happlicationn/>

<jsp:setPropertyname=Hcustomer"value=HSH/>

<jsp:setPropertyname=,,customernva1ue=118899123'*/>

</jsp:useBean>

10.答:不能在同一个vjsp:useBean>声明中同时使用beanName和class属性。

11.答:必须使用property指定bean的属性。param用来指定请求参数,并且不能在

同一个vjsp:setProperty>动作中同时指定param和value属性。

12.答:使用代码段1是只有在指定作用域中找不到customer的bean对象时才执行标签

体,使用代码段2在任何时候都执行属性设置标签。

13.答:可以在一个动作中设置bean的全部属性:

<jsp:setPropertyname=nbeanNamenproperty=n*"/>

但不能在一个动作中获得全部属性值。

14.答:C

15.答:MVC模式称为模型-视图-控制器模式。该模式将Web应用的组件分为模型、

视图和控制器,每种组件完成各自的任务。该模型将业务逻辑和数据访问从表示层分离出

来。实现MVC模式的一般步骤:(1)定义JavaBeans表示数据;(2)使用Servlet处理请

求;(3)填写JavaBeans对象数据;(4)将结果存储在作用域对象中;(5)将请求转发到

JSP页面;(6)最后在JSP页面中从JavaBeans中取出数据。

雪章习题解析

1.答:两层模型即客户机/服务器模型,在两层模型中应用程序直接通过JDBC驱动程

序访问数据库。三层模型是浏览器/应用服务器/数据库服务器结构,在该结构中浏览器向

应用服务器发出请求,应用服务器通过JDBC驱动程序访问数据库。

2.答:传统的数据库连接的一般步骤是:(1)加载JDBC驱动程序。(2)建立连接对

象。(3)创建语句对象,语句对象有3种:StatementsPreparedStatement和CallableStatement(,

(4)执行SQL语句得到结果集对象,调用ResultSet的有关方法就可以完成对数据库的操

作。(5)关闭建立的各种对象。

缺点是每次访问数据库都要建立连接对象,请求结束需关闭连接对象。这将耗费大量

的时间,可能导致增大请求的响应时间。

3.答:连接Oracle数据库代码如下。

Class.forName("oracle.jdbc.driver.OracleDriver");

Stringdburl="jdbc:oracle:thin:@:1521:ORCL";

Connectionconn=Drivermanager.getConnection(dburl,"scott","tiger");

上述代码中,oracle.jdbc.driver.OracleDriver为JDBC驱动程序名,jdbc:oracle:thin:@

: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_UPDATABLE

6.参考程序如下:

packagecom.control;

importjava.io.*;

importjava.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassBookQueryServletextendsHttpServlet{

Connectiondbconn;

publicvoidinit(){

Stringdriver=norg.postgresql.Driver,';

Stringdburl=*'jdbc:postgresql://:5432/bookstore";

Stringusername="bookstore";

Stringpassword="bookstore”;

try(

Class.forName(driver);

dbconn=DriverManager.getConnection(

dburl,username,password);

}catch(ClassNotFoundExceptionel){

}catch(SQLExceptione2){}

)

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,lOException{

response.setContentType("text/html;charset=gb2312n);

Printwriterout=response.getWriter();

out.printin(n<html><body>");

out.printin(n<table>");

try(

Stringsql=nSELECT*FROMbooks";

Statementstmt=dbconn.createStatement();

ResultSetrst=stmt.executeQuery(sql);

while(rst.next()){

out.printin(n<tr><td>n+rst.getString(1)+n</td>n);

out.printin(n<td>n+rst.getString(2)+”</td>“);

out.printin(n<td>n+rst.getString(3)+n</td>n);

out.printin(n<td>n+rst.getString(4)+”</td>“);

out.printin(n<td>n+rst.getDouble(5)+n</td></tr>n);

)

}catch(SQLExceptione){

e.printStackTrace();

)

out.printin(“〈/table〉”);

out.printin(n</body></html>,');

)

publicvoiddestroy(){

try(

dbconn.close();

}catch(Exceptione){

e.printStackTrace();

}

)

}

7.JSP页面如下:

<%@pagecontentType=ntext/html;charset=gb2312n%>

<%0pageimport=njava.sql.*,java.io.*n%>

<htmlxbody>

<%

Stringdriver=norg.postgresql.Driver,';

Stringdburl=njdbc:postgresql://:5432/bookstoren;

Stringusername="bookstore";

Stringpassword="bookstore";

try(

Class.forName(driver);

Connectiondbconn=DriverManager.getConnection(

dburl,username,password);

DatabaseMetaDatadbmd=dbconn.getMetaData();

out.printsIn("数据库名:H+dbmd.getDatabaseProductName()+n</br>n);

out.printin("数据库版本:"+dbmd.getDatabaseProductVersion()+n</br>n);

out.printIn("连接的用户:"+dbmd.getUserName()+n</br>");

out.printin("数据库URL:n+dbmd.getURL()+H</br>n);

out.printin("马区动程序名:"+dbmd.getDriverName()+"</br>n);

out.printin("马区动程序版本:n+dbmd.getDriverVersion()+n</br>,T);

}catch(ClassNotFoundExceptionel){

out.printin(el);

}catch(SQLExceptione2){

out.printin(e2);

)

%>

</body></html>

8.JSP页面如下:

<%@pagecontentType=Htext/html;charset=gb2312"%>

<%@pageimport=njava.sql.*,java.io.**'%>

<htmlxbody>

<%

Stringdriver=norg.postgresql.DriverM;

Stringdburl="jdbc:postgresql://:5432/bookstore°;

Stringusername="bookstore";

Stringpassword="bookstore";

try{

Class.forName(driver);

Connectiondbconn=DriverManager.getConnection(

dburl,username,password);

Stringsql=nSELECT*FROMpublic.books";

Statementstmt=dbconn.createStatement();

ResultSetrst=stmt.executeQuery(sql);

ResuitSetMetaDatarstmd=rst.getMetaData();

out.printin("结果集歹U数:n+rstmd.getColumnCount()+”</br>");

out.printIn("第3歹U标题:"4-rstmd.getColumnLabel(3)+”</br>”);

out.printin3列名:n+rstmd.getColumnName(3)+n</br>");

out.printin("第3歹U类型:"+rstmd.getColumnType(3)+”</br>");

out.printIn(n3歹U类型名:n+rstmd.getColumnTypeName(3)+H</br>n);

}catch(ClassNotFoundExceptionel){

out.printin(el);

}catch(SQLExceptione2){

out.printIn(e2);

}

%>

</body></html>

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,lOException{

SampleDAOdao=newSampleDAO();

ArrayList<CustomerBean>custs=dao.selectCustomer();

request.setAttribute("custs",custs);

RequestDispatcherview=getServletContext().

getRequestDispatcher("/displaycustomer.jsp");

view.forward(request,response);

)

)

displayCustomer.jsp页面代码如卜:

<%0pagecontentType=,,text/html;charset=gb2312n%>

<%0pageimport=ncom.model.CustomerBean,java.util.*n%>

<html><head><title>DisplayCustomer</title></head>

<body>

<%

ArrayList<CustomerBean>custs=

(ArrayList<CustomerBean>)request.getAttribute("custs");

for(CustomerBeancb:custs){

out.printIn(cb.getCustName()+**"+cb.getEmail()+*'"

+cb.getPhone()+'*</br>n);

}

%>

</body></html>

10.首先在SampleDAO类中定义下面两个字符串常量:

privatestaticfinalStringDELETE_SQL=

“DELETEFROMcustomerWHEREcustName=?n;

privatestaticfinalStringUPDATE_SQL=

"UPDATEcustomerSETemail=?,phone=?WHEREcustName=?H;

下面是删除客户和修改客户的方法:

//按姓名删除客户记录

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$$

DECLARE

arginteger;

BEGIN

arg:=value;

IFargISNULLORarg<0THEN

RAISENOTICE*InvalidNumber1;

RETURNNULL;

ELSE

IFarg=1THEN

RETURN1;

ELSE

DECLARE

next_valueinteger;

BEGIN

next_value:=my_factorial(arg-1)*arg;一函数递归调用

RETURNnext_value;

END;

ENDIF;

ENDIF;

END;

$$LANGUAGE'plpgsql';

创建JSP页面compute.jsp,连接数据库,调用存储过程:

<%@pagecontentType=ntext/html;charsets=gb2312n%>

nH

<%0pageimport=java.sql.★fjava.io.*%>

<htmlxbody>

<formaction=Mnmethod="postH>

请输入一个整数:<inputtype=Htextnname="paramnsize=,,5H/>

<inputtype=wsubmitu确定”/>

</form>

<%

Stringdriver=Horg.postgresql.Driver;

Stringdburl=*'jdbc:postgresql://:5432/bookstoren;

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(nparamn));

Stringsql=H{?=callmy_factorial(?)}n;

CallableStatementcstmt=dbconn.prepareCall(sql);

cstmt.setInt(2,num);

cstmt.registerOutParameter(1,java.sql.Types.INTEGER);

cstmt.execute();

intresult=cstmt.getInt(1);

request.setAttribute(nresultn,result);

}catch(ClassNotFoundExceptionel){

out.printIn(el);

}catch(SQLExceptione2){

out.printIn(e2);

}catch(NumberFormatExceptione3){

out.printIn("输入未合法!n);

}

%>

<p><%=request.getParameter("param”)宅>的阶乘为:

<%=request.getAttribute("resultn)%></p>

</body></html>

该页面的运行结果如下:

地址U/http://1ocalhost:8080/helloapp/compute.jsp

请输入一个整数:5|晅

5的阶乘为:120

12.略。

雪章习题解析

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='*truen%>

6.答:A7.答:A8.答:E

9.答:B,E10.答:B

11.答:由于paramValues返回的是包含String口的Map,所以需要访问数组的单个元

素。使用${paramValues.result[O]}和${paramValues.resultJ'O"]}都可以,但使用

${paramValues.result.O}不可以。

记住,paramValues和headerValues返回String]]的Map对象。

12.答:A,C13.答:C14.答:A

15.答:D16.答:B

17.答:${(5+3>0)?true:false}

18.参考程序如下:

(1)定义Java函数

packagecom.demo;

publicclassFunctions{

publicstaticbooleanpalindrome(Strings){

intlow=0;

inthigh=s.length()-1;

while(low<high){

if(s.charAt(low)!=s.charAt(high))

returnfalse;

low++;

high——;

)

returntrue;

)

)

(2)创建标签库描述文件

<?xmlversion=H1.0"encoding=**UTF-8*'?>

<taglibxmlns=n/xml/ns/j2een

xmlns:xsi=,,/2001/XMLSchema-instance"

xsi:schemaLocation=*'/xml/ns/j2ee

/xml/ns/j2ee/web-jsptaglibrary_2_0.xsdn

version='*2.0',>

<description>ASimpleTagLibrary</description>

<tlib-version>l.0</tlib-version>

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论