服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

web 开发技术系列之一

 前言

1.为什么要讨论?

简单的来说,就是就用来开发web应用所需要的技术,目前有很多讨论各种技术的论坛,但我在这里想讨论的是横向方面,也就是在web应用开发中,如何把各种技术结合起来,提高开发效率.用更通俗的话讲,不要讲最先进的,讲最有用的.

 

2.内容包括什么?

web开发技术包括三个层面:

 a) 显示层. 页面制作 ,这个通常由美工完成

 b) 逻辑层.主要讨论的内容,包括struts,hibernate,模式,代码生成技术(xdoclet,middlegen),自动构建(maven)taglib

 c) 资源层. 讨论数据库的设计,mssql,oracle,存储过程,触发器.

 

3.目的

web开发的难点之一就是比较分散,不像做gui界面那样紧凑,比如写了一个servlet,就要配置web.xml,修改了数据库的字段,就要修改各种逻辑,而修改数据库这种情况恰恰是经常发生的,所以开发人员要来回的修改,同步. 除了这些,web开发所需要的人也是不同的,有美工,数据库设计,逻辑开发,这些人如何协调起来,如何同步,这些都对提高开发效率有直接的影响.

我在这里讨论的技术不一定是万能的,这些只是我积累的经验,我也在不停的完善中.

 

 

第一篇: 汉字编码的问题

 

也许汉字是web开发中最常见的问题了,所以就拿这个问题开始我们的讨论吧!

 

1.汉字问题出现的场合

a. 获取参数request.getparameter("param"); 在tomcat下,默认是iso8859-1,因此若要正确获得参数,需要转换成gb2132;

 

b. 页面的汉字显示。

 

这里有两种情况,

  i )当jsp要被解析成servlet时,容器读取<%@ page contenttype="text/html; charset=gb2312" 以确定文件的编码,故通常应该设置。

 

     当ie得到页面要显示时,通过<meta http-equiv="content-type" content="text/html; charset=gb2312">来确定显示的编码.

  ii) 如果没有设置编码,则页面的编码为 iso8859-1,这时候如果要显示汉字,可以采用unicode编码形式来显示汉字. 如直接out.print('/uffff');

     把汉字转换成unicode编码可以用jdk 1.5 下的一个工具.可以把一个文件里的汉字全部转换成unicode编码.这种方法就没有前面这种方便了.

 

c.beans中的编码。在java beans中的编码时默认编码,如果平台的默认编码时gb2312,则在java beans中不需要特殊转换。

 

d.数据库的编码。数据库也有自己的默认编码。mysql的默认编码为iso8859,mssql/orcale的默认编码为平台编码,在windows下均为gb2312。当向数据库写数据库,应该根据数据库的编码做相应变换。

 

2.如何实现汉字编码的自动转换

从上面讲的场合来分析,最关键的就是第一种,每次都要转来转去的,很麻烦. 如果在weblogic,可以在web.xml 设置一个参数,weblogic自动转换,不过这个只能在weblogic下用了.

 

借鉴weblogic的思路,可以编写servlet filter来实现.filterservlet 2.3规范的内容.现在所有流行的服务器都应该支持.

代码如下:

 

/**

* filter class

*

* @web.filter name="locale.filter" display-name="locale filter" description="description for locale"

* @web.filter-mapping url-pattern="/*"

*

*/

public class localefilter implements filter {

private log log = logfactory.getlog(localefilter.class);

 

/**

*

*/

public localefilter() {

super();

}

 

/**

* @see javax.servlet.filter#init(javax.servlet.filterconfig)

*/

public void init(filterconfig arg0)  {

// todo auto-generated method stub

 

}

 

/**

* @see javax.servlet.filter#dofilter(javax.servlet.servletrequest, javax.servlet.servletresponse, javax.servlet.filterchain)

*/

public void dofilter(servletrequest request, servletresponse response,

filterchain chain) throws ioexception, servletexception {

 

//string encoding = commonutil.getdefaultencoding();

///log.debug("default characterencoding:" + encoding);

 

//encoding可以从平台上自动获取.

         string encoding = "gb2312";

       

request.setcharacterencoding(encoding);

 

 

response.setcontenttype("text/html;charset="+encoding);

response.setcharacterencoding(encoding);

 

chain.dofilter(request, response);

 

}

 

/** 

* @see javax.servlet.filter#destroy()

*/

public void destroy() {

 

}

 

}

 

3. 效果

基于filter的实现好处很多,我们可以类似写出gb2312平台下的filter,也可以写出其他平台下的filter.使用的方法,也很简单,就直接request.getparameter()就可以了,不需要特殊的转换.

 

4. 总结

 

基于filter的实现是个不错的选择. 如果要想在struts类似的框架中读取某个文件中的汉字,并要想显示在页面上, 常见bean:write 标签读取properties,

最好的做法就是把properties中的汉字用unicode编码,高效直接.

 

 

 

 

 

扫描关注微信公众号