使用tomcat运行servlet时中文乱码的解决

电脑不是国人发明以及中国文字的博大精深让我们编程的人也时时遇到麻烦。在linux中中文问题确实头痛了很久,现在的servlet看来又有问题servlet中的问题一般有这么几个
通过网址传递过来的中文参数出现乱码,如?name=小灰到了里面就不知道变成什么玩意了。
程序内部处理乱码,正确得到中文参数处理时内部又乱码,和数据库通讯的时候又经常有这个问题。
程序将中文输出乱码。
tomcat 5.5 现在已经基本能解决这个问题
最简单的一个方法应该是使用tomcat示例中\servlets-examples\WEB-INF\classes\filters下包含的SetCharacterEncodingFilter过滤器将这个类复制到自己工程的web-inf文件夹的同一位置。然后在工程的web.xml中添加以下部分。
  <filter>
       <filter-name>Set Character Encoding</filter-name>
       <filter-class>filters.SetCharacterEncodingFilter</filter-class>
       <init-param>
           <param-name>encoding</param-name>
           <param-value>gbk</param-value>
       </init-param>
   <filter-mapping>
       <filter-name>Set Character Encoding</filter-name>
 <url-pattern>/*</url-pattern>
   </filter-mapping>
然后在conf/server.xml中的Connector标记里面添加URIEncoding="gbk"这样就解决了传递时乱码的问题。
然后还可以设
request.setCharacterEncoding("gbk");
response.setCharacterEncoding("gbk");
但是程序内部还是可能乱码,在有这种问题的时候可以进行编码转换。例如
String sr="中文";
String tf=new String(sr.getBytes("gbk"),"ISO8859_1");
这样基本能解决tomcat处理时出现乱码的情况了。
解决了这个问题。可是如果url路径中或参数中存在空格的话就有问题。把一个带空格的文本做为url上带的参数肯定不行。需要进行转码,例如我有段程序是生成一个文件下载的超链接
File file=new File("e:\中文 文件.txt");
out.println("<a href=/demo/servlet/DownLoadServlet?filename="+file.getName()+">"+file.getName()+"</a");
倘若path中带有空格,这个链接就不会正常,空格及后面文字被忽略。
生成的链接是…DownLoadServlet?filename=中文
这时就需要在out.println(…);语句前面加上这么两句
String path=file.getName();
path=java.net.URLEncoder.encode(path);
将……./DownLoadServlet?filename="+file.getName()+">"…改成
……./DownLoadServlet?filename="+path+"…….
就解决了url路径中含有空格的问题

servlet版防盗链程序概念模型

早上起来躺床上不知道怎么突然想起防盗链这个事情,一个简单的概念系统该很简单,
获得浏览器的get请求以后查看http head的referer部分,里面的网址是否是本站地址就行。
这样只要做一个字符串比较就可以实现,这样可以保护链接,但是如果别人获得文件的绝对地址这个方法恐怕就无法阻止盗链了,文件默认是由web服务器还进行处理,像apache简单设置就可以防盗链,光检查referer部分是不善的,http head本来是由客户端提供,很容易伪造,flashget在下载的时候就可以设置引用页面,而且新版flashget在不提供引用页的请客下把网址去掉下载文件名后的其他部分当然referer发给服务器,这时候就需要加上session或cookie的保护的,servlet通过内部io是可以在不发送文件真是地址的情况下发送文件的。具体实现部分稍后发布
2006-09-01 v0.1
[codes=java]
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
继续阅读“servlet版防盗链程序概念模型”

servlet配置总结

使用servlet也有月余,回想起来磕磕碰碰其实走了不少弯路,现在总结一下,备忘。

开始具体写servlet程序前还需将tomcat的servlet包导入
common\lib\servlet-api.jar
才能编译成功.
tomcat配置
webapps下新建一文件夹放置将project放在的文件既可,里面至少需要一个WEB-INF文件夹,这个文件夹是不可通过网址直接访问的,WEB-INF下面一般建两个文件夹classes和lib,classes放置编译好的class文件,lib则放其他第三方库,比如mysql的jdbc库,WEB-INF下面应有个web.xml配置文件叫做Deployment Descriptor,一个典型的web.xml应该是这样的。
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
   version="2.4">
 <!–设置该project的名称和描述,可在tomcat管理器中看到–>
 <display-name>demo</display-name>
 <description>
    demo project
 </description>

<!– JSPC servlet mappings start –>

   <servlet>
       <!–url上显示的名字–>
       <servlet-name>Content2</servlet-name>
       <!–实际的类名–>
       <servlet-class>Content2Servlet</servlet-class>
   </servlet>
   <servlet>
       <servlet-name>Login</servlet-name>
       <servlet-class>SessionLoginServlet</servlet-class>
       <!–还可给某一servlet附加参数,可用在动态配置中–>
       <init-param>
           <!–参数名–>
           <param-name>dbhost</param-name>
           <!–参数内容–>
           <param-value>db4free.org</param-value>
       </init-param>
   </servlet>
   <!–设置url映射–>
   <servlet-mapping>
       <servlet-name>Login</servlet-name>
       <!–设为/*表示将此servlet设为默认首页–>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>Content2</servlet-name>
       <!–这样映射得到的网址就是 主机名/webapps下的文件夹名/content2–>
       <url-pattern>/Content2</url-pattern>
   </servlet-mapping>

<!– JSPC servlet mappings end –>

</web-app>

tomcat里面这里面地址很是有学问,刚学的时候很容易搞混
网页放在工程的根目录下面,编译好的class文件放在WEB-INF/classes下面
而url是这样的.在web.xml中类名和显示名做了定义那么url中用的是定义后的servlet-name
如果没有做servlet-mapping那么执行的路径就是
http://主机名:端口/工程文件夹名/servlet/servlet-name
如果做了servlet-mapping将class映射为/servlet-name,
按照html的习惯写出'/'了就应该在根目录下,结果该是
http://主机名:端口/servlet-name 这样执行,但是servlet中不是这样.而应该是
http://主机名:端口/工程文件夹名/servlet-name
少了中间的servlet这段.
当然如果是html文件什么写/的话url还是从根开始算的.

弄明白网址后面编译执行就很容易了,但是还有个问题,启动tomcat以后如果你重新编译了servlet文件生成了新的class,但是却不会自动加载修改后重新编译后的class,tomcat中看的还是启动时的class,这个问题很严重,尤其是调试的时候,每次都需要重启tomcat已使它加载新class,这个过程真会让人抓狂,不过还是有让tomcat自动加载新class的方法的.在tomcat的\conf\Catalina\localhost新建一xml文件.文件名同工程文件夹名.内容可参考如下
<Context path="/demo" reloadable="true" docBase="M:\Tomcat 5.5\webapps\demo" workDir="M:\Tomcat 5.5\webapps\demo\work"/>
可将demo替换实际工程文件夹名既可.使用这个context设置还有一个方便,就是可以不用把程序放在tomcat的文件夹中。将docBase和workdir改成实际在硬盘上的位置就可以了。实际运用在也是很方便的。

在servlet中读写一个文件,比如写File f=new File("dbconfig.xml");那么应该把这个文件放哪呢?
这个问题还困惑我一阵,先是手工试了一下,放在class文件夹,WEB-INF文件夹,工程根目录,webapps根目录,却都不对,写行程序输出路径才知道应该放在tomcat的根目录下面,但是把文件放在工程外面始终不是好选择,也不便于程序的移动移植,倘若程序在tomcat的webapps里面这个好办,用相对路径就能搞定,如果我们用了context配置,工程不在tomcat里面呢?能否得到路径呢?其实是可以的。
getServletContext().getRealPath("/")返回一个String。里面就是docBase的实际路径,这样就解决这个路径问题。所以读取工程根目录下面的dbconfig.xml文件就应该是
File f=new File(getServletContext().getRealPath("/")+"dbconfig.xml");

fd

Tomcat是Apache的一个子项目,也是一个开源项目,主要是用于J2EE Web容器,由于一个开源项目,在学习与开发测试中经常被应用。目前在商业经常用到的Web服务器是BEA WebLogic。

   这时选择Tomcat作为学习与测试环境,以下是一些基本配置:

  一、下载Tomcat,这里是Tomcat5.5.15,直接安装,端口号设置为:8080。
  注意:JDK1.4与TOMCAT5.5不能配置在一起,这样程序跑不起来,TOMCATL5.5,必须要JDK1.5以上的,才可以
  安装目录:1、webapps:主要用于web应用程序部署,比如你可以把你的应用程序包,如war文件拷到该目录,容器会自动部署。
  2、conf:主要是放置Tomcat服务器的相关配置文件。
  3、common:容器全局变量的文件放置地方,如common/lib下就是放置一些需要全文配置的文件包。

  二、J2EE的相关部署规范:

  一般来说作为一个符合规范的WEB程序,会包括以下文件夹和文件:

  /WEN-INF/:放置一些配置文件与不希望外部程序访问的隐私文件。在网络上是不允许访问该文件夹的。
  在/WEN-INF/下有一个web.xml文件,这是对当前应用程序的相关设置,资源寻找等。
  /WEN-INF/classes:是应用程序的根路径
  /WEN-INF/lib:放置需要引入的包,应用程序导入的包先从这里开始寻找,其次到容器的全局路径下$CATALINA_HOME/common/lib下寻找。

  以下是基本文件夹:
  /tomcat
    /common
      /lib
      /classes
    /conf
    /webapps
      /root
        web.xml
        /WEB-INF
          /lib
          /classes
  三、容器的配置(server.xml)

  主目录/conf下server.xml文件是对web服务器的配置:

  以下是一些常见的设置,http端口设置,找到:
    

  把8080端口改为你喜欢使用并且当前没有使用的端口,以后就可以利用该端口来访问测试用的网站了。

  找到:
  ….
Host name=”localhost” appBase=”webapps” unpackWARs=”true” autoDeploy=”true”  
      xmlValidation=”false” xmlNamespaceAware=”false”>  
       ….  

    

  在他们之间可以添加一个元素,如:

 

  其中path表示网络访问的上下文路径;reloadable表示可以在运行时在classes与lib文件夹下自动加载类包;docBase表示应用程序的路径,在Windows中如:docBase=”E:\java\new”;workDir表示是缓存文件的放置地点,可以方便跨平台移植时不用重编译,这样,应用程序就可以放到硬盘上的任意地方了。

  还有一个方法也可以做到这点:编写一个xml文件,然后放到Tomcat/conf/Catalina/相应的网站(如localhost)/下,如上:编写一个文件new.xml内容如下:
    

  放到Tomcat/conf/Catalina/localhost/下,在浏览器打开:http://localhost/new就会转向到E:\java\new程序。

  四、Tomcat5中文解决

  对于中文系统主要有以下问题:

  1、表单提交的数据,用request.getParameter(“xxx”)返回的字符串为乱码或为???;
  2、直接通过url如:http://localhost/test.jsp?name=中国,这样的get请求在服务端用request.getParameter(“name”)时返回的也是乱码。

  原因:
  1、Tomcat的J2EE实现对表单提交即POST方式时处理参数采用缺省的iso-8859-1来处理;
  2、Tomcat的get方式提交的请求对query-string处理时采用了和post不一样的处理方式。

  解决办法:

  首先给所有的JSP文件都加上:
<%@ page contentType="text/html;charset=gb2312" %>  

  1、post方法:

  先实现一个Filter,设置处理字符集为GBK。(在Tomcat的webapps/servlet-examples目录有一个完整的例子,参考web.xml和SetCharacterEncodingFilter的配置)。

  1)、把$TOMCAT/webapps/servlets-examples/WIN-INF/classes/filters/SetCharacterEncodingFilter.class文件copy到应用程序/WIN-INF/filters下,如果没有filters目录,就创建一个。

  2)、在web.xml里加入以下几行:

    
    Set Character Encoding  
    filters.SetCharacterEncodingFilter  
      
      encoding  
      GBK  
    
 
  

    
    Set Character Encoding  
    /*  
  
 

  3)、完成。post方法还可以在编程时,在用到request的前面添加语句:

   <%request.SetCharacterEncodin("GBK");%>  
也可以解决中文问题。

  2、get方式的解决办法:

  1)、打开server.xml文件,找到区块:

     debug=”0″ connectionTimeout=”20000″ disableUploadTimeout=”true”   URIEncoding=”GBK” />  
  加上一句URIEncodeing=”GBK”,如上所示。

  2)、重启Tomcat,乱码就可解决。

常见蔬菜及亲属中英对照

     常见蔬菜的英文名,恩。还是挺实用的。虽然放在面前不一定能认出是什么菜,但咋是文化人嘛,认标签,现在好了,中英文都不怕。还有亲属对照表遇到什么表弟,弟媳怎么说就不会面露菜色了噢。
   string bean 四季豆
  pea 豌豆
  green soy bean 毛豆
  soybean sprout 黄豆芽
  mung bean sprout 绿豆芽
  bean sprout 豆芽
  kale 甘蓝菜
  cabbage 包心菜; 大白菜
  broccoli 花椰菜
继续阅读“常见蔬菜及亲属中英对照”