1. 程式人生 > >JavaEE(9)——JSTL與標籤檔案

JavaEE(9)——JSTL與標籤檔案

實驗9 JSTL與標籤檔案 一、實驗目的

  1. 瞭解什麼是JSTL?
  2. 掌握JSTL的核心庫標籤的使用。
  3. 掌握標籤檔案的開發和使用。 二、實驗原理 JSP標準標籤庫(JSP Standard Tag Library,簡稱JSTL)是一個為實現Web應用程式的常用功能而開發的標籤庫集合。功能包括基本輸入輸出、流程控制、XML檔案解析、資料庫查詢、國際化和文字格式化等。JSTL主要由下面幾個庫組成: 核心標籤庫;XML標籤庫;格式化/國際化標籤庫;資料庫標籤庫;函式標籤庫。 這些庫都很有用,但我們這裡只學習核心庫的使用。核心庫的標籤又可以分成四類,如表9.1所示: 表9.1 按功能分類的核心庫的標籤 JSTL標籤類別 JSTL標籤 標籤說明 通用目的 <c:out> <c:catch> 在頁面中顯示內容 捕獲異常 變數支援 <c:set> <c:remove> 設定一個EL變數值 清除一個EL變數 流程控制 <c:if> <c:choose> <c:forEach> <c:forTokens> 根據一個屬性等於一個值改變處理 根據一個屬性等於一組值改變處理 對集合中的每個物件作重複處理 對給定一個文字域中的每個子串執行處理 URL處理 <c:url> <c:import> <c:redirect> 重寫URL並對它們的引數編碼 訪問web應用程式外部的內容 告訴客戶瀏覽器訪問另一個URL

標籤檔案(tag file)也是JSP 2.0新增的功能,它的目的是使JSP頁面開發人員僅使用JSP語法就能開發標籤庫而無須編寫Java程式。所謂標籤檔案就是直接使用JSP語法編寫的標籤。標籤檔案的副檔名一般為.tag或.tagx,如果標籤檔案包含其他完整的或片段的標籤檔案,JSP 2.0建議其副檔名為.tagf。 在JSP頁面中使用標籤檔案,需要在taglib動作中使用tagdir屬性指定標籤檔案所在的目錄,例如: <%@ taglib prefix=“mytag” tagdir="/WEB-INF/tags"%> 三、實驗任務與步驟 (一)JSTL的安裝和測試 【步驟1】要在JSP頁面中使用JSTL標籤,首先必須安裝JSTL庫。可以到Jakarta網站下載最新版本的JSTL,網址為http://jakarta.apache.org/。 如果安裝了Tomcat,可以在示例應用程式中獲得JSTL,它位於<CATALINA_HOME>\webapps\ examples\WEB-INF\lib目錄中,共有兩個檔案:jstl.jar和standard.jar。將這兩個檔案複製到你的Web應用程式的WEB-INF\lib目錄中,就安裝了JSTL。 【步驟2】一個簡單的測試JSP頁面JSTLTest.jsp <%@ page contentType=“text/html;charset=gb2312” %> <%@ taglib uri=“

http://java.sun.com/jsp/jstl/core” prefix=“c” %>

Using JSTL Request Method:${pageContext.request.method} Remote Address:${pageContext.request.remoteAddr} 【步驟3】在瀏覽器位址列輸入如下URL:http://localhost:8080/prac07_JSTL/JSTLTest.jsp, 如果頁面執行產生如圖9-1所示結果,說明JSTL安裝正確,可以使用。

圖9-1 說明:使用JSTL我們不用建立標籤庫描述檔案,因為該檔案已經包含在standard.jar檔案中了,JSP容器可以找到該檔案。另外,也可以不用配置web.xml檔案,因為JSP容器使用隱含對映的方式可以將標準的URI對映到適當的標籤庫上。 (二)表示式相關標籤的使用 下面的core_expression.jsp演示了<c:out>、<c:set>和<c:remove>標籤的使用,程式碼如下: <%@ page contentType=“text/html;charset=UTF-8” %> <%@ taglib prefix=“c” uri=“

http://java.sun.com/jsp/jstl/core” %>

表示式相關的標籤

使用的例子

不同作用域的number變數的初始值 pageScope.number = requestScope.number = sessionScope.number = pageScope.number = requestScope.number = sessionScope.number = (三)流程控制標籤的使用。本實驗包括2個頁面,一個是flowControl.html,一個是flowControl.jsp。 【步驟1】flowControl.html的程式碼如下: JSTL中用於流程控制的標籤

