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也並非不可能。