周一
接著半拉子半死不活的投票系統,繼續孤軍奮戰于無人境界。我的PL頭兒就沒見著鬼影,大好的周一,不來上班。誰讓人牛呢。
?
javax.servlet.ServletException: org/apache/jsp/testjsp_jsp (wrong name: org/apache/jsp/TestJSP_jsp) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:244) javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause
java.lang.NoClassDefFoundError: org/apache/jsp/testjsp_jsp (wrong name: org/apache/jsp/TestJSP_jsp) java.lang.ClassLoader.defineClass1(Native Method)
?這個錯誤,調了一個小時都沒用。服務器Tomcat已經被我關開瘋了。于是,我換了一下思路,開始琢磨servlet起作用的機制。
首先右鍵點我的電腦。打開屬性。然后選擇
“
高級
”
里面的
“
環境變量
”
,在新的打開界面中的系統變量里需要設置三個屬性
“java_home”
、
“path”
、
“classpath”,
其中在沒安裝過
jdk
的環境下,
path
屬性是本來存在的。而
java_home
和
classpath
是不存在的。
?? ?
首先點
“
新建
”
,然后在變量名寫上
java_home
,顧名其意該變量的含義就是
java
的安裝路徑,呵呵,然后在變量值寫入剛才安裝的路徑
“E:\Java\jdk1.6.0_02”
;
其次在系統變量里面找到 path ,然后點編輯, path 變量的含義就是系統在任何路徑下都可以識別。打開該變量時,會發現其 “ 變量值 ” 后面的文本框中已經有了內容,我們不要刪除這些內容,而是按 “End” ,定位到該文本框的末尾,如果末尾有一個分號 “;” ,就直接添加 JAVA 命令所在的路徑,如果沒有分號,則需要添加一個分號后再添加 JAVA 命令的路徑 ——java 命令的路徑是 “%java_home%\bin;%java_home%\jre\bin”( 其中 “%java_home%” 的意思為剛才設置 java_home 的值),也可以直接寫上 “E:\Java\jdk1.6.0_02” ;
最后再點 “ 新建 ” ,然后在變量名上寫 classpath, 該變量的含義是為 java 加載類 (class or lib) 路徑,只有類在 classpath 中, java 命令才能識別,其值為 “.;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar ( 要加 . 表示當前路徑 )” ,與 “%java_home%” 有相同意思。
-----------------------事實證明,貌似沒用-----------------------------------------
???1.
到
Tomcat
的安裝目錄的
webapps
目錄,可以看到
ROOT
,
examples, tomcat-docs
之類
Tomcat
自帶的的目錄;
?
?? ?2.
在
webapps
目錄下新建一個目錄,起名叫
myapp
;
?
?? ?3.myapp
下新建一個目錄
WEB-INF
,注意,目錄名稱是區分大小寫的;
?
?? ?4.WEB-INF
下新建一個文件
web.xml
,內容如下:
?
<?
xml
version
=
"1.0"
encoding
=
"ISO-8859-1"?
>
<
display-name
>
My Web Application
</
display-name
>
</ web-app > |
?
在我的電腦
->
屬性
->
高級
->
環境變量
->
系統變量中添加以下環境變量
(
假定你的
tomcat
安裝在
e:\tomcat
):
CATALINA_HOME
:
c:\tomcat
CATALINA_BASE
:
c:\tomcat
TOMCAT_HOME:? c:\tomcat??? ?????????
????
如果是第一次設置
tomcat
的環境變量,上面的這三個變量都是沒有的,因此都需要
“
新建
”
,以第一個變量為例:點擊
“
新建
”,
輸入變量名為
CATALINA_HOME
,輸入變量值為
c:\tomcat
。
????? 然后修改環境變量中的 classpath (這一步與上面 jdk 相關聯,這里的 classpath 變量便是上面在安裝 jdk 時所創建的環境變量):把 tomat 安裝目錄下的 common\lib 下的 servlet.jar 追加到 classpath 中去,修改后的 classpath 如 下: classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib \tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar (注意:末尾最好別加分號) 注意:雙擊打開 classpath 變量時,其值為 jdk 的相關值,即:
?? ?.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar ,現在要追加 tomcat 的該變量值,需要先 在末尾添加一個分號 ( 如果末尾有分號,就不必添加了 ) ,然后再添加 tomcat 的值: ?? ??? ??? ??? ??? ?????? ??? ??%CATALINA_HOME%\common\lib\servlet-api.jar 。
?
--------------------------------依然沒用!!--------------------------------------
?
??? ?5. 在 myapp 下新建一個測試的 jsp 頁面,文件名為 index.jsp ,文件內容如下: ?
?
< html > < body >
<
center
>
</ body > </ html > |
?? ?6.
重啟
Tomcat?
?? ?7.
打開瀏覽器,輸入
http://localhost:8080/myapp/index.jsp
看到當前時間的話說明就成功了。
?? ?8. 如果在這一步出現如下錯誤:
??? ?exception
?? ?javax.servlet.ServletException: javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver
那 就檢查一下 Tomcat/lib 下是否已經有 el-api.jar? el-ri.jar 兩個 jar 文件,沒有則拷貝到此目錄下。重啟 Eclipse 測試;同時,如果機器上已經有 Eclipse ,又安裝 MyEclipse , MyEclipse 會自動查找 jre, 他首先檢測到的是 C:\Program Files\Java ( jdk 安裝目錄)中的 jre ,而不是 C:\Program Files\Java\jdk1.5.0_06 中的 jre ,原先的 Eclipse 的 jre 也隨之改動(解決方法 (Eclipse 為例, MyEclipse 類似 )window->preferences->Java->Installed JRES->Edit-> 更改 jre home 為 C:\Program Files\Java\jdk1.5.0_06 );如果還不行,就將 el-api.jar 包也添加到 classpath 環境變量中去。 如 果這樣還不行,就再參考一下這一段:原 因:在 Eclipse 的 Windows -->> Preference? -->>Tomcat 設置 Tomcat Home 路徑后,又在 Tomcat 的 Advanced 選中設置了相同的 Tomcat Base 路徑,關鍵一步是 Advanced 下有項: Add Java projects to tomcat classpath ,勾上所選項目之后,才可以正常的引起 javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver?
解決辦法:從哪里勾上的,就從哪里勾回去,把 Add Java projects to tomcat classpath 勾掉。 如 果上面的方法都不行,那就只好出一個必殺招了 —— 卸載安裝好的 jdk 、 tomcat 和 eclipse ,并清除 jdk 和 tomcat 的環境變量,然后重新安 裝一遍 jdk 、 tomcat 和 eclipse ,并設置 jdk 和 tomcat 的環境變量。可能是我這個人比較搓,我每次將我在公司做好的項目拷回來研究時, 總是會出現這樣的錯誤,并且每次無論怎樣搞, tomcat 依然會報 “ java.lang.NoClassDefFoundError: javax/el/ELResolver ” 的錯誤,最后終于恨下心來,專門花了一個星期的時間來研究解決之道,最后才想出了這個 “ 先毀滅再重建 ” 的不是辦法的辦法,并且每一次都屢試不爽!
?
這是另一個高手寫的,可這并不是我的問題,我原來投票系統致命的問題是,不能喚醒和調用httpservice服務,所以我就在tomcat環境下,配合jdk1.5,看這個javax.servlet.ServletException是否運作,可是問題卻僵持在了永久的http404?? ***.jsp不是可調用的問題上,服務器找不到文件!!這么簡單,可是就是沒調出來。
----------------害的我差點沖動要重裝所有軟件,還好,我挺住了所有沖動\!!!!----------
5
第四步——建立自己的
Servlet
???
緊接上面第三節中的第三步“建立自己的
jsp app
目錄
”,接下來寫入你的第一個
Servlet:
在你新建的
Application
myapp/WEB-INF/classes
/test
目錄下新建
HelloWorld.java
?
package test;
import
java
.
io
.*;
|
??
然后照樣用
javac HelloWorld.java
來編譯這個文件,如果出現無法
import javax.servlet.*
??
那么就是應該把
C:\Tomcat\common\lib
里面的
servlet-api.jar
文件拷貝到
C:\JDK\jre\lib\ext
中,再次編譯,就沒有問題了!
??
然后在
Tomcat
目錄里面的
C:\Tomcat\webapps\myapp
里面按如下的文件結構:
?? myapp\index.jsp
?? myapp\WEB-INF\classes\
test
\HelloWorld.class(
把上面生成的
HelloWorld.class
文件放在這個里面
)
????Servlet
必須使用
C:\Tomcat\webapps\myapp\WEB-INF
這個目錄下面的
web.xml
文件進行注冊,
?? ?
用
EditPlus
打開這個
web.xml
文件,
?? ?
在
<web-app></web-app>
添加下面這段程序
:
?
<
servlet
>
|
??? ? 為什么呢? 因為這樣的結構
?? <servlet>
?? <servlet-name>HelloWorld</servlet-name>
?? <servlet-class>
test
.HelloWorld</servlet-class>//
類的路徑
?? </servlet>
?? ? 表示指定包含的 servlet 類,而以下的結構
?? <servlet-mapping>
?????<servlet-name>HelloWorld</servlet-name>
??? <url-pattern>/HelloWorld</url-pattern>
?? </servlet-mapping>
?? ? 表示指定 HelloServlet 應當映射到哪一種 URL 模式。在修改 web.xml 完畢過后,重新啟動 Server ,然后再輸入 http://localhost:8080/myapp/HelloWorld , ,那么偌大一個 Hello,World! 等著你呢,恭喜你 !
?? ? 第五步 :建立自己 java Bean
?? ?1. 在你新建的 Application myapp/WEB-INF/classes /test 目錄下新建 TestBean.java
?
package
test
;
|
?? ? 然后照樣用 javac TestBean.java 來編譯這個文件。
?? ?2. 然后在你新建的應用程序目錄 myapp 下新建一個新的 jsp 文件: testBean.jsp
?
<%@
page
import
=
"test.TestBean"
%>
|
?? ? 好了,確定各個文件的位置:
?
myapp\index
.
jsp
|
?? ?3. 重啟 Tomcat 如果需要的話,在瀏覽器輸入 : http://localhost:8080/myapp/testBean.jsp ? 幸運的話就會看到 :
?? ?Java Bean Test: The author's blog address isHttp://yexin218.cublog.cn
?? ? 這樣就完成了整個 Tomcat 下的 jsp 、 servlet 和 javabean 的配置。
?
?如果路徑沒有問題的話你看下你的目錄下是不是有這個文件:/WEB-INF/web.xml
如果沒有的話去到別的目錄中拷一個過來,比如webdav目錄下就有一個。
這時重新起動TOMCAT,就OK了。我也是在網上搞了半天,說這說那個都沒不實用,我就發這個最有用。你試試看。我懶人只會懶方法!
我看了這句,于是,在web.xml里附加了這句話
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>My Web Application</display-name> <description> A application for test. </description> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>test.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app>
?
?
??
?重新啟動了一下服務器,然后,不可思議的是,全好了!!!!!!!!!!!!!!!!!!!!
?
要servlet有servlet的反應,要目標地址**.jsp有那個文件的反應。
?
---------------------------------我問題最終解決的方法居然是-------------------------------------------------------
我組長從隔壁拉來一個高手,啟動服務器又關閉服務器,,若干類似,程序級錯誤,其實是后來又導進去的el-api.jar包放在tomcat/common/lib下即可,而我又再次附加在了eclipse/windows/properties/installed jres/,我這樣一來,就給程序duplicate,多重載了一次。然后就刪掉了,刪掉以后,就好了。。。
?
很不服氣啊。原本差不多了已經。
?
但是高手也教給我一點東西:編譯JSP,java的包,放在tomcat下的包中。因為這個時候,才能編譯通過,而不是放在eclipse下面的包。eclipse下面,又服務器servers這一個關鍵的項目,就放的是你要用來編譯的服務器tomcat!!!!
?
而弄好的原因,我琢磨:
少放了el-api.jar,servlet-api.jar包在服務器上,所以,它當然沒法調用httpservice嘍。。
?
所以高手一進門就預言的的確是對的:
這個錯誤,就是httpservice錯誤,應該是配置錯誤,缺少相應的jar 包!!
?
唉,我服了,心服口服。
?
---------------------------------------------------問題遠遠沒有結束-----------------------------------------------------------
最后提交,寥寥幾個字,我的心:提交錯誤,一遍又一遍的提交錯誤!!
折騰了一天沒找到錯誤,還去琢磨斷點怎么設置,后來的后來的后來,我無意中發現了,在run on server的時候,下面有輸出的所有信息,原來,作者就怕像我這樣的 小輩弄不懂,所以,故意,搞了一系列最關鍵的類似于:
System.out.println(strSql);
的檢查語句,可以檢測程序的運行程度。我的菜真讓自己見笑,昨個還忙活著要去弄什么斷點,全都寫好了已經。
拿到NAVICAT上直接調試,發現,在插入時候,問題四的字段varchar(11),白天(上午9:00至下午16:00),根本不止。我猜測應該是提取什么吧,否則,怎么會這么點長度,接著研究,反正我改成50就好了,可是插進去的全是??(??18:30???21:00),亂碼。。但最起碼,圖形已經弄出來了,看著自動生成的所有餅狀圖,心里還是著實安慰了不少。。
解決方法:
url = "jdbc:mysql://localhost/flexvote?autoReconnect=true&UseUnicode=true&characterEncoding=UTF-8";
在數據庫連接的時候采用的這個utf-8方法
插入數據的時候:
<%@ page contentType="text/html; charset=utf-8" import="java.sql.*"%>
contronldb.SetVote_Question4(new String(request.getParameter("Question4").getBytes("ISO8859-1"), "UTF-8"));
這是我隨便換著調試做出來的正確結果。仔細一看,是這樣的:
四、數據庫連接方式使用UTF-8編碼
JSP中要把網頁輸入的中文存入數據庫,通常有一個提交(Submit)的過程,是用str=request.getParameter("username"),然后執行update或者insert語句來存入數據庫。如何賦值給str很重要,而且這里中文輸入與網頁所使用的字體編碼有關。
1、 網頁使用UTF-8,使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),都可以使得存到數據庫里的數據是UTF-8編碼。
2. 網頁使用GBK,使用str= new String(request.getParameter("username").getBytes(),"GBK"),那么存入數據庫的是UTF-8編碼。
3. 值得注意的是使用UTF-8的數據庫連接方式不能存得GBK。
相關:
一、數據庫連接方式使用UTF-8
在連接數據庫的驅動后面加上這句參數useUnicode=true&characterEncoding=
UTF-8,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&useUnicode=
true&characterEncoding=UTF-8,從數據庫里讀出中文顯示在使用GBK的JSP的網頁里,如果數據庫里存放的字體編碼是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1),可以正確顯示中文。如果數據庫里存放的是GBK數據,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")來顯示正確的中文。值得注意的是如果頁面使用UTF-8,數據庫里存放的是UTF-8,也可以用str=new String(rs.getBytes(1),"GBK")正確顯示中文。如果網頁是UTF-8,而數據庫里存放的是GBK,無法直接顯示中文,需要2步轉換, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK"),才可以正確顯示中文。
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