使用JSTL流程控制標籤

請選擇一個填入文字框中:Tom\Jerry\Mike\Ben

姓名:

【步驟2】flowControl.jsp的程式碼如下: <%@ page contentType="text/html;charset=GB2312" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> JSTL中用於流程控制的標籤

標籤c:if的使用

您好,Tom 您好,Jerry 您好,Mike 您好,Ben

標籤c:choose c:when c:otherwise使用

您好,Tom 您好,Jerry 您好,Mike 您好,Ben 執行flowControl.jsp的結果如下圖所示:

圖9-2 在文字框中輸入Tom後,點選“傳送”按鈕,則出現下面的結果:

圖9-3 (四)URL相關標籤的使用 【步驟1】included.jsp是被包含的頁面,程式碼如下: <%@ page contentType=“text/html;charset=gb2312” %> <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

Included Page

這是被包含頁面中的內容

使用者名稱:<c:out value="${param.userName}" />

【步驟2】import_test.jsp是包含頁面,程式碼如下: <%@ page contentType=“text/html;charset=UTF-8” %> <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

Using URL JSTL

這是包含頁面中的內容

<c:import url=“included.jsp” charEncoding = “UTF-8”> <c:param name=“userName” value=“Harry Porter” /> </c:import>

執行該頁面,結果如下圖所示:

圖9-4 【步驟3】redirect_test.jsp測試了重定向標籤的使用,其程式碼如下: <%@ page contentType=“text/html;charset= UTF-8” %> <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

Using Redirect Tag

使用redirect標籤

> 該頁面的執行結果與前面的圖一樣。 (五)建立簡單的標籤檔案 【步驟1】建立一個名為example.tag的簡單的標籤檔案,程式碼如下: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 注意:將該檔案存放在Web應用程式的WEB-INF/tags目錄中。 【步驟2】建立一個名為example.jsp的頁面,程式碼如下: <%@ taglib prefix="ex" tagdir="/WEB-INF/tags" %> The first six numbers in the Fibonacci sequence are: 執行該JSP頁面,結果如下:

圖9-5 (六)獲取域中的值 【步驟1】建立Person.java、Address.java和testAttribute.jsp。 Address.java參考程式碼如下: package beans; public class Address { private String name; private int id;

public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}

} Person參考程式碼如下: package beans;

public class Person { private int age; private Address address; private String name; private String sex; public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public int getAge() { return age; } public String getName() { return name; } public String getSex() { return sex; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } } testAttribute.jsp參考程式碼如下: <%@ page language=“java” import=“java.util.*” pageEncoding=“UTF-8”%> <%@taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %> <%@page import=“beans.Person”%> <%@page import=“beans.Address”%>

el表示式獲取資料 <% request.setAttribute("name","張轉"); %> <%--${name}等同於pageContext.findAttribute("name") --%> 使用EL表示式獲取資料:${name} <% Person p = new Person(); p.setAge(12); request.setAttribute("person",p); %> 使用el表示式可以獲取bean的屬性:${person.age} <% Person person = new Person(); Address address = new Address(); address.setName("燕園路12號"); person.setAddress(address); request.setAttribute("person",person); %> ${person.address.name} <% Person p1 = new Person(); p1.setName("張轉");
    Person p2 = new Person();
    p2.setName("楊和");
    
    List<Person> list = new ArrayList<Person>();
    list.add(p1);
    list.add(p2);
    
    request.setAttribute("list",list);
%>

<!-- 取list指定位置的資料 -->
${list[1].name} 

<!-- 迭代List集合 -->
<c:forEach var="person" items="${list}">
    ${person.name}
</c:forEach>
<hr>
<!-- 在jsp頁面中,使用el表示式獲取map集合的資料 -->
<% 
    Map<String,String> map = new LinkedHashMap<String,String>();
    map.put("a","aaaaxxx");
    map.put("b","bbbb");
    map.put("c","cccc");
    map.put("1","aaaa1111");
    request.setAttribute("map",map);
%>

<!-- 根據關鍵字取map集合的資料 -->
  ${map.c}  
  ${map["1"]}
  <hr>
  <!-- 迭代Map集合 -->
  <c:forEach var="me" items="${map}">
      ${me.key}=${me.value}<br/>
  </c:forEach>
<hr>
【步驟2】使用下面的URL訪問之。 http://localhost:8080/prac04_servlet_param/servlet/postForm.html 將出現如圖9-6所示表單介面。

