小弟最近在学习jsp,看的是 JSP程序设计 在第十章 错误处理 时碰到一个不解处。
先贴下源码:
index.jsp<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page errorPage="showerr.jsp" %>
<html>
<head>
<jsp:useBean id="errgen" class="com.wrox.begjsp.ch10.ErrorGenerator" /><title>Error Generating page</title>
</head>
<body>
<h1>Page to Generate Error</h1>
<table>
<tr>
<td><h3>${errgen.divideByZero}</h3></td>
</tr>
</table>
</body>
</html>
ErrorGenerator类:
package com.wrox.begjsp.ch10;
public class ErrorGenerator {
private Integer[] tpArray = new Integer[3];
public ErrorGenerator() {
}
public String getOutOfRange() {
tpArray[3] = tpArray[2];
return "";
}
public String getDivideByZero() {
tpArray[3] = new Integer(1/0);
return "";
}
}
showerr.jsp:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage="true" %><html>
<head>
<title>An Error is detected</title>
</head>
<body>
<h1>Error Detected</h1>
<table width="600" border="1"><tr valign="top">
<td ><b>Error:</b></td>
<td>${pageContext.exception}</td>
</tr><tr valign="top">
<td><b>URI:</b></td>
<td>${pageContext.errorData.requestURI}</td>
</tr>
<tr valign="top">
<td><b>Status code:</b></td>
<td>${pageContext.errorData.statusCode}</td>
</tr><tr valign="top">
<td><b>Stack trace:</b></td> <td>
<c:forEach var="trace" items="${pageContext.exception.stackTrace}">
<p>${trace}</p>
</c:forEach>
</td>
</tr></table></body>
</html>在index.jsp中这句: ${errgen.divideByZero} 我觉得应该在ErrorGenerator类中有对应的属性divideByZero,但是其中并没有。同时代码运行达到了预期的效果.
那么jsp是如何把方法:getDivideByZero() 与divideByZero联系起来的呢 ??
还请大家指导下小弟
先贴下源码:
index.jsp<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page errorPage="showerr.jsp" %>
<html>
<head>
<jsp:useBean id="errgen" class="com.wrox.begjsp.ch10.ErrorGenerator" /><title>Error Generating page</title>
</head>
<body>
<h1>Page to Generate Error</h1>
<table>
<tr>
<td><h3>${errgen.divideByZero}</h3></td>
</tr>
</table>
</body>
</html>
ErrorGenerator类:
package com.wrox.begjsp.ch10;
public class ErrorGenerator {
private Integer[] tpArray = new Integer[3];
public ErrorGenerator() {
}
public String getOutOfRange() {
tpArray[3] = tpArray[2];
return "";
}
public String getDivideByZero() {
tpArray[3] = new Integer(1/0);
return "";
}
}
showerr.jsp:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isErrorPage="true" %><html>
<head>
<title>An Error is detected</title>
</head>
<body>
<h1>Error Detected</h1>
<table width="600" border="1"><tr valign="top">
<td ><b>Error:</b></td>
<td>${pageContext.exception}</td>
</tr><tr valign="top">
<td><b>URI:</b></td>
<td>${pageContext.errorData.requestURI}</td>
</tr>
<tr valign="top">
<td><b>Status code:</b></td>
<td>${pageContext.errorData.statusCode}</td>
</tr><tr valign="top">
<td><b>Stack trace:</b></td> <td>
<c:forEach var="trace" items="${pageContext.exception.stackTrace}">
<p>${trace}</p>
</c:forEach>
</td>
</tr></table></body>
</html>在index.jsp中这句: ${errgen.divideByZero} 我觉得应该在ErrorGenerator类中有对应的属性divideByZero,但是其中并没有。同时代码运行达到了预期的效果.
那么jsp是如何把方法:getDivideByZero() 与divideByZero联系起来的呢 ??
还请大家指导下小弟
具体忘了,好久没研究这个了。
<%=errgen.getDivideByZero() %>等价于${errgen.divideByZero}。
一旦讀出來 說明你配置對了
自動去尋找getDivideByZero方法調用它,因為即使你聲明了divideByZero也是private屬性 你無法直接讀取的,一般都是根據屬性名稱自動調用get方法的
private Integer[] tpArray = new Integer[3];
public ErrorGenerator() {
}
public String getOutOfRange() {
tpArray[3] = tpArray[2];
return "";
}
public String getDivideByZero() {
tpArray[3] = new Integer(1/0);
return "";
}
}
首先 ,在这个类中你的getDivideByZero返回的是空字符串,所以不论你怎么弄他返回的最多也就是个空字符串,在页面上是看不出什么效果的.
其次,你也没有真的明白el表达式${errgen.divideByZero}的工作原理
它的原理是:
首先按page,request,session,application的顺序去找errgen变量,当首次找到就停止,再去找errgen变量所引用的类的属性divideByZero的值,而它找divideByZero属性值则是通过类中提过的getter方法得到的,所以必须在你的ErrorGenerator中加一个divideByZero并未他提供getter方法,在getter方法中返回你想要返回的值;public class ErrorGenerator {
private Integer[] tpArray = new Integer[3];
private String divideByZero; public ErrorGenerator() {
}
public String getOutOfRange() {
tpArray[3] = tpArray[2];
return "";
}
public String getDivideByZero() {
tpArray[3] = new Integer(1/0);
return "";//返回你想要的值
}
}希望我说明白了
首先谢谢你的回复。
因为我这个是 错误处理 的例子,就是要看 被0除的异常,所以返回空字符串是无所谓的。showerr.jsp将打印错误的调用栈。而且就是因为ErrorGenerator类没有属性divideByZero,我才发的这个提问的代码是书籍源代码,确实没有此属性。
我就是想知道在没有属性divideByZero时,jsp如何知道寻找getDivideByZero()这个方法。
第一次发帖,没有表述清楚,谢谢关注哈