2007年8月的存档

  • 14
  • 8月

最近在用netbeans研究Webwork开发,在被折腾死去活来,差点被气得把电脑从窗口扔出去后,终于用utf-8统一编码,搞定了中文乱码问题。

先声明一下自己使用的环境:WindowsXP + netbeans5.5.1中文版 + Webwork插件 + java1.6 + mysql5.0。使用netbeans内置Tomcat。

中文乱码的问题主要表现在

  • jsp中使用webwork的tag,Label中使用中文无法通过编译。提示“编码GBK的不可映射字符”。
  • 将中文写入mysql数据库中时,全部变成“??”

页面之间传参没有乱码。Action的结果页面可以正常接收并显示。

经过一番查找,找到了问题所在:

  • netbeans模板生成的jsp默认为utf-8编码
  • java源文件编码与本地系统一致,在Windows下应该是GB2312。
  • mysql的JDBC驱动默认使用ISO8859_1
  • mysql新建数据库字符型数据默认编码为Latin1

其中最后两项基本是兼容的,其他的之间就会兼容性问题了。乱码及变“?”就是在这些不同编码之间传递或组合之中出现的。

解决的原则很简单:统一编码。

我现在使用的是统一为utf-8,优点是确保在不同系统上的兼容性(目前几乎所有系统都能良好支持utf-8),缺点是中文一个字在utf-8编码中会占用3个字节,比gbk多占用一半的空间。

1)jsp文件无需改变。只需确认jsp头部有

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

html头部有以下声明:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

2)Java源文件

在netbeans中打开“工具”-“选项”,在打开的选项卡中点击左下角的“高级选项”,在左侧的树中找到“编辑”-“Java源代码”,在“缺省编码”中输入“utf-8”

3)数据库连接

连接数据库时的url中加入编码选择:

jdbc:mysql://localhost/regtest?user=root&password=root&useUnicode=true&characterEncoding=UTF8

4)数据库编码

在mysql中建库时将数据库的编码设为“utf8_general_ci”。

OK,在我的系统上完成这些后乱码再也没出现过。有空的话再研究一下gbk编码下的解决。

  • 10
  • 8月

我开这个Blog主要想分享一下技术上的心得,顺便总结一下自己的收获,因此少不了会例举一些代码和配置文件。WordPress本身好像没有为这准备什么。之前我也是把代码直接放在正文中的。最近觉得十在不爽了,干脆自己为Blog添加代码显示框。

考虑了一下Html中的标签,准定改写pre标签,让它来实现代码显示。

在主题的style.css中定义:

pre {
    text-indent:0;
    border:1px solid black;
    padding:5px 15px 5px 15px;
    margin:5px 10px 5px 10px;
    word-wrap:break-word;
    white-space: pre-wrap;
    white-space: -moz-pre-wrap;
    background-color:#E6E6E6;
}

实现了将段首缩进置零(我正文中有自动段首缩进,所以得取消掉)、增加边框背景等样式,让它看起来像别的网站上的代码显示块。

其中最重要的是以下三行:

    word-wrap:break-word;
    white-space: pre-wrap;
    white-space: -moz-pre-wrap;

成功实现了在所有浏览器中文本在元素边界强制换行。这样连续的英文文本就不会把元素撑大了(相信做过Web开发的人都知道这个经典的问题)。

以后插入代码只要把它们放到pre标签中就可以了。

  • 10
  • 8月

找了半天终于弄明白了,VIM里是有强大的自动补全功能的。

我下载的gVIM中已经自动加载了很多好用的插件。新开一个文件时只要使用

:setf html

这样设定一下文件类型。然后就可以使用Ctrl+x,Ctrl+o实现非常好的自动完成了。

另外今天从http://vimdoc.sourceforge.net/下载到了vim中文版的帮助文件和那个pdf教程。有空再多研究研究。

  • 07
  • 8月

决定玩一玩Jsp,于是要安装Tomcat。

前一阵子玩php时安装了一个EasyAPM的WAMP套件,所以现在机子上已经有Apache2.0.55了。且由于我SubVersion的服务器也是架设在它上面,所以不想把它停掉。遂决定采取Tomcat与Apache集成的方式安装。结果这一装居然用了我几个小时…

