Java Web开发:从JavaServer Pages到Java 1.0 Applets
1. JavaServer Pages基础
在Web开发中,JavaServer Pages(JSP)是一种强大的工具。JSP允许我们在服务器页面上编写Java程序,而无需编译程序、在网页上布局、设计界面或发布类文件。它通过表达式、语句和声明来实现这一点,是将网页上的静态内容与由servlet为这些页面生成的动态内容分离的有效方法。这种技术使得修改网页的文本和呈现变得更加容易,而无需更改页面使用的servlet和其他类。
例如,在处理留言板时,有一个
replaceText()
方法,它接受三个参数:
- 可能包含不需要字符的字符串
- 应该移除的字符
- 应该替换的字符
当编译
Guestbook
类时,需要将其放在Web服务器上存储servlet的相同位置。在配备Tomcat的Apache Web服务器上,这个文件夹可能是
/WEB-INF/classes
或
/htdocs/WEB-INF/classes
。
要测试
guestbookpost.jsp
服务器页面,可以使用以下URL打开显示留言板条目的页面:
http://www.java21pro.com/guestbook.jsp?id=cinema
添加留言并点击提交按钮后,会看到类似特定示例的页面。
2. JSP相关问题解答
-
为什么servlet和JSP需要
getRealPath()方法来确定文件在Web服务器上的位置?
Tomcat不支持servlet或JSP内部的相对文件名。为了读取或写入文件中的数据,必须知道文件在Web服务器上的确切位置。由于在实时Web托管环境中,这些信息并非总是可用,因此ServletContext接口包含了getRealPath()方法,该方法向Web服务器请求文件的完整路径名。使用Tomcat而不是通用网关接口脚本的最大优点之一是可以直接与服务器通信。
3. JSP小测验
以下是一些关于JSP的小测验问题及答案:
| 问题 | 选项 | 答案 |
| — | — | — |
| 如果在JSP上看到请求变量,它指的是
javax.servlets.http
中的哪个类? | a.
HttpServletResponse
b.
HttpServletRequest
c.
ServletContext
| b.
HttpServletRequest
|
| 创建JSP需要在计算机上安装哪些工具? | a. Java解释器和编译器
b. Java解释器、编译器和appletviewer
c. 以上都不需要 | c. 只需要一个文本编辑器。发布页面时,Tomcat会将其编译成servlet并运行程序。 |
| JSP元素中哪个使用
<%=
和
%>
标签? | a. 声明
b. 表达式
c. 语句 | b. 标签内的表达式将被求值,其值将显示在页面上表达式的位置。 |
4. 认证练习
考虑以下代码:
public class ArraySize {
public static void main(String[] arguments) {
String[] sites = new String[10];
String[] places = { "Albany", "Ithaca", "Savannah" };
sites = places;
System.out.println(sites.length);
}
}
该应用程序的输出是什么?答案可在特定网站上找到。
5. JSP练习
为了扩展对JSP的了解,可以尝试以下练习:
- 创建一个使用JSP的
SetColor
servlet版本。
- 编写一个JSP,为Internet Explorer用户显示一个问候语,为其他用户显示另一个问候语。
6. Java 1.0 Applets概述
在1995年Java推出时,它迅速被添加到两个最流行的Web浏览器Netscape Navigator和Microsoft Internet Explorer中。浏览器开发者包含了自己的内置Java解释器来加载和运行嵌入在网页中的applet。这是大多数人接触Java的主要方式,也是该语言成功的重要原因。然而,如今Java 1.0是唯一被Web浏览器作为内置功能完全支持的版本,这使得许多程序员在编写applet时不得不使用1.0技术。
7. 创建Java 1.0 Applets
Java 1.0 applet是
java.applet
包中
Applet
类的子类,其生命周期发生在以下四个公共方法中:
-
init()
:当applet首次加载时调用,用于进行任何必要的初始化。
-
start()
:在
init()
之后以及每次包含applet的网页被重新访问时调用。
-
stop()
:在包含applet的网页被另一个页面替换之前调用。
-
destroy()
:在显示applet的Web浏览器关闭之前调用。
Applet还有用于检索参数(
getParameter(String)
)、使用URL加载图像(
getImage(URL)
和
getImage(URL, String)
)以及查找applet的
CodeBase
和
DocumentBase
文件夹(
getCodeBase()
和
getDocumentBase()
)的相同方法。
与Swing不同,Java 1.0不支持内容面板,需要直接将组件添加到容器中。例如,创建一个按钮并添加到applet的代码如下:
Button exit = new Button("Exit Program");
add(exit);
applet窗口的布局管理器使用
java.awt
包中的类来建立,可用的布局管理器包括
BorderLayout
、
CardLayout
、
FlowLayout
、
GridLayout
和
GridBagLayout
。默认的布局管理器是流布局,如果要选择其他布局管理器,可以使用以下代码:
BorderLayout border = new BorderLayout();
setLayout(border);
在Java 1.0中,使用
size()
方法来确定applet或其他组件的大小,而不是Swing中使用的
getSize()
方法。
8. Java 1.0 Applets绘图
在applet的
paint()
方法中,Java 1.0仅支持一个用于绘图的类:
Graphics
,它是
java.awt
包的一部分。该类代表了一个可以绘制图形和文本的环境。
-
绘制字符串、线条和矩形
-
绘制字符串使用
drawString(String, x, y)方法。 -
绘制线条使用
drawLine(int, int, int, int)方法。 -
绘制矩形使用
drawRect(int, int, int, int)或fillRect(int, int, int, int)方法。 -
可以通过
setColor(Color)方法选择绘图颜色,Color类有13个类变量可供使用,也可以通过构造函数创建自定义颜色。
-
绘制字符串使用
-
绘制椭圆
使用drawOval()和fillOval()方法绘制椭圆,需要指定椭圆边界矩形的位置和大小。如果边界矩形的高度和宽度相同,则绘制的是圆形。例如以下代码:
import java.awt.*;
public class Oval extends java.applet.Applet {
public void paint(Graphics screen) {
setBackground(Color.white);
screen.setColor(Color.black);
for (int i = 0; i <= 200; i += 20) {
screen.drawLine(0, i, 200, i);
screen.drawLine(i, 0, i, 200);
}
screen.setColor(Color.red);
screen.fillOval(30, 30, 160, 160);
}
}
-
绘制弧形
使用drawArc()和fillArc()方法绘制弧形,需要额外指定弧形的起始点和度数。 -
绘制多边形
首先创建Polygon对象,然后通过addPoint(int, int)方法添加点,最后使用drawPolygon(Polygon)或fillPolygon(Polygon)方法绘制多边形。例如以下代码:
import java.awt.*;
public class Map1 extends java.applet.Applet {
public void paint(Graphics screen) {
setBackground(Color.blue);
// Draw waves
screen.setColor(Color.white);
for (int ax = 10; ax < 340; ax += 10)
for (int ay = 30; ay < 340 ; ay += 10) {
screen.drawArc(ax, ay, 10, 10, 0, -180);
}
// Draw Florida
screen.setColor(Color.green);
Polygon fl = new Polygon();
fl.addPoint(10, 12);
fl.addPoint(234, 15);
fl.addPoint(253, 25);
fl.addPoint(261, 71);
fl.addPoint(344, 209);
fl.addPoint(336, 278);
fl.addPoint(295, 310);
fl.addPoint(259, 274);
fl.addPoint(205, 188);
fl.addPoint(211, 171);
fl.addPoint(195, 174);
fl.addPoint(191, 118);
fl.addPoint(120, 56);
fl.addPoint(94, 68);
fl.addPoint(81, 49);
fl.addPoint(12, 37);
screen.fillPolygon(fl);
// Draw ovals
screen.setColor(Color.black);
screen.fillOval(235, 140, 15, 15);
screen.fillOval(225, 130, 15, 15);
screen.fillOval(245, 130, 15, 15);
}
}
9. Java 1.0 Applets图形用户界面设计
Java 1.0使用抽象窗口工具包(Abstract Windowing Toolkit)来实现图形用户界面,其接口类包含在
java.awt
包中。可以使用以下类创建组件:
Button
、
Canvas
、
Checkbox
、
Choice
、
Label
、
List
、
Scrollbar
、
TextArea
和
TextField
,还有用于创建菜单和菜单命令的类。
-
创建按钮和文本组件
-
Button(String):创建带有指定标签的可点击按钮。 -
Label(String):创建带有指定文本的标签。 -
TextField(int):创建指定字符显示数量的单行文本输入字段。 -
TextArea(int, int):创建指定行数和每行字符数的多行文本输入框。 -
可以使用
setText(String)方法设置标签、文本字段或文本区域的文本,使用setLabel(String)方法设置按钮的标签。 -
可以使用
enable(Boolean)方法启用或禁用组件的输入功能,使用setEchoCharacter(char)方法隐藏文本字段中的输入内容。
-
-
创建多选项组件和滚动条
-
Choice:弹出菜单,允许用户选择一个项目。可以使用addItem()方法添加项目,使用getSelectedItem()方法获取用户选择的项目。 -
List:下拉列表,可以显示多个项目并接受多个输入。可以使用getSelectedItem()或getSelectedItems()方法获取用户选择的项目。 -
Checkbox:复选框,用于选择两个选项之一。可以使用CheckboxGroup类将多个复选框分组,确保一次只能选择一个复选框。 -
Scrollbar:滚动条,用于选择数值。创建滚动条时需要指定方向、起始值、滑块表示的量、最小值和最大值。
-
-
在界面中绘图
Canvas类代表界面上可以绘制或显示内容的区域。可以创建Canvas的子类并覆盖其paint()方法来实现绘图。例如以下代码:
import java.awt.*;
public class Plot extends java.applet.Applet {
Label statLabel = new Label("Current Statistics:");
Graph stats = new Graph();
public void init() {
BorderLayout border = new BorderLayout();
setLayout(border);
add("North", statLabel);
add("Center", stats);
}
}
class Graph extends java.awt.Canvas {
int[] point = { 1, 10, 3, 5, 8, 7, 2, 2, 5, 9 };
public void paint(Graphics screen) {
for (int i = 0; i < 10; i++) {
Color blueHue = new Color(0, 0, 255 - (i*20));
screen.setColor(blueHue);
screen.fillRect(20, i * 20, point[i] * 20, 17);
}
}
}
-
显示图像
在Java 1.0中,可以使用Image类来显示图像。需要将图像存储在与applet相同的Web服务器上,并使用getImage(URL, String)方法加载图像。加载后,可以在Canvas组件的paint()方法中使用drawImage(Image, int, int, ImageObserver)方法显示图像。例如以下代码:
import java.awt.*;
public class Picture extends java.applet.Applet {
Image searchImage;
public void init() {
searchImage = getImage(getCodeBase(), "faulkner.jpg");
}
public void paint(Graphics screen) {
screen.drawImage(searchImage, 0, 0, this);
}
}
10. Java 1.0 Applets处理用户事件
Java 1.0不使用当前版本Java中的事件处理技术,而是通过继承自
Component
类的方法来接收用户事件。这些方法包括:
-
action(Event, Object)
:当组件生成操作事件时调用。
-
gotFocus(Event, Object)
和
lostFocus(Event, Object)
:当组件获得或失去输入焦点时调用。
-
keyDown(Event, int)
和
keyUp(Event, int)
:当按键被按下或释放时调用。
-
mouseDown(Event, int, int)
和
mouseUp(Event, int, int)
:当鼠标按钮被点击或释放时调用。
-
mouseEnter(Event, int, int)
和
mouseExit(Event, int, int)
:当鼠标首次移动到组件上或首次移出组件时调用。
-
mouseDrag(Event, int, int)
:当鼠标按下按钮移动到组件上时调用。
-
mouseMove(Event, int, int)
:当鼠标不按下任何按钮移动到组件上时调用。
所有这些方法都返回一个布尔值。当完全处理用户事件时,返回
true
,否则返回
false
以将事件发送到容器进行额外处理。
例如以下代码实现了一个可以在图像上涂鸦的applet:
import java.awt.*;
public class Draw extends java.applet.Applet {
Button erase = new Button("Erase");
DrawPanel canvas;
public void init() {
canvas = new DrawPanel(getImage(getCodeBase(), "faulkner.jpg"));
BorderLayout bord = new BorderLayout();
setLayout(bord);
add(canvas, "Center");
Panel commandPanel = new Panel();
commandPanel.add(erase);
add(commandPanel, "South");
}
public boolean action(Event evt, Object obj) {
if (evt.target == erase) {
canvas.numPoints = -1;
canvas.repaint();
}
return true;
}
}
class DrawPanel extends Panel {
Image picture;
int[] drawX = new int[1000];
int[] drawY = new int[1000];
int numPoints = -1;
DrawPanel(Image inputImage) {
picture = inputImage;
}
public void paint(Graphics screen) {
screen.drawImage(picture, 0, 0, this);
screen.setColor(Color.black);
for (int i = 0; i <= numPoints; i++) {
screen.fillOval(drawX[i]-3, drawY[i]-3, 6, 6);
}
}
public void update(Graphics screen) {
paint(screen);
}
public boolean mouseDown(Event evt, int x, int y) {
if (numPoints < 1000) {
numPoints++;
drawX[numPoints] = x;
drawY[numPoints] = y;
}
repaint();
return true;
}
public boolean mouseDrag(Event evt, int x, int y) {
mouseDown(evt, x, y);
return true;
}
}
通过以上内容,我们了解了JavaServer Pages的基本使用和Java 1.0 Applets的开发,包括创建、绘图、界面设计和事件处理等方面。这些知识在Web开发中具有重要的应用价值。
Java Web开发:从JavaServer Pages到Java 1.0 Applets(续)
11. Java 1.0 Applets 代码示例总结
为了更清晰地回顾之前提到的 Java 1.0 Applets 代码示例,下面以表格形式进行总结:
| 功能 | 代码示例 |
| — | — |
| 绘制十字线 |
import java.awt.*;
public class CrossHair extends java.applet.Applet {
String mark = "+";
public void paint(Graphics screen) {
Dimension appletWindow = size();
int height = appletWindow.height;
int width = appletWindow.width;
screen.drawString(mark, width/2, height/2);
}
}
``` |
| 绘制椭圆和网格 |
```java
import java.awt.*;
public class Oval extends java.applet.Applet {
public void paint(Graphics screen) {
setBackground(Color.white);
screen.setColor(Color.black);
for (int i = 0; i <= 200; i += 20) {
screen.drawLine(0, i, 200, i);
screen.drawLine(i, 0, i, 200);
}
screen.setColor(Color.red);
screen.fillOval(30, 30, 160, 160);
}
}
``` |
| 绘制地图 |
```java
import java.awt.*;
public class Map1 extends java.applet.Applet {
public void paint(Graphics screen) {
setBackground(Color.blue);
// Draw waves
screen.setColor(Color.white);
for (int ax = 10; ax < 340; ax += 10)
for (int ay = 30; ay < 340 ; ay += 10) {
screen.drawArc(ax, ay, 10, 10, 0, -180);
}
// Draw Florida
screen.setColor(Color.green);
Polygon fl = new Polygon();
fl.addPoint(10, 12);
fl.addPoint(234, 15);
fl.addPoint(253, 25);
fl.addPoint(261, 71);
fl.addPoint(344, 209);
fl.addPoint(336, 278);
fl.addPoint(295, 310);
fl.addPoint(259, 274);
fl.addPoint(205, 188);
fl.addPoint(211, 171);
fl.addPoint(195, 174);
fl.addPoint(191, 118);
fl.addPoint(120, 56);
fl.addPoint(94, 68);
fl.addPoint(81, 49);
fl.addPoint(12, 37);
screen.fillPolygon(fl);
// Draw ovals
screen.setColor(Color.black);
screen.fillOval(235, 140, 15, 15);
screen.fillOval(225, 130, 15, 15);
screen.fillOval(245, 130, 15, 15);
}
}
``` |
| 绘制统计图表 |
```java
import java.awt.*;
public class Plot extends java.applet.Applet {
Label statLabel = new Label("Current Statistics:");
Graph stats = new Graph();
public void init() {
BorderLayout border = new BorderLayout();
setLayout(border);
add("North", statLabel);
add("Center", stats);
}
}
class Graph extends java.awt.Canvas {
int[] point = { 1, 10, 3, 5, 8, 7, 2, 2, 5, 9 };
public void paint(Graphics screen) {
for (int i = 0; i < 10; i++) {
Color blueHue = new Color(0, 0, 255 - (i*20));
screen.setColor(blueHue);
screen.fillRect(20, i * 20, point[i] * 20, 17);
}
}
}
``` |
| 显示图像 |
```java
import java.awt.*;
public class Picture extends java.applet.Applet {
Image searchImage;
public void init() {
searchImage = getImage(getCodeBase(), "faulkner.jpg");
}
public void paint(Graphics screen) {
screen.drawImage(searchImage, 0, 0, this);
}
}
``` |
| 图像涂鸦 |
```java
import java.awt.*;
public class Draw extends java.applet.Applet {
Button erase = new Button("Erase");
DrawPanel canvas;
public void init() {
canvas = new DrawPanel(getImage(getCodeBase(), "faulkner.jpg"));
BorderLayout bord = new BorderLayout();
setLayout(bord);
add(canvas, "Center");
Panel commandPanel = new Panel();
commandPanel.add(erase);
add(commandPanel, "South");
}
public boolean action(Event evt, Object obj) {
if (evt.target == erase) {
canvas.numPoints = -1;
canvas.repaint();
}
return true;
}
}
class DrawPanel extends Panel {
Image picture;
int[] drawX = new int[1000];
int[] drawY = new int[1000];
int numPoints = -1;
DrawPanel(Image inputImage) {
picture = inputImage;
}
public void paint(Graphics screen) {
screen.drawImage(picture, 0, 0, this);
screen.setColor(Color.black);
for (int i = 0; i <= numPoints; i++) {
screen.fillOval(drawX[i]-3, drawY[i]-3, 6, 6);
}
}
public void update(Graphics screen) {
paint(screen);
}
public boolean mouseDown(Event evt, int x, int y) {
if (numPoints < 1000) {
numPoints++;
drawX[numPoints] = x;
drawY[numPoints] = y;
}
repaint();
return true;
}
public boolean mouseDrag(Event evt, int x, int y) {
mouseDown(evt, x, y);
return true;
}
}
``` |
#### 12. Java 1.0 Applets 开发流程总结
下面通过 mermaid 格式的流程图来展示 Java 1.0 Applets 的开发流程:
```mermaid
graph LR
A[创建 Applet 类] --> B[重写生命周期方法]
B --> C[设计界面布局]
C --> D[添加组件]
D --> E[绘制图形或显示图像]
E --> F[处理用户事件]
F --> G[编译和运行]
具体步骤如下:
1.
创建 Applet 类
:继承自
java.applet.Applet
类。
2.
重写生命周期方法
:如
init()
、
start()
、
stop()
和
destroy()
方法。
3.
设计界面布局
:选择合适的布局管理器,如
BorderLayout
、
FlowLayout
等。
4.
添加组件
:使用
add()
方法将组件添加到容器中。
5.
绘制图形或显示图像
:在
paint()
方法中使用
Graphics
类进行绘图操作,或使用
getImage()
方法加载和显示图像。
6.
处理用户事件
:重写继承自
Component
类的事件处理方法,如
action()
、
mouseDown()
等。
7.
编译和运行
:使用 Java 编译器编译 Applet 类文件,然后在 Web 浏览器或
appletviewer
工具中运行。
13. Java 1.0 Applets 与现代 Java 开发的对比
虽然 Java 1.0 Applets 在早期 Web 开发中发挥了重要作用,但与现代 Java 开发相比,存在一些明显的差异:
| 对比项 | Java 1.0 Applets | 现代 Java 开发 |
| — | — | — |
| 浏览器支持 | 仅 Java 1.0 被主流浏览器完全支持 | 支持最新的 Java 版本,通过插件或其他技术实现 |
| 功能特性 | 功能相对简单,缺乏现代 Java 的高级特性 | 拥有丰富的类库和框架,支持多线程、泛型、Lambda 表达式等 |
| 安全性 | 安全性较低,存在一定的安全风险 | 有更完善的安全机制,如沙箱模型、权限管理等 |
| 开发效率 | 开发效率较低,代码编写相对繁琐 | 开发效率高,有很多开发工具和框架辅助开发 |
14. 总结与展望
通过对 JavaServer Pages 和 Java 1.0 Applets 的学习,我们了解到它们在不同时期的 Web 开发中都有着重要的地位。JavaServer Pages 提供了一种简单而有效的方式来将 Java 代码嵌入到 Web 页面中,实现动态内容的生成;而 Java 1.0 Applets 则为早期 Web 带来了交互性和丰富的图形界面。
虽然 Java 1.0 Applets 由于浏览器支持和功能限制等原因,在现代 Web 开发中逐渐被淘汰,但其中的一些基本概念和技术仍然具有一定的参考价值。例如,
Graphics
类的绘图方法、事件处理机制等,在现代 Java 图形开发中仍然有应用。
在未来的 Web 开发中,我们应该关注现代 Java 技术的发展,如 JavaFX、Spring Boot 等,它们提供了更强大的功能和更高的开发效率。同时,我们也可以从历史的技术中汲取经验,不断提升自己的开发能力。
希望本文能够帮助你更好地理解 JavaServer Pages 和 Java 1.0 Applets 的相关知识,为你的 Web 开发之路提供一些参考。如果你有任何问题或建议,欢迎在评论区留言交流。
超级会员免费看
65

被折叠的 条评论
为什么被折叠?