圖9-6 (七)在JSP頁面中使用Java函式 設要在JSP頁面中使用一個add()函式,實現兩個整數的加法運算。在JSP中使用Java函式要經過如下3個步驟: 【步驟1】函式的定義,建立類檔案Compute.java。它定義了要在JSP中使用的add()方法。 package cn.edu.el;

public class Compute{ public static int add(String x,String y){ int a = 0; int b = 0; try{ a = Integer.parseInt(x); b = Integer.parseInt(y); }catch(Exception e){ System.err.println(“Number format is illegal.”); } return a+b; } }

package beans;

import java.util.*;

public class Functions { public static String reverse( String text ) { return new StringBuffer( text ).reverse().toString(); }

public static int numVowels( String text ) {
    String vowels = "aeiouAEIOU";
    int result = 0;
    for( int i = 0; i < text.length(); i++ ) {
        if( vowels.indexOf( text.charAt( i ) ) != -1 ) {
           result++;
    }
}
return result;
}

public static String caps( String text ) {
    return text.toUpperCase();
}

} 【步驟2】建立標籤庫描述檔案taglib.tld,該檔案放到應用程式WEB-INF目錄中。 。它實現將每個Java方法與函式名相匹配。

<?xml version="1.0" encoding="UTF-8" ?>
<description>A Simple Taglib File.</description>
<tlib-version>1.0</tlib-version>
<short-name>addTag</short-name>
<function>
  <description>Adding two numbers</description>
  <name>add</name>
    <function-class>cn.edu.el.Compute</function-class>
    <function-signature>
       int add( java.lang.String, java.lang.String)
    </function-signature>
</function>
<function>
    <description>Reverses the characters in the given String</description>
    <name>reverse</name>
    <function-class>cn.edu.el.Functions</function-class>
    <function-signature>java.lang.String reverse( java.lang.String )</function-signature>
</function>
<function>
    <description>Counts the number of vowels (a,e,i,o,u) in the given String</description>
    <name>countVowels</name>
    <function-class>beans.Functions</function-class>
    <function-signature>java.lang.String numVowels( java.lang.String )</function-signature>
</function>
<function>
    <description>Converts the string to all caps</description>
    <name>caps</name>
    <function-class>cn.edu.el.Functions</function-class>
    <function-signature>java.lang.String caps( java.lang.String )</function-signature>
【步驟3】編寫JSP檔案sum.jsp,使用標籤庫URI以及函式名呼叫Java函式,程式碼如下: <%@ page contentType="text/html;charset=gb2312" %> <%@ taglib prefix="demo" uri="http://www.mydomain.com/function" %> Using Function

計算兩個整數之和

X = Y =

兩個整數的和為:${demo:add(param["x"],param["y"])} 字串逆置:${demo:reverse()}

該頁面執行結果為:

圖9-7 (八)自定義分頁標籤 1.實驗內容 (1)在MySQL新建資料庫books,在資料庫books中新建表格titles,並輸入部分內容,其SQL指令碼如下: /* Navicat MySQL Data Transfer

Source Server : localhost_3306 Source Server Version : 50170 Source Host : localhost:3306 Source Database : books

Target Server Type : MYSQL Target Server Version : 50170 File Encoding : 65001

Date: 2017-09-20 08:38:35 */

SET FOREIGN_KEY_CHECKS=0;

– Table structure for titles

