版本:
JDK 1.4.2 c:\jdk1.4
Eclipse 2.1 c:\eclipse
Tomcat 4.1.24 c:\tomcat4.1
Tomcat Plugins: com.sysdeo.eclipse.tomcat_2.1.0
Tomcat Patch: jasperDebugPatchV4.1.24.zip
存在的問題:
- Servlet調(diào)用問題
- JSP實時編譯問題
- 亂碼問題
- JSP編譯調(diào)試問題
如何解決:
1.Servlet調(diào)用問題
對于很多程序員開發(fā)的Servlet,如繼承于HttpServlet的程序,想通過URL調(diào)用進行直接調(diào)用,
但是發(fā)現(xiàn)通過如:http://localhost:8080/mywebapp/servlet/com.aaa.bbb.MyServletTest
會出現(xiàn)錯誤,Tomcat提示找不到相應(yīng)的資源,那是因為TOMCAT的缺省配置是禁止通過全類名
進行Servlet的調(diào)用的,如何打開此選項,看TOMCAT_HOME/conf/web.xml
代碼:
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
代碼:
<!-- The mapping for the invoker servlet -->
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
對于第二段配置是關(guān)鍵,那是告訴TOMCAT所有/servlet/****的請求全部發(fā)向invoker的servlet,
TOMCAT缺省是注釋掉的,把它打開就行那,所有的WEBAPP都可以通過全路徑進行調(diào)用servlet啦。
而對于invoker到底是什么,看第一段配置代碼,所以當(dāng)你對Tomcat的invoker實現(xiàn)不滿意的話,
可以替換第一段配置代碼中invoker的相應(yīng)實現(xiàn)類。
注:對于tomcat中的Examples是可以通過全路徑調(diào)用SERVLET那是因為,在Examples的web.xml
中使用了filter繼續(xù),截獲了TOMCAT的缺省動作,相當(dāng)于覆蓋了TOMCAT的全局設(shè)置。對于web
container的行為,請參見SUN規(guī)范。
代碼:
<filter-mapping>
<filter-name>Servlet Mapped Filter</filter-name>
<servlet-name>invoker</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>Path Mapped Filter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
2.JSP實時編譯問題
很多在TOMCAT中會發(fā)現(xiàn),對于剛改過的JSP在IE中刷新不出來,即TOMCAT沒有實時編譯JSP文件,
如何修改呢?同樣參看TOMCAT_HOME/conf/web.xml,找到對于JSP編譯程序進行配置,如下
加上init-param參數(shù)段,告知TOMCAT每次都需要進行reloading,即進行日期比較,適當(dāng)時候
進行重編譯。對于其他參數(shù)可以看在web.xml中的參數(shù)解釋,非常的具體。
代碼:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>reloading</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>javaEncoding</param-name>
<param-value>GBK</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
注:org.apache.jasper.servlet.JspServlet 的作用,它就是為什么JSP能夠自動轉(zhuǎn)換成servlet
的罪魁禍?zhǔn)桌?,對于JSP編譯上出現(xiàn)的問題都可以從它身上找到答案。注意JSP這個servlet是mapping
到*.jsp的,所以所有的JSP請求才會被編譯成servlet后執(zhí)行,非常類似于Apache中的addType功能。
代碼:
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
3.亂碼問題
亂碼問題比較復(fù)雜,但是只要找到為什么出現(xiàn)問題就非常簡單啦。
A.JSP頁面編譯后對于中文變成亂碼
B.頁面輸出有亂碼
C.傳遞的URL參數(shù)或是中文Form field值,解釋成亂碼
對于A子問題,那是由于Tomcat的Jasper不能正確識別JSP文件的編碼造成的,所以需要告訴Jasper本地
的JSP文件編碼。打開TOMCAT_HOME/conf/web.xml,找到如下的配置段,給<servlet-name>jsp</servlet-name>
加上參數(shù)javaEncoding=GBK,其中的GBK換成GB2312也行,大家可以琢磨一下原因。呵呵
代碼:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<init-param>
<param-name>reloading</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>javaEncoding</param-name>
<param-value>GBK</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
對于B子問題,很簡單,在所有JSP文件的頭部加上:
<%@ page contentType="text/html;charset=gb2312" %>
對于C子問題,也很簡單,那是因為,TOMCAT對于HTTP的解釋全部是按照ISO-8859-1的方式傳送的,
把前臺的GB2312的內(nèi)容傳到后臺,所以需要轉(zhuǎn)碼。
對于JSP文件,在所有JSP文件的頭部加上:
request.setCharacterEncoding("GB2312");
對于Servlet類同理:
doGet(...)
{
request.setCharacterEncoding("GB2312");
...
)
就可以搞定了。
4.JSP編譯調(diào)試問題
對于使用TOMCAT plugins進行Eclipse的開發(fā)的人,是非常希望能夠及時調(diào)試的JSP被編譯后的SERVLET的,
但是出現(xiàn)了,在tomcat的Jasper編譯后,TOMCAT plugins導(dǎo)入到Eclipse的workspace后會出現(xiàn)路徑即包名
不匹配的問題,這個TOMCAT plugins提供了補丁,使Tomcat和Eclipse能夠更好的協(xié)調(diào)工作。
方法:
把jasperDebugPatchV4.1.24.zip解壓到TOMCAT_HOME\common\classes\下,就OK啦!能夠在eclipse中進行
調(diào)試編譯后的JSP.
先寫這么多,拋磚引玉先!
附件為jasperDebugPatchV4.1.24.zip,主要是為了防止大家難找。
還有就是版本一定要注意好,否則無法工作。