Java Web编程习题解析(4-7)

更新时间:2024-04-25 20:36:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第4章习题解析

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

2. 答:如果客户在指定时间内没有访问服务器,则该会话超时。对超时的会话对象,服务器使其失效。通过会话对象的setMaxInactiveInterval()方法设置会话最大超时时间。

web.xml文件使用元素的子元素设置最大超时时间,如下所示。

20

这里的最大超时时间是对整个应用程序的所有会话有效,元素指定的时间单位是分钟。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(\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(\int count = 0 ;

out.write(\out.print( ++count );

out.write(\

16. 答:

Page改为page

<%! int count = 0 %> // 声明缺少分号 <% count++; %> // 去掉分号

17. 答:D 18. 答:

<% Float one = new Float(88.88) %> 小脚本 <%! int y = 3; %> 声明 <%@ page import=\指令

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 (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. 答:B 2. 答:⑤

3. 答:这两种表示等价,但第一种表示使用了JSP脚本元素,第二种表示使用的是动作。它们的功能类似,但有一点细微的差别。pageContext.include()方法在包含其他组件之前总是刷新当前页面的输出,而只有在flush属性值明确设置为true时才刷新当前页面的输出,如下所示:

4. 答:请求对象的getParameter()方法的返回值类型是String,因此display.jsp中的Integer应改为String。使用和request.getParameter()机制只能传递和检索String类型的参数。要传递其他对象类型的参数,必须在包含页面中使用request.setAttribute(),在被包含页面中使用request.getAttribute()。

5. 答:D 6. 答:C 7. 答:B 8. 答:可以。页面customerDisplay.jsp文件可以使用输出bean的属性值,只要它也包含一个与customerInput.jsp相同的声明并且该声明出现在声明前面即可。

9. 答:

<%@ page import=\

type=\

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(\

String dburl = \

Connection conn = Drivermanager.getConnection(dburl, \

上述代码中,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(\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 = \

String dburl = \ String username = \ String password = \ 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(\ PrintWriter out = response.getWriter(); out.println(\ out.println(\ try{

String sql=\

Statement stmt = dbconn.createStatement(); ResultSet rst = stmt.executeQuery(sql); while(rst.next()){

out.println(\ out.println(\ out.println(\ out.println(\

out.println(\

}

}catch(SQLException e){ e.printStackTrace(); }

out.println(\

out.println(\ }

public void destroy(){ try {

dbconn.close(); }catch(Exception e){ e.printStackTrace(); } } }

7. JSP页面如下:

<%@ page contentType=\<%@ page import=\ <%

String driver = \

String dburl = \ String username = \ String password = \ try{

Class.forName(driver);

Connection dbconn = DriverManager.getConnection( dburl,username,password); DatabaseMetaData dbmd = dbconn.getMetaData();

out.println(\数据库名:\

out.println(\数据库版本:\ out.println(\连接的用户:\ out.println(\数据库URL:\

out.println(\驱动程序名:\

out.println(\驱动程序版本:\ }catch(ClassNotFoundException e1){ out.println(e1); }catch(SQLException e2){ out.println(e2); } %>

8. JSP页面如下:

<%@ page contentType=\<%@ page import=\ <%

String driver = \

String dburl = \ String username = \ String password = \ try{

Class.forName(driver);

Connection dbconn = DriverManager.getConnection(

dburl,username,password); String sql=\ Statement stmt = dbconn.createStatement(); ResultSet rst = stmt.executeQuery(sql);

ResultSetMetaData rstmd = rst.getMetaData();

out.println(\结果集列数:\ out.println(\第3列标题:\ out.println(\第3列名:\ out.println(\第3列类型:\

out.println(\第3列类型名:\ }catch(ClassNotFoundException e1){ out.println(e1); }catch(SQLException e2){ out.println(e2); } %>

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 custs = dao.selectCustomer(); request.setAttribute(\

RequestDispatcher view = getServletContext().

getRequestDispatcher(\

view.forward (request,response); } }

displayCustomer.jsp页面代码如下:

<%@ page contentType=\

<%@ page import=\ Display Customer <%

ArrayList custs =

(ArrayList)request.getAttribute(\

for(CustomerBean cb : custs){

out.println(cb.getCustName() + \

+ cb.getPhone() + \

} %>

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

private static final String DELETE_SQL =

\

private static final String UPDATE_SQL =

\

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

// 按姓名删除客户记录

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=\<%@ page import=\

<%

String driver = \

String dburl = \ String username = \ String password = \ try{

Class.forName(driver);

Connection dbconn = DriverManager.getConnection( dburl,username,password); Integer num = 0;

if(request.getParameter(\

num = Integer.parseInt(request.getParameter(\ String sql = \ 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(\ }catch(ClassNotFoundException e1){ out.println(e1); }catch(SQLException e2){ out.println(e2);

}catch(NumberFormatException e3){ out.println(\输入不合法!\ } %>

<%=request.getParameter(\的阶乘为:

<%=request.getAttribute(\

该页面的运行结果如下:

12. 略。

本文来源:https://www.bwwdw.com/article/xl6p.html

Top