DROP TABLE IF EXISTS titles; CREATE TABLE titles ( isbn varchar(15) DEFAULT NULL, title varchar(20) DEFAULT NULL, copyright varchar(15) DEFAULT NULL, editionNumber int(11) DEFAULT NULL, publisherId int(11) DEFAULT NULL, price float DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

– Records of titles

INSERT INTO titles VALUES (‘01359098’, ‘c++程式設計’, ‘清華大學’, ‘2’, ‘7826’, ‘50’); INSERT INTO titles VALUES (‘978965’, ‘Java語言程式設計’, ‘人民大學’, ‘2’, ‘8866’, ‘99’); INSERT INTO titles VALUES (‘9785566’, ‘Java Web設計’, ‘人民大學’, ‘1’, ‘5566’, ‘98’); INSERT INTO titles VALUES (‘9783355’, ‘SSH2技術’, ‘西北大學’, ‘3’, ‘6688’, ‘88’); (2)設計資料庫訪問工具類,包括DBConn.java、Title.java、TitleDao.java、TitleDaoImpl.java。 (3)設計JSP自定義標籤並進行測試。 2.實驗步驟 【步驟1】設計相關類及JSP頁面 (1)設計實體類Title.java Title.java參考程式碼如下:

package bean; public class Title { private String isbn; private String title; private String copyright; private String imageFile; private int editionNumber; private int publisherId; private float price; public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getCopyright() { return copyright; } public void setCopyright(String copyright) { this.copyright = copyright; } public String getImageFile() { return imageFile; } public void setImageFile(String imageFile) { this.imageFile = imageFile; } public int getEditionNumber() { return editionNumber; } public void setEditionNumber(int editionNumber) { this.editionNumber = editionNumber; } public int getPublisherId() { return publisherId; } public void setPublisherId(int publisherId) { this.publisherId = publisherId; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; }

} (2)設計輔助類PageResult.java。 PageResult.java參考程式碼如下: package tag;

import java.util.ArrayList; import java.util.List; public class PageResult { private List list = new ArrayList(); //查詢結果 private int pageNo = 1; //實際頁號 private int pageSize = 4; //每頁記錄數 private int recTotal = 0; //總記錄數

public List getList() {
	return list;
}
public void setList(List<E> list) {
	this.list = list;
}
public int getPageNo() {
	return pageNo;
}
public void setPageNo(int pageNo) {
	this.pageNo = pageNo;
}
public int getPageSize() {
	return pageSize;
}
public void setPageSize(int pageSize) {
	this.pageSize = pageSize;
}
public int getRecTotal() {
	return recTotal;
}
public void setRecTotal(int recTotal) {
	this.recTotal = recTotal;
}
public int getPageTotal() {  //根據記錄數計算總的頁數
	int ret = (this.getRecTotal() - 1) / this.getPageSize() + 1;
	ret = (ret<1)?1:ret;
	return ret;
}
public int getFirstRec()  //計算第一頁的記錄數
{
	int ret = (this.getPageNo()-1) * this.getPageSize();// + 1;
	ret = (ret < 1)?0:ret;
	return ret;
}	

} (3)設計輔助類PaginationTag.java。 PaginationTag.java參考程式碼如下: package tag;

import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class PaginationTag extends TagSupport { private static final long serialVersionUID = -5904339614208817088L; public int doEndTag() { try { PageResult pageResult = null; pageResult = (PageResult) pageContext.getRequest().getAttribute(“pageResult”); if (pageResult!=null){ StringBuffer sb = new StringBuffer(); sb.append("<div style=“text-align:right;padding:6px 6px 0 0;”>\r\n") .append(“共”+pageResult.getRecTotal()+“條記錄 \r\n”) .append(“每頁顯示<input name=“pageResult.pageSize” value=”"+pageResult.getPageSize()+"" size=“3” />條 \r\n") .append(“第<input name=“pageResult.pageNo” value=”"+pageResult.getPageNo()+"" size=“3” />頁") .append(" / 共"+pageResult.getPageTotal()+“頁\r\n”) .append("<a href=“javascript:page_first();”>第一頁 \r\n") .append("<a href=“javascript:page_pre();”>上一頁\r\n") .append("<a href=“javascript:page_next();”>下一頁 \r\n") .append("<a href=“javascript:page_last();”>最後一頁\r\n") .append("<input type=“button” onclick=“javascript:page_go();” value=“轉到” />\r\n") .append("\r\n"); JspWriter out = pageContext.getOut(); out.println(sb.toString()); } } catch (Exception e) { } return EVAL_PAGE; } } 注意:Pagination.java標籤處理類繼承了TagSupport,而pageContext屬性是在TagSupport中定義的,所以在類中可以直接使用這個物件。 (4)設計Servlet程式碼(ToViewBooks.java) ToViewBooks.java參考程式碼如下: package servlet;

import java.io.IOException; import java.io.PrintWriter; import java.util.List;

import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

import tag.PageResult; import bean.TitleDao; import bean.TitleDaoImpl;

public class ToViewBooks extends HttpServlet { public ToViewBooks() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	response.setContentType("text/html");
	PageResult pageResult=new PageResult();  
	TitleDao dao=new TitleDaoImpl();
	List list=dao.getTitles();  //得到圖書列表
	int pageSize=pageResult.getPageSize();//每頁顯示的記錄數
	int pageNo;  //當前頁號
	if(request.getParameter("pageResult.pageNo")!=null){
     //從請求中獲取當前頁號
	 pageNo=Integer.parseInt(request.getParameter("pageResult.pageNo"));
	}
	else
		pageNo=pageResult.getPageNo();  //採用預設頁號
	if(request.getParameter("pageResult.pageSize")!=null)
       //獲取請求中每頁顯示的記錄數
	   pageSize=Integer.parseInt(request.getParameter("pageResult.pageSize"));
	int len=list.size();
	len=len>(pageNo)*pageSize?(pageNo)*pageSize:len; //顯示到當前頁時的記錄數
	List list1=list.subList((pageNo-1)*pageSize,len);  //將第pageNo的資料從list複製到list1陣列中
	//將要顯示的當前頁得資料,當前頁數,總記錄數儲存在pageResult物件中
	pageResult.setList(list1);  //用list1初始化pageResult物件中的list屬性
	pageResult.setPageNo(pageNo);
	pageResult.setRecTotal(list.size());
	pageResult.setPageSize(pageSize);
	request.setAttribute("pageResult",pageResult);//將pageResult物件儲存到request物件中
	System.out.println("hello,servlet");
	request.getRequestDispatcher("/tag/viewBookByPageTag.jsp").forward(request,response); 
	//請求轉發到tag資料夾下的viewBookByPageTag.jsp
}
public void init() throws ServletException {
}

} (5)設計資料庫連結類(DBcon.java) DBcon.java參考程式碼如下: package bean; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;