首先说明一下我的基本配置:WinXP professional sp2,EasyAPM中带的Apache2.0.55,JRE1.5.0

1、到http://tomcat.apache.org/下载了最新版的Tomcat6.0.13(注意是Windows Service Installer版的)和Tomcat Connectors(注意官方下载列表中文件名最后的那个版本是该Connector对应Apache的版本,不要图高,要与自己的Apache配套,我就因为第一次下载了对应2.2.4的版本,弄的Apache都引导不起来…)

2、Tomcat除安装路径被改为D盘之外,全部默认。此时在浏览器中打开localhost:8080应该可以看到Tomcat的欢迎页面了。

3、把下载到的Connector“mod_jk-apache-2.0.59.so”改名为“mod_jk.so”复制到Apache安装目录下的modules目录下。

4、建立mod_jk所需的配置文件workers.properties:

(其中的work1是可自定义的名字,但必需与下一步在httpd.conf中的名字相同)

# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

将其保存到”D:Program FilesApache Software FoundationTomcat 6.0workers.properties”

5、修改Apatch的配置文件,将mod_jk加入Modules列表并设置将servlet目录转发给Tomcat处理

打开Apache安装目录下conf下的httpd.conf文件。

在LoadModule块中加入一行:

LoadModule jk_module MyModules/mod_jk.so

在该文件底部追加:

