Only a type can be imported. l1.l2.MyClass resolves to a package
==========這裡是解決方案===============
把生成的MyClass.class複製到網站根目錄下的WEB-INF下的classes目錄下,如果沒有classes,就建一個,然後在classes目錄下,按照包的層級逐層建立目錄,例如l1.l2.MyClass,就建一個l1目錄,在l1目錄下建l2目錄,把MyClass.class複製到l2目錄下,即可。
==========以下是過程===============
昨天和今天,一直在嘗試在JSP中呼叫JavaBean,看似很簡單的事情,卻遇到這個問題,遍搜全網,包括英文,下面這句給了我一些提示:
If you spell the class name wrong or the class isn't on the classpath, the JSP processor will say it "resolves to a package" rather than that it doesn't exist. This was driving me crazy today as I kept not seeing a typo I'd made.
就是說,你寫錯類名了,它就找不到,也就是說,隨便寫個類名,java找不到,就會出這個提示,說你寫的這個類被解析為包,它不說找不到這個類。
整個問題過程如下:
1.用Eclipse Java Neon在專案中建立jsp頁面a.jsp,位於D:\eclipseWorkspace\MentalArithmetic\WebContent,並在tomcat的conf目錄下的server.xml中配置host節,設定為
<Context path="" docBase="D:\eclipseWorkspace\MentalArithmetic\WebContent" debug="0" privileged="true" reloadable="true">
</Context>
2.專案中右鍵new一個java的class,類名叫MyClass,包名叫l1.l2,它會在java Resources節點下的src目錄下建立java檔案,對應於MentalArithmetic目錄下的src目錄,類似這樣D:\eclipseWorkspace\MentalArithmetic\src\l1\l2,l1和l2是包的名字,layer1和layer2的意思。
package l1.l2; public class MyClass { public MyClass() { } public String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
3.專案中右鍵new一個jsp檔案,我叫它a.jsp,在MentalArithmetic\WebContent,也就是網站根目錄下。並在此檔案中引入類,程式碼如下:
<%@ page language="java" import="l1.l2.MyClass"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form> <% MyClass b = new MyClass(); b.setAddress("kkkkkkkkkkkkkkkkk"); out.print(b.getAddress()); %> </form> </body> </html>
理論上,如果這是一個在eclipse中關聯緊密的專案,像visual studio一樣,這個時候應該是可以執行了。背後的很多工作,應當由IDE來完成。
然而,問題來了。無論我怎樣執行,都會提示Only a type can be imported. l1.l2.MyClass resolves to a package,做了很多嘗試,確認我沒有寫錯。把eclipse在build中生成的MyClass.class到處貼上,每一個可能的地方,均無效。網上說tomcat會在網站根目錄下的WEB-INF下的classes中找類的資訊,這個其實是對的,但是在不清楚全過程的情況下,這麼一句是無法解決問題的,我把MyClass.class複製到了classes目錄下,然並卵,仍然無效。不細說了。
找了很多網站,找了很多書,依然然並卵。
最後,絕望極了。
然後就思考一個問題,如果JSP頁面中,隨便寫個匯入類的語句,如<%@ page import="a.b.c"%>,就會報下面這個錯
Only a type can be imported. a.b.c resolves to a package
無論a.b.c是否真的存在,這說明系統沒有找到a.b.c這個類,那麼問題就變成了“如何讓系統找到自定義的類?”
如果tomcat會在網站根目錄下尋找類的位元組碼,那麼它是不是像eclipse中定義的一樣,一層一層地去尋找呢?
開啟網站根目錄下的WEB-INF,這個目錄是eclipse生成的,裡面毛也沒有。
新建了一個classes目錄,在其下又新建了一個l1子目錄,在l1下又新建了一個l2子目錄,把MyClass.class複製過來,再執行http://localhost/a.jsp,成功。
我一點都不興奮。
這是不是意味著,每次寫完javaBean,都要手動把class複製到WEB-INFO目錄去?可能有更好的方法,目前不知道。
作為eclipse來講,如此基礎的工作都沒有完成,這個IDE真的好用麼?
是不是開源的工具都是這樣,易用性較差,學習曲線陡峭,如果你會用,那它還挺好使的,如果你是不會用的初學者,要花很多的時間和精力去學習。
從這個角度來看,微軟真的挺偉大的,致力於讓開發者把精力集中在業務上,開發工具簡單得一塌糊塗,包括java的開發者在內,都認為VS太好用了,節省大量時間。但是它的正版工具價格與破解成本比起來,實在讓人無法產生購買慾。如果VS和.net能繼續開源,繼續發展,超過Java也並非不可能。