44、Java Web开发:从JavaServer Pages到Java 1.0 Applets

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 开发之路提供一些参考。如果你有任何问题或建议,欢迎在评论区留言交流。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值