《JavaWeb编程技术》课后习题答案
更新时间:2023-05-17 16:46:01 阅读量: 实用文档 文档下载
[键入文字]
Java Web编程习题解析
第1章习题解析
1. 略。
什么是URL,什么是URI,它们都由哪几个部分组成,URL和URI之间有什么关系 ?
2. 答:URL称为统一资源定位符, URL通常由4部分组成:协议名称、页面所在主机的DNS名、可选的端口号和资源的名称。URI称为统一资源标识符,是以特定语法标识一个资源的字符串。URI由模式和模式特有的部分组成,它们之间用冒号隔开,一般格式如下:
schema:schema-specific-part
URI是URL和URN的超集。
3. 答:①是URL,①和②都是URI,③是URN
动态web文档技术有哪些?服务器端动态文档技术的客户端动态文档技术有何不同?
4. 答:动态Web文档技术包括服务器端动态文档技术和客户端动态文档技术,前者包括CGI技术、服务器扩展技术和HTML页面中嵌入脚本技术。其中HTML页面中嵌入脚本技术包括ASP、PHP和JSP技术。
最流行的客户端动态文档技术是在HTML页面中嵌入JavaScript脚本代码。使用JavaScript可以设计交互式页面。与服务器端动态文档不同,JavaScript脚本是在客户端执行的。
什么是Servlet?什么是Servlet容器?它的主要作用是什么?
5. 答:Servlet是用Servlet API开发的Java程序,它运行在Servlet容器中。Servlet容器是运行Servlet的软件,主要用来扩展Web服务器的功能。
简述开发一个Servlet的上体步骤
6. 答:开发Servlet的一般步骤包括:(1)编写Servlet源程序;(2)编译;(3)将Servlet部署到Servlet容器中;(4)访问执行Servlet。
要使一个Servlet能够正确编译的运行,应该将什么文件加到CLASSPATH环境变量中?
7. 答:<tomcat-install>\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页面主要用来实现表示逻辑。
第2章习题解析
Servlet接口中定义了哪几个方法?
1. 答:Servlet接口定义了下面5个方法:
public void init(ServletConfig config)
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException
public void destroy()
public ServletConfig getServletConfig()
public String getServletInfo()
简述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. 答:A 12. 答:B 13. 答:E
14. 答:
action="courseServlet.do"
HttpServlet
com.demo.CourseServlet
courseServlet
15. 答: ① E ② D ③ C ④ B ⑤ A
第3章习题解析
1. 答:Web应用程序是运行在应用服务器之中的。应用服务器为Web应用程序提供一种简单的和可管理的对系统资源的访问机制。
2. 答:web.xml bankapp\WEB-INF
3. 答:D 4. 答:A 5. 答:D
6. 答:F 7. 答:E 8. 答:D
9. 答:getServletConfig().getServletContext()或getServletContext()
10. 答:B 11. 答:B 12. 答:D
13. 答:因为Applet只能运行在客户端,所以可以将它放在Web应用程序的文档根目录的任何位置,但不能将其放在WEB-INF目录或其子目录中。
14. 答:不能这样做,至少不能直接这样。部署描述文件不允许为一个名称指定多个参数,所以必须像下面这样:
<init-param>
<param-name>countries</param-name>
<param-value>Australia,Brazil,India,UK,US</param-value>
<init-param>
然后在Servlet中解析param-value串的值并解释字符串中列出的多个值。
15. 答:
package com.demo;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloCounterServlet extends HttpServlet{
private Integer visits = 0;
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
visits = visits +1;
try{
Thread.sleep(2000);
}catch(InterruptedException e){
log("Exception during sleeping.");
}
out.println("<html><body>");
out.println("欢迎您!<br>" + "该Servlet已被访问 " + visits +" 次。"); out.println("</body></html>");
}
}
修改后的Servlet如下:
package com.demo;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloCounterServlet extends HttpServlet{
private Integer visits = 0;
private String dbPath = null;
public void init(){
try{
dbPath = getServletContext().getRealPath("/WEB-INF/counter.db");
FileInputStream fis = new FileInputStream(dbPath);
DataInputStream dis = new DataInputStream(fis);
visits = dis.readInt();
dis.close();
}catch(Exception e){
log("Error loading persistent counter", e);
}
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
synchronized(this){
visits = visits +1;
out.println("<html><body>");
out.println("欢迎您!<br>" +"该Servlet已被访问 " + visits +" 次。"); out.println("</body></html>");
}
}
public void destroy(){
try{
FileOutputStream fos = new FileOutputStream(dbPath);
DataOutputStream dos = new DataOutputStream(fos);
dos.writeInt(visits);
dos.close();
}catch(Exception e){
log("Error storing persistent counter", e);
}
}
}
第4章习题解析
1. 答:使用请求对象(即HttpServletRequest接口)的getSession()方法。
2. 答:如果客户在指定时间内没有访问服务器,则该会话超时。对超时的会话对象,服务器使其失效。通过会话对象的setMaxInactiveInterval()方法设置会话最大超时时间。
web.xml文件使用<session-config>元素的子元素<session-timeout>设置最大超时时间,如下所示。
<session-config>
<session-timeout>20</session-timeout>
</session-config>
这里的最大超时时间是对整个应用程序的所有会话有效,<session-timeout>元素指定的时间单位是分钟。setMaxInactiveInterval()方法参数单位是秒。
3. 答:有些客户浏览器可能不支持Cookie或用户阻止所有的Cookie,此时不能用Cookie实现会话。
4. 答:使用响应对象(即HttpServletResponse接口)的encodeURL()方法或
encodeRedirectURL()方法。
5. 答:不能。因为许多用户是通过代理服务器访问Internet的,此时服务器得到的是代理服务器的IP地址而不是实际用户的IP地址,因此这些用户的IP地址不唯一。
6. 答:D 7. 答:A, B 8. 答:A, D
9. 答:C 10. 答:A,C 11. 答:C
12. 答:C, D 13. 答:B,C 14. 答:C
15. 答:B 16. 答:A 17. 答:C
18. 答:A,B,D,F
19. 答:具有很大的影响。该应用程序将不能维护用户的状态。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; %>
<%= int i = 20 %>
<%= sBuff.setLength(12); %>
3. 答:C
4. 答:正确声明应为:
<%! int i = 5; %>
<% !int getI() { return i; } %>
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()方法就会像下面这样:
public void _jspService(...){
// 其他代码
int x = 0;
int incr() { return ++x; }
out.write("The value of x is ");
out.print(incr());
}
由于incr()方法定义在_jspService()方法内,所以代码不能编译。
9. 答:The value of i is 3
注意:如果代码写成下面形式:
<% int i; %>
<% for(i = 0; i<3; i++)%>The value of i is <%=i%>
输出结果将为:
The value of i is The value of i is The value of i is 3
10. 答:不能在japInit()方法中使用application对象。
11. 答:The sum of x and y is 9
变量x将被声明两次:一次是作为类的全局变量,因为使用了<%! int x = 5; %>语句,另一次是在_jspService()方法中声明的局部变量,因为使用的代码是<% int x = 3; %>。
12. 答:B 13. 答:C,E
14. 答:②③⑥④①⑤
15. 答:
out.write("<html><body>");
int count = 0 ;
out.write(" The page count is now:");
out.print( ++count );
out.write("</body></html>");
16. 答:
Page改为page
<%! int count = 0 %> // 声明缺少分号
<% count++; %> // 去掉分号
17. 答:D
18. 答:
<% Float one = new Float(88.88) %> 小脚本
<%! int y = 3; %> 声明
<%@ page import="java.util.*" %> 指令
<jsp:include page="foo.jsp" /> 动作
<%=pageContext.getAttribute("foo") %> 表达式
email:${applicationScope.mail} EL表达式
19. 答:A,B,C,E 20. 答:A,B,C,D
21. 答:D 22. 答: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 (ng.Throwable )
pageContext (javax.servlet.jsp.PageContext)
page (ng.Object)
24. 答:共有4个作用域对象:application、session、request和pageContext。用setAttribute()方法和getAttribute()方法在这些对象上设置和获得属性。在application作用域上的对象可以被Servlet容器的所有的Web应用程序访问。
25. 答:可以使用pageContext的findAttribute()方法,该方法将依次在页面作用域、请求作用域、会话作用域和应用作用域中查找指定名称的属性。
第6章习题解析
1. 答:B 2. 答:⑤
3. 答:这两种表示等价,但第一种表示使用了JSP脚本元素,第二种表示使用的是动作。它们的功能类似,但有一点细微的差别。pageContext.include()方法在包含其他组件之前总是刷新当前页面的输出,而<jsp:include>只有在flush属性值明确设置为true时才刷新当前页面的输出,如下所示:
<jsp:include page="other.jsp" flush="true" />
4. 答:请求对象的getParameter()方法的返回值类型是String,因此display.jsp中的Integer应改为String。使用<jsp:param>和request.getParameter()机制只能传递和检索String类型的参数。要传递其他对象类型的参数,必须在包含页面中使用request.setAttribute(),在被包含页面中使用request.getAttribute()。
5. 答:D 6. 答:C 7. 答:B
8. 答:可以。页面customerDisplay.jsp文件可以使用<jsp:getProperty>输出bean的属性值,只要它也包含一个与customerInput.jsp相同的<jsp:useBean>声明并且该声明出现在<jsp:getProperty>声明前面即可。
9. 答:
<%@ page import="com.model.CustomerBean,com.model.BusinessCustomerBean"%> <jsp:useBean id="customer" class="com.model.BusinessCustomerBean"
type="com.model.CustomerBean" scope="application"/>
<jsp:setProperty name="customer" value="Smith@"/>
<jsp:setProperty name="customer" value="8899123" />
</jsp:useBean>
10. 答:不能在同一个<jsp:useBean>声明中同时使用beanName和class属性。
11. 答:必须使用property指定bean的属性。param用来指定请求参数,并且不能在同一个<jsp:setProperty>动作中同时指定param和value属性。
12. 答:使用代码段1是只有在指定作用域中找不到customer的bean对象时才执行标签体,使用代码段2在任何时候都执行属性设置标签。
13. 答:可以在一个动作中设置bean的全部属性:
<jsp:setProperty name="beanName" property="*" />
但不能在一个动作中获得全部属性值。
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");
String dburl = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
Connection conn = Drivermanager.getConnection(dburl, "scott", "tiger"); 上述代码中,oracle.jdbc.driver.OracleDriver为JDBC驱动程序名,jdbc:oracle:thin:@ 127.0.0.1:1521:ORCL为JDBC URL。
4. 答:使用数据源是目前Web应用开发中建立数据库连接的首选方法。这种方法是事先建立如干连接对象,存放在连接池中。当应用程序需要一个连接对象时就从连接池中取出一个,使用完后再放回连接池。这样就可避免每次请求都创建连接对象,从而降低请求的响应时间,提高效率。
使用数据源建立连接是通过JNDI技术实现的。这需要首先配置数据源(可以是局部数据源或全局数据源),然后在应用程序中通过Context对象查找数据源对象。假设已经配置了名为sampleDS的数据源,建立连接代码如下:
Context context = new InitialContext();
DataSource dataSource = context.lookup("java:comp/env/jdbc/sampleDS"); Connection dbConnection = dataSource.getConnection();
5. 答:可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录,还可以向后访问结果集中的记录。可更新的ResultSet是指不但可以访问结果集中的记录,还可以通过结果集对象更新数据库。
要创建可滚动、可更新的ResultSet对象,必须使用Connection对象的带两个参数的createStatement()方法创建的Statement,第一个参数用下面两个常量之一:
ResultSet.TYPE_SCROLL_SENSITIVE
ResultSet.TYPE_SCROLL_INSENSITIVE
第二个参数使用下面常量:
ResultSet.CONCUR_UPDATABLE
6. 参考程序如下:
package com.control;
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class BookQueryServlet extends HttpServlet{
Connection dbconn;
public void init() {
String driver = "org.postgresql.Driver";
String dburl = "jdbc:postgresql://127.0.0.1:5432/bookstore";
String username = "bookstore";
String password = "bookstore";
try{
Class.forName(driver);
dbconn = DriverManager.getConnection(
dburl,username,password);
}catch(ClassNotFoundException e1){
}catch(SQLException e2){}
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<table>");
try{
String sql="SELECT * FROM books";
Statement stmt = dbconn.createStatement();
ResultSet rst = stmt.executeQuery(sql);
while(rst.next()){
out.println("<tr><td>"+rst.getString(1)+"</td>");
out.println("<td>"+rst.getString(2)+"</td>");
out.println("<td>"+rst.getString(3)+"</td>");
out.println("<td>"+rst.getString(4)+"</td>");
out.println("<td>"+rst.getDouble(5)+"</td></tr>");
}
}catch(SQLException e){
e.printStackTrace();
}
out.println("</table>");
out.println("</body></html>");
}
public void destroy(){
try {
dbconn.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
7. JSP页面如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*,java.io.*"%>
<html><body>
<%
String driver = "org.postgresql.Driver";
String dburl = "jdbc:postgresql://127.0.0.1:5432/bookstore";
String username = "bookstore";
String password = "bookstore";
try{
Class.forName(driver);
Connection dbconn = DriverManager.getConnection(
dburl,username,password);
DatabaseMetaData dbmd = dbconn.getMetaData();
out.println("数据库名:"+dbmd.getDatabaseProductName()+"</br>");
out.println("数据库版本:"+dbmd.getDatabaseProductVersion()+"</br>"); out.println("连接的用户:"+dbmd.getUserName()+"</br>");
out.println("数据库URL:"+dbmd.getURL()+"</br>");
out.println("驱动程序名:"+dbmd.getDriverName()+"</br>");
out.println("驱动程序版本:"+dbmd.getDriverVersion()+"</br>");
}catch(ClassNotFoundException e1){
out.println(e1);
}catch(SQLException e2){
out.println(e2);
}
%>
</body></html>
8. JSP页面如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*,java.io.*"%>
<html><body>
<%
String driver = "org.postgresql.Driver";
String dburl = "jdbc:postgresql://127.0.0.1:5432/bookstore";
String username = "bookstore";
String password = "bookstore";
try{
Class.forName(driver);
Connection dbconn = DriverManager.getConnection(
dburl,username,password);
String sql="SELECT * FROM public.books";
Statement stmt = dbconn.createStatement();
ResultSet rst = stmt.executeQuery(sql);
ResultSetMetaData rstmd = rst.getMetaData();
out.println("结果集列数:"+rstmd.getColumnCount()+"</br>");
out.println("第3列标题:"+rstmd.getColumnLabel(3)+"</br>");
out.println("第3列名:"+rstmd.getColumnName(3)+"</br>");
out.println("第3列类型:"+rstmd.getColumnType(3)+"</br>");
out.println("第3列类型名:"+rstmd.getColumnTypeName(3)+"</br>"); }catch(ClassNotFoundException e1){
out.println(e1);
}catch(SQLException e2){
out.println(e2);
}
%>
</body></html>
9. 按教材7.7.2节建立局部或全局数据源sampleDS。创建程序7.9的CustomerBean.java程序和程序7.10的SampleDAO.java程序。
SelectCustomerServlet.java代码如下:
package com.control;
import java.io.*;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.model.CustomerBean;
import com.model.SampleDAO;
public class SelectCustomerServlet extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
SampleDAO dao = new SampleDAO();
ArrayList<CustomerBean> custs = dao.selectCustomer();
request.setAttribute("custs", custs);
RequestDispatcher view = getServletContext().
getRequestDispatcher("/displayCustomer.jsp");
view.forward (request,response);
}
}
displayCustomer.jsp页面代码如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="com.model.CustomerBean,java.util.*" %>
<html><head> <title>Display Customer</title></head>
<body>
<%
ArrayList<CustomerBean> custs =
(ArrayList<CustomerBean>)request.getAttribute("custs");
for(CustomerBean cb : custs){
out.println(cb.getCustName() + " "+ cb.getEmail() + " "
+ cb.getPhone() + "</br>");
}
%>
</body></html>
10. 首先在SampleDAO类中定义下面两个字符串常量:
private static final String DELETE_SQL =
"DELETE FROM customer WHERE custName = ?";
private static final String UPDATE_SQL =
"UPDATE customer SET email=? , phone=? WHERE custName=?";
下面是删除客户和修改客户的方法:
// 按姓名删除客户记录
public boolean deleteCustomer(String custName){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rst = null;
CustomerBean customer =null;
try{
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(DELETE_SQL);
pstmt.setString(1,custName);
int n = pstmt.executeUpdate();
if(n ==1){
return true;
}else{
return false;
}
}catch(SQLException se){
return false;
}finally{
try{
pstmt.close();
conn.close();
}catch(SQLException se){}
}
}
// 修改客户记录
public boolean updateCustomer(CustomerBean customer){
Connection conn = null;
PreparedStatement pstmt = 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());
int n = pstmt.executeUpdate();
if(n ==1){
return true;
}else{
return false;
}
}catch(SQLException se){
return false;
}finally{
try{
pstmt.close();
conn.close();
}catch(SQLException se){}
}
}
11. 首先在PostgreSQL数据库中创建一个求整数阶乘的函数my_factorial(),代码如下: CREATE OR REPLACE FUNCTION my_factorial(value integer)
RETURNS integer AS $$
DECLARE
arg integer;
BEGIN
arg := value;
IF arg IS NULL OR arg < 0 THEN
RAISE NOTICE 'Invalid Number';
RETURN NULL;
ELSE
IF arg = 1 THEN
RETURN 1;
ELSE
DECLARE
next_value integer;
BEGIN
next_value := my_factorial(arg - 1) * arg; -- 函数递归调用
RETURN next_value;
END;
END IF;
END IF;
END;
$$ LANGUAGE 'plpgsql';
创建JSP页面compute.jsp,连接数据库,调用存储过程:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*,java.io.*"%>
<html><body>
<form action="" method="post">
请输入一个整数:<input type="text" name="param" size="5" />
<input type="submit" value="确定" />
</form>
<%
String driver = "org.postgresql.Driver";
String dburl = "jdbc:postgresql://127.0.0.1:5432/bookstore";
String username = "bookstore";
String password = "bookstore";
try{
Class.forName(driver);
Connection dbconn = DriverManager.getConnection(
dburl,username,password);
Integer num = 0;
if(request.getParameter("param")!=null)
num = Integer.parseInt(request.getParameter("param"));
String sql = "{?=call my_factorial(?)}";
CallableStatement cstmt = dbconn.prepareCall(sql);
cstmt.setInt(2,num);
cstmt.registerOutParameter(1,java.sql.Types.INTEGER);
cstmt.execute();
int result = cstmt.getInt(1);
request.setAttribute("result",result);
}catch(ClassNotFoundException e1){
out.println(e1);
}catch(SQLException e2){
out.println(e2);
}catch(NumberFormatException e3){
out.println("输入不合法!");
}
%>
<p><%=request.getParameter("param")%>的阶乘为:
<%=request.getAttribute("result")%></p>
</body></html>
该页面的运行结果如下:
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,如下所示:
<%@ page isELIgnored="true"%>
6. 答:A 7. 答:A 8. 答:E
9. 答:B,E 10. 答:B
11. 答:由于paramValues返回的是包含String[]的Map,所以需要访问数组的单个元素。使用${paramValues.result[0]}和${paramValues.result["0"]}都可以,但使用${paramValues.result.0}不可以。
记住,paramValues和headerValues返回String[]的Map对象。
12. 答:A,C 13. 答:C 14. 答:A
15. 答:D 16. 答:B
17. 答:${(5 + 3 > 0) ? true : false}
18. 参考程序如下:
(1)定义Java函数
package com.demo;
public class Functions{
public static boolean palindrome(String s){
int low = 0;
int high = s.length() -1;
while(low < high){
if(s.charAt(low)!=s.charAt(high))
return false;
low ++;
high --;
}
return true;
}
}
(2)创建标签库描述文件
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee
/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A Simple Tag Library</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/sample</uri>
<function>
<description>check palindrome</description>
<name>palindrome</name>
<function-class>com.demo.Functions</function-class>
<function-signature>
boolean palindrome(ng.String)
</function-signature>
</function>
</taglib>
(3)在JSP页面中访问函数,palindrome.jsp。
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib prefix="demo" uri="/sample" %>
<html>
<head><title>Using Function </title></head>
<body>
<p>判断字符串是否是回文</p>
<form action=" palindrome.jsp" method="post">
输入字符串: <input type="text" name="x" size="15" />
<input type="submit" value="确定">
</form>
字符串:${param.x}${demo:palindrome(param.x)?"是":"不是"}回文。
</body>
</html>
第9章习题解析
1. 答:自定义标签的开发步骤:(1)创建标签处理类;(2)创建标签库描述文件TLD;
(3)在JSP页面中引入标签库和使用标签。
2. 答:下面按容器调用的顺序列出SimpleTag接口定义的方法:
public void setJspContext(JspContext pc)
public void setParent(JspTag parent)
public void setJspBody(JspFragment jspBody)
public JspTag getParent()
public void doTag() throws JspException, IOException
3. 答:C 4. 答:C 5. 答:B
6. 答:D 7. 答:D 8. 答:A
9. 答:B 10. 答:mime randomthings advice user true
11. 答:F 12. 答:B, D 13. 答:B
14. 答:B, C 15. 答:B, F 16. 答:A
17. 答:在TLD文件中定义标签代码如下:
<uri>/sample</uri>
<tag>
<name>echotag</name>
<tag-class>beans.EchoAttributesTag</tag-class>
<body-content>empty</body-content>
<danamic-attributes>true</danamic-attributes>
</tag>
在JSP页面echoattribute.jsp中使用该标签:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib prefix="demo" uri="/sample"%>
<html><body>
<p>动态属性的使用</p>
<demo:echotag one="111" two="222" three="333">
</body></html>
第10章习题解析
1. 答:获得JSTL有两种方法。(1)到下载,下载的文件名是jakarta-taglibs-standard-1.1.2.zip,将该文件解压到一个目录中,将其中lib目录中的jstl.jar文件和stantard.jar文件复制到应用程序的WEB-INF\lib目录中即完成安装。(2)从Tomcat安装目录的\webapps\examples\WEB-INF\lib目录中将上述两个文件复制到应用程序的WEB-INF\lib目录中。
2. 答:不需要。因为TLD文件包含在standard.jar文件中,容器能够自动找到该文件。
3. 答:通用目的的标签:<c:out>、<c:set>、<c:remove>、<c:catch>。条件控制标签:<c:if>、<c:choose>、<c:when>、<c:otherwise>。循环控制标签:<c:forEach>、<c:forToken>。URL处理标签:<c:url>、<c:import>、<c:redirect>、<c:param>。
4. 答:D。简单标签的标签体中不能包含脚本元素。
5. 答:在浏览器中输出下面一行。
0 3 6 9 12 15 18 21 24 27 30
6. 答:C 7. 答:E
8. 答:B 9. 答:D,E
10. 答:① varStatus ② test ③ value ④ when, test, otherwise
11. 答:B
12. 答:将example.tag标签文件存放在/WEB-INF/tags目录中。下面的页面使用该标签文件。
<%@ taglib prefix="fibo" tagdir="/WEB-INF/tags" %>
<html><body>
<fibo:example />
</body></html>
13. 答:C
第11章习题解析
1. 答:3个对象上可发生事件:ServletContext、HttpSession和HttpRequest。针对不同的事件,应实现不同的监听器接口。如对ServletContextEvent应实现ServletContextListener接口。注册事件监听器在web.xml文件中使用<listener>元素及其子元素<listener-class>实现。
2. 答:Web应用程序启动时将通知ServletContextListener事件监听器。
3. 答:B
4. 答:
<listener>
<listener-class>MyServletRequestListener</listener-class>
</listener>
5. 答:C 6. 答:A,C,D
7. 答:E 8. 答:D
第12章习题解析
1. 答:Web应用的安全性主要包括4个方面:(1)身份验证;(2)授权;(3)数据完整性;(4)数据保密性。进入大楼出示证件属于身份验证。
2. 答:验证用户的机制包括:
(1)HTTP基本验证。优点:实现简单。缺点:用户名和口令没有加密。
(2)HTTP摘要验证。优点:用户名和口令加密,比基本验证安全。
(3)HTTPS客户证书验证。优点:是罪安全的。缺点:需要授权机构的证书。
(4)基于表单的验证。优点:实现容易。缺点:用户名和口令不加密。
3. 答:声明式安全和程序式安全是Web应用实现安全性的两种方法。声明式安全是在程序外配置安全信息,程序式安全是在程序内实施安全措施。
4. 答:D 5. 答:C
6. 答:E,F,H 7. 答:A,D
8. 答:A,C
9. 答:① j_security_check ② j_username ③ FORM
④ form-login-page ⑤/form-login-page
10. 答: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. 答:要上传文件应将<form>的method属性值指定为“post”。
5. 答:在表单bean类中为每个上传文件定义一个FormFile类型的属性,然后通过其访问方法得到每个FormFile对象就可以实现一次上传多个文件。
6. 答:使用Tiles框架设计页面布局的原理是:首先使用Tiles标签创建一个布局页面,然后在需要使用该布局的JSP页面中引用该布局页面即可。请参阅教材中程序13.17和程序13.18的实现。
第14章习题解析
1. 答:Ajax是英文Asynchronous JavaScript and XML的首字母缩写,意思为异步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)通过回调函数处理结果并更新HTML DOM对象。
4. 答:参见教材14.2.6节叙述。
5. 答:参见教材14.3节叙述。
正在阅读:
《JavaWeb编程技术》课后习题答案05-17
手机数据恢复技巧:如何恢复手机删除的文件12-14
【优质】小学英语外研版四年级上册m5 can you run fast 优质公开课教案08-09
合伙企业合伙人所得税问题最新政策解读-财税法规解读获奖文档09-13
校园的秋天作文550字06-23
全县机关党的建设暨社区建设工作会议主持词05-23
迪奥品牌的发展史12-26
苏教版小学二年级美术下册全册教案210-02
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 课后
- 习题
- 答案
- JavaWeb
- 编程
- 技术