`
zhangfeilo
  • 浏览: 393298 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

Tomcat支持中文名和不区分大小写

阅读更多

Tomcat是Java开发者使用得较多的一个Web服务器,因为它占用资源小,运行速度快等特点,深受Java Web程序员的喜爱。不过,在使用中,由于Java中的中文问题的存在,如果不经过配置,在WEB程序中,不能直接支持具有中文文件名的文件的下载,这为Java Web程序的开发带来一定的不便。本文拟介绍一种手段,解决这个问题。 

解决问题的核心在于修改Tomcat的配置,在Server.xml文件中添加一个名为URIEncoding的属性,它用于对HTTP请求中的get方法传过来的URL进行编码。如果直接从Apache站点中下载Tomcat,无论是安装版的exe文件,还是解压缩的ZIP文件,内置的对于get协议中的URL编码都是ISO-8859-1,这个字符集不能直接支持中文等双字节的信息,而中文文件的下载链接恰恰是通过get协议进行的。以下说明修改Tomcat安装目录中的config文件夹中的server.xml文件的方法。 

打开config/server.xml文件,如果没有修改过这个文件,应该可以在其中找到如下代码: 

<Connector port="8080" protocol="HTTP/1.1" 
connectionTimeout="20000" 
redirectPort="8443" /> 

这段代码规定了Tomcat监听HTTP请求的端口号等信息,可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat不再以ISO-8859-1的编码处理get请求。更改后的代码如下所示(红色部分为新添加的代码): 

<Connector port="8080" 
URIEncoding="utf-8"
protocol="HTTP/1.1" 
connectionTimeout="20000" 
redirectPort="8443" /> 

下面,我们准备测试一下更改后的效果。 

最为简单的测试方法就是让Tomcat自己列出WEB程序中的目录和文件,默认情况下,Tomcat不会直接列出WEB程序目录中的文件和文件夹,但是,我们可以修改位于安装目录中的config文件夹中的web.xml,使其能够支持自动列出WEB程序中的目录和文件。 
在config/web.xml文件中找到如下代码: 

<servlet> 
<servlet-name>default</servlet-name> 
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 
<init-param> 
<param-name>debug</param-name> 
<param-value>0</param-value> 
</init-param> 
<init-param> 
<param-name>listings</param-name> 
<param-value>false</param-value> 
</init-param> 
<load-on-startup>1</load-on-startup> 
</servlet> 

将上面的代码中标为红色的部分改为如下内容: 

<init-param> 
<param-name>listings</param-name> 
<param-value>true</param-value> 
</init-param> 


即将参数listings的属性改为true,就可让Tomcat自动列出某个WEB程序目录中的文件和文件夹。 

现在,我们的设置已经完成,将修改的文件保存后,就可以启动Tomcat进行测验了,当然,如果Tomcat正在运行,则需要重新启动,以便配置生效。 

现在,可以在Tomcat安装目录中的webapps目录中建立一个名为cntest的文件夹,作为测试的web程序的上下文路径(注意:对于WEB程序的上下文路径,请不要使用中文)。请在cntest中添加一些中文目录和文件,然后在浏览器中打开该WEB程序,如,http://localhost:8080/cntest,测验一下效果吧。当然,也可以在JSP或HTML文件中使用那些包含中文的文件夹或文件名的超级链接。 

说明:以上修改均使用Tomcat5.5做的测试,在5.5以上都应该可以,至于5.0和4.x,我没有实验过,不过对于5.0应该也是可以的,但4.x不能保证(4.x在处理HTTP的get和post方法和5.x不大一样)。

URL不区分大小写:

默认情况下,tomcat的URL是区分大小写的。如http://localhost:8080/web和http://localhost:8080/Web是不一样的。这样做的原因可能是因为tomcat支持jsp和servlet,而Java语言是区分大小写的。一般来说这样做是没有问题的。但是如果某些网站程序或者页面制作过程中忽略了大小写问题,则就会导致网页显示不正常。 
    可以在其<Context>(位于tomcat根目录下:conf/context.xml文件中)元素中增加“caseSensitive="false"”来使其不区分大小写。 只是这样设置只能保证该Context定义的路径下的内容不区分大小写。其他Context定义的路径仍然区分大小写,除非也加上 caseSensitive="false"的选项。 
    当然这样设置只能是对链接地址有效,至于jsp和Servlet中的语法还是区分大小写的,不是说做个该设置就全部是不区分大小写了。


 

分享到:
评论

相关推荐

    tomcat环境变量配置

    3.myapp下新建一个目录WEB-INF,注意,目录名称是区分大小写的; 4.WEB-INF下新建一个文件web.xml,内容如下: &lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" ...

    Java面试宝典2010版

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 68、你所知道的集合类都有哪些?主要方法? 69、两个对象值相同(x.equals(y) == true),但却可有不同的hash ...

    超级有影响力霸气的Java面试题大全文档

    Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 15、final, finally, finalize的区别。  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 ...

    java 面试题 总结

    Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 12、final, finally, finalize的区别。  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 ...

    最新Java面试宝典pdf版

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    Java面试笔试资料大全

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    JAVA面试宝典2010

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    Java面试宝典-经典

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    java面试题大全(2012版)

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    Java面试宝典2012版

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    java面试宝典2012

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 51 68、你所知道的集合类都有哪些?主要方法? 51 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    Java面试宝典2012新版

    67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都有哪些?主要方法? 47 69、两个对象值相同(x.equals(y) == true),但却可有不同的...

    Java 面试宝典

    7、char 型变量中能不能存贮一个中文汉字?为什么? ................................................ 10 8、用最有效率的方法算出 2 乘以 8 等於几? ..............................................................

Global site tag (gtag.js) - Google Analytics