JSP初学者实验学习

更新时间:2024-03-22 07:49:01 阅读量: 综合文库 文档下载

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

第3章

Java Web编程实验指导

本实验指导根据《Java Web编程技术》课程教学大纲编写,共包括15个实验,每个实验2学时,每周完成一个实验。

实验环境:

系统应该安装JDK 1.5以上版本,开发工具使用Eclipse for Java EE developer版,服务器使用Tomcat 7.0.6版,数据库使用PostgreSQL 8.3.11版。

该实验指导书的配套教材是《Java Web编程技术》沈泽刚 主编,清华大学出版社,2010.3。

Java Web编程实验总结

学号: 姓名: 实验题目: 完成实验时间: 分钟 实验中遇到的问题: 解决办法: 该实验中最重要的代码(不多于10行): 没有解决的问题:

班级

Java实验指导与习题解析 3.1 实验一 简单的Servlet与JSP 56 一. 实验目的 1. 了解和掌握Servlet和JSP页面的编写和运行。

2. 比较Servlet与JSP的区别和联系,体会动态页面的含义。 二. 实验内容

1. 编写和运行一个简单的Servlet

步骤1:在Tomcat安装目录的webapps下建立一个helloapp目录,在其中再建立一个WEB-INF目录,在WEB-INF目录中建立一个classes目录。这样就建立了一个名为helloapp的Web应用程序。

步骤2:编写下面Servlet类,编译并将类文件放入classes/com/demo目录中。