JkWorkersFile "D:Program FilesApache Software FoundationTomcat 6.0workers.properties"
JkMount /servlet/* worker1

即将/servlet下的所有文件都交给Tomcat处理。如果你要处理跟目录下的jsp文件,可以再加一句:

JkMount /*.jsp worker1

重启Apache。

现在打开浏览器,访问localhost/servlet,应该返回Tomcat的错误信息了。

6、修改Tomcat主目录

现在Apache的主目录和Tomcat的主目录还不一致,做的Jsp还必须放在Tomcat的主目录下的servlet内才能正常运行。我们可以把它改到与Apache主目录在同一个地方,以方便运行。

打开Tomcat安装目录下conf下的server.xml,在<host>与</host>间加入

<Context path="" docBase="E:MySite" debug="0"  reloadable="true" crossContext="true"/>

将”E:MySite”改为你Apache的主目录所在地就OK了。

重启Tomcat,现在只要把jsp放入”E:MySiteservlet”就可以直接在浏览器中使用localhost/serverlet/helloworld.jsp的方式访问了。

另外关于Tomcat主目录和虚拟目录介绍,可以参见这篇文章

  • 04
  • 8月

受不了《程序员修炼之道》的诱惑,昨晚下载下来了gvim。今天好好研究一了一番。

这个Unix下最著名的编辑程序让我立刻回忆起当初我在文曲星下用GVBasic编写的LoveEditor:所有的功能使用命令实现,数据靠键盘指令查看和修改。

不过我当时是被逼的——文曲星GVBasic提供的功能太少。而gvim则是在功能强大的Unix平台下设计开发的。

用了一段时间后感觉很不错:双手放在主键盘区就可以完成所有的工作是件非常爽的事。尤其对于我这种早已受不了用鼠标拖选一行代码,然后费力地把它剪切、粘贴到另一个位置,再手动调节缩进…这样操作的人来说,vim使用命令选择、粘贴时提供的高度可控性使我感觉相当的爽。

我已经用gvim取代EditPlus设成了我TotalCommander编辑热键”F4″的编辑器。慢慢地熟悉一下它。希望它能帮我省下些宝贵的时间:)

  • 03
  • 8月

命令行内容说明

如前所述,所谓的命令行或命令模式,就是在最下面一行没有显示 『–INSERT–』或者『–REPLACE–』 字样的时候。通常在命令行中的指令有下面几种:(注意,当按下 『:』 时,光标会自动移动到屏幕的最下面一行!) Read the rest of this entry …

  • 02
  • 8月

今天玩asp.net时遇到了一个小小的问题:页面中有一个以JavaScript控制的select控件,用于时间的选择。

如何在asp.net的后台文件.cs代码中取得它的值呢?

第一个想到的方法是asp.net中最“正宗”的方法,把这控件标为runat=”server”,就可以在.cs代码中直接使用它的id访问它的属性了。但问题是这个控件是造客户端JavaScript代码来添加它的值的。而将select变为runat=”server”后,控件在客户端的id会被系统自动改变,不再是VS设计器中的那个id了。于是那段JavaScript就失效了。

然后就想到的传统的Form法,如同asp、php那样,在接受数据的页面取得post来的内容。在asp中,可以用 Request.Form(“XXX”)得到Form中的值。php中可以直接访问枚举数组$_POST[‘XXX’]。查阅文档,asp.net使用的与asp几乎相同的方法,使用Request.Form[“XXX”];(注意三种方法用的括号)。

但在我的程序中却意外的发现,这样取得的值始终是null。问题又出在哪呢?

又是一番排查,终于找到问题所在——又是可恶的name属性惹的祸!

这个问题其实在做php时就发现过,很简单:表单传值时只认name属性。如果不设置一个控件的name属性,不管你接收页用的是什么技术(asp、php、asp.net…)都无法取得这个控件的值。

这也就是为什么用DreamWeaver生成的控件代码总是会自动生成内容相同的两个属性,如:<input type=”text” id=”tt” name=”tt” />。JavaScript只认id、Form传值只认name。没办法啊!

总结一下,两句话:

1.asp.net中可以用Request.Form[“XXX”]这个索引指示器来实现传统的表单内容取值。

2.表单中的控件,只要不是runat=”server”,需要给它设上name=”xxx”的属性。

最后引用一篇介绍asp.net的Request对象的文章:asp.net技术浅析(九)

  • 01
  • 8月

今天做了个WebService的客户代理WebForm,要将WebService返回的DataSet中的表显示出来。

说到显示表格数据,最先想到的自然是GridView控件,然而教科书上给的DataSet全是在aspx前台文件里绑定到一个DataSource控件上的。而这个WebService返回的DataSet中有多个表,这些表在WSDL里又没有描述,所以无法用GUI搞定数据绑定。只有用代码了。

稍微上网查了一下,又试验了一下发现,其实这东西真的很简单——只要把支持的对象赋给GridView的DataSource属性就可以了。不过赋完值之后得显式地调用一下DataBlinding()方法,不然数据不会被显示出来。

如:
myGridView.DataSource = serviceReturnDataSet.Tables[“theTable”];
myGridView.DataBind();

这就OK了。

不过这样绑定有个很明显的问题:GirdView的列标题显示的都是服务器返回的值,对用户很不友好。怎样才能在代码中修改GridView的表头呢?

又是一番查找和尝试。找到了两个解决方案:

1.在前台aspx文件中实现

点击GirdView右上角的三角,在“GirdView任务”中选择“编辑列…”。取消掉“自动生成字段”的选择,手动添加与返回数据列数相等个BoundField字段,将它们的DataField属性手动设为需要绑定数据的每列的列名,HeaderText属性设为想要显示的名称。

确定后应该生成类似以下代码:
<asp:GridView ID=”scores” runat=”server” AutoGenerateColumns=”False” >
<Columns>
<asp:BoundField DataField=”C_name” HeaderText=”课程名称” />
<asp:BoundField DataField=”C_teacher” HeaderText=”教师” />
<asp:BoundField DataField=”C_hours” HeaderText=”学时” />
<asp:BoundField DataField=”C_scores” HeaderText=”学分” />
<asp:BoundField DataField=”scores” HeaderText=”成绩” />
</Columns>
</asp:GridView>

这样默认显示的“C_name”就会变成“课程名称”。而且利用这种方法还可以控制某些列是否显示。

2.在后台.cs代码中实现

只需在调用DataBlinding()方法前,改变GridView对应Columns的HeaderText属性即可。例:

myGirdView.Columns[1].HeaderText = “aaa”;

注意,该语句必需出现在myGirdView.DataBlinding();之前,否则不起作用。

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程