版本:
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調用問題
- JSP實時編譯問題
- 亂碼問題
- JSP編譯調試問題
如何解決:
1.Servlet調用問題
對于很多程序員開發的Servlet,如繼承于HttpServlet的程序,想通過URL調用進行直接調用,
但是發現通過如:http://localhost:8080/mywebapp/servlet/com.aaa.bbb.MyServletTest
會出現錯誤,Tomcat提示找不到相應的資源,那是因為TOMCAT的缺省配置是禁止通過全類名
進行Servlet的調用的,如何打開此選項,看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>
對于第二段配置是關鍵,那是告訴TOMCAT所有/servlet/****的請求全部發向invoker的servlet,
TOMCAT缺省是注釋掉的,把它打開就行那,所有的WEBAPP都可以通過全路徑進行調用servlet啦。
而對于invoker到底是什么,看第一段配置代碼,所以當你對Tomcat的invoker實現不滿意的話,
可以替換第一段配置代碼中invoker的相應實現類。
注:對于tomcat中的Examples是可以通過全路徑調用SERVLET那是因為,在Examples的web.xml
中使用了filter繼續,截獲了TOMCAT的缺省動作,相當于覆蓋了TOMCAT的全局設置。對于web
container的行為,請參見SUN規范。
代碼:
<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中會發現,對于剛改過的JSP在IE中刷新不出來,即TOMCAT沒有實時編譯JSP文件,
如何修改呢?同樣參看TOMCAT_HOME/conf/web.xml,找到對于JSP編譯程序進行配置,如下
加上init-param參數段,告知TOMCAT每次都需要進行reloading,即進行日期比較,適當時候
進行重編譯。對于其他參數可以看在web.xml中的參數解釋,非常的具體。
代碼:
<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能夠自動轉換成servlet
的罪魁禍首啦,對于JSP編譯上出現的問題都可以從它身上找到答案。注意JSP這個servlet是mapping
到*.jsp的,所以所有的JSP請求才會被編譯成servlet后執行,非常類似于Apache中的addType功能。
代碼:
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
3.亂碼問題
亂碼問題比較復雜,但是只要找到為什么出現問題就非常簡單啦。
A.JSP頁面編譯后對于中文變成亂碼
B.頁面輸出有亂碼
C.傳遞的URL參數或是中文Form field值,解釋成亂碼
對于A子問題,那是由于Tomcat的Jasper不能正確識別JSP文件的編碼造成的,所以需要告訴Jasper本地
的JSP文件編碼。打開TOMCAT_HOME/conf/web.xml,找到如下的配置段,給<servlet-name>jsp</servlet-name>
加上參數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的內容傳到后臺,所以需要轉碼。
對于JSP文件,在所有JSP文件的頭部加上:
request.setCharacterEncoding("GB2312");
對于Servlet類同理:
doGet(...)
{
request.setCharacterEncoding("GB2312");
...
)
就可以搞定了。
4.JSP編譯調試問題
對于使用TOMCAT plugins進行Eclipse的開發的人,是非常希望能夠及時調試的JSP被編譯后的SERVLET的,
但是出現了,在tomcat的Jasper編譯后,TOMCAT plugins導入到Eclipse的workspace后會出現路徑即包名
不匹配的問題,這個TOMCAT plugins提供了補丁,使Tomcat和Eclipse能夠更好的協調工作。
方法:
把jasperDebugPatchV4.1.24.zip解壓到TOMCAT_HOME\common\classes\下,就OK啦!能夠在eclipse中進行
調試編譯后的JSP.
先寫這么多,拋磚引玉先!
附件為jasperDebugPatchV4.1.24.zip,主要是為了防止大家難找。
還有就是版本一定要注意好,否則無法工作。
jasperDebugPatchV4.1.24.zip 點擊此鏈接下載附件