package com.demo; import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HelloServlet extends {

public void service( )

throws ServletException,IOException{

PrintWriter out = response.getWriter(); out.println(\out.println(\out.println(\out.println(\

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

步骤3:在WEB-INF目录中建立一个名为web.xml的文件,该文件为Web应用程序的部署描述文件,简称DD。具体内容如下:

xmlns:xsi=\ xsi:schemaLocation=\ http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\ version=\

metadata-complete=\

Welcome to HelloApp Welcome to HelloApp

helloServlet

com.demo.HelloServlet

/hello.do

提示:可以将\\ROOT\\WEB-INF\\web.xml文件复制来,在其上修改。 步骤4:在浏览器的地址栏中输入下列地址访问该Servlet。

http://localhost:8080/helloapp/hello.do

在浏览器的窗口中应该显示Hello, World!。

2. 下面的Servlet可显示系统当前时间。编译并部署该Servlet,然后使用浏览器访问。

package com.demo; import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HelloWorldServlet extends {

public void service( ) throws ServletException,IOException{

PrintWriter out = ; out.println(\ out.println(\

out.println(\ out.println(\

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

3.编写下面的JSP文件,将其用hello.jsp名保存到helloapp目录中

A Simple JSP Page

Hello,World!

The time now is:<%=new java.util.Date()%>

使用下面的URL访问该页面: http://localhost:8080/helloapp/hello.jsp 57 4. 运行下面的JSP页面square.jsp,看结果如何。 第 3 章 Java Web实验指导 Java实验指导与习题解析 numbersquared <% for ( int i=0; i<10; i++ ) { %> <%= i %><%= (i * i) %> <% } %>

58 5. 改写上述页面,使其运行后产生下列页面。

图1.1 修改后的square.jsp运行结果

三. 思考题

1. 如何安装配置JDK和Tomcat?

2. 如何在Tomcat中运行Servlet和JSP页面?

3.2 实验二 HTTP请求对象的使用 一. 实验目的

1. 掌握如何获得请求参数; 2. 掌握如何检索请求头;

3. 了解如何通过请求对象获得客户信息;

4. 重点掌握使用请求对象存储数据和请求转发。 二. 实验内容

1. 通过查询串传递请求参数,并在Servlet中检索请求参数 步骤1:编写下面的Servlet。

package com.demo; import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class HelloUserServlet extends HttpServlet{

public void service(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException{

String userName = request.getParameter(\ PrintWriter out = response.getWriter(); out.println(\out.println(\out.println(\out.println(\

out.println(%userName + \out.println(\out.println(\} }

步骤2:编译该Servlet,然后修改web.xml文件,将下面代码添加到其中:

helloUserServlet

com.demo.HelloUserServlet

helloUser

步骤3:使用下面的URL访问之。

http://localhost:8080/helloapp/hellouser.do?userName=John

将userName的值改为你自己的名字,看输出结果。若不给出查询字符串,结果如何?参数值使用汉字如何?

2. 通过表单传递请求参数,使用HttpServletRequest对象获得请求参数

步骤1:首先编写一个input.html文件,存放在helloapp目录中。该页面在屏幕上显示一个表单,其中包括姓名和年龄域,点击“确定”按钮后,将表单参数传递给ParamServlet并显示出来。input.html代码如下:

参数传递

从表单向Servlet传递参数

Java实验指导与习题解析 email

hacker@163.com telephone 8899123

1

configDemoServlet /configDemo.do

70 【步骤3】在浏览器的地址栏中输入下面URL访问该Servlet:

http://localhost:8080/bookstore/configDemo.do

程序运行结果如图3.2所示:

图3.2 ConfigDemoServlet的运行结果

3. ServletContext的使用

修改上面程序,将email地址和电话使用ServletContext初始化参数传递给ConfigDemoServlet。使用ServletContext对象将email地址和电话信息写入日志文件中,并查看日志文件。

4.下面是一个Servlet,它可以获得有关服务器的信息。

package com.demo; import java.io.*; import java.util.*;

import javax.servlet.*;

public class ServerInfo extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { response.setContentType(\ PrintWriter out = response.getWriter(); ServletContext sc = getServletContext(); out.println(\

out.println(\out.println(\

out.println(\获取服务器端信息\out.println(\out.println(\

out.println(\服务器端信息:\

out.println(\out.println(\

out.println(\站点名\out.println(\

request.getServerName() + \

out.println(\

out.println(\

out.println(\端口号\

out.println(\ out.println(\

out.println(\

out.println(\服务器类型\

out.println(\ out.println(\

out.println(\

out.println(\支持Servlet版本\out.println(\

+sc.getMinorVersion()+\

out.println(\

out.println(\

out.println(\服务器属性\out.println(\// 获得服务器属性集合

Enumeration attributes = sc.getAttributeNames(); while (attributes.hasMoreElements()) { String name = (String)attributes.nextElement(); out.println(name); }

out.println(\out.println(\

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

} }

71 5. 简单的综合应用 【步骤1】创建一个名为input.html的HTML页面,其中包括一个表单,表单中包含两个文本域,分别供用户输入学号和姓名,该页面也包含提交和重置按钮。 Java Web实验指导 第 3 章 Java实验指导与习题解析 72 【步骤2】定义一个名为com.demo.Student类,其中包括学号sno和姓名name两个private的成员变量,定义访问和修改sno和name的方法。

【步骤3】编写名为FirstServlet的Servlet,要求当用户在input.html中输入信息后点击“提交”按钮,请求FirstServlet对其处理。在FirstServlet中使用表单传递的参数(学号和姓名)创建一个Student对象并将其作为属性存储在ServletContext对象中,然后获得通过ServletContext的getRequestDispatcher()方法获得RequestDispatcher()对象,将请求转发到SecondServlet。

【步骤4】在SecondServlet中取出ServletContext上存储的Student对象,并显示输出该学生的学号和姓名。在SecondServlet的输出中应该包含一个超链接,点击该连接可以返回input.html页面。

图4.2 input.html页面显示结果 图4.3 SecondServlet显示结果

三. 思考题

1. 如何通过ServletConfig获得Servlet参数?

2. 如何获得ServletContext对象,如何通过该对象获得上下文参数? 3. 如何使用ServletContext共享数据?

3.5 实验五 会话管理

一. 实验目的

1. 了解Web服务器对客户跟踪的各种方法; 2. 重点掌握使用HttpSession对象跟踪会话的方法; 3. 掌握使用Cookie技术跟踪会话的方法; 4. 了解URL重写和隐藏表单域的方法。 二. 实验内容

1. 使用HttpSession对象管理会话。

package com.demo; import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*; import java.util.Date;

public class ShowSession extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType(\

HttpSession session = ; String heading =null;

Integer accessCount = (Integer)session.getAttribute(\

if(accessCount==null){

accessCount = new Integer(0); heading = \ }else{

heading = \

accessCount = new Integer(accessCount.intValue()+1); }

session.setAttribute(\

PrintWriter out = response.getWriter(); out.println(\

out.println(\ out.println(\

out.println(\

out.println(\ out.println(\

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

out.println(\ out.println(\

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

图5.1 ShowSession程序的运行结果 2. 使用Cookie跟踪会话 使用Cookie跟踪会话涉及到向客户端写入Cookie和从客户端读取Cookie。 73 第 3 章 Java Web实验指导 Java实验指导与习题解析 【步骤1】向客户端写入Cookie对象

package test; import java.io.*; import javax.servlet.*; import javax.servlet.http.*;

public class SendCookie extends HttpServlet{ public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws IOException,ServletException{

Cookie userCookie = new Cookie(\ userCookie. setMaxAge(60*60*24*7); response.addCookie(userCookie); response.setContentType(\ PrintWriter out=response.getWriter(); out.println(\ out.println(\

\ out.println(\ } }

74 访问上述Servlet将向客户端写入一个Cookie,执行后可查看客户机对应目录看是否写了一个文件。

图5.2 SendCookie程序的运行结果

【步骤2】从客户端读取Cookie对象

package test;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class GetCookie extends HttpServlet{

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws IOException,ServletException{

String cookieName = \ String cookieValue = null;

Cookie[] cookies = request.getCookies(); if (cookies!=null){

for(int i = 0;i

if(cookie.getName().equals(cookieName)) cookieValue = cookie.getValue(); } } response.setContentType(\ PrintWriter out=response.getWriter(); out.println(\ out.println(\ out.println(\

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

图5.3 GetCookie程序的运行结果

三. 思考题

1. 简述会话管理的常用方法有哪些? 2. 如何使用HttpSession对象共享数据?

3.6 实验六 JSP基本语法与页面指令 一. 实验目的

1. 熟练掌握JSP的声明、表达式、小脚本和注释的使用; 2. 理解JSP页面(page)指令和动作的语法格式; 3. 理解JSP页面的生命周期。 4. 熟练掌握page指令的下面的属性:import、session、errorPage、isErrorPage、contentType、pageEncoding。 5. 理解page指令的下面的属性:language、extends、buffer、autoFlush、info。 Java Web实验指导 75 第 3 章 Java实验指导与习题解析 二. 实验内容 1. 输入并执行下面JSP页面,文件名为counter.jsp

76 <%@ page language=\<%! int count = 0; %> <% count++; %>

Welcome! You are visitor number <%= count %>

【步骤1】该JSP页面包含哪些JSP语法元素。在浏览器中访问该页面,输出结果如何?多次刷新页面,结果如何?

【步骤2】打开counter.jsp转换后的源文件counter_jsp.java,对应的类文件在哪里?文件名是什么?

【步骤3】查看count变量是在哪里声明的? 【步骤4】将上面JSP页面中的<%! int count = 0; %>一行改为<% int count = 0; %>,页面能否正常执行,它与上面页面有什么区别?

2. 有下面expression.jsp页面:

<%@ page language=\<%!

int anInt = 3;

boolean aBool = true;

Integer anIntObj = new Integer(3); Float aFloatObj = new Float(8.6); String str = \

StringBuffer sBuff = new StringBuffer(); char getChar(){ return 'A'; } %>

<%= 500 %>

<%= anInt*3.5/100-500 %> <%= aBool %> <%= false %> <%= !false %> <%= getChar() %>

<%= Math.random() %> <%= aVector %> <%= aFloatObj %>

<%= aFloatObj.floatValue() %> <%= aFloatObj.toString() %> <%= aBool; %>

<%= int i = 20 %>

<%= sBuff.setLength(12); %>

你能找出其中的错误吗?你可试着执行该页面,看会出现什么结果?将其中错误修改过来,最后输出下面结果:

图6.1 expression.jsp的运行结果

3. 运行下面persistent_counter.jsp页面,体会如何实现持久的计数器的?

<%@ page language=\<%!

int count = 0; String dbPath;

public void jspInit(){ try{

dbPath = getServletContext().getRealPath(\FileInputStream fis = new FileInputStream(dbPath); DataInputStream dis = new DataInputStream(fis); count = dis.readInt(); dis.close();

}catch(Exception e){

log(\} } %>

<%--下面是向浏览器输出的主要内容,

它将成为产生的_jspService()方法的一部分 --%>

<% count++; %>

Welcome! You are <%= count %> th visitor(s). <%!

public void jspDestroy(){

try{

FileOutputStream fos = new FileOutputStream(dbPath); DataOutputStream dos = new DataOutputStream(fos); dos.writeInt(count); dos.close();

}catch(Exception e){

log(\} } %> 77 4.输入并运行下面的import_test.jsp页面: Java Web实验指导 第 3 章 Java实验指导与习题解析 <%@ page import=\ page指令示例

<% Date date = new Date();

String s = DateFormat.getDateInstance().format(date);

String s2 = DateFormat.getDateInstance(DateFormat.FULL).format(date); %>

78 访问上述JSP页面,输出结果如下图所示:

图6.2 import_test.jsp页面的运行结果

可以看到页面中最后一行的中文显示为乱码,将下面代码加到JSP页面中:

<%@ page contentType=\

重新访问页面,中文显示正常。这说明可以使用page指令的contentType属性指定页面输出使用的字符编码。默认情况下,JSP页面使用的字符集是iso-8859-1编码,如使用汉字编码应指定为gb2312或gbk。

5. errorPage属性和isErrorPage属性的使用。

【步骤1】下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。

<%@ page contentType=\

<%@ page errorPage=\ <%

String name = request.getParameter(\if (name == null){

throw new RuntimeException(\没有指定name 属性。\} %>

Hello, <%= name %>

【步骤2】下面的errorHandler.jsp是错误处理页面。

<%@ page contentType=\ <%@ page isErrorPage=\

请求不能被处理:<%=exception.getMessage()%>
请重试!

用下面的URL访问hello.jsp页面,就会产生下面结果:

http://localhost:8080/bookstore/hello.jsp

图6.3 errorHandler.jsp页面的运行结果

这说明没有提供name参数,hello.jsp页面中抛出RuntimeException异常,所以调用错误页面。

如果使用下面URL访问 hello.jsp页面,将产生下面正常的页面:

http://localhost:8080/bookstore/hello.jsp?name=Mary

图6.4 hello.jsp页面的运行结果

注意:如果请求参数值使用汉字,仍然产生乱码,例如:

http://localhost:8080/bookstore/hello.jsp?name=欧阳清风

这是因为请求参数默认使用iso-8859-1编码传递,如果要正确显示中文,应将请求参数编码转换为gb2312编码。 按下面方法修改hello.jsp页面,将请求参数值编码转换为汉字编码。 <%@ page contentType=\ 79 第 3 章 Java Web实验指导

Java实验指导与习题解析 <%@ page errorPage=\ <% String name = request.getParameter(\if (name==null){ throw new RuntimeException(\没有指定name 属性。\} else{

// 将字符串name的字符编码转换为汉字编码

name = new String(name.getBytes(\} %>

Hello, <%=name %>

80 三. 思考题

1. JSP语法元素有哪些?使用时应注意什么问题? 2. JSP页面的生命周期有哪几个阶段? 3. 如何理解JSP页面本质上是Servlet?

4. page指令有哪些常用的属性,各自的功能是什么?

3.7 实验七 JSP隐含对象与作用域

一. 实验目的

1. 掌握全部9个隐含对象的使用; 2. 理解4种作用域对象。 二. 实验内容

1. 了解隐含对象是如何定义的。

在helloapp应用程序中编写一个名为implicit.jsp的页面,内容为空。然后在浏览器中访问该页面。接下来打开\\work\\Catalina\\localhost\\helloapp\\org\\apache\\jsp目录中的implicit_jsp.java文件,查看隐含对象是如何定义的。完成下面的填空:

JSP页面转换后定义的类名为:( ) 该类继承了哪个类:( ) 隐含对象request的类型为:( ) 隐含对象response的类型为:( ) 隐含对象pageContext的类型为:( ) 隐含对象session的类型为:( ) 隐含对象application的类型为:( ) 隐含对象config的类型为:( ) 隐含对象out的类型为:( ) 隐含对象page的类型为:( )

修改implicit.jsp页面,在中加入下面一行:

<%@ page isErrorPage = \

然后再访问该页面,再次查看上述Java源文件,则可看到exception隐含对象的定义。 隐含对象exception的类型为:( )

说明下面4个隐含对象是如何得到的:

application( ) config ( ) session ( ) out ( ) 2. 各种隐含对象与作用域变量的使用 【1】request隐含对象的使用(request.jsp)

<%@ page contentType=\ <%

String remoteAddr = request.getRemoteAddr(); String remoteHost = request.getRemoteHost(); int serverPort = request.getServerPort(); %>

你的IP地址为:<%=remoteAddr %>
你的主机名为:<%=remoteHost %>

服务器的端口号为:<%=serverPort %>

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

图7.1 request.jsp页面的运行结果

【2】out隐含对象的使用(out.jsp)

<%@ page contentType=\ Out Example

out对象的使用

<% out.print(\学习使用out对象\ int buffer = out.getBufferSize(); int available = out.getRemaining(); %> 81 第 3 章 Java Web实验指导 Java实验指导与习题解析
out对象的类型为:<%= out.getClass().getName() %>
BufferSize=<%= buffer %>
82 Available=<%= available %> 上述页面运行结果如下图所示:

图7.2 out.jsp页面的运行结果

【3】application隐含对象的使用(application.jsp)

<%@ page contentType=\ <%

int number = 0;

Integer num =(Integer)application.getAttribute(\ if(num==null){

application.setAttribute(\ }

else{

number = num.intValue()+1;

application.setAttribute(\ } %>

application example


本页面文件的实际路径是
<%=application.getRealPath(\

application对象中变量num的值为:<%=application.getAttribute(\

上述页面运行结果如下图所示:

图7.3 application.jsp页面的运行结果

【4】session隐含对象的使用(session.jsp)

<%@ page contentType=\<%@ page session=\<%

session.setAttribute(\欧阳清风\%>

您的会话ID是:<%=session.getId()%>

session对象中存放的变量user的值为:<%=session.getAttribute(\

上述页面运行结果如下图所示:

图7.4 session.jsp页面的运行结果

3. 错误页面与异常处理

【步骤1】下面的syntax_error.jsp页面将产生异常,exception.jsp页面使用exception对象处理异常。syntax_error.jsp页面的代码如下:

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

<%@ page errorPage=\ <% Calendar rightNow = null; //下行代码将产生NullPointerException异常 rightNow.getTime(); 83 第 3 章 Java Web实验指导 Java实验指导与习题解析 %> 【步骤2】exception.jsp页面的代码

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

Exception Example

exception变量使用示例


<%

exception.printStackTrace();

StringWriter sout = new StringWriter(); PrintWriter pout = new PrintWriter(sout); exception.printStackTrace(pout); %>

 

<%= sout.toString() %>

84 三. 思考题

1. 在JSP页面中可以使用的隐含对象有哪几个?

2. 在JSP页面中可以使用的作用域对象有哪几个?它们都属于什么作用域?

3.8 实验八 Web组件重用与JavaBeans 一. 实验目的

1. 理解静态包含和动态包含的概念,掌握相关指令和动作的使用; 2. 掌握JavaBeans的含义和创建;

3. 重点掌握在JSP页面中使用JavaBeans的标准动作。 二. 实验内容

1. include指令的使用

本实验包括3个文件header.htmlf、footer.jspf和main.jsp。在main.jsp文件中使用include指令实现静态包含,即实现页面组装技术。3个文件的代码如下:

【步骤1】创建header.htmlf文件



【步骤2】创建footer.jspf文件


Copyright © 2008 New Century Web Bookstore, Inc.

【步骤3】创建main.jsp文件代码

<%@ page contentType=\

New Century Web Bookstore

<%@ include file=\

<%@ include file=\

【步骤4】最后执行main.jsp文件,结果如下图所示:

图8.1 main.jsp页面的运行结果

2. 标准动作的使用 【步骤1】将上面的mian.jsp修改成下面这样(注意加粗部分的修改),重新执行main.jsp将得到相同的结果。 <%@ page contentType=\ 85 第 3 章 Java Web实验指导 Java实验指导与习题解析 New Century Web Bookstore

86 3. 标准动作的使用 【步骤1】action_forward.jsp的代码如下:

<%@ page contentType=\

Forward Test

【步骤2】forwardTo.jsp的代码如下:

<%@ page contentType=\ <%

String userName = request.getParameter(\ String welcomeStr = \欢迎光临本站\

welcomeStr = userName+\ out.print(welcomeStr); %>

执行action_forward.jsp页面的结果如下:

图8.2 action_forward.jsp页面的运行结果

4. 的使用

从HTML页面login.html中输入用户名和口令等,然后提交给display.jsp页面,在该页面中通过JavaBeans保存数据并输出。

【步骤1】UserBean.java程序代码如下:

package com.model;

public class UserBean {

private String username; private String password; private String email;

public UserBean(){}

public void setUsername(String username){ this.username = username; }

public void setPassword(String password){ this.password = password; }

public void setEmail(String email){ this.email = email; }

public String getUsername(){ return username; }

public String getPassword(){ return password; } public String getEmail(){ return email; } }

【步骤2】登录页面login.html代码如下:

Please input:

【步骤3】display.jsp页面使用JavaBeans显示输入的信息。

<%@ page import=\

UserName: Password: 87 第 3 章 Java Web实验指导 Java实验指导与习题解析 Email: 88 三. 思考题 1. 试说明静态包含与动态包含的区别?

2.在JSP页面中使用JavaBean的动作有哪几个?

3.9 实验九 JDBC访问数据库 一. 实验目的

1. 掌握使用传统的方法访问数据库; 2. 掌握使用数据源的方法访问数据库。 二. 实验内容

1. 使用传统方法通过JSP页面访问数据库

【步骤1】创建数据库。假设在PostgreSQL建立了一个名为bookstore的数据库,在其中建立books表,代码如下:

CREATE TABLE books (

bookid character(5) PRIMARY KEY, --书号 title text, --书名

author character varying(20), --作者 publisher character varying (40), --出版社 price real --价格 );

向books表中插入几条记录,代码如下:

INSERT INTO books VALUES ('204','Head First Servlets & JSP', 'Bryan Basham', '中国电力出版社',98.00); INSERT INTO books VALUES

('201', 'Servlets 与JSP 核心教程', 'Hall Marty','清华大学出版社',45); INSERT INTO books VALUES

('202', 'Tomcat与Java Web 开发技术祥解', '孙卫琴', '机械工业出版社',45); INSERT INTO books VALUES

('203', 'JSP 应用开发技术', '柳永坡','人民邮电出版社',52); INSERT INTO books VALUES

('205', 'J2EE 1.4 编程指南', 'Spielman Sue','电子工业出版社',68);

注意:需要将数据库的JDBC驱动程序安装到应用程序的WEB-INF\\lib目录中。 【步骤2】使用下面JSP页面displayBooks.jsp访问books表中的数据。

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

Database Access Test

<%

try {

Class.forName(\

String dburl = \Connection conn =

DriverManager.getConnection(dburl, \

Statement stmt = conn.createStatement(); String sql = \ResultSet rs = stmt.executeQuery(sql); out.println(\

out.println(\书号书名作者价格

\

while (rs.next()){

out.println(\rs.getString(1)+\rs.getString(2)

+\

+\

}

out.println(\rs.close(); stmt.close(); conn.close();

}catch (Exception e) {

out.println(e.getMessage()); } %>

提示:不推荐在JSP页面中编写访问数据库代码。

2. 通过数据源访问数据库

注意:需要将数据库的JDBC驱动程序安装到Tomcat安装目录的\\lib目录中,并重新启动Tomcat服务器。

【步骤1】建立局部数据源

在Web应用程序中建立一个META-INF目录,在其中建立一个context.xml文件,内容如下:

name=\jdbc/bookDS\

type=\ maxActive=\ maxIdle=\ username=\ maxWait=\ driverClassName=\ password=\89 第 3 章 Java Web实验指导

Java实验指导与习题解析 url=\ 【步骤2】使用下面的JSP页面displayBooks.jsp访问数据库

90 <%@ page contentType=\

<%@ page import=\

DataSource Test <%

try {

Context context = new InitialContext(); DataSource ds =

(DataSource) context.lookup(\

Connection conn = ds.getConnection(); Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(\out.println(\

out.println(\书号书名作者价格

\

while (rs.next()){

out.println(\rs.getString(1)+\rs.getString(2) +\

+\}

out.println(\rs.close(); stmt.close(); conn.close();

}catch (Exception e) {

out.println(e.getMessage()); } %>

3. 综合应用。本实验采用MVC设计模式,通过数据源和DAO对象访问数据库。其中JavaBeans实现模型,访问数据库,Servlet实现控制器,JSP页面实现视图。

?

模型包括2个JavaBean:BookBean用于存放图书信息,BookDAO用于访问数据

库。

? 控制器包括2个Servlet:BookQueryServlet根据请求参数查询图书信息、BookInsertServlet用来向数据库中插入数据。

? 视图包括4个JSP页面:bookQuery.jsp显示查询页面、bookInsert.jsp显示插入页面、display.jsp显示查询结果页面和errorPage.jsp显示错误页面。

【步骤1】存放图书信息的JavaBeans代码BookBean.java,它也是一个传输对象。

package com.model; import java.io.*;

public class BookBean implements Serializable{

private String bookid = null; private String title = null; private String author = null; private String publisher = null; private float price = 0.0F;

public BookBean(){}

public BookBean(String bookId, String author,

String title, String publisher, float price) { this.bookid = bookId; this.title = title; this.author = author;

this.publisher = publisher; this.price = price; }

public String getBookid() { return this.bookid; } public String getTitle() { return title; }

public String getAuthor() { return this.author; } public float getPrice() { return price; }

public String getPublisher () { return publisher; }

public void setBookid(String bookid){ this.bookid=bookid; } public void setTitle(String title){this.title=title; }

public void setAuthor(String author){ this. author = author; } public void setPrice(float price){this.price=price; } public void setPublisher (String publisher){ this.publisher = publisher;} }

【步骤2】下面的BookDAO是一个简单的JavaBeans,它实现数据库的访问。

package com.model; import java.sql.*; import javax.sql.*; import javax.naming.*;

import java.util.ArrayList; import com.beans.BookBean;

public class BookDAO{

private static InitialContext context= null; private DataSource dataSource = null;

public BookDAO(){ try{

if(context == null){ context = new InitialContext(); } dataSource (DataSource)context.lookup(\ }catch(NamingException e2){ } } = 91 第 3 章 Java Web实验指导 Java实验指导与习题解析 // 根据书号查询图书信息

public BookBean searchBook(String bookid){ Connection conn = null; PreparedStatement pstmt = null; ResultSet rst = null; BookBean book = new BookBean(); try{

conn = dataSource.getConnection(); pstmt = conn.prepareStatement(\* FROM books WHERE bookid=?\ pstmt.setString(1,bookid); rst = pstmt.executeQuery(); if(rst.next()){

book.setBookid(rst.getString(\ book.setTitle(rst.getString(\ book.setAuthor(rst.getString(\

book.setPublisher(rst.getString(\ book.setPrice(rst.getFloat(\ return book; }else{

return null; }

}catch(SQLException se){ return null; }finally{ try{

conn.close();

}catch(SQLException se){ } } }

// 插入一本图书记录

public boolean insertBook(BookBean book){ Connection conn = null;

PreparedStatement pstmt = null; try{

conn = dataSource.getConnection(); pstmt = conn.prepareStatement(

\ pstmt.setString(1,book.getBookid()); pstmt.setString(2,book.getTitle()); pstmt.setString(3,book.getAuthor()); pstmt.setString(4,book.getPublisher()); pstmt.setFloat(3,book.getPrice());

pstmt.executeUpdate(); pstmt.close(); return true;

}catch(SQLException se){ return false; }finally{ try{

92

conn.close();

}catch(SQLException se){ } } } }

【步骤3】下面的JSP页面bookQuery.jsp实现根据书号查询图书信息

<%@ page contentType=\ Book Query

请输入一个书号:

【步骤4】下面的JSP页面bookInsert.jsp实现向数据库中插入数据

<%@ page contentType=\ Book Insert

请输入图书信息:

<% if(request.getAttribute(\ out.print(request.getAttribute(\%>

【步骤5】显示查询结果的JSP页面display.jsp:

<%@ page contentType=\

书号: 93 第 3 章 Java Web实验指导 Java实验指导与习题解析 【步骤6】错误页面errorPage.jsp代码如下:

<%@ page contentType=\ 对不起,您查的图书不存在! 94 【步骤7】下面的Servlet实现从请求参数获得书号,然后从数据库中查找该书,最后根据查询结果将请求转发到显示页面(display.jsp)或错误页面(errorPage.jsp)。

package com.control;

import java.io.*; import java.sql.*;

import javax.servlet.*;

import javax.servlet.http.*; import com.beans.BookBean; import com.beans.BookDAO;

public class BookQueryServlet extends HttpServlet{

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

String bookid = request.getParameter(\ BookDAO bookdao = new BookDAO();

BookBean book = bookdao.searchBook(bookid);

if(book!=null){

request.getSession().setAttribute(\ RequestDispatcher view = request.getRequestDispatcher(\

view.forward(request, response); }else{

RequestDispatcher view = request.getRequestDispatcher(\

view.forward(request, response); } } }

【步骤8】下面的Servlet实现向数据库插入数据,并将控制请求的转发到bookInsert.jsp页面。

package com.control;

import java.io.*; import java.sql.*;

import javax.servlet.*;

import javax.servlet.http.*; import com.model.BookBean; import com.model.BookDAO;

public class BookInsertServlet extends HttpServlet{

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException{

request.setCharacterEncoding(\ String message = null;

BookBean book = new BookBean(

request.getParameter(\

request.getParameter(\ Float.parseFloat(request.getParameter(\ );

BookDAO bookdao = new BookDAO();

boolean success = bookdao.insertBook(book); if(success){

message = \成功插入一条记录!\ }else{

message = \插入记录错误!\ }

request.setAttribute(\ RequestDispatcher view = request.getRequestDispatcher(\

view.forward(request, response); } }

【步骤9】在DD文件中部署Servlet,将下列代码添加到DD文件的适当位置:

bookQuery

com.control.BookQueryServlet

bookInsert

com.control.BookInsertServlet

bookQuery /bookquery.do

bookInsert /bookinsert.do

三. 思考题

1. 简述使用数据源访问数据库一般步骤。

2. 简述使用数据源访问数据库比使用传统方法的优点。 95 第 3 章 Java Web实验指导 Java实验指导与习题解析 3.10 实验十 表达式语言的使用 96 一. 实验目的 1. 了解表达式语言的功能; 2. 掌握表达式语言的使用。 二. 实验内容

1. 表达式语言运算符的使用

下面的JSP页面operator.jsp演示了EL运算符的使用:

<%@ page contentType=\

JSP 2.0 Expression Language - Basic Arithmetic

JSP 2.0 表达式语言 - 基本算术运算符


该例说明了基本的表达式语言的算术运算符的使用,其中包括加(+),减(-), 乘(*),除(/ 或 div), 取余 (% 或 mod)。


EL 表达式 结果 \\${1} ${1} \\${1 + 2} ${1 + 2} \\${1.2 + 2.3} ${1.2 + 2.3} \\${1.2E4 + 1.4} ${1.2E4 + 1.4} \\${-4 - 2} ${-4 - 2} \\${21 * 2} ${21 * 2} \\${3/4} ${3/4} \\${3 div 4} ${3 div 4} \\${3/0} ${3/0} \\${10%4} ${10%4} \\${10 mod 4} ${10 mod 4}

\\${(1==2) ? 3 : 4} ${(1==2) ? 3 : 4}

2 访问作用域变量

编写一个名为EmployeeBean的JavaBean,其中包括3个属性eno表示雇员号、ename表示雇员名和ecompany表示雇员公司名。

【步骤1】EmployeeBean.java程序代码

package com.beans;

public class EmployeeBean { private String eno = \ private String ename = \ private String ecompany = \

public EmployeeBean() { }

public void setEno(String eno){ this.eno = eno; }

public void setEname(String ename){ this.ename = ename; }

public void setEcompany(String ecompany){ this.ecompany = ecompany; }

public String getEno(){ return eno; }

public String getEname(){ return ename; }

public String getEcompany(){ return ecompany; } }

【步骤2】编写一个JSP页面,在其中通过表单输入雇员信息,将请求转发到一个Servlet。

<%@ page contentType=\

请输入雇员信息:

97 【步骤3】下面的Servlet从JSP页面得到客户信息 package com.control; 第 3 章 Java Web实验指导 Java实验指导与习题解析 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.beans.EmployeeBean;

public class EmployeeServlet extends HttpServlet{

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException,IOException{

String eno = request.getParameter(\

String ename = request.getParameter(\

String ecompany = request.getParameter(\ EmployeeBean employee = new EmployeeBean(); employee.setEno(eno);

employee.setEname(ename);

employee.setEcompany(ecompany);

request.setAttribute(\ RequestDispatcher view =

request.getRequestDispatcher(\ view.forward(request, response); } }

98 【步骤4】下面的JSP使用EL表达式显示用户的信息

<%@ page contentType=\

雇员的信息如下:

雇员号:${employee.eno} 雇员名:${employee.ename} 公司名:${employee.ecompany}

3. 隐含对象的使用

下面的JSP页面implicit.jsp演示了EL隐含对象的使用。

<%@ page contentType=\

EL implicit objects

JSP 2.0 表达式语言-隐含对象


输入foo参数值


EL 表达式 结果 \\${param.foo} ${param.foo}  \\${param[\ ${param[\ \\${header[\ ${header[\ \\${header[\ ${header[\ \\${header[\ ${header[\

4. 在JSP页面中使用Java函数

设要在JSP页面中使用一个add()函数,实现两个整数的加法运算。在JSP中使用Java函数要经过如下3个步骤:

【步骤1】函数的定义,创建类文件Compute.java。它定义了要在JSP中使用的add()方法。

package com.demo;

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(\ 99 第 3 章 Java Web实验指导

Java实验指导与习题解析 } return a+b; } } 100 【步骤2】创建标签库描述文件taglib.tld。它实现将每个Java方法与函数名相匹配。

xmlns:xsi=\ xsi:schemaLocation=\

http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd\ version=\

A Simple Taglib File. 1.0

Simple Tag Library http://www.mydomain.com/function

Adding two numbers add com.demo.Compute int add( java.lang.String, java.lang.String)

注意:将该文件保存在Web应用程序WEB-INF\\classes目录中。

【步骤3】编写JSP文件sum.jsp,使用标签库URI以及函数名调用Java函数,代码如下:

<%@ page contentType=\

<%@ taglib prefix=\

Using Function

计算两个整数之和

两个整数的和为:${demo:add(param[\

该页面运行结果为:

图10.1 sum.jsp页面的运行结果

5. 下面在Functions类中定义了reverse()函数用来实现字符串反转、numVowels()函数用来实现统计字符串中元音字母个数、caps()函数用来将一个字符串转换成大写字母、palindrome()函数用来判断一个字符串是否是回文。

编译该文件,编写TLD文件定义这些函数,编写JSP页面使用这些函数。

package com.function; 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 = \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(); }

public static boolean palindrome(String str){ StringBuffer sb = new StringBuffer(str); if((sb.reverse().toString()).equals(str)){ return true; }else{ return false; } } 101 第 3 章 Java Web实验指导 Java实验指导与习题解析 Reverses the characters in the given String reverse 102 beans.Functions java.lang.String reverse( java.lang.String )

Counts the number of vowels (a,e,i,o,u) in the String

countVowels beans.Functions java.lang.String

numVowels( java.lang.String )

Converts the string to all caps caps beans.Functions java.lang.String caps( java.lang.String )

三. 思考题

1. 简述JSP表达式语言的主要功能有哪些? 2.简述在JSP页面中使用Java函数的步骤。

3.11 实验十一 用户自定义标签 一. 实验目的

1. 了解什么是自定义标签;

2. 掌握使用SimpleTag和SimpleTagSuppot开发简单标签; 3. 了解传统自定义标签的接口和类的使用。 二. 实验内容

1. 开发一个简单的SimpleTag标签;

given

【步骤1】创建简单标签类

package mytags;

import java.io.*;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

public class MathTag extends SimpleTagSupport { int x = 289;

public void doTag() throws JspException, IOException { getJspContext().getOut().print(

\ } }

【步骤2】创建taglib.tld文件,将其存放在WEB-INF目录中,内容如下:

xmlns:xsi=\ xsi:schemaLocation=\http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd\ version=\

www.mydomain.com/math 1.0 2.0

Sends a math expression to the JSP sqrt

mytags.MathTag empty

【步骤3】编写JSP页面math.jsp访问该标签,代码如下:

<%@ taglib prefix=\

该页面的运行结果如下:

103 图11.1 math.jsp页面的运行结果 Java Web实验指导 第 3 章 Java实验指导与习题解析 2. 开发一个空标签,该标签显示一个红色星号 【步骤1】创建标签处理类

下面是RedStarTag标签的处理类的源代码:

104 package sampleLib;

import java.io.*;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

public class RedStarTag extends SimpleTagSupport {

public void doTag() throws JspException, IOException{ JspWriter out = getJspContext().getOut();

out.print(\ } }

【步骤2】创建标签库描述文件(TLD)

在WEB-INF目录中创建一个名为sampleLib.tld标签库描述文件,内容如下:

xmlns:xsi=\ xsi:schemaLocation=\http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd\ version=\

A simple tag handler 1.0 2.0 mytaglib /WEB-INF/sampleLib.tld

star

sampleLib.RedStarTag empty

Prints * wherever it occurs

【步骤3】在JSP文件中引入标签库和使用标签

<%@ page contentType=\

<%@ taglib uri=\

请输入客户信息,带的域必须填写。

Name

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

Top