JavaEE(9)——JSTL与标签文件

版权声明:[email protected] https://blog.csdn.net/zhaoxuyang1997/article/details/82942654

实验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>

扫描二维码关注公众号,回复: 3465852 查看本文章

运行该页面,结果如下图所示:

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

http://www.mydomain.com/function

<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.isbn} ${titles.title} ${titles.editionNumber} ${titles.copyright} ${titles.price}
(8)编写page-common.tld,放在WEB-INF下。 参考代码如下: <?xml version="1.0" encoding="UTF-8" ?> 1.2

common

pager
tag.PaginationTag
empty


【步骤2】使用下面的URL访问之。
http://localhost:8080/prac07_JSTL_page_tag/ToViewBooks
将出现如图9-8所示表单界面。

图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类的方法。

猜你喜欢

转载自blog.csdn.net/zhaoxuyang1997/article/details/82942654