小弟最近在学习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联系起来的呢 ??
还请大家指导下小弟

解决方案 »

  1.   

    这个你需要看一下xml配置文件了。
    具体忘了,好久没研究这个了。
      

  2.   

    看看el表达式吧 
    <%=errgen.getDivideByZero() %>等价于${errgen.divideByZero}。
      

  3.   

    貌似${errgen.divideByZero} 這種寫法  要就是行不通 讀不出來 
    一旦讀出來 說明你配置對了  
    自動去尋找getDivideByZero方法調用它,因為即使你聲明了divideByZero也是private屬性  你無法直接讀取的,一般都是根據屬性名稱自動調用get方法的 
      

  4.   

    这种写法是javabean基于组件模型设计的规范,你看下javabean的相关资料就明白了。
      

  5.   

    明白了class跟bean的区别你就不会困惑了。
      

  6.   

    其他的先不说,先看你的ErrorGenerator 类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 "";
        }
        
        
    }
    首先 ,在这个类中你的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 "";//返回你想要的值
        }
        
        
    }希望我说明白了
      

  7.   

    回复 9#
    首先谢谢你的回复。
    因为我这个是 错误处理 的例子,就是要看 被0除的异常,所以返回空字符串是无所谓的。showerr.jsp将打印错误的调用栈。而且就是因为ErrorGenerator类没有属性divideByZero,我才发的这个提问的代码是书籍源代码,确实没有此属性。
    我就是想知道在没有属性divideByZero时,jsp如何知道寻找getDivideByZero()这个方法。
    第一次发帖,没有表述清楚,谢谢关注哈