顯示具有 Tomcat 標籤的文章。 顯示所有文章
顯示具有 Tomcat 標籤的文章。 顯示所有文章

2014-12-18

Tomcat 8 改了 Connector URIEncoding 預設值!

某一天某一個 Web 專案突然不能用中文執行查詢,網址列上是顯示中文(用 GET),但是查詢結果沒有資料,查詢字串也變成一堆問號,由於使用者的機器運作正常就沒去管它,只不過是我的本機不能用中文查詢,不會怎樣。


但隨著 CR 與 Bug 的出現,這個小小地不便還挺討厭的,還是來搞清楚發生什麼事了吧!

2014-07-05

java.lang.Integer 的 cache?

前幾天遇到鬼打牆的問題,先用簡單的方式來還原現場。
for (int i = -130; i < 130; i++) {
  System.out.println(i + ">" + (Integer.valueOf(i) == Integer.valueOf(i)));
}
以前不知道所以也不會去用 Integer.valueOf(int) 來產生 Integer 物件,只知道用 new Integer(int),那這兩個 method 有什麼差別嗎?先看看上面程式的執行結果。
-130>false
-129>false
-128>true
-127>true
...
126>true
127>true
128>false
129>false
奇怪了,在 -128 到 127 之間的 Integer 相等(不正常),在這範圍外的 Integer 不相等(這才正常),見鬼了!

2012-07-25

Context in Tomcat 6.0.35

Context 代表一個 Web application,必須有唯一的 path 值, path 為空字串表示 ROOT,也就是該 Host 預設的 Web application。

Tomcat 6 不建議將 context 設定在 server.xml 裡,因為 server.xml 在 Tomcat 啟動後就不能重新載入了!

Context 設定檔可以使用的位置:

Virtual Host in Tomcat 6.0.35

Virtual Host 就是使用不同的網址連到同一個 Tomcat instance 的不同 Webapp,Tomcat 預設的 host 為 localhost。

開啟 Tomcat/config/server.xml:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">
</Host>
</Engine>
假設要使用兩個 Virtual host,網址分別為 vh1.neil.idv 與 vh2.neil.idv,其對應的 appBase 分別為 webapps_vh1 與 webapps_vh2,只要加上兩個 Host 定義如下:

An Empty Tomcat in Tomcat 6.0.35

新專案新氣象,Tomcat 也是新的

解壓縮 apache-tomcat-6.0.35.zip 到 apache-tomcat-6.0.35 目錄。

執行 apache-tomcat-6.0.35/bin/startup.bat,開啟 http://localhost:8080/ 驗證。

刪除 apache-tomcat-6.0.35/webapps 裡 ROOT 以外的所有目錄,刪除 apache-tomcat-6.0.35/conf/Catalina/localhost 裡的 xml 檔,開啟 http://localhost:8080/ 驗證。

刪除 apache-tomcat-6.0.35/webapps/ROOT 裡 index.html 與 WEB-INF 以外的所有檔案目錄。

編輯 apache-tomcat-6.0.35/webapps/ROOT/index.html:

2011-11-02

從 Tomcat 5.0 升級到 Tomcat 6.0 時,設定 DataSource 出錯

設定如下:

hibernate.cfg.xml
<hibernate-configuration>
 <session-factory>
  <property name="connection.datasource">java:comp/env/jdbc/Pool</property>
  <property name="show_sql">true</property>
  <!-- mapping files -->
  <mapping resource="..." />
 </session-factory>
</hibernate-configuration>
tomcat/bin/conf/Catalina/localhost/Root.xml
<Context debug="9" displayName="..." docBase=".../webapp" path="/" reloadable="true" crossContext="true">
  <Loader className="org.apache.catalina.loader.WebappLoader" debug="9" reloadable="true"/>
  <Logger className="org.apache.catalina.logger.FileLogger" debug="9" prefix="tomcat." suffix=".log" timestamp="true"/>
  <Resource name="jdbc/Pool" type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/Pool">
    <parameter>
      <name>url</name>
      <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db;SelectMethod=Cursor</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>20</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>40</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>5000</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>root</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>root</value>
    </parameter>
  </ResourceParams>
