JavaServerPages(JSPs)全解析
立即解锁
发布时间: 2025-08-20 00:52:13 订阅数: 11 


Java网络编程入门与实践
# JavaServer Pages (JSPs) 全解析
## 1. JSP 标签介绍
### 1.1 表达式标签
表达式标签用于在网页上显示一个值,标签以 `<%=` 开头,以 `%>` 结尾。例如:
```jsp
<%= origPrice*(1+VAT) %>
<%= today.getMonth() %>
```
需要注意的是,与声明和脚本不同,表达式不能以分号结尾。
### 1.2 脚本标签
脚本标签是在调用 JSP 时要执行的 Java 代码块。虽然可以通过这种方法包含大量代码,但这不是好的做法,应尽量减少此类代码。后续会介绍如何将大部分处理封装在 JavaBean 中,然后从 JSP 调用其方法。脚本标签以 `<%` 开头,以 `%>` 结尾。
示例如下:
```jsp
<%
//'total' and 'numArray' are pre - declared.
total = 0;
for (int i = 0; i < numArray.length; i++)
total += numArray[i];
%>
Total:
<%= total %>
```
输出值可以根据特定条件是否为真而变化,示例代码如下:
```jsp
<%
if (today.getHours() < 12)
{
%>
Good morning!
<%
}
else
{
%>
Good afternoon!
<%
}
%>
```
也可以在脚本中进行声明,并且这些声明会在页面上的后续 JSP 标签中被识别。
### 1.3 注释标签
注释标签类似于 HTML 注释,但在页面发送到浏览器之前会被移除。注释标签以 `<%--` 开头,以 `--%>` 结尾。
示例:
```jsp
<%-- Search algorithm --%>
```
这种标签只对一行有效,多行注释需要重复使用这些标签,例如:
```jsp
<%-- Search algorithm --%>
<%-- Implements Quicksort --%>
```
### 1.4 动作标签
动作标签执行各种扩展 JSP 标准功能的操作,例如使用 JavaBeans。开始标签指定一个库和一个动作名称,用冒号分隔,结束的 `>` 前有一个斜杠 `/`。
示例:
```jsp
<jsp:useBean id="manager" class="staff.Personnel" scope="session" />
```
这里对 `useBean` 和相关属性的引用表示使用了一个 JavaBean。
## 2. 隐式 JSP 对象
为了提供动态网站所需的灵活性,支持 JSP 的 Web 服务器会自动提供一些对象,JSP 可以在不进行显式声明的情况下使用这些对象。共有九个这样的对象,如下表所示:
| 变量 | 类型 | 用途 |
| ---- | ---- | ---- |
| request | HttpServletRequest | 最初发送到服务器的 HTTP 请求 |
| response | HttpServletResponse | 对请求的 HTTP 响应 |
| session | HttpSession | 与上述请求和响应关联的会话对象 |
| application | ServletContext | 保存多个用户可以访问的其他对象的引用,如数据库链接 |
| out | JspWriter | 写入响应输出流的对象 |
| exception | Throwable | 包含运行时错误信息,仅在错误页面可用 |
| pageContext | PageContext | 封装页面上下文 |
| config | ServletConfig | 此 JSP 的 ServletConfig 对象 |
| page | Object | 此 JSP 中的 `this` 对象引用 |
其中,`ServletContext` 是每个 Servlet 引擎实现的接口,它为 Servlet 提供了了解其环境的方法。该接口有两个方法 `getAttribute` 和 `setAttribute`,与 `Session` 类的同名方法相对应。
示例:
```jsp
String userName = (String)application.getAttribute("name");
Float balanceObject = (Float)application.getAttribute("balance");
application.setAttribute("total", new Integer(0));
```
`application` 对象的其他一些有用方法如下:
- `public Enumeration getAttributeNames()`
- `public void removeAttribute(String name)`
## 3. 与 Servlet 协作
Servlet 常与 JSP 结合使用,考虑让两者轻松协作的方法很有必要。Servlet 和 JSP 共享信息主要有两种方式:共享与单个用户会话相关的数据,以及共享与应用程序环境相关且适用于所有访问该网站用户的数据。对于 JSP,这两类信息分别由隐式对象 `session` 和 `application` 提供。
### 3.1 会话信息共享
如果在引用 JSP 时,Servlet 已经在同一会话中创建了 `Session` 对象,那么 JSP 的隐式对象 `session` 将包含原 `Session` 对象中放置的任何属性 - 值对。因此,`session` 对象可以使用其 `getAttribute` 方法检索 Servlet 存储的任何信息。
### 3.2 应用程序环境信息共享
`HttpServlet` 通过其父类 `GenericServlet` 实现了 `ServletConfig` 接口,该接口有一个 `getServletContext` 方法,返回一个 `ServletContext` 引用。为了获得对环境级信息的读写访问权限,Servlet 首先调用此方法并存储返回的 `ServletContext` 引用,然后像在 JSP 中对隐式对象 `application` 调用方法一样,在 `ServletContext` 引用上调用 `getAttribute` 和 `setAttribute` 方法。
示例:
```java
ServletContext context = getServletContext();
String userName = (String)context.getAttribute("name");
```
类似地,当首次引用 JSP 时创建的 `application` 对象将自动包含 Servlet 先前设置的任何属性 - 值对。
## 4. JSP 实战示例 - 购物车应用
为了说明 JSP 如何与 Servlet 协作,重新实现上一章的购物车示例。
### 4.1 初始页面修改
将初始页面重命名为 `ShoppingCartX.html`,只需修改表单的 `ACTION` 属性地址,指定为一个名为 `Selection.jsp` 的 JSP:
```html
<FORM METHOD = POST ACTION = "Selection.jsp">
```
### 4.2 Selection.jsp 代码
```jsp
<!-- Selection.jsp -->
<HTML>
<HEAD>
<TITLE> <%= currentProduct %> </TITLE>
<STYLE>
body{text - align = center; color = blue;}
</STYLE>
</HEAD>
<BODY>
<%
String currentProduct;
currentProduct = request.getParameter("Product");
if (currentProduct.equals("Checkout"))
response.sendRedirect("Checkout.jsp");
else
session.setAttribute("currentProd", currentProduct);
%>
<H1><P STYLE = "color:red"> <%= currentProduct %>
</P></H1>
<BR><BR><BR>
<FORM METHOD = POST ACTION = "WeightX">
<TABLE>
<TR>
<TD>Quantity required (kg)
<INPUT TYPE = 'Text' NAME = Qty VALUE = '' SIZE = 5></TD>
</TR>
</TABLE>
<BR><BR><BR>
<TABLE>
<TR>
<TD><INPUT TYPE = 'Radio' NAME = 'Option' VALUE = 'Add' CHECKED>
Add to cart.
</TR>
<TR>
<TD><INPUT TYPE = 'Radio' NAME = 'Option' VALUE = 'Remove'>
Remove item from cart.
</TR>
<TR>
<TD><INPUT TYPE = 'Radio' NAME = 'Option' VALUE = 'Next'>
Choose next item.
</TR>
<TR>
<TD><INPUT TYPE = 'Radio' NAME = 'Option' VALUE = 'Checkout'>
Go to checkout.
</TR>
</TABLE>
<BR><BR><BR>
<INPUT TYPE = 'Submit' VALUE = 'Submit'>
</FORM>
</BODY>
</HTML>
```
### 4.3 Weight Servlet 修改
原 `Weight` Servlet 只需修改类头行和指定 URL 的行,修改后的 Servlet 命名为 `WeightX`。
### 4.4 Checkout.jsp 代码
```jsp
<!-- Checkout.jsp -->
<%@ page import = "java.util.Enumeration" %>
<HTML>
<HEAD>
<TITLE>Checkout</TITLE>
<STYLE>
body{text - align = center; }
table,th,td{border:2px solid black;}
table{background - color:aqua;}
</STYLE>
</HEAD>
<BODY>
<%
final float APPLES_PRICE = 1.45F;
final float PEARS_PRICE = 1.75F;
//In a real application, the above prices would be retrieved from a database, of course.
%>
<BR><BR><BR>
<H1><P STYLE = "color:red">Order List</P></H1>
<BR><BR><BR>
<TABLE>
<TR>
<TH>Item</TH>
<TH>Weight(kg)</TH>
<TH>Cost(£)</TH>
</TR>
<!-- Now make use of the implicit object session -->
<!-- to r
```
0
0
复制全文
相关推荐