public class DBcon {

private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";

private static final String DATABASE_URL =
	"jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf-8";

private static final String DATABASE_USRE = "root";

private static final String DATABASE_PASSWORD = "";

public static Connection getConnction() {
	Connection dbConnection = null;
	try {
		Class.forName(DRIVER_CLASS);
		dbConnection = DriverManager.getConnection(DATABASE_URL,
				DATABASE_USRE, DATABASE_PASSWORD);
	} catch (Exception e) {
		e.printStackTrace();
	}

	return dbConnection;
}


 
public static void closeConnection(Connection dbConnection) {
	try {
		if (dbConnection != null && (!dbConnection.isClosed())) {
			dbConnection.close();
		}
	} catch (SQLException sqlEx) {
		sqlEx.printStackTrace();
	}

}

public static void closeResultSet(ResultSet res) {
	try {
		if (res != null) {
			res.close();
			res = null;
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

public static void closeStatement(PreparedStatement pStatement) {
	try {
		if (pStatement != null) {
			pStatement.close();
			pStatement = null;
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

} (6)設計DAO(DBcon.java) TitleDao.java參考程式碼如下: package bean; import java.util.List; public interface TitleDao { public List

getTitles();<br/> public int add(Title titlebean);<br/> public int delete(String isbn);<br/> public int update(Title titlebean);<br/> public Title findByIsbn(String isbn);<br/> }<br/> TitleDaoImpl.java參考程式碼如下:

package bean;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.*;

public class TitleDaoImpl implements TitleDao { private Connection connection; private PreparedStatement titlesQuery; private ResultSet results;

public List<Title> getTitles() {
	List<Title> titlesList = new ArrayList<Title>();
	
	try {
		connection = DBcon.getConnction();
		titlesQuery = connection.prepareStatement("SELECT isbn, title, editionNumber,copyright,"
				+ " publisherID, imageFile, price " + " FROM titles ORDER BY title");
		ResultSet results = titlesQuery.executeQuery();
		System.out.println("hello");
		
		while (results.next()) {
			Title book = new Title(); 
			
			book.setIsbn(results.getString("isbn"));
			book.setTitle(results.getString("title"));
			book.setEditionNumber(results.getInt("editionNumber"));
			book.setCopyright(results.getString("copyright"));
			book.setPublisherId(results.getInt("publisherID"));
			book.setImageFile(results.getString("imageFile"));
			book.setPrice(results.getFloat("price"));
			titlesList.add(book); 
		}
	}
	
	catch (SQLException exception) {
		exception.printStackTrace();
	}
	
	finally {
		DBcon.closeResultSet(results);
		DBcon.closeStatement(titlesQuery);
		DBcon.closeConnection(connection);
	}
	return titlesList;
}

public int add(Title titlebean) { 
	int result = 0;
	try {
		connection = DBcon.getConnction();
		String sql = "insert into titles(isbn, title, editionNumber, ";
		sql += "copyright, publisherID, imageFile, price) values(?,?,?,?,?,?,?)";
		titlesQuery = connection.prepareStatement(sql);
		titlesQuery.setString(1, titlebean.getIsbn());
		titlesQuery.setString(2, titlebean.getTitle());
		titlesQuery.setInt(3, titlebean.getEditionNumber());
		titlesQuery.setString(4, titlebean.getCopyright());
		titlesQuery.setInt(5, titlebean.getPublisherId());
		titlesQuery.setString(6, titlebean.getImageFile());
		titlesQuery.setFloat(7, titlebean.getPrice());
		result = titlesQuery.executeUpdate();
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	finally {
		DBcon.closeResultSet(results);
		DBcon.closeStatement(titlesQuery);
		DBcon.closeConnection(connection);
	}
	return result;
}

public int delete(String isbn) { 
	int result = 0;
	try {
		connection = DBcon.getConnction();
		String sql = "delete from titles where isbn='" + isbn + "'";
		titlesQuery = connection.prepareStatement(sql);
		result = titlesQuery.executeUpdate();
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	finally {
		DBcon.closeResultSet(results);
		DBcon.closeStatement(titlesQuery);
		DBcon.closeConnection(connection);
	}
	return result;
}

public int update(Title titlebean) { // 更新titles表中的資料
	int result = 0;
	try {
		connection = DBcon.getConnction();
		String sql = "update titles set title=?, editionNumber=?, ";
		sql += "copyright=?, publisherID=?, imageFile=?, price=?  where isbn=?";
		titlesQuery = connection.prepareStatement(sql);
		titlesQuery.setString(1, titlebean.getTitle());
		titlesQuery.setInt(2, titlebean.getEditionNumber());
		titlesQuery.setString(3, titlebean.getCopyright());
		titlesQuery.setInt(4, titlebean.getPublisherId());
		titlesQuery.setString(5, titlebean.getImageFile());
		titlesQuery.setFloat(6, titlebean.getPrice());
		titlesQuery.setString(7, titlebean.getIsbn());
		result = titlesQuery.executeUpdate();
	} catch (Exception e) {
		e.printStackTrace();
	}
	//釋放資源
	finally {
		DBcon.closeResultSet(results);
		DBcon.closeStatement(titlesQuery);
		DBcon.closeConnection(connection);
	}
	return result;

}

public Title findByIsbn(String isbn) { // 根據ISBN查詢
	Title book = null;
	try {
		connection = DBcon.getConnction();
		String sql = "SELECT * FROM titles where isbn='" + isbn + "'";
		titlesQuery = connection.prepareStatement(sql);
		results = titlesQuery.executeQuery();
		if (results.next()) {
			book = new Title(); //例項化book物件
			// 用結果集中的資料初始化book物件
			book.setIsbn(results.getString("isbn"));
			book.setTitle(results.getString("title"));
			book.setEditionNumber(results.getInt("editionNumber"));
			book.setCopyright(results.getString("copyright"));
			book.setPublisherId(results.getInt("publisherID"));
			book.setImageFile(results.getString("imageFile"));
			book.setPrice(results.getFloat("price"));
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		DBcon.closeResultSet(results);
		DBcon.closeStatement(titlesQuery);
		DBcon.closeConnection(connection);
	}
	return book;
}

} (7)編寫viewBookByPageTag.jsp頁面 參考程式碼如下: <%@ page language=“java” contentType=“text/html; charset=utf-8” pageEncoding=“utf-8”%> <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %> <%@ taglib uri="/WEB-INF/page-common.tld" prefix=“page” %>

圖書列表

瀏覽圖書

ISBN書名版本釋出時間價格
${titles.title} ${titles.editionNumber} ${titles.copyright} ${titles.price}
(8)編寫page-common.tld,放在WEB-INF下。 參考程式碼如下: <?xml version="1.0" encoding="UTF-8" ?> 1.2

圖9-8 四、思考題

  1. 什麼是Servlet?
  2. 理解web.xml中如下配置的含義 web.xml(下面內容需要背下來) hello servlet.HelloServlet hello /helloworld
  3. ServletConfig物件中的getInitParameter()與ServletContext物件中的getInitParameter()的區別?
  4. ServletContext物件的獲取方式? 五、實驗總結
  5. 通過本實驗,要求掌握JSTL四大標籤庫常用標籤的用法。
  6. 通過本實驗,要求掌握JSTL與EL結合起來訪問相關物件中的資料。
  7. 通過本實驗,掌握呼叫Java方法。 EL表示式允許使用者開發自定義EL函式,以在JSP頁面中通過JSTL結合EL表示式呼叫Java類的方法。