guorabbit/
共36个网摘 [
1 2 ]
下一页 |
访问guorabbit的个人空间
guorabbit收录,时间:2008-8-7 9:25:29 | 相关网摘,我也收藏
一、首先Java的基础、面向对象的基础和设计模式的基础知识是必不可少的。
关于设计模式我觉得不用学太多,但以下三个模式是学习Spring必不可少的:factory模式(包括简单工厂和抽象工厂), Strategy模式,Template method模式。如果不掌握这些你就根本没法领悟Spring的精髓,只能依样画葫芦地照搬,这是很可怕的事。
我这里强烈建议的书可能让人有点意外,那就是Expert one on one J2EE design and development的第四章,这一章不仅仅是Spring初学者,而是任何搞Java开发的人必读的一章。经典!
二、接下可以看一些Spring的入门书籍
其实我自己没怎么看过这方面的书,我当时只看过Spring的reference,不过现在这方面的书好象多的是,而Spring reference看起来还是有些吃力的。JavaEye上很多人建议夏昕的Spring开发指南,据说入门很容易。另外的入门书应该是Spring live或Spring in action。我大概扫了一下,Spring live是一本只讲怎么做而不讲为什么的书,我不太喜欢(偶尔参考一下倒不错),不过有些人特别喜欢这样的书,看自己的个人爱好吧。
三、研究几个用Spring做的开源项目
理论还是要与实际结合,所以看完书后是要看实际的项目的。很多人喜欢appfuse,我觉得appfuse花的东西太多,真正实质性的内容又太少。我更喜欢Spring自带的jpetstore,这是一个非常完整的例子,看完后Spring的基本用法应该都能掌握。
四、开始做实际的项目
在上述这些都完备以后,我觉得应该要去实际项目中锻炼了。当然并不是每人都有这样的机会的,这时只能自己做个玩具项目啦。项目的锻炼是非常关键的,其实每个人都清楚,我就不重复了。
五、继续深入学习
经过项目的锤炼,对Spring的用法和原理有了一定的了解的时候,才有可能真正掌握Spring的精髓。这时要读的书才是Rod Johnson的三本经典名著,分别是:
Expert one on one J2ee design and development
Expert one on one J2ee without EJB
Professional Java Development with SpringFramework
前两本书的经典程度我就不说了,只有读了它们,才能真正了解Spring的设计意图,掌握Spring的精髓。
第三本书是我强烈不建议初学者读的书。里面的东西深入而全,但是原理讲解得又不够深,很容易让初学者犯迷糊。但是却是Spring的高级用户必读的一本书(还有一本pro Spring据说也不错,不过我没读过)。我过几天会写一下这本书的书评。
当然这个阶段与第四阶段是交错的,边读书边做项目学到的东西才会更多的。
六、分析源代码,扩展Spring
有人认为没有必要分析Spring的源代码,因为这是很累人又不计好的事。但是要想成为Spring的高级用户,这是必经的阶段。在学习的过 程中,我们学到的不仅是Spring,更重要的是他的设计思想。不管怎样,看牛人的源代码是绝对有好处的。不过这是一个很累人的过程,要有思考准备哦
http://www.javah.net/Spring/20070529/2011.html
guorabbit收录,时间:2008-8-5 23:27:16 | 相关网摘,我也收藏
可以说几乎每个做过Web开发的人都问过,到底元素的ID和Name有什么区别阿?为什么有了ID还要有Name呢?! 而同样我们也可以得到最classical的答案:ID就像是一个人的身份证号码,而Name就像是他的名字,ID显然是唯一的,而Name是可以重复的。
上周我也遇到了ID和Name的问题,在页面里输入了一个input type="hidden",只写了一个ID='SliceInfo',赋值后submit,在后台用Request.Params["SliceInfo"]却怎么也去不到值。后来恍然大悟因该用Name来标示,于是在input里加了个Name='SliceInfo',就一切ok了。
第一段里对于ID和Name的解答说的太笼统了,当然那个解释对于ID来说是完全对的,它就是Client端HTML元素的Identity。而Name其实要复杂的多,因为Name有很多种的用途,所以它并不能完全由ID来代替,从而将其取消掉。具体用途有:
用途1: 作为可与服务器交互数据的HTML元素的服务器端的标示,比如input、select、textarea、和button等。我们可以在服务器端根据其Name通过Request.Params取得元素提交的值。
用途2: HTML元素Input type='radio'分组,我们知道radio button控件在同一个分组类,check操作是mutex的,同一时间只能选中一个radio,这个分组就是根据相同的Name属性来实现的。
用途3: 建立页面中的锚点,我们知道link是获得一个页面超级链接,如果不用href属性,而改用Name,如:,我们就获得了一个页面锚点。
用途4: 作为对象的Identity,如Applet、Object、Embed等元素。比如在Applet对象实例中,我们将使用其Name来引用该对象。
用途5: 在IMG元素和MAP元素之间关联的时候,如果要定义IMG的热点区域,需要使用其属性usemap,使usemap="#name"(被关联的MAP元素的Name)。
用途6: 某些特定元素的属性,如attribute,meta和param。例如为Object定义参数或Meta中。
显然这些用途都不是能简单的使用ID来代替掉的,所以HTML元素的ID和Name的却别并不是身份证号码和姓名这样的区别,它们更本就是不同作用的东西。
当然HTML元素的Name属性在页面中也可以起那么一点ID的作用,因为在DHTML对象树中,我们可以使用document.getElementsByName来获取一个包含页面中所有指定Name元素的对象数组。Name属性还有一个问题,当我们动态创建可包含Name属性的元素时,不能简单的使用赋值element.name = "..."来添加其Name,而必须在创建Element时,使用document.createElement('')为元素添加Name属性。这是什么意思啊?看下面的例子就明白了。
var input = document.createElement('INPUT');
input.id = 'myId';
input.name = 'myName';
alert(input.outerHTML);
消息框里显示的结果是:。
var input = document.createElement('');
input.id = 'myId';
alert(input.outerHTML);
消息框里显示的结果是:。
初始化Name属性的这个设计不是IE的缺陷,因为MSDN里说了要这么做的,可是这样设计的原理什么呢?我暂时没有想太明白。
这里再顺便说一下,要是页面中有n(n>1)个HTML元素的ID都相同了怎么办?在DHTML对象中怎么引用他们呢?如果我们使用ASPX页面,这样的情况是不容易发生的,因为aspnet进程在处理aspx页面时根本就不允许有ID非唯一,这是页面会被抛出异常而不能被正常的render。要是不是动态页面,我们硬要让ID重复那IE怎么搞呢?这个时候我们还是可以继续使用document.getElementById获取对象,只不过我们只能获取ID重复的那些对象中在HTML Render时第一个出现的对象。而这时重复的ID会在引用时自动变成一个数组,ID重复的元素按Render的顺序依次存在于数组中。
http://www.cnblogs.com/birdshome/archive/2005/01/31/html_id_name.html
guorabbit收录,使用标签:ajax,时间:2008-8-5 1:27:06 | 相关网摘,我也收藏
终于实现了ajax用户注册系统.。注册界面如上。
index.html
用户注册
function checkpass1()
{
var Inform="form1";
var Inputname="password1";
var Form=Inform+"."
eval("Temp="+Form+Inputname+".value;");
//alert(Temp);
if(Temp==""){
msg="此项不能为空";
}
else
{
if(Temp.length20)
{
msg="密码必须在6~20个字符之间";
}
else
{
var Inputname1="password";
eval("Temp1="+Form+Inputname1+".value");
if (Temp!=Temp1)
{
eval(Form+Inputname+".value='';");
eval(Form+Inputname1+".value='';");
eval(Form+Inputname1+".focus();");
msg="两次密码不一样!";
msg1="";
var ch1=document.getElementById("password2");
ch1.innerHTML=""+msg1+"";
}
else
{
msg="输入正确";
}
}
}
var ch=document.getElementById("password3");
ch.innerHTML=""+msg+"";
}
function checkpass()
{
var Inform="form1";
var Inputname="password";
var Form=Inform+"."
eval("Temp="+Form+Inputname+".value;");
//alert(Temp);
if(Temp==""){
msg="此项不能为空";
}
else
{
if(Temp.length20)
{
msg="密码必须在6~20个字符之间";
}
else
{
msg="输入正确";
}
}
var ch=document.getElementById("password2");
ch.innerHTML=""+msg+"";
}
function sendreg()
{
if(this.form1.username.value=="")
{
alert('请输入要注册的用户名');
this.form1.username.focus();
return false;
}
if(this.form1.password.value=="")
{
alert('请输入密码');
this.form1.password.focus();
return false;
}
else
{
if(this.form1.password.value.length20)
{
alert('密码长度必须在6~20个字符');
this.form1.password.focus();
return false;
}
}
if(this.form1.password1.value=="")
{
alert('请输入密码');
this.form1.password1.focus();
return false;
}
else
{
if(this.form1.password1.value.length20)
{
alert('密码长度必须在6~20个字符');
this.form1.password1.focus();
return false;
}
}
if(this.form1.password.value!=this.form1.password1.value)
{
this.form1.password.value="";
this.form1.password1.value="";
this.form1.password.focus();
alert('两次密码不一样,请重新输入');
return false;
}
username=this.form1.username.value;
password=this.form1.password.value;
var xmlhttp;
try
{
xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
try
{
xmlhttp=new XMLHttpRecordset();
}
catch (e)
{
}
}
}
//创建请求,并使用escape对username编码,以避免乱码
xmlhttp.onreadystatechange=function()
{
if(4==xmlhttp.readyState)
{
if(200==xmlhttp.status)
{
if (xmlhttp.responseText=="yes")
{
this.form1.username.value="";
this.form1.password.value="";
this.form1.password1.value="";
document.getElementById("check1").innerHTML="";
document.getElementById("password2").innerHTML="";
document.getElementById("password3").innerHTML="";
alert('注册成功');
}
else
{
this.form1.password.value="";
this.form1.password1.value="";
alert('注册失败');
}
}
else
{
alert('网络连接失败');
}
}
}
//打开连接
xmlhttp.open("post","reg.asp",true)
xmlhttp.setRequestHeader('Content-type',
'application/x-www-form-urlencoded');
//发送数据
xmlhttp.send("username="+escape(username)+
"&password="+escape(password));
}
用户注册
用户名
密码
确认密码
checkuser.asp
<%
username=Replace(request.querystring("username"),"'","")
sql="select * from puser where y_username='"&username&"'"
rs.open sql,conn,1,1
if rs.eof then
response.write "no"
else
response.write "yes"
end if
rs.close
%>
http://www.aspprogram.cn/detail.asp?id=69
guorabbit收录,使用标签:CSS, Hmtl,时间:2008-7-29 17:26:00 | 相关网摘,我也收藏
新一篇: CSS语法 | 旧一篇: 类的加载及初始化
1、详解HTML
标签和属性
在HTML中,通常标签都是由开始标签和结束标签组成的,开始标签用“”表示,结束标签用“”表示。
元素指的是包含标签在内的整体,除去标签的部分叫做内容。
属性要在开始标签中指定,用来表示该标签的性质和特性。通常都是以“属性名=”值””的形式来表示,用空格隔开后,还可以指定多个属性。指定多个属性时不用区分顺序
颜色的指定方法
用HTML指定颜色有两种方法
1、用16进制数值来指定:在#号的后面,把RGB的各个选项用十六进制的数值来表示,数值保持两位数。
2、指定颜色的名称:可以对基本的16色用名称来指定其颜色
指定文件的位置
在对某部分设置链接的时候,需要指定链接端HTML文件的位置;同样%
http://blog.csdn.net/hbrqlpf/archive/2007/09/30/1808143.aspx
guorabbit收录,使用标签:DHTML, CSS,时间:2008-7-29 14:05:25 | 相关网摘,我也收藏
CSS中的滑动门技术研究
2006-02-22 08:56作者:龙犊整理出处:天极网责任编辑:龙犊 收尾工作
敏锐的观察者也许会在上一例注意到白色的标签角落。这些不透明的角用来防止下面的图像透过上面的一副。理论上,我们可以尝试使用部分背景图像来适应标签的背景。但是我们的标签会在高度上增长,尝试通过移动背景颜色,背景图像就会相对变矮。代替的办法是,改变图像,将标签的角落设为透明。如果弧线是反锯齿的,我们在其边缘使用较平均的背景色彩。
现在,角落已经变成透明色,左边的图像将透过右边图像的角落。为了补偿,我们为表单项加入和左边图像宽度相吻合的padding(9px)。既然已经为表单项加入了padding,我们还需去掉同样的宽度以达到文本的居中(15px-9px=6px):
#header li { float:left; background:url("right.gif") no-repeat right top; margin:0; padding:0 0 0 9px; }#header a { display:block; background:url("left.gif") no-repeat left top; padding:5px 15px 4px 6px; }
仍未结束,因为加入了9个像素的padding使左边图像与标签的左边之间产生了一段空白。现在,左侧与右侧,可见“doorway”的边缘接在一起,我们再不需要将左边图像保持在上方。于是,交换两幅背景图像的顺序,相反过来。同样交换“当前”标签中使用的两幅图像:
#header li { float:left; background:url("left.gif") no-repeat left top; margin:0; padding:0 0 0 9px; }#header a, #header strong, #header span { display:block; background:url("right.gif") no-repeat right top; padding:5px 15px 4px 6px; }#header #current { background-image:url("left_on.gif"); }#header #current a { background-image:url("right_on.gif"); padding-bottom:5px; }
完成这些后,我们到达了效果4。要注意的是,透明的角落在标签的左侧产生了一段不能点击的无效区域。这个区域在文本以外,但仍然是可以察觉到的。在标签的两边都使用透明的图像是没有必要的。如果我们不希望产生这种无效的区域,那么我们必须使用在标签后面使用颜色,然后用这种颜色来代替标签角落的透明图像。现在我们仅保持这种透明角落。
对于剩下的问题,我们将一次性完成全部的修改:加重标签文本,将普通标签中的文本改为棕色,“当前”标签文本改为深灰色,去掉链接的下划线,最后将悬停文本色彩改为同样的深灰色。经过一系列的改变,我们将看到目前为止的效果5。
一致性的解决
在效果2之后,我们公认的一个问题就是在IE5/Mac浏览方式下,每个标签延伸并占据了整个浏览器的宽度,以致标签垂直的堆在了一起。这不是我们所希望的。
在大多数的浏览器中,浮动一个元素会有收缩,收缩最小至它所包含内容的大小。如果一个浮动元素包含一幅图像或其本身即图像,便会收缩至图像的宽度。如果仅仅包含文本,那么将会收缩至最长的,不可被顶开的那文本的宽度。
一个问题出现在IE5/Mac中的图片中,当一个auto-width的块对象元素被插入到一个浮动的元素中时。其他的浏览器仍旧将浮动缩小至最小,而无视容器内的块对象元素。但IE5/Mac并不按照这种情况,相反它将浮动和块对象元素扩展至尽可能的宽度。为解决这个问题,我们将锚链同时浮动起来,但仅仅对于IE5/Mac,以免放弃其他的浏览器。首先,我们为锚链设定浮动规则。然后,我们使用反斜杠注释法来隐藏这种规则,让它仅仅对IE5/Mac生效,而无视其他的浏览器:
#header a { float:left; display:block; background:url("right.gif") no-repeat right top; padding:5px 15px 4px 6px; text-decoration:none; font-weight:bold; color:#765; }/* Commented Backslash Hack hides rule from IE5-Mac \*/#header a {float:none;}/* End IE5-Mac hack */
现在IE5/Mac浏览器将按我们所期望的那样来显示标签,看效果6。对于非IE5/Mac的浏览器什么都不需要改变。注意到IE5.0/Mac的一系列解释上的bug在IE5.1中解决。因此,滑动门技术在5.0版本中所遭遇的问题超出了hack的限度。既然升级到IE5.1/Mac已不成难题,OS 9 Macs/IE5.0的占有率应逐渐缩减至很低。
举一反三
我们刚刚演练了滑动门技术,用纯文本和无序列表来创造导航标签,加以少量的样式。它的装载速度快,具有可维持性,并且文本的大小可以在不破坏外观的情况下进行较大的伸缩。不必我们再重申在创造复杂样式的导航栏中,滑动门技术所表现出来的弹性了。
只有想不到,没有做不到。最终效果向我们展示了一例,但我们设计不可能因此而被限定死。
在某些场合,标签不一定是对称的。我很快就制作了这种标签的第二个版本,也有阴影3D的样式,有角的边缘,和具有特色的左边部分。依据第二个版本,我们甚至可以交换左右两幅图像的位置。以这种细致的布局和灵巧的图像控制,我们可以去掉按钮的下边框以便标签图像更好的去适应背景,如第三个版本所显示的那样。如果你的浏览器支持多个样式表的切换,你甚至可以靠它在多个版本的导航栏之间自由切换。
仍有许多我们没有提到的其他的效果。快速的提一下,我改变鼠标悬停的文本色彩,但是真个图像可以替换掉以创造出更有趣的变换效果。即使标记中两个嵌套的HTML元素,也可以用CSS来达到一些我们还未想到的效果。我们在此例中创造的仅仅是水平的标签栏,但滑动门亦可应用于许多其他的情形。阁下觉得如何呢?
http://homepage.yesky.com/71/2311071_2.shtml
guorabbit收录,时间:2008-7-28 17:41:36 | 相关网摘,我也收藏
jsp乱码解决大全(转自csdn一高手)
2007-06-12 20:45:52 / 个人分类:技术历程
jsp中文显示乱码解决方案2006-12-27 22:56
一、JSP页面显示乱码
二、表单提交中文时出现乱码
三、数据库连接
大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到
的中文乱码的问题及解决办法写出来供大家参考。
一、JSP页面显示乱码
下面的显示页面(display.jsp)就出现乱码:
JSP的中文处理
<%
out.print("JSP的中文处理");
%>
对不同的WEB服务器和不同的JDK版本,处理结果就不一样。原因:服务器使用的编码方式不同和浏览器
对不同的字符显示结果不同而导致的。解决办法:在JSP页面中指定编码方式(gb2312),即在页面的第一
行加上:<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。完整页面如下
:
<%@ page contentType="text/html; charset=gb2312"%>
JSP的中文处理
<%
out.print("JSP的中文处理");
%>
二、表单提交中文时出现乱码
下面是一个提交页面(submit.jsp),代码如下:
JSP的中文处理
下面是处理页面(process.jsp)代码:
<%@ page contentType="text/html; charset=gb2312"%>
JSP的中文处理
<%=request.getParameter("name")%>
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF
-8编码方式来发送请求,而UTF- 8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。
解决办法:通过request.seCharacterEncoding ("gb2312")对请求进行统一编码,就实现了中文的正常
显示。修改后的process.jsp代码如下:
<%@ page contentType="text/html; charset=gb2312"%>
<%
request.seCharacterEncoding("gb2312");
%>
JSP的中文处理
<%=request.getParameter("name")%>
三、数据库连接出现乱码
只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上
useUnicode=true&characterEncoding=GBK 就OK了。
四、数据库的显示乱码
在mysql4.1.0中,varchar类型,text类型就会出现中文乱码,对于varchar类型把它设为binary属性就
可以解决中文问题,对于text类型就要用一个编码转换类来处理,实现如下:
public class Convert {
/** 把ISO-8859-1码转换成GB2312
*/
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e){
System.err.print("编码转换错误:"+e.getMessage());
return "";
}
}
}
把它编译成class,就可以调用Convert类的静态方法ISOtoGB()来转换编码。
如果你还有什么不懂之处:我给大家推荐一个好的JSP-JAVA网站:
http://www.phy.hbnu.edu.cn/dsp/
总结:
1. 在jsp中<%@ page contentType="text/html; charset=A" %>如果指定了,那么在改jsp中所有构造
的String(不是引用),如果沒有指定编码,那么这些String的编码是A的。
从request的得到的String如果沒有指定request的编码的话,他是iso-8859-1的
从别的地方得到的String是使用原來初始的编码的,比如从数据库得到String,如果数据库的编码
是B,那么该String的编码是B而不是A的,也不是系统默认的。
此时,如果要输出的String的编码不是A,那么,很可能显示乱码的,所以首先要将String正確转化
为编码A的String,然后输出。
2. 在jsp中<%@ page contentType="text/html; charset=A" %>沒有指定,那么相当于指定了<%@
page contentType="text/html; charset=ISO-8859-1" %>
3. Servelte中如果执行了像 response.setContentType("text/html;charset=A");説明将response的
字符输出流编码设置为A,所有要输出的String的编码要转化为A的,否則会得到乱码的。
Servelet中从request得到的String的编码和jsp中一样的,但是在servlet java文件中构造的
String是使用的系统默认的编码的。在servelt中从外部得到的String 是使用原来的编码的,比如从编
码为B的数据库得到的数据是编码为B的,不是A,也不是系统默认的编码。
//////////////////////////////////////////////////////////////////////////////////////////
转载:JSP中文乱码问题解决方法小结
在使用JSP的过程中,最使人头疼的一个问题就是中文乱码问题,以下是我在软件开发中遇到的乱
码问题以及解决方法。
1、JSP页面乱码
这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下
面代码指定字符集编码即可,
2、数据库乱码
这种乱码会使你插入数据库的中文变成乱码,或者读出显示时也是乱码,解决方法如下:
在数据库连接字符串中加入编码字符集
String Url="jdbc:mysql://localhost/digitgulf?
user=root&password=root&useUnicode=true&characterEncoding=GB2312";
并在页面中使用如下代码:
response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3、中文作为参数传递乱码
当我们把一段中文字符作为参数传递个另一页面时,也会出现乱码情况,解决方法如下:
在参数传递时对参数编码,比如
RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
然后在接收参数页面使用如下语句接收
keywords=new String(request.getParameter("keywords").getBytes("8859_1"));
4、JSP页面乱码加这句
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"
errorPage="err.jsp" %>
/////////////////////////////////////////////////////////////////////////////////////////
JSP/JDBC MySQL乱码问题~~~
作者:佚名 来源:本站整理 发布时间:2005-7-1 12:24:30
綠起:
JSP的request 默认为ISO8859_1,所以在处理中文的时候,
要显示中文的话,必须转成GBK的,如下
String str=new String(request.getParameter("name").getBytes("ISO8859-1"),"GBK");
out.println(str);
这样就可以显示中文了
MYSQL操作时的中文问题:
这个要看MySQL的默认编码了,一般不调整的话为latin1其实和ISO8859_1一样,所以操作的时候要处理
和他一致,不然就会乱码的
1.插入中文:
String sql2="INSERT INTO test (name) VALUES('"+request.getParameter("name")+"')";
stmt.executeUpdate(sql2);
不用编码就可以插入了
2.显示插入的中文:
因为存入的是latin,所以显示的时候就要GBK一下
String x=new String((rs.getString("title")).getBytes("ISO8859_1"),"GBK");
out.println(x);
3.设定存储编码:
当然在MySQL为latin1编码时,也可以存的时候用GBK了
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/jsp?
useUnicode=true&characterEncoding=GBK","root","");
str1="中文";
String sql2="INSERT INTO test (name) VALUES('"+str1+"')";
这样也可以很成功的插入了,呵呵
////////////////////////////////////////////////////////////////////////////////////////
JSP/Servlet 中的汉字编码问题
(作者:张建芳,转自IBM DeveloperWorks 中国网站 2001年04月18日 15:08)
网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理,
并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余的。
1.问题的起源
每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312
-80,日本的 JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用。字符编码集按
长度分为 SBCS(单字节字符集),DBCS(双字节字符集)两大类。早期的软件(尤其是操作系统),
为了解决本地字符信息的计算机处理,出现了各种本地化版本(L10N),为了区分,引进了 LANG,
Codepage 等概念。但是由于各个本地字符集代码范围重叠,相互间信息交换困难;软件各个本地化版
本独立维护成本较高。因此有必要将本地化工作中的共性抽取出来,作一致处理,将特别的本地化处理
内容降低到最少。这也就是所谓的国际化(I18N)。各种语言信息被进一步规范为 Locale 信息。处理
的底层字符集变成了几乎包含了所有字形的 Unicode。
现在大部分具有国际化特征的软件核心字符处理都是以 Unicode 为基础的,在软件运行时根据当
时的 Locale/Lang/Codepage 设置确定相应的本地字符编码设置,并依此处理本地字符。在处理过程中
需要实现 Unicode 和本地字符集的相互转换,甚或以 Unicode 为中间的两个不同本地字符集的相互转
换。这种方式在网络环境下被进一步延伸,任何网络两端的字符信息也需要根据字符集的设置转换成可
接受的内容。
Java 语言内部是用 Unicode 表示字符的,遵守 Unicode V2.0。Java 程序无论是从/往文件系统
以字符流读/写文件,还是往 URL 连接写 HTML 信息,或从 URL 连接读取参数值,都会有字符编码的
转换。这样做虽然增加了编程的复杂度,容易引起混淆,但却是符合国际化的思想的。
从理论上来说,这些根据字符集设置而进行的字符转换不应该产生太多问题。而事实是由于应用程
序的实际运行环境不同,Unicode 和各个本地字符集的补充、完善,以及系统或应用程序实现的不规范
,转码时出现的问题时时困扰着程序员和用户。
2.GB2312-80,GBK,GB18030-2000 汉字字符集
其实解决 JAVA 程序中的汉字编码问题的方法往往很简单,但理解其背后的原因,定位问题,还需
要了解现有的汉字编码和编码转换。
GB2312-80 是在国内计算机汉字信息技术发展初始阶段制定的,其中包含了大部分常用的一、二级
汉字,和 9 区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是
最基本的中文字符集。其编码范围是高位0xa1-0xfe,低位也是 0xa1-0xfe;汉字从 0xb0a1 开始,结
束于 0xf7fe;
GBK 是 GB2312-80 的扩展,是向上兼容的。它包含了 20902 个汉字,其编码范围是 0x8140-
0xfefe,剔除高位 0x80 的字位。其所有字符都可以一对一映射到 Unicode 2.0,也就是说 JAVA 实际
上提供了 GBK 字符集的支持。这是现阶段 Windows 和其它一些中文操作系统的缺省字符集,但并不是
所有的国际化软件都支持该字符集,感觉是他们并不完全知道 GBK 是怎么回事。值得注意的是它不是
国家标准,而只是规范。随着 GB18030-2000国标的发布,它将在不久的将来完成它的历史使命。
GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。
GBK2K 从根本上解决了字位不够,字形不足的问题。它有几个特点:
●它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。
●编码是变长的,其二字节部分与 GBK 兼容;四字节部分是扩充的字形、字位,其编码范围是首
字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39。
●它的推广是分阶段的,首先要求实现的是能够完全映射到 Unicode 3.0 标准的所有字形。
●它是国家标准,是强制性的。
现在还没有任何一个操作系统或软件实现了 GBK2K 的支持,这是现阶段和将来汉化的工作内容。
3.JSP/Servlet 汉字编码问题及在 WAS 中的解决办法
3.1 常见的 encoding 问题的现象
网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser 或应用程序端,如:
●浏览器中看到的 Jsp/Servlet 页面中的汉字怎么都成了 ’?’ ?
●浏览器中看到的 Servlet 页面中的汉字怎么都成了乱码?
●JAVA 应用程序界面中的汉字怎么都成了方块?
●Jsp/Servlet 页面无法显示 GBK 汉字。
●Jsp/Servlet 不能接收 form 提交的汉字。
●JSP/Servlet 数据库读写无法获得正确的内容。
隐藏在这些问题后面的是各种错误的字符转换和处理(除第3个外,是因为 Java font 设置错误引
起的)。解决类似的字符 encoding 问题,需要了解 Jsp/Servlet 的运行过程,检查可能出现问题的
各个点。
3.2 JSP/Servlet web 编程时的 encoding 问题
运行于Java 应用服务器的 JSP/Servlet 为 Browser 提供 HTML 内容,其过程如下图所示:
其中有字符编码转换的地方有:
a.JSP 编译。Java 应用服务器将根据 JVM 的 file.encoding 值读取 JSP 源文件,并转换为内部
字符编码进行 JSP 编译,生成 JAVA 源文件,根据 file.encoding 值写回文件系统。如果当前系统语
言支持 GBK,那么这时候不会出现 encoding 问题。如果是英文的系统,如 LANG 是 en_US 的 Linux,
AIX 或 Solaris,则要将 JVM 的 file.encoding 值置成 GBK 。系统语言如果是 GB2312,则根据需要
,确定要不要设置 file.encoding,将 file.encoding 设为 GBK 可以解决潜在的 GBK 字符乱码问题
。
b.Java 需要被编译为 .class 才能在 JVM 中执行,这个过程存在与a.同样的 file.encoding 问
题。从这里开始 servlet 和 jsp 的运行就类似了,只不过 Servlet 的编译不是自动进行的。
c.Servlet 需要将 HTML 页面内容转换为 browser 可接受的 encoding 内容发送出去。依赖于各
JAVA App Server 的实现方式,有的将查询 Browser 的 accept-charset 和 accept-language 参数或
以其它猜的方式确定 encoding 值,有的则不管。因此 constant-encoding 也许是最好的解决方法。
对于中文网页,可在 JSP 或 Servlet 中设置 contentType="text/html; charset=GB2312";如果页面
中有GBK字符,则设置为contentType="text/html; charset=GBK",由于IE 和 Netscape对GBK的支持程
度不一样,作这种设置时需要测试一下。
因为16位 JAVA char在网络传送时高8位会被丢弃,也为了确保Servlet页面中的汉字(包括内嵌的
和servlet运行过程中得到的)是期望的内码,可以用 PrintWriter ōut=res.getWriter() 取代
ServletOutputStream ōut=res.getOutputStream(), PrinterWriter 将根据contentType中指定的
charset作转换(ContentType需在此之前指定!);也可以用OutputStreamWriter封装
ServletOutputStream 类并用write(String)输出汉字字符串。
对于 JSP,JAVA Application Server 应当能够确保在这个阶段将嵌入的汉字正确传送出去。
d.这是 URL 字符 encoding 问题。如果通过 get/post 方式从 browser 返回的值中包含汉字信息
, servlet 将无法得到正确的值。SUN的 J2SDK 中,HttpUtils.parseName 在解析参数时根本没有考
虑 browser 的语言设置,而是将得到的值按 byte 方式解析。这是网上讨论得最多的 encoding 问题
。因为这是设计缺陷,只能以 bin 方式重新解析得到的字符串;或者以 hack HttpUtils 类的方式解
决。参考文章 2、3 均有介绍,不过最好将其中的中文 encoding GB2312、 CP1381 都改为 GBK,否则
遇到 GBK 汉字时,还是会有问题。
Servlet API 2.3 提供一个新的函数 HttpServeletRequest.setCharacterEncoding 用于在调用
request.getParameter(“param_name”) 前指定应用程序希望的 encoding,这将有助于彻底解决这个
问题。
WebSphere Application Server 对标准的 Servlet API 2.x 作了扩展,提供较好的多语言支持。
上述c,d情况,WAS 都要查询 Browser 的语言设置,在缺省状况下zh、zh-cn 等均被映射为 JAVA
encoding CP1381(注意:CP1381 只是等同于 GB2312 的一个 codepage,没有 GBK 支持)。这样做我
想是因为无法确认 Browser 运行的操作系统是支持GB2312, 还是 GBK,所以取其小。但是实际的应用
系统还是要求页面中出现 GBK 汉字,最著名的是朱总理名字中的“?”(rong2 ,0xe946,\u9555),所
以有时还是需要将 Encoding/Charset 指定为 GBK。当然 WAS 中变更缺省的 encoding 没有上面说的
那么麻烦,针对 a,b,参考文章 5 ),在 Application Server 的命令行参数中指定 -
Dfile.encoding=GBK 即可; 针对 d,在 Application Server 的命令行参数中指定-
Ddefault.client.encoding=GBK。如果指定了-Ddefault.client.encoding=GBK,那么c情况下可以不再
指定charset。
3.3 数据库读写时的 encoding 问题
JSP/Servlet 编程中经常出现 encoding 问题的另一个地方是读写数据库中的数据。
流行的关系数据库系统都支持数据库 encoding,也就是说在创建数据库时可以指定它自己的字符
集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有
encoding 转换。对于中文数据,应当保证数据的完整性。GB2312,GBK,UTF-8 等都是可选的数据库
encoding;如果选择 ISO8859-1(8-bit SBCS),那么应用程序在写数据之前须将 16Bit 的一个汉字或
Unicode 拆分成两个 8-bit 的字符,读数据之后则需将两个字节合并起来,同时还有判别其中的 SBCS
字符。没有充分利用数据库 encoding 的作用,反而增加了编程的复杂度,ISO8859-1不是推荐的数据
库 encoding。JSP/Servlet编程时,可以先用数据库管理系统提供的功能检查其中的中文数据是否正确
。
然后应当注意的是读出来的数据的 encoding,JAVA 程序中一般得到的是 Unicode。写数据时则相
反。
3.4 定位问题时常用的技巧
定位中文encoding问题通常采用最笨的也是最有效的办法——在你认为有嫌疑的程序处理后打印字
符串的内码。通过打印字符串的内码,你可以发现什么时候中文字符被转换成Unicode,什么时候
Unicode被转回中文内码,什么时候一个中文字成了两个 Unicode 字符,什么时候中文字符串被转成了
一串问号,什么时候中文字符串的高位被截掉了……
取用合适的样本字符串也有助于区分问题的类型。如:”aa啊aa?aa” 等中英相间、GB、GBK特征
字符均有的字符串。一般来说,英文字符无论怎么转换或处理,都不会失真(如果遇到了,可以尝试着
增加连续的英文字母长度)。
4.结束语
其实 JSP/Servlet 的中文encoding 并没有想像的那么复杂,虽然定位和解决问题没有定规,各种
运行环境也各不尽然,但后面的原理是一样的。了解字符集的知识是解决字符问题的基础。不过,随着
中文字符集的变化,不仅仅是 java 编程,中文信息处理中的问题还是会存在一段时间的。
5.参考文章
1) Character Problem Review
2) Java 编程技术中汉字问题的分析及解决
3) NLS Characters in WebSphere: SBCS/DBCS display on same page
4) GB18030
5) Setting language encoding in web applications: Websphere applications Server
作者简介
张建芳,软件工程师,毕业于北京理工大学计算机应用学院,有多年中文本地化经验。您可通过
jfzhang@usa.net 与他联系。
/////////////////////////////////////////////////////////////////////////////////////
关于jsp乱码问题的解决。
1 最基本的乱码问题。
这个乱码问题是最简单的乱码问题。一般新会出现。就是页面编码不一致导致的乱码。
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
中文问题
我是个好人
三个地方的编码。
第一个地方的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件
,包括里面的汉字。
第二处编码为解码格式。因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。也就
是必须一致。而第二处所在的这一行,可以没有。缺省也是使用iso8859-1的编码格式。所以如果没有
这一行的话,“我是个好人”也会出现乱码。必须一致才可以。
第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式没有关系
。有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致
浏览器混淆了编码格式。出现了乱码。
2 表单使用Post方式提交后接收到的乱码问题
这个问题也是一个常见的问题。这个乱码也是tomcat的内部编码格式iso8859-1在捣乱,也就是说post
提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式
接受。导致乱码。既然这样的原因,下面有几种解决方式,并比较。
A 接受参数时进行编码转换
String str = new String(request.getParameter("something").getBytes("ISO-8859-1"),"utf-8")
; 这样的话,每一个参数都必须这样进行转码。很麻烦。但确实可以拿到汉字。
B 在请求页面上开始处,执行请求的编码代码, request.setCharacterEncoding("UTF-8"),把提交内
容的字符集设为UTF-8。这样的话,接受此参数的页面就不必在转码了。直接使用
String str = request.getParameter("something");即可得到汉字参数。但每页都需要执行这句话。
这个方法也就对post提交的有效果,对于get提交和上传文件时的enctype="multipart/form-data"是无
效的。稍后下面单独对这个两个的乱码情况再进行说明。
C 为了避免每页都要写request.setCharacterEncoding("UTF-8"),建议使用过滤器对所有jsp
进行编码处理。这个网上有很多例子。请大家自己查阅。
3 表单get提交方式的乱码处理方式。
如果使用get方式提交中文,接受参数的页面也会出现乱码,这个乱码的原因也是tomcat的内部编码格
式iso8859-1导致。Tomcat会以get的缺省编码方式iso8859-1对汉字进行编码,编码后追加到url,导致
接受页面得到的参数为乱码/、。
解决办法:
A 使用上例中的第一种方式,对接受到的字符进行解码,再转码。
B Get走的是url提交,而在进入url之前已经进行了iso8859-1的编码处理。要想影响这个编码则需要在
server.xml的Connector节点增加useBodyEncodingForURI="true"
属性配置,即可控制tomcat对get方式的汉字编码方式,上面这个属性控制get提交也是用
request.setCharacterEncoding("UTF-8")所设置的编码格式进行编码。所以自动编码为utf-8,接受页
面正常接受就可以了。但我认为真正的编码过程是,tomcat又要根据
里面所设置的URIEncoding=”UTF-8”再进行一次编码,但是由于已经编码为utf-8,再编码也不会有变
化了。如果是从url获取编码,接受页面则是根据URIEncoding=”UTF-8”来进行解码的。
4 上传文件时的乱码解决
上传文件时,form表单设置的都是enctype="multipart/form-data"。这种方式以流方式提交文件。
如果使用apach的上传组件,会发现有很多乱码想象。这是因为apach的先期commons-fileupload.jar有
bug,取出汉字后进行解码,因为这种方式提交,编码又自动使用的是tomcat缺省编码格式iso-8859-1
。但出现的乱码问题是: 句号,逗号,等特殊符号变成了乱码,汉字如果数量为奇数,则会出现乱码
,偶数则解析正常。
解决方式: 下载commons-fileupload-1.1.1.jar 这个版本的jar已经解决了这些bug。
但是取出内容时仍然需要对取出的字符进行从iso8859-1到utf-8转码。已经能得到正常所有汉字以及字
符。
5 Java代码关于url请求,接受参数的乱码
url的编码格式,取决于上面所说的URIEncoding=”UTF-8”。 如果设定了这个编码格式,则意味着所
有到url的汉字参数,都必须进行编码才可以。否则得到的汉字参数值都是乱码,例如
一个链接 Response.sendDerect(“/a.jsp?name=张大维”);而在a.jsp里面直接使用
String name");得到的就是乱码。因为规定了必须是utf-8才可以,所以,这个转向应该这样写:
Response.sendDerect(“/a.jsp?name=URLEncode.encode(“张大维”,”utf-8”);才可以。
如果不设置这个参数URIEncoding=”UTF-8”, 会怎么样呢? 不设置则就使用了缺省的编码格式
iso8859-1。问题又出来了,第一就是参数值的个数如果是奇数个数,则就可以正常解析,如果使偶数
个数,得到最后字符就是乱码。还有就是如果最后一个字符如果是英文,则就能正常解析,但中文的标
点符号仍出现乱码。权宜之计,如果您的参数中没有中文标点符号,则可以在参数值最后加一个英文符
号来解决乱码问题,得到参数后再去掉这个最后面的符号。也可以凑或使用。
6 脚本代码关于url请求,接受到的参数乱码
脚本中也会进行页面转向的控制,也会涉及到附带参数,并在接受页面解析这个参数的情况。如果这个
汉字参数不进行URIEncoding=”UTF-8”所指定的编码处理,则接受页面接受到的汉字也是乱码。脚本
处理编码比较麻烦,必须有相应的编码脚本对应文件,然后调用脚本中的方法对汉字进行编码即可。
7 关于jsp在MyEclipse中打开的乱码问题
对于一个已经存在的项目,Jsp文件的存储格式可能是utf-8。如果新安装的eclipse,则缺省打开使用
的编码格式都是iso8859-1。所以导致jsp里面的汉字出现乱码。这个乱码比较容易解决,直接到
eclipse3.1的偏好设置里面找到general-〉edidor,设置为您的文件打开编码为utf-8即可。Eclipse会
自动重新以新的编码格式打开。汉字即可正常显示。
8 关于html页面在eclipse中打开出现乱码情况
由于大部分页面都是由dreamweaver制作,其存储格式跟eclipse的识别有差别导致。
一般这种情况,在eclipse中新建一个jsp,直接从dreamweaver复制页面内容粘贴到jsp即可。
//////////////////////////////////////////////////////////////////////////////////////////
jsp中文乱码问题的解决办法 jsp中java中文编码问题的个人经验|终于看到一个完全解决的方案
四月 5th, 2006
====================http://www.glgg.net/blog===================zsjnju@hotmail.com=========
=======
开发java应用出现乱码是很常见的,毕竟现在unicode的使用还不是很广泛,在使用gb2312(包含了gbk
简体,big5繁体)的系统中要正确实现
中文的display和数据库的存储是最基本的要求。
========================http://www.glgg.net/blog=======================================
1,首先developer要明确自己为什么会遇到乱码,遇到什么样的乱码(无意义的符号还是一串问号或者
其它什么东西)。
新手遇到一堆很乱的字符时通常不知所措,最直接的反映就是打开google搜索”java中文”(这个字符
串在搜索引擎上的查询频率非常高),
然后一个一个的去看别人的解决方法。这样做没有错,但是很难达到目的,原因下面会提到。
总之,出现乱码的原因是非常多的,解决的方法也完全不一样,要解决问题必须先分析自己的”上下文
环境”。
========================http://www.glgg.net/blog=====================================
2,具体说来,需要哪些信息才能确定项目中的乱码的根源。
a,开发者所用的操作系统
b,j2ee容器的名称,版本
c,数据库的名称,版本(精确版本)以及jdbc驱动的版本
d,出现乱码的source code(比如是system out 出来的,还是jsp页面中的,如果是jsp中的,那么头
部声明的情况也很重要)
=========================http://www.glgg.net/blog========================================
3,如何初步分析乱码出现的原因。
有了上述的信息,基本上就可以发帖求助了,相信放到javaworld等论坛上,很快就会有高手给你提出
有效的解决方案的。
当然不能总靠发帖求助,也要试试自行解决问题。如何下手呢?
a,分析一下你的”乱码”到底是什么编码。这个其实不难,比如
System.out.println(testString);
这一段出现了乱码,那么不妨用穷举法猜测一下它的实际编码格式。
System.out.println(new String(testString.getBytes(”ISO-8859-1〃),”gb2312〃));
System.out.println(new String(testString.getBytes(”UTF8〃),”gb2312〃));
System.out.println(new String(testString.getBytes(”GB2312〃),”gb2312〃));
System.out.println(new String(testString.getBytes(”GBK”),”gb2312〃));
System.out.println(new String(testString.getBytes(”BIG5〃),”gb2312〃));
等等,上述代码的意思是用制定的编码格式去读取testString这个”乱码”,并转换成gb2312(此处仅
以中文为例)
然后你看哪一个转换出来的结果是ok的,那就。。。
b,如果用上面的步骤能得到正确的中文,说明你的数据肯定是在的,只不过是界面中没有正确显示而
已。那么第二步就该纠正你的view部分了
,通常需要检查的是jsp中是否选择了正确的页面编码。
在此要声明被很多人误解的一点,那就是<%@ page contentType=”text/html; charset=GB2312〃 %>
指令和两者的不同。通常网上的很多文章在提到中文问题时都是说
数据库中选择unicode或者gb2312存储,同
时在jsp中用page指令声明编码就可以解决。但是我觉得这种说法很不负责任,害的我费了N多时间为本
来并不存在的乱码而郁闷。实际上page
的作用是在jsp被编译成为html的过程中提供编码方式让java来”读取”表达式当中的String(有点类
似于上面的第三个语句的作用),而meta
的作用是众所周知的为IE浏览器提供编码选择,是用来”显示”最后的数据的。但是没有看到有人提醒
这一点,我一直把page当成meta在用,
导致本来是iso-8859的数据,被page指令读成gb2312,于是乱码,所以又加了编码转化的函数把所有的
string数据都从iso8859转到gb2312(为
什么这么转,当时也没考虑这么多,因为这么做可以正常显示了,所以就这么改了,呵呵当时实在没有
时间慢慢排查问题了)。
===========================http://www.glgg.net/blog=======================================
===
4,数据库选择什么样的编码比较好。
目前流行的DB主要有sql server,mysql,oracle,DB2等,其中mysql作为免费DB中的老大,性能和功
能是得到公认的,安装配置比较方便,相
应的driver也比较完善,性价比是绝对的OK。所以就以mysql为例。
我个人建议采用mysql的默认编码来存储,也就是iso-8859-1(在mysql的选项中对应于latin-1)。理
由主要有这么几个,一是iso-8859-1对中
文的支持不错;二是跟java中的默认编码一致,至少在很多地方免除了转换编码的麻烦;三是默认的比
较稳定,兼容性也更好,因为多编码的
支持是由具体的DB产品提供的,别说跟其它的DB会不兼容,即使自身的不同版本也可能出现兼容性的问
题。
例如mysql 4.0以前的产品中,很多中文的解决方案是利用connection中的characterEncoding字段来制
定编码,比如gb2312什么的,这样是ok
的,因为原数据都是ISO8859_1编码,jdbc驱动会采用url里面指定的character set来进行编码,
resultSet.getString(*)取出的就是编码后的
字符串。这样就直接拿到gb2312的数据了。
但是mysql 4.1的推出给很多dbadmin带来了不小的麻烦,因为mysql4.1支持column level的character
set,每个table,column都可以指定编码
,不指定就是ISO8895_1,因此jdbc取出数据后会根据column的character set来进行编码,而不再是用
一个全局的参数来取所有的数据了。
这从另一个方面也说明了乱码问题的产生实在是很复杂的事情,原因太多了。我也只是针对自己遇
////////////////////////////////////////////////////////////////////////////////////////
jsp中文问题解决之道[转载]
和Java一样,JSP是目前比较热门的一个话题。它是一种在服务器端编译执行的Web设计语言,因为脚本
语言采用了Java,所以JSP继承了Java的所有优点。可是在使用JSP程序的过程中,常遇到中文乱码问题
,很多人为此头疼不已,初学的时候我就深受其害,而且使用平台不同,中文乱码问题的解决方法也不
同,无形中增加了学习JSP的难度。其实,在彻底了解相关原因后,问题还是比较容易解决的。,以下
是我总结的解决方法,相信对读者会有一定的借鉴意义。 (因为我使用得最多的是Tomcat环境,所以
主要是以Tomcat为例,其它的环境只会提及一下,但解决办法也是差不多的!
每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码、中国的GB2312
-80、日本的 JIS 等,作为该国家(区域)信息处理的基础,有着统一编码的重要作用。由于各本地字
符集代码范围重叠,相互间信息交换困难,软件本地化版本独立维护成本较高。因此有必要将本地化工
作中的共性抽取出来,做一致性处理,将特殊的本地化处理内容降低到最少,这就是所谓的国际化
(I18N)。各种语言信息被规范为本地信息,而底层字符集采用包含了所有字符的Unicode。
相信了解JSP代码的读者对ISO8859-1一定不陌生,ISO8859-1是我们平时使用比较多的一个CodePage,
它属于西欧语系。GB2312-80 是在国内计算机汉字信息技术发展初始阶段制订的,其中包含了大部分
常用的一、二级汉字和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符
集,这也是最基本的中文字符集。
GBK 是 GB2312-80 的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是 0x8140~
0xFEFE,剔除高位 0x80 的字位,其所有字符都可以一对一映射到 Unicode 2.0,也就是说 Java
实际上提供了对 GBK 字符集的支持。
>GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的文字。
GBK2K 从根本上解决了字位不够、字形不足的问题。
1.Tomcat 4开发平台
这个版本应该是我们经常用到的版本,所以讨论得会比较详细。
Windows 98/2000下的Tomcat 4以上版本都会出现中文问题(而在Linux下和Tomcat 3.x中则没有问
题),主要表现是页面显示乱码。
为解决这个问题,最简单的方法就是在每个JSP的页面开始处加上<%@ page language=“Java”
contentType=“text/html; charset=gb2312”%>。不过,这还不够,虽然这时显示了中文,但是发现
从数据库读出的字段变成了乱码。经过分析发现: 在数据库中保存的中文字符是正常的,数据库用
ISO8859-1字符集存取数据,而Java程序在处理字符时默认采用统一的ISO8859-1字符集(这也体现了
Java国际化思想),所以在数据添加的时候Java和数据库都是以ISO8859-1方式处理,这样不会出错。但
是在读取数据的时候就出现问题了,因为数据读出也采用ISO8859-1字符集,而 JSP的文件头中有语句
<%@ page language=“Java” contentType=“text/html; charset=gb2312”%>,这说明页面采用
GB2312的字符集显示,这样就和读出的数据不一样。这时页面显示从数据库中读出的字符是乱码,解决
的方法是对这些字符转码,从ISO8859-1转成GB2312,就可以正常显示了。这个解决办法对很多平台具
有通用性,读者可以灵活运用。具体的方法会在以下详细讲解。另外,对于不同的数据库如SQL
Server,Oracle,Mysql,Sybase等,字符集的选择很重要。如果考虑多语言版本,数据库的字符集就
应该统一采用ISO8859-1,需要输出的时候在不同的字符集之间做转换就可以了。
以下是针对不同平台的总结:
(1) JSWDK只适合于普通开发,稳定性和其他问题可能不如商业软件。 由于JDK 1.3版性能要好于
JDK 1.2.2很多,并且对中文的支持也较好,所以应该尽量采用。 现在jdk已经出到1.4版本了,所以
如果允许最好升级到最新的版本,这样对中文的也会较好,而且还可以得到更多的支持。
(2) Tomcat仅仅是一个对JSP 1.1、Servlet 2.2标准的实现, 我们不应该要求这个免费软件在细节
和性能上都面面俱到, 它主要考虑英文用户, 这也是为什么不做特殊转换,汉字用URL方法传递就有
问题的原因。大部分IE浏览器缺省始终以UTF-8发送, 这似乎是Tomcat的一个不足, 另外Tomcat不管
当前的操作系统是什么语言, 都按ISO8859去编译JSP, 似乎也欠妥。
2.JSP代码的中文处理
(1)如果与数据无关的操作,可以在页面首行加入
(2)将Form中的值传送到数据库中再取出来后全变成了“?”。Form用POST提交数据,代码中使用了语
句:
String st=new(request.getParameter(“name”).getBytes(“ISO8859_1”)), 而且也声明了
charset=gb2312。
要处理Form中传递的中文参数,应该在JSP中加入下面的代码,另外定义一个专门解决这个问题的
getStr类,然后对接收到的参数进行转换:
String keyword1=request.getParameter(“keyword1”);
keyword1=getStr(keyword1);
这样就可以解决问题了,代码如下:
<%@ page contentType=“text/html;charset=gb2312”%>
<%!
public String getStr(String str){
try{String temp_p=str;
byte[] temp_t=temp_p.getBytes(“ISO8859-1”);
String temp=new String(temp_t);
return temp;
}
catch(Exception e){ }
return “NULL”;
}
%>
<%--http://www.cndes.com测试--%>
<% String keyword=“创联网络技术中心欢迎您的到来”;
String keyword1=request.getParameter(“keyword1”);
keyword1=getStr(keyword1);
out.print(keyword);
out.print(keyword1);
%>
另外,流行的关系数据库系统都支持数据库Encoding,也就是说在创建数据库时可以指定它自己的字符
集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有
Encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性。 GB2312、GBK、
UTF-8 等都是可选的数据库 Encoding,也可以选择 ISO8859-1 (8-bit), 但会增加了编程的复
杂度,ISO8859-1不是推荐的数据库 Encoding。在JSP/Servlet编程时,可以先用数据库管理系统提供
的管理功能检查其中的中文数据是否正确。
(3)JDBC Driver的字符转换
目前大多数JDBC Driver采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41
”和“0x75”进行传输。因此需要对JDBC Driver返回的字符以及要发给JDBC Driver的字符进行转换
。当用JDBC Driver向数据库中插入数据时,需要先将Unicode转成Native code; 当 JDBC Driver
从数据库中查询数据时,则需要将Native code转换成Unicode。下面给出了这两种转换的实现:
String native2Unicode(String s) {
if (s == null || s.length() == 0) {
return null;
}
byte[] buffer = new byte[s.length()];
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
c = s.charAt(i);
byte []buf = (“”+c).getBytes();
buffer[j++] = (char)buf[0];
buffer[j++] = (char)buf[1];
}
else {buffer[j++] = s.charAt(i);}
}
return new String(buffer, 0, j);
}
要注意的是,有些JDBC Driver如果通过JDBC Driver Manager设置了正确的字符集属性,以上方法
就不需要了。具体情况可参考相关JDBC的资料。
其实理解了,中文乱码就这么一回事!反复使用就会摸出一定的门道了!我觉得以上的三种方法,只要你
真的能弄懂,在遇到中文问题时,在这三种方法多试尝,我保证你不再会使这种中文问题所烦!
以上只是自己的一些经验所谈,如果有什么不对,希望能提出,共同学习!
//////////////////////////////////////////////////////////////////////////////////////////
我的乱码之路——JSP与MySQL交互的中文乱码解决方案及总结
首先实现了一个StringConvert bean(GBtoISO()和ISOtoGB()两个方法),解决了与MySQL数据库
交互的时候的部分中文乱码问题:在JSP程序中读取MySQL的中文内容,用这两个方法可以解决乱码问题
。
但是从JSP写入到MySQL的中文内容都成了乱码,并且再读出来的时候也显示为“??”,在这里应
该出现了编码转换过程中的字符信息丢失。郁闷的是,我在命令行窗口中登陆到MySQL后,执行如
“INSERT INTO customerVALUES('字符',...)”这样的语句时,写入到数据表中的中文内容又是显示正
常的!!!数据库使用的字符集是utf8。
碰壁多次,终于发现一条解决问题的路径:查看MySQL手册的时候,看到一条这样的语句:
Toallow multiple character sets to be sent from the client, the "UTF-8"encoding should be
used, either by configuring "utf8" as the defaultserver character set, or by configuring
the JDBC driver to use "UTF-8"through the characterEncoding property.
此外,在查阅《MySQL权威指南》时,发现在查询语句中可以使用这样的语法将字符串转换到一个
给定的字符集:_charset str。
其中charset必须是服务器支持的某个字符集。在本例中,shopdb数据库使用的默认字符集是utf8
,于是开始测试:
先输入INSERT INTO publish Values('8',_gb2312 '高等教育出版社') 写入后中文变成“??
”
再试INSERT INTO publish Values('8',_gbk '高等教育出版社') 结果同上
INSERT INTO publish Values('8',_utf8 '高等教育出版社') 这下更干脆,什么都没有!!
快疯了!!没办法,用show character set;命令查看MySQL支持的字符集,心想我都试一遍总
有一个能成功吧。浏览了一下,发现没有几个熟悉的字符集,就只剩下一个latin1(ISO-8859-1)比较常
见了,不会是它吧,一试之下果然便是。
INSERT INTO publish Values('8',_latin1 '高等教育出版社') 输入中文能够正确显示。
这下总算找到方法了,把Tomcat下配置的数据库连接池的url改为
"...characterEncoding=UTF-8",然后把写入数据库的中文内容用
String s2 = new String(s1.getBytes("gb2312"),"ISO-8859-1")进行转码,其中s1为中文字符
串.然后再写入到数据库一切显示正常。
为解决这个问题查看了n多资料,现作一个总结:由于字符集和字符编码方式的不同,在OS以
及程序之间传递数据(尤其是multiple character sets中的数据)时便会产生乱码以及字符信息的丢
失.解决这个问题的关键便是了解数据输出端和接收端使用的字符集和字符编码方式,如果这两种编码
方式不同,便需要在数据出口或入口处进行 转码。一般的说,在编写代码,编译,以及运行期间都会字
符数据的传递,因此需要特别小心。
在编写代码的时候,你可能会使用某种开发工具,例如我正在使用的Eclipse.或许在写的时候
一切正常,可是一旦保存后再次打开文档,所有的中文字符都变成了乱码。这是因为在编写的时候,这
些字符数据都在内存的某个stream中,ok,这没问题,可是保存的时候这个stream中的数据会被写入到
硬盘,使用的就是你的开发工具默认的编码方式,如果很不幸你的开发工具默认编码方式是ISO-8859-1
,中文字符信息就不能正确地存储。Eclipse中可以这样查看并修改默认字符编码方式:Project-
>Properties->info,这里有"default encoding for text file"。如果设置为GBK,那么编写代码
并保存这关就过了。
对于JSP程序而言,编写完代码后就交给Container,首先它们会被转成.java文件,然后编译成
.class才能提交给服务器执行.这个过程也存在字符编码问题.java编译器(javac)使用操作系统的语
言环境作为默认的字符编码方式,JRE(Java Runtime Environment)也是这样。只有当编译和运行环境
的字符编码方式与存储源文件的编码方式相同时,中文字符才能正确地显示。否则就需要在运行时进行
转码,使它们使用兼容的编码。这里的设置可以分为几个层次:操作系统层支持的语言,这是最重要的
,因为它会影响JVM的默认字符编码方式,同时对字符的显示,如字体等有直接影响;J2EE服务器层
,大多数服务器都可以对字符编码进行自定义的配置,例如Tomcat就可以通过web.xml中设置
javaEncoding参数设置字符编码,默认是UTF-8.
IE也可以设置成总是使用UTF-8编码来发送请求.应用程序层,每个配置在服务器下的程序都可以
设置自己的编码方式,这个我目前还没有用到,以后再学习。
运行时的转码,运行时期,应用程序很可能需要与外部系统进行交互,例如对数据库进行读写
,对外部文件进行读写.在这些情况下,应用程序免不了要和外部系统进行数据交换。那么对于中文字
符, 数据出入口的编码方式就显得特别重要了。一般外部系统都有自己的字符编码方式,我的例子中
配置的MySQL就是使用的UTF-8编码。JSP页面通过设定"charset=gb2312",
使用gb2312编码,在它与数据库交互的时候就需要进行显式的转码才能正确处理中文字符。
http://www.lupaworld.com/39846/viewspace_19726.html
guorabbit收录,使用标签:Tomcat, JSP, Servlet, JavaBean,时间:2008-7-28 11:32:05 | 相关网摘,我也收藏
在Tomcat下JSP、Servlet和JavaBean环境的配置
创建时间: 2004-11-30
文章提交: 孤独
经常看到jsp的初学者问tomcat下如何配置jsp、servlet和bean的问题,于是总结了一下如何tomcat下配置jsp、servlet和ben,希望对那些初学者有所帮助。
第一步:下载j2sdk和tomcat:到sun官方站点(http://java.sun.com/j2se/1.4.2/download.html)下载j2sdk,注意下载版本为Windows Offline Installation的SDK,同时最好下载J2SE 1.4.2 Documentation,然后到tomcat官方站点(http://www.apache.org/dist/jakarta/tomcat-4/)下载tomcat(下载最新4.1.x版本的tomcat);
第二步:安装和配置你的j2sdk和tomcat:执行j2sdk和tomcat的安装程序,然后按默认设置进行安装即可。
1.安装j2sdk以后,需要配置一下环境变量,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.4.2):
JAVA_HOME=c:\j2sdk1.4.2
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因为它代表当前路径)
path=%JAVA_HOME%\bin
接着可以写一个简单的java程序来测试J2SDK是否已安装成功:
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.";
}
}
将上面的这段程序保存为文件名为Test.java的文件。
然后打开命令提示符窗口,cd到你的Test.java所在目录,然后键入下面的命令
javac Test.java
java Test
此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。
2.安装Tomcat后,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat):
CATALINA_HOME=c:\tomcat;
CATALINA_BASE=c:\tomcat;
然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;
接着可以启动tomcat,在IE中访问http://localhost:8080
如果看到tomcat的欢迎页面的话说明安装成功了。
第三步:建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录;
2.在webapps目录下新建一个目录,起名叫myapp;
3.myapp下新建一个目录WEB-INF,注意,目录名称是区分大小写的;
4.WEB-INF下新建一个文件web.xml,内容如下:
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
My Web Application
A application for test.
5.在myapp下新建一个测试的jsp页面,文件名为index.jsp,文件内容如下:
Now time is: <%=new java.util.Date()%>
6.重启Tomcat
7.打开浏览器,输入http://localhost:8080/myapp/index.jsp 看到当前时间的话说明就成功了。
第四步:建立自己的Servlet:
1.用你最熟悉的编辑器(建议使用有语法检查的java ide)新建一个servlet程序,文件名为Test.java,文件内容如下:
package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.println("This is a servlet test.";
out.flush();
}
}
2 .编译
将Test.java放在c:\test下,使用如下命令编译:
C:\Test>javac Test.java
然后在c:\Test下会产生一个编译后的servlet文件:Test.class
3 .将结构test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那个test目录到classes目录下,如果classes目录不存在,就新建一个。 现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结构
4 .修改webapps\myapp\WEB-INF\web.xml,添加servlet和servlet-mapping
编辑后的web.xml如下所示,红色为添加的内容:
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
My Web Application
A application for test.
Test
Test
A test Servlet
test.Test
Test
/Test
这段话中的servlet这一段声明了你要调用的Servlet,而servlet-mapping则是将声明的servlet“映射”到地址/Test上
5 .好了,启动Tomcat,启动浏览器,输入http://localhost:8080/myapp/Test 如果看到输出This is a servlet test.就说明编写的servlet成功了。
注意:修改了web.xml以及新加了class,都要重启Tomcat
第四步:建立自己的Bean:
1.用你最熟悉的编辑器(建议使用有语法检查的java ide)新建一个java程序,文件名为TestBean.java,文件内容如下:
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}
2 .编译
将TestBean.java放在c:\test下,使用如下命令编译:
C:\Test>javac TestBean.java
然后在c:\Test下会产生一个编译后的bean文件:TestBean.class
3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,
4 .新建一个TestBean.jsp文件,文件内容为:
<%@ page import="test.TestBean" %>
<%
TestBean testBean=new TestBean("This is a test java bean.";
%>
Java bean name is: <%=testBean.getName()%>
5 .好了,重启Tomcat,启动浏览器,输入http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了。
这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码,自己多动手写代码以增强自己在这方面开发的能力了。
http://www.itpub.net/viewthread.php?tid=345002&extra=&page=1
guorabbit收录,时间:2008-7-24 11:31:06 | 相关网摘,我也收藏
JUnit常用断言方法
发布时间: 2008-7-14 16:47 作者: 未知 来源: ITPUB论坛
字体: 小 中 大 | 上一篇 下一篇 | 打印 | 我要投稿 | 每周一问,答贴有奖
JUnit断言方法有很多,不过,可以很清楚地从其子面看出其功能。
常用的方法如下:
assertEquals(a, b)
Asserts that two primitive values are equal.
测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)
assertFalse(a)
Asserts that a condition (a) is false.
测试a是否为false(假),a是一个Boolean数值。
assertTrue(a)
Asserts that a condition is true.
测试a是否为true(真),a是一个Boolean数值
assertNotNull(a)
Asserts that an object isn't null.
测试a是否非空,a是一个对象或者null。
assertNull(a)
Asserts that an object is null.
测试a是否为null,a是一个对象或者null。
assertNotSame(a, b)
Asserts that two objects do not refer to the same object.
测试a和b是否没有都引用同一个对象。
assertSame(a, b)
Asserts that two objects refer to the same object.
测试a和b是否都引用同一个对象。
http://www.51testing.com/?action_viewnews_itemid_87519.html
guorabbit收录,时间:2008-7-21 11:41:41 | 相关网摘,我也收藏
Eclipse及其插件下载网址大全
1 Eclipse下载
EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载
http://www.eclipse.org/downloads/index.php
2 lomboz J2EE插件,开发JSP,EJB
http://forge.objectweb.org/projects/lomboz
3 MyEclipse J2EE开发插件,支持SERVLET/JSP/EJB/数据库操纵等
http://www.myeclipseide.com
4 Properties Editor 编辑java的属性文件,并可以自动存盘为Unicode格式
http://propedit.sourceforge.jp/index_en.html
5 Colorer Take 为上百种类型的文件按语法着色
http://colorer.sourceforge.net/
6 XMLBuddy 编辑xml文件
http://www.xmlbuddy.com
7 Code Folding 加入多种代码折叠功能(比eclipse自带的更多)
http://www.coffee-bytes.com/servlet/PlatformSupport
8 Easy Explorer 从eclipse中访问选定文件、目录所在的文件夹
http://easystruts.sourceforge.net/
9 Fat Jar 打包插件,可以方便的完成各种打包任务,可以包含外部的包等
http://fjep.sourceforge.net/
10 RegEx Test 测试正则表达式
http://brosinski.com/stephan/archives/000028.php
11 JasperAssistant 报表插件(要钱的哦~)
http://www.jasperassistant.com/
12 Jigloo GUI Builder JAVA的GUI编辑插件
http://cloudgarden.com/jigloo/
13 Profiler 性能跟踪、测量工具,能跟踪、测量B/S程序
http://sourceforge.net/projects/eclipsecolorer/
14 AdvanQas 提供对if/else等条件语句的提示和快捷帮助(自动更改结构等)
http://eclipsecolorer.sourceforge.net/advanqas/index.html
15 Log4E Log4j插件,提供各种和Log4j相关的任务,如为方法、类添加一个logger等
http://log4e.jayefem.de/index.php/Main_Page
16 VSSPlugin VSS插件
http://sourceforge.net/projects/vssplugin
17 Implementors 提供跳转到一个方法的实现类,而不是接口的功能(实用!)
http://eclipse-tools.sourceforge.net/implementors/
18 Call Hierarchy 显示一个方法的调用层次(被哪些方法调,调了哪些方法)
http://eclipse-tools.sourceforge.net/call-hierarchy/index.html
19 EclipseTidy 检查和格式化HTML/XML文件
http://eclipsetidy.sourceforge.net/
20 Checkclipse 检查代码的风格、写法是否符合规范
http://www.mvmsoft.de/content/plugins/checkclipse/checkclipse.htm
21 Hibernate Synchronizer Hibernate插件,自动映射等
http://www.binamics.com/hibernatesync/
22 VeloEclipse Velocity插件
http://propsorter.sourceforge.net/
23 EditorList 方便的列出所有打开的Editor
http://editorlist.sourceforge.net/
24 MemoryManager 内存占用率的监视
http://cloudgarden.com/memorymanager/
25 swt-designer java的GUI插件
http://www.swt-designer.com/
26 TomcatPlugin 支持Tomcat插件
http://www.sysdeo.com/eclipse/tomcatPlugin.html
27 XML Viewer
http://tabaquismo.freehosting.net/ignacio/eclipse/xmlview/index.html
28 quantum 数据库插件
http://quantum.sourceforge.net/
29 Dbedit 数据库插件
http://sourceforge.net/projects/dbedit
30 clay.core 可视化的数据库插件
http://www.azzurri.jp/en/software/index.jsp
http://www.azzurri.jp/eclipse/plugins
31 hiberclipse hibernate插件
http://hiberclipse.sourceforge.net
http://www.binamics.com/hibernatesync
32 struts-console Struts插件
http://www.jamesholmes.com/struts/console/
33 easystruts Struts插件
http://easystruts.sourceforge.net
34 veloedit Velocity插件
http://veloedit.sourceforge.net/
35 jalopy 代码整理插件
http://jalopy.sourceforge.net/
36 JDepend 包关系分析
http://andrei.gmxhome.de/jdepend4eclipse/links.html
37 Spring IDE Spring插件
http://springide-eclip.sourceforge.net/updatesite/
38 doclipse 可以产生xdoclet 的代码提示
http://beust.com/doclipse/
39 SQLExplorer,在Eclipse 中连接各种数据库进行操作使用
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=31124
40 Eclipse 插件Implementors 在Eclipse 中的使用。
问题提出:
如果你想看看某个类或者方法的实现,一般是Ctrl + 鼠标左键,单击即可以打开这个类或者方法的具体实现代码。但是如果碰到接口时,只是到达接口而已,不能到达具体的实现类里。
解决方法:利用Eclipse 的Implementors 插件。
当追踪方法代码时,Eclipse 默认是转到方法的接口类,而接口中是只有方法名称没有具体的实现代码,此插件提供了追踪到具体实现类的实现代码的功能。
另外还有Call Hierarchy 插件: 显示一个方法的调用层次,可以从中看到它被哪些方法调用了,以及它调用了哪些方法,是代码追踪比较实用的工具。Eclipse 3.1 中已经自带有这个功能了。这个插件就不用另加介绍了。
下载地址:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=30441
或者
http://www.cjsdn.net/post/view?bid=7&id=165547&sty=1
Eclipse插件之SQLExplorer- -
本文介绍如何利用Eclipse 插件SQLExplorer 在Eclipse 中连接各种数据库进行操作使用。
Eclipse 是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。
下载地址:
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=124&threadID=31124
或者
http://www.cjsdn.net/post/view?bid=7&id=164702&sty=1
用links方法加载Eclipse插件
eclispe想必大家都很熟悉了,一般来说,eclipse插件都是安装在plugins目录下。不过这样一来,当安装了许多插件之后,eclipse变的很大,最主要的是不便于更新和管理众多插件。用links方式安装eclipse插件,可以解决这个问题。
当前配置XP SP1,eclipse3.0.1
现在假设我的eclipse安装目录是D:\eclipse,待安装插件目录是D:\plug-in ,我将要安装LanguagePackFeature(语言包)、emf-sdo-xsd-SDK、GEF-SDK、Lomboz这四个插件。
先把这四个插件程序全部放在D:\plug-in目录里,分别解压。如Lomboz3.0.1.zip解压成Lomboz3.0.1目录,这个目录包含一个plugins目录,要先在Lomboz3.0.1目录中新建一个子目录eclipse,然后把plugins目录移动到刚建立的eclipse目录中,即目录结构要是这样的:D:\plug-in\Lomboz3.0.1\eclipse\plugins
Eclipse 将会到指定的目录下去查找 eclipse\features 目录和eclipse\plugins 目录,看是否有合法的功能部件和(或)插件。也就是说,目标目录必须包含一个 \eclipse 目录。如果找到,附加的功能部件和插件在运行期配置是将是可用的,如果链接文件是在工作区创建之后添加的,附加的功能部件和插件会作为新的配置变更来处理。
其它压缩文件解压后若已经包含eclipse\plugins目录,则不需要建立eclipse目录。
然后在 eclipse安装目录D:\eclipse目录中建立一个子目录links,在links目录中建立一个link文件,比如 LanguagePackFeature.link,改文件内容为 path=D:/plug-in/LanguagePackFeature 即这个link文件要对应一个刚解压后的插件目录。
说明:
1. 插件可以分别安装在多个自定义的目录中
2. 一个自定义目录可以安装多个插件。
3. link文件的文件名及扩展名可以取任意名称,比如ddd.txt,myplugin都可以。
4. link文件中path=插件目录的path路径分隔要用\\或是/
5. 在links目录也可以有多个link文件,每个link文件中的path参数都将生效。
6. 插件目录可以使用相对路径。
7. 可以在links目录中建立一个子目录,转移暂时不用的插件到此子目录中,加快eclipse启动。
8. 如果安装后看不到插件,把eclipse 目录下的configuration目录删除,重启即可。
http://blog.csdn.net/cbhprogrammer/archive/2007/10/24/1842402.aspx
guorabbit收录,时间:2008-7-21 10:08:35 | 相关网摘,我也收藏
关于Eclipse 3.0的插件自动构建简介2007-08-29 12:12 作者: 晏斐 出处: 论坛整理 责任编辑:方舟
3.3Eclipse自动构建框架介绍
下面我们用一个例子来说明整个的构建过程。我们在下面的例子中将会编写sdk.examples的构建脚本。sdk.examples是eclipse的示例代码,你可以在eclipse的cvs里得到。
在开始之前你需要下载cvs.exe和unzip.exe,并将他们拷贝到系统目录中,或者放置在环境变量%PATH%可以找到的地方。Cvs.exe和unzip.exe可以从以下地方下载:
CVS client version 1.10 or higher on system path.
Info-Zip zip and unzip executables on system path.
第一步先获得org.eclipse.releng.eclipsebuilder。org.eclipse.releng.eclipsebuilder是eclipse的发布引擎。
D:\build>cvs -d :pserver:anonymous@dev.eclipse.org:/home/eclipse export -r R3_0_2 org.eclipse.releng.eclipsebuilder
org.eclipse.releng.eclipsebuilder中的readme.html描述了如何构建一个eclipse的组件。
在默认的情况下,为了获取3.0.0版本的sdk.examples,我们需要修改org.eclipse.releng.eclipsebuilder/sdk.examples/build.properties文件。
mapVersionTag=R3_0_0
现在我们可以在控制台的命令行中开始构建过程。
D:\build\org.eclipse.releng.eclipsebuilder>set ECLIPSE_HOME=D:\eclipse\eclipse-3.0.0
D:\build\org.eclipse.releng.eclipsebuilder>java -cp %ECLIPSE_HOME%\startup.jar org.eclipse.core.launcher.Main
-application org.eclipse.ant.core.antRunner -buildfile build.xml
-Dcomponent=sdk.examples -Dconfigs="*,*,*" -Dbaseos=win32 -Dbasews=win32 -Dbasearch=x86 -Djavacfailonerror=true
-Dpde.build.scripts=%ECLIPSE_HOME%/plugins/org.eclipse.pde.build_3.0.0/scripts -DbaseLocation=%ECLIPSE_HOME%
命令行中的compoent属性是你将要构建的组件名称。也就是你在d:\build\org.eclipse.releng.eclipsebuilder目录下的一个子目录的名称。在这个子目录下有build.properties和customTargets.xml文件。
Build脚本将会使用d:\build\org.eclipse.releng.eclipsebuilder\src目录作为默认的build目录。你也可以将-DbuildDirectory=${basedir}/newDirectory加入到命令行中指定你自己的build目录。
构建完成之后,装配完成的可分发的软件包和构建日志位于build目录下的一个子目录,这个子目录的名字由buildLabel属性定义。默认的这个目录的名称由”I-”开始,并包含构建时刻的时间戳。
命令行中的baseLocation属性用户指定eclipse启动的目录。同时,构建过程中如果在build目录中找不到一个plugin,会到baseLocation目录去查找。因此,在你自己的构建过程中的第三方的插件也应该位于%baseLocation%/plugins目录下,才能保证构建过程成功。BaseLocation目录下不能包含任何你将要构建的插件,如果baseLocation目录下包含了sdk.examples,构建过程将会出错。
3.4构建过程分析
在下面的部分我们将为你分析构建过程中的一些细节。首先我们先熟悉一下和构建有关的几个重要文件和他们的位置:
build.xml
位于 org.eclipse.pde.build_<version>/scripts 目录下。该文件提供了一个从prebuild到postbuild的过程的一个骨架。
genericTargets.xml
位于org.eclipse.pde.build_<version>/scripts目录下。包含了像fetchElement, generateScript, processElement, assembleElement等Ant Task。
customTargets.xml
位于org.eclipse.releng.eclipsebuilder目录的子目录下。如sdk.examples.customTargets.xml文件将会被org.eclipse.releng.eclipsebuilder目录下的build.xml文件调用。在customTargets.xml文件中将会调用genericTargets.xml文件中的target。CustomTargets.xml文件的主要职责是定义将要构建的features和从那里得到构建过程中需要的map文件。关于map文件将会在后边介绍。
4. build.properties
位于org.eclipse.releng.eclipsebuilder目录的子目录下。Build.properties属性文件中定义了一些构建过程中build脚本使用的一些属性。
下面我们来看一下整个构建过程的序列图如下:
上面的序列图给出了整个构建过程的一个概览。
1.D:\build\org.eclipse.releng.eclipsebuilder目录下的build.xml首先会设置一些与构建过程有关的环境设置变量,然后调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的build.xml文件。
2.$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的build.xml文件会一次调用自身的preBuild,fetch,generate,process,assemble,postBuild的几个target。在这几个target中又会一次调用customTargets.xml文件。所以说build.xml是整个构建过程的骨架,它定义了构建过程中的“构建准备”,“fetch构建所需资源”,“生成插件构建所需build.xml文件”,“编译”,“组装”,“构建完成后的相关工作”等阶段。
3.PreBuild过程中要做的一件重要事情就是回调customTargets.xml文件的getMapFiles Target获取map文件。Map文件定义了将要构建的所有插件在cvs中的位置。Map文件的格式如下:
feature|fragment|plugin@elementId=<cvs tag>,<access method>:<cvsuser>@<cvs repository>,<cvs password>[,<repository path> (no starting slash) ]
Map文件从cvs获得后会放在buildDirectory目录下的map子目录下。Map文件可以是有多个的,脚本会将map目录下的所有map文件连接为${buildDirectory}/directory.txt文件。
4.fetch过程同样会调用customTargets.xml文件中的allElements target。AllElements Target又将调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的genericTargets.xml文件的fetchElement target。FetchElement target中会调用eclipse内置的Ant Task “eclipse.fetch”。“eclipse.fetch”会自动生成一个fetch_${plugin_id}.xml文件。它生成的原理是分析feature.xml文件,获取一个feature内包含的所有插件id, 然后在map文件中查找插件在cvs中的位置并生成fetch_$(plugin_id).xml文件。然后会执行该fetch文件将插件代码获取到本地构建机器上。
5.Generate过程同样会回调customTargets.xml文件的allElements target。AllElements target又将调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的genericTargets.xml文件的generateScript target。GenerateScript Target中会调用eclipse内置的Ant Task “eclipse.buildScript”。“eclipse.buildScript”的作用是根据插件下的plugin.xml文件生成构建插件所需的build.xml文件。大家注意到在脚本中将这个过程自动化了。同样的我们可以在ide环境中的插件开发透视图中选中一个plugin.xml文件,执行右键菜单中的pde tools->Create Ant Build File命令生成build.xml文件。如下图所示:
但是,在开发过程中经常会添加对新的插件的引用而没有重新生成build.xml文件,这是导致构建过程失败的主要原因。另外一个缺点是如果使用在ide环境中生成的build.xml文件,构建环境必须和ide环境设置一样。开发环境和构建环境设置不一样也是导致构建过程失败的最常见的原因。
在构建时刻生成build.xml文件可以避免以上两个缺点。
6.Process过程同样也会回调customTargets.xml文件的allElements target。AllElements target又将调用$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的genericTargets.xml文件的processElement Target。 ProcessElement Target调用自动生成的插件build.xml文件,完成对插件的构建。
7.Assemble过程将完成插件的组装过程。
8.PostBuild过程回调customTargets.xml的postBuild target。
3.5构建你自己的插件
前面我们构建了sdk.examples,并且分析了整个自动构建的全过程。采用上面介绍的构建方法有一个限制就是你必须有一个feature项目。如果没有就先建立一个。菜单路径是File->New->Project...->Plug-in Development->Feature Project。在打开的向导中输入feature项目的名称,然后选择你要构建的插件并且包含到feature项目中。如果你不想将你要发布的plugin部署为一个feature,你只需要修改feature项目中的build.properties文件,删除掉bin.includes属性就可以了。
构建你自己的插件,你需要准备四个文件:
1.a map file for fetching the sources ,map文件一般情况下是存放在cvs中,在构建开始时从cvs下载。
2.customTargets.xml ,customTargets.xml文件位于位于d:\build\org.eclipse.releng.eclipsebuilder目录的子目录下。如sdk.examples。org.eclipse.releng.eclipsebuilder是eclipse的release engine。可以从eclipse的cvs中获得。
3.build.properties ,build.properties文家定义了构建过程中使用的环境变量。你可以根据自己的情况修改。
4.a shell script, which starts an Eclipse instance as AntRunner。运行Eclipse实例的脚本。在本文的前面已经有过介绍。
下面是一个Map文件片断的示例,你可以根据你自己的情况修改用户名,密码,package名称,和CVS分支名称。
feature@org.rubypeople.rdt=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse,,org.rubypeople.rdt-feature
plugin@org.kxml2=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse,
plugin@org.rubypeople.rdt=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse,
plugin@org.rubypeople.rdt.core=HEAD,:ext:cvs.sf.net:/cvsroot/rubyeclipse,
CustomeTargets.xml提供了构建过程中回调的钩子。CustemerTargets.xml文件的模板在org.eclipse.pde.build插件的script目录下可以找到。下面是customerTargets.xml文件的一个片断。allElements target中定义了你要构建的feature id。这里的feature id不是feature manifest文件中定义的feature,而是用于在map文件中查找cvs信息时使用的id。getMapFiles target会将map文件下载到本地的${buildDirectory}目录下。Assemble target会调用生成的assemble脚本文件对编译结果进行组装。
<target name="allElements">
<ant antfile="${genericTargets}" target="${target}" >
<property name="type" value="feature" />
<property name="id" value="org.rubypeople.rdt" />
</ant>
</target>
<target name="getMapFiles">
<property name="cvsRoot" value=":ext:cvs.sf.net:/cvsroot/rubyeclipse" />
<cvs cvsroot="${cvsRoot}"
dest="${buildDirectory}/maps"
command="export -r ${mapVersionTag} org.rubypeople.rdt.build/map"/>
</target>
<target name="assemble.org.rubypeople.rdt">
<ant antfile="${assembleScriptName}" dir="${buildDirectory}">
<property name="zipargs" value="" />
</ant>
</target>
结论
回顾一下整个构建过程,在customTargets.xml文件中我们定义了每一构建过程中供$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts下的build.xml文件回调的target。对于一些复杂的通用功能如生成获取cvs中插件代码的fetch.xml文件、生成build.xml文件等由genericTargets.xml来完成。这样一种结构最大限度的保证了customTargets.xml文件的简洁性、可维护性、可扩充性。Eclipse提供了这样一个优雅的构建脚本框架,用户只需要编写自己的customTargets.xml文件。CustomTargets.xml文件的模板可以在$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts找到。我们只需要拷贝一个,然后稍加修改就可以完成该项工作。
CustomTargets.xml文件中预定义了很多和构建过程对应的target。这些target都会被$ECLIPSE_HOME\plugins\org.eclipse.pde.build_3.0.0\scripts调用。一个例子可以很好的说明这种回调的方便性。当我们构建一个包含有help文件的插件时,一个预先要做的工作就是先要将help文件打包成zip文件。我们可以修改customTargets.xml中的preProcess Target:
<target name="preProcess">
<zip destfile="${buildDirectory}/plugins/org.eclipse.sdk.examples/doc.zip"
basedir="${buildDirectory}/plugins/org.eclipse.sdk.examples"
includes="doc/**"/>
</target>
http://dev.yesky.com/487/7521987_1.shtml
guorabbit收录,时间:2008-7-18 23:55:22 | 相关网摘,我也收藏
触发器 是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。 功能: 1、 答应/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务处理 6、 启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old as old_value new as new_value for each row when (new_value.department_id<>80 ) begin :new_value.commission_pct :=0; end; / 触发器的组成部分: 1、 触发器名称
2、 触发语句 3、 触发器限制 4、 触发操作 1、 触发器名称 create trigger biufer_employees_department_id 命名习惯: biufer(before insert update for each row) employees 表名 department_id 列名 2、 触发语句 比如: 表或视图上的DML语句 DDL语句 数据库关闭或启动,startup shutdown 等等 before insert or update of department_id on employees referencing old as old_value new as new_value for each row 说明: 1、 无论是否规定了department_id ,对employees表进行insert的时候 2、 对employees表的department_id列进行update的时候 3、 触发器限制 when (new_value.department_id<>80 ) 限制不是必须的。此例表示假如列department_id不等于80的时候,触发器就会执行。
其中的new_value是代表更新之后的值。 4、 触发操作 是触发器的主体 begin :new_value.commission_pct :=0; end; 主体很简单,就是将更新后的commission_pct列置为0 触发: insert into employees(employee_id, last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct ) values( 12345,’Chen’,’Donny’, sysdate, 12, ‘donny@hotmail.com’,60,10000,.25); select commission_pct from employees where employee_id=12345; 触发器不会通知用户,便改变了用户的输入值。 触发器类型: 1、 语句触发器 2、 行触发器 3、 INSTEAD OF 触发器 4、 系统条件触发器 5、 用户事件触发器 1、 语句触发器 是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。 例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。 Create table foo(a number); Create trigger biud_foo Before insert or update or delete On foo Begin If user not in (‘DONNY’) then Raise_application_error(-20001, ‘You don’t have Access to modify this table.’); End if; End; / 即使SYS,SYSTEM用户也不能修改foo表 [试验] 对修改表的时间、人物进行日志记录。 1、 建立试验表 create table employees_copy as select *from hr.employees 2、 建立日志表 create table employees_log( who varchar2(30), when date); 3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。 Create or replace trigger biud_employee_copy Before insert or update or delete On employees_copy
Begin Insert into employees_log( Who,when) Values( user, sysdate); End; / 4、 测试 update employees_copy set salary= salary*1.1; select *from employess_log; 5、 确定是哪个语句起作用? 即是INSERT/UPDATE/DELETE中的哪一个触发了触发器? 可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判定: begin if inserting then ----- elsif updating then ----- elsif deleting then ------ end if; end; if updating(‘COL1’) or updating(‘COL2’) then
------ end if; [试验] 1、 修改日志表 alter table employees_log add (action varchar2(20)); 2、 修改触发器,以便记录语句类型。 Create or replace trigger biud_employee_copy Before insert or update or delete On employees_copy Declare L_action employees_log.action%type; Begin if inserting then l_action:=’Insert’; elsif updating then l_action:=’Update’; elsif deleting then l_action:=’Delete’; else raise_application_error(-20001,’You should never ever get this error.’); Insert into employees_log(
Who,action,when) Values( user, l_action,sysdate); End; / 3、 测试 insert into employees_copy( employee_id, last_name, email, hire_date, job_id) values(12345,’Chen’,’Donny@hotmail’,sysdate,12); select *from employees_log
http://www.knowsky.com/385353.html
guorabbit收录,时间:2008-7-18 17:34:45 | 相关网摘,我也收藏
Oracle初学者必知的100个问题2007年12月22日 星期六 22:581. Oracle安装完成后的初始口令?
internal/oracle
sys/change_on_install
system/manager
scott/tiger
sysman/oem_temp
2. ORACLE9IAS WEB CACHE的初始默认用户和密码?
administrator/administrator
3. oracle 8.0.5怎么创建数据库?
用orainst。如果有motif界面,可以用orainst /m。
4. oracle 8.1.7怎么创建数据库?
dbassist
5. oracle 9i 怎么创建数据库?
dbca
6. oracle中的裸设备指的是什么?
裸设备就是绕过文件系统直接访问的储存空间。
7. oracle如何区分 64-bit/32bit 版本???
$ sqlplus '/ AS SYSDBA'
SQL*Plus: Release 9.0.1.0.0 - Production on Mon Jul 14 17:01:09 2003
(c) Copyright 2001 Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
PL/SQL Release 9.0.1.0.0 - Production
CORE 9.0.1.0.0 Production
TNS for Solaris: Version 9.0.1.0.0 - Production
NLSRTL Version 9.0.1.0.0 - Production
SQL>
8. SVRMGR什么意思?
svrmgrl,Server Manager.
9i下没有,已经改为用SQLPLUS了。
sqlplus /nolog
变为归档日志型的。
9. 请问如何分辨某个用户是从哪台机器登陆ORACLE的?
SELECT machine , terminal FROM V$SESSION;
10. 用什么语句查询字段呢?
desc table_name 可以查询表的结构
select field_name,... from ... 可以查询字段的值
select * from all_tables where table_name like '%'
select * from all_tab_columns where table_name='??'
11. 怎样得到触发器、过程、函数的创建脚本?
desc user_source
user_triggers
12. 怎样计算一个表占用的空间的大小?
select owner,table_name,
NUM_ROWS,
BLOCKS*AAA/1024/1024 "Size M",
EMPTY_BLOCKS,
LAST_ANALYZED
from dba_tables
where table_name='XXX';
Here: AAA is the value of db_block_size ;
XXX is the table name you want to check
13. 如何查看最大会话数?
SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%';
SQL>
SQL> show parameter processes
NAME TYPE VALUE
------------------------------------ ------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 4
log_archive_max_processes integer 1
processes integer 200
这里为200个用户。
select * from v$license;
其中sessions_highwater纪录曾经到达的最大会话数。
14. 如何查看系统被锁的事务时间?
select * from v$locked_object ;
15. 如何以archivelog的方式运行oracle?
init.ora
log_archive_start = true
RESTART DATABASE
16. 怎么获取有哪些用户在使用数据库?
select username from v$session;
17. 数据表中的字段最大数是多少?
表或视图中的最大列数为 1000。
18. 怎样查得数据库的SID ?
select name from v$database;
也可以直接查看 init.ora文件。
19. 如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ?
select sys_context('userenv','ip_address') from dual;
如果是登陆本机数据库,只能返回127.0.0.1,呵呵。
20. unix 下怎么调整数据库的时间?
su -root
date -u 08010000
21. 在ORACLE TABLE中如何抓取MEMO类型栏位为空的资料记录?
select remark from oms_flowrec where trim(' ' from remark) is not null ;
22. 如何用BBB表的资料去更新AAA表的资料(有关联的字段)?
UPDATE AAA SET BNS_SNM=(SELECT BNS_SNM FROM BBB WHERE AAA.DPT_NO=BBB.DPT_NO) W
HERE BBB.DPT_NO IS NOT NULL;
23. P4电脑安装方法
将SYMCJIT.DLL改为SYSMCJIT.OLD
24. 何查询SERVER是不是OPS?
SELECT * FROM V$OPTION;
如果PARALLEL SERVER=TRUE则有OPS能。
25. 何查询每个用户的权限?
SELECT * FROM DBA_SYS_PRIVS;
26. 如何将表移动表空间?
ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;
27. 如何将索引移动表空间?
ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME;
28. 在LINUX,UNIX下如何启动DBA STUDIO?
OEMAPP DBASTUDIO
29. 查询锁的状况的对象有?
V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ;
查询锁的表的方法:
SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'R
ow-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', T
O_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)
', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(RE
QUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',
S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2 FROM V$LOCK L, SYS.DBA_OBJEC
TS O, V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;
30. 如何解锁?
ALTER SYSTEM KILL SESSION ‘SID,SERIR#’;
31. SQLPLUS下如何修改编辑器?
DEFINE _EDITOR="" -- 必须加上双引号
来定义新的编辑器,也可以把这个写在$ORACLE_HOME/sqlplus/admin/glogin.sql里面使它
永久有效。
32. ORACLE产生随机函数是?
DBMS_RANDOM.RANDOM
33. LINUX下查询磁盘/CPU竞争状况命令?
Sar -d
sar -r
34. 查询当前用户对像?
SELECT * FROM USER_OBJECTS;
SELECT * FROM DBA_SEGMENTS;
35. 如何获取错误信息?
SELECT * FROM USER_ERRORS;
36. 如何获取链接状况?
SELECT * FROM DBA_DB_LINKS;
37. 查看数据库字符状况?
SELECT * FROM NLS_DATABASE_PARAMETERS;
SELECT * FROM V$NLS_PARAMETERS;
38. 查询表空间信息?
SELECT * FROM DBA_DATA_FILES;
39. ORACLE的INTERAL用户要口令?
修改 SQLNET.ORA
SQLNET.AUTHENTICATION_SERVICES=(NTS)
40. 出现JAVA.EXE的解决办法?
一般是将ORACLEORAHOMEXIHTTPSERVER改成手工启动可以的,X是8或9。
41. 如何给表、列加注释?
SQL>comment on table 表 is '表注释';
注释已创建。
SQL>comment on column 表.列 is '列注释';
注释已创建。
SQL> select * from user_tab_comments where comments is not null;
42. 如何查看各个表空间占用磁盘情况?
SQL> col tablespace format a20
SQL> select
b.file_id 文件ID号,
b.tablespace_name 表空间名,
b.bytes 字节数,
(b.bytes-sum(nvl(a.bytes,0))) 已使用,
sum(nvl(a.bytes,0)) 剩余空间,
sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_id,b.bytes
order by b.file_id
43. 如把ORACLE设置为MTS或专用模式?
#dispatchers="(PROTOCOL=TCP) (SERVICE=SIDXDB)"
加上就是MTS,注释就是专用模式,SID是指你的实例名。
44. 如何才能得知系统当前的SCN号 ?
select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe;
45. 请问如何在ORACLE中取毫秒?
9i之前不支持,9i开始有timestamp.
9i可以用select systimestamp from dual;
46. 如何在字符串里加回车?
select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ;
47. 中文是如何排序的?
Oracle9i之前,中文是按照二进制编码进行排序的。
在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值
SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M 按照拼音排序
48. Oracle8i中对像名可以用中文吗?
可以。
49. 如何改变WIN中SQL*Plus启动选项?
SQL*PLUS自身的选项设置我们可以在$ORACLE_HOME/sqlplus/admin/glogin.sql中设置。
50. 怎样修改oracel数据库的默认日期?
alter session set nls_date_format='yyyymmddhh24miss';
OR
可以在init.ora中加上一行
nls_date_format='yyyymmddhh24miss'
51. 如何将小表放入keep池中?
alter table xxx storage(buffer_pool keep);
52. 如何检查是否安装了某个patch?
check that oraInventory
53. 如何使select语句使查询结果自动生成序号?
select rownum,COL from table;
54. 如何知道数据裤中某个表所在