Javabean——“helloworld”級別的應用

本文章對應於《輕量級JavaEE企業應用實戰(第四版)》——Struts2+Spring4+Hibernate整合開發 李剛編著

(其實我也初心者,把遇到的不起眼問題整理解決之後po出來,有助於跟我一樣的初心者快速學習JSP/Servlet)

在幾天之前,我快樂的學習Javabean的第一個應用的時候,按照本書的第79頁,寫程序。按照書中所說,一步一步來進行。首先我看到了書中79頁jsp清單和80頁Person類的清單,其題目分別是codes\02\2.5\directive\beanTest.jsp和codes\02\2.5\directive\WEB-INF\src\lee\Person.java。唔我知道了些什麼:大概就是在webapps下有N多層文件,最終有個叫做directive的文件夾,裏面有兩個分別叫做beanTest.jsp和WEB-INF的文件或文件夾。其中WEB-INF裏還有子文件夾,這些在本書前些內容裏也提到過文件夾的用處。好了,我爲了簡便,就直接在webDemo下建立項目,以下就是我建立的文件目錄:
webapps:
    └webDemo
        └directive:
            ├WEB-INF:
            │   ├classes:
            │   ├lib:
            │   ├src:
            │   │   └lee:
            │   │       └Person.java
            │   └web.xml
            └beanTest.jsp

好,有了目錄之後就好說了,照着書上搬程序吧。
以下爲我測試的代碼:
beanTest.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <jsp:useBean id="p1" class="lee.Person" scope="page"/>
    <jsp:setProperty name="p1" property="name" value="ZZU"/>    
    <jsp:setProperty name="p1" property="age" value="32"/>
    <jsp:getProperty name="p1" property="name"/><br/>
    <jsp:getProperty name="p1" property="age"/><br/>
  </body>
</html>

Person.java

public class Person{
        private String name;
        private int age;
        public Person(){
            }
        public Person(String name,int age){
                this.name = name;
                this.age = age;
            }
        public void setName(String name){
                this.name = name;
            }
        public String getName(){
                return this.name;
            }
        public void setAge(int age){
                this.age = age;
            }
        public int getAge(){
                return this.age;
            }
    }

web.xml就不貼了,基本是塊骨頭,沒肉。

接下來我就進入的測試階段。按照書中所說,先用javac編譯Person.java文件,生成Person類,放在classes路徑下。之後就打開tomcat的開始運行測試,發現拋出異常了,也就是java.lang.NoClassDefFoundError: lee/Person (wrong name: Person)這樣的異常。回頭檢查代碼發現,在jsp頁面中body體內,引用類用的是這樣的一個東西class=“lee.Person”。誒呦,這點東西當然難不倒我啦,肯定是這樣的:在class文件下的還有個文件夾叫做lee,然後裏面放的是Person.class文件。這樣肯定沒錯啦。嘿嘿嘿~~~之後纔是最可怕的事,竟然還是這樣的異常錯誤>,< 黑人問號.jpg。

why,再想想問題。不管了我在所有的文件夾下面都放好Person.class文件,我就不行它找不到。結果不出所料依然是異常,難死了,摔書。之後就是各種查論壇,各種逛blog。然後發現大家很多都是在myeclipse中建立項目解決的這個問題的。好,那這樣我也用myeclipse試試吧。當我試過之後,給出了書中的結果。嗯。是的,運行成功了。

成功之後要找原因啊,我把myeclipse中生成的工程目錄和自己建的目錄對比,確實沒發現問題啊。現在我已經是指數次冪懵逼了 = =什麼東西好詭異啊。之後我又新建了項目,把myeclipse中生成的東西一項一項的移到新的項目中,OK,依然成功。我心想,myeclispe果然牛V啊,myeclispe大法好啊,文件自帶success BUFF。然後我還是鬱悶啊,爲什麼呢,到底爲什麼呢。突然靈光乍現,想到成功和失敗的不同的地方。

**好了,接下來是乾貨**

我實驗測試的不同的地方在於,myeclipse中生成的項目是直接建立在tomcat內webapps下的,而我按照書中手動建立的項目是在tomcat內webapps裏一個叫做directive的文件下。會不會是這樣的原因,tomcat在執行操作時,查找類文件的時候是查找webapps下項目裏第一個classes文件內的類文件,而不是運行項目相應的classes內的類文件。或許我這樣說不太清楚,接下來我上目錄。

第一個是myeclipse下生成的項目路徑內文件,以webapps開始:
webapps:
    └beanTest:
        ├WEB-INF:
        │   ├classes:
        │   │   └lee:
        │   │       └Person.class
        │   ├lib:
        │   └web.xml
        └beanTest.jsp
第二個是手動建立按照書中要求推斷的項目路徑文件,以webapps開始:
webapps:
    └webDemo
        ├directive:
        │   ├WEB-INF:
        │   │   ├classes:
        │   │   ├lib:
        │   │   ├src:
        │   │   │   └lee:
        │   │   │       └Person.java
        │   │   └web.xml
        │   └beanTest.jsp
        ├WEB-INF:
        │   ├classes:
        │   ├lib:
        │   ├src:
        │   └web.xml
        └XXX.jsp
此時,我在運行手動建立的項目時,即在瀏覽器內輸入這樣的地址localhost:8080//webDemo/directive/beanTest.jsp時,Tomcat應該是從webDemo下的WEB-INF內的classes檢索Person.class類文件,而不是從directive下的WEB-INF檢索。當我檢驗時,把Person.class類文件放入webDemo下的WEB-INF內的classes時,再次運行,就變得正常了。
**好了,乾貨結束**
= =我擦,這也太反人類了吧,不在項目內檢索,非要跑到父文件下檢索。也可能是我這樣的新手對Tomcat的運行機制不太瞭解,纔出現這樣的問題吧。

最後感嘆一句,tomcat真是一隻頑皮的小貓啊~~~~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章