</Context>
執行時出錯:
org.apache.jasper.JasperException: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set
 org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:500)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:428)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 ...
好吧,給你加上 Dialect!

元兇現身:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1452)
 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
 org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
 org.hibernate.connection.DatasourceConnectionProvider.getConnection(DatasourceConnectionProvider.java:69)
 org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
 org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
 org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:129)
 org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
 org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1290)
 ...
最後發現,原來 Tomcat 5.5 以後的 DataSource 設定改變了,將 ResourceParams 併入 Resource 來簡化設定。
<Resource
 name="jdbc/Pool"
 type="javax.sql.DataSource"
 url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db;SelectMethod=Cursor"
 driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
 username="root"
 password="root"
 maxIdle="20"
 maxWait="5000"
 maxActive="40"/>

2011-10-20

設定 Eclipse JEE 裡 Tomcat 的 Startup Timeout 與 Port

在 Eclipse JEE 裡啟動 Tomcat 時出現「Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.」的錯誤訊息。

雙點 Servers View 裡的 Tomcat 名稱開啟設定畫面如下。

可以在 Timeouts 裡設定啟動與停止 Tomcat 的時間設定。

也可以在 Ports 裡設定 Tomcat 使用的 port。

2011-04-19

Google App Engine 簡介

用 Java 寫一個網路應用程式( web app)需要哪些東西?
  1. 首先,當然要會寫 Java,還有要懂得 JavaEE 在 web 的兩大主角,Servlet 與 JSP,如果不想用這麼原始的方式,還要學會 Spring MVC 或者 Struts 之類的 web framework。
  2. 現在應該不會有任何一個 web app 沒用到資料庫,所以還需要 JDBC,或者較好用但複雜的 Hibernate,以及一個真正的 database server,最常用的當然是 mysql 了。
  3. 程式寫完之後,我們需要一個可以執行程式的地方,那就是 web container(或 web server),一般都是用 Tomcat。
  4. 再來就是一台真正的機器,用來執行 Tomcat。
  5. 最後就是對外網路與網域名稱。

2011-01-18

Tomcat 7.0.6 設定

  • tomcat 需要 JRE_HOME 或 JAVA_HOME 才能啟動。
  • tomcat service
    • 安裝
      • {apache-tomcat-7.0.6}/bin/service.bat install
    • 移除
      • {apache-tomcat-7.0.6}/bin/service.bat remove
  • 一份 tomcat 使個多個不同 port 的 service
    • 一份 tomcat、一個 server、多個 port
    • 修改 $CATALINA_BASE/conf/server.xml
      • 複製 Service name="Catalina" 整段
      • 修改所有相關欄位。

Tomcat 7.0.6 簡介

  • 實作 Servlet 3.0 和 JSP 2.2。
  • 在 tomact 裡,context 代表什麼?
    • 簡單說,context 就是一個 web app。
  • $CATALINA_HOME 和 $CATALINA_BASE 有何不同?
    • $CATALINA_HOME 就是指 tomcat 安裝的位置。
    • $CATALINA_BASE 主要用於使用多個 tomcat instance,每個 tomcat instance 都透過 $CATALINA_BASE 來設定。
    • 所以當沒有使用多個 tomcat instance 時,$CATALINA_BASE 等於 $CATALINA_HOME。

2010-04-30

-XX:MaxPermSize 到底要加在哪?

最近用WTP去跑Tomcat,一直出現 java.lang.OutOfMemoryError: PermGen space。

2010/4/30 上午 07:00:41 org.apache.catalina.core.ApplicationDispatcher invoke
嚴重的: Servlet.service() for servlet jsp threw exception
java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9228)
    at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9208)
    at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:7864)
    at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:587)
    at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:357)
    at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:371)
    at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:413)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:317)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:295)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:282)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:586)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)

Google的結果是說要加 -XX:MaxPermSize,但是要加在哪呢?

第一、加在eclipse.ini裡,沒用!

第二、eclipse.exe -vmargs -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m,一樣沒用!

最後,加在 Installed JREs > Default VM Arguments > -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m,終於有用了!