本文章對應於《輕量級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真是一隻頑皮的小貓啊~~~~~