shi asked in 電腦與網際網路程式設計 · 1 decade ago

JavaBean-request的問題?

請問題目中, 會調用訪問人次:顯示為2, 但不知為捨麼 我沒顯示出2呢?

sample3.java

package sh1;

import java.io.*;

public class sample3{

public sample3(){

}

private int num = 0;

public void setNum(int num) {

this.num = num;

}

public int getNum(){

num++;

return num;

}

}

Index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>

<jsp:useBean id="splBean" class="sh1.sample3" scope="request"/>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>request的範圍JavaBean</title>

</head>

<body>

<% splBean.getNum();%>

-<center><p><font size="5">訪問人次:<strong><jsp:include page="sample4.jsp" flush="true"/></strong></font></p></center>

<p>請你分別做如下操作,看訪問人次的變化情況:</p>

<p>1、按F5鍵或者單擊【查看】/【刷新】命令來刷新頁面。</p>

<p>2、單擊【文件】/【新建】/【窗口】命令打開一個相魂的新窗口。</p>

<p>3、再打開一個瀏覽器並訪問此JSP網頁。</p>

<p>4、在網絡中的另一台計算機上訪問此JSP網頁。</p>

</body>

</html>

Sample4.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>

<jsp:getProperty name="splBean" property="num"/>

2 Answers

Rating
  • Samuel
    Lv 5
    1 decade ago
    Favorite Answer

    1. 我只針對您的問題回答, 至於您程式目的是什就不討論了. 我假設您至少有一定程度了解 java.

    2. 您無法得出結果的原因在於要了解 jsp:include 的運作方式. 用 jsp:include 包含進來的 jsp 程式是一個獨立執行單元(translation units), 所以在呼叫端程式所寫的宣告(and/or 初始)並無法在另一個 jsp(其實是 java啦)程式"看到".

    3. 用 jsp:useBean 使用 javabeans 時, Servlet container(伺服器)會產生一段程式為您做2件事, 首先 在您 jsp:useBean的 scope(預設值是 page) 中找尋是否有叫做這個名字(id)的 Attribute(一個物件) 存在, 如果有就將此物件轉型(cast)為jsp:useBean的class物件並指定給id所包含名字的變數. 其次如果不存在就 new 一個物件給變數, 並將此物件加入 scope 的 Attribute.

    4. 所以依據您的 index.jsp, 一個sample3物件是以splBean的名字存入 request scope 的 Attribute. 在 sample4.jsp 執行 jsp:getProperty 時, 伺服器根據scope預設值是 page 去尋找叫做splBean的物件, 並叫用此物件的 getNum(), 此時當然找不到, 因為 index.jsp 是將其存入 request scope.

    5. 解法, 在 sample4.jsp 加一行 jsp:useBean 跟 index.jsp 一樣, 如此伺服器就找的到此物件. 您擔心是否會多初始了一個不一樣的物件, 如果您看懂第3項, 您就知道不會, 除非 scope 不同. 所以全部只需加一行, 程式就OK了, 每次都顯示 "訪問人次 : 2". 順帶提醒您(以免您不知)您的 charset 都設成 utf-8 所以如果您程式的中文是存成 big5(大部分視窗的選擇), 那網頁的中文會是一堆亂碼. sample4.jsp 程式如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"%>

    <jsp:useBean id="splBean" class="sh1.sample3" scope="request"/>

    <jsp:getProperty name="splBean" property="num" />

    2008-10-02 10:54:34 補充:

    sample4.jsp 另一個寫法, 不是好的方法, 失去了用 tag 的最終目的:不須寫Java!!!

    <%@ page language="java" contentType="text/html; charset=utf-8"%>

    <%= ((sh1.sample3)request.getAttribute("splBean")).getNum() %>

  • 吉他
    Lv 5
    1 decade ago

    一開始是1吧,之後你依序測試他說的才會變2,如下

    請你分別做如下操作,看訪問人次的變化情況:

    1、按F5鍵或者單擊【查看】/【刷新】命令來刷新頁面。

    2、單擊【文件】/【新建】/【窗口】命令打開一個相魂的新窗口。

    3、再打開一個瀏覽器並訪問此JSP網頁。

    4、在網絡中的另一台計算機上訪問此JSP網頁。

    你看到的是他書裡的圖片是2吧

Still have questions? Get your answers by asking now.