tbwshc

#

解决jsp参数传递乱码的问题

计算机生于美国,英语是他的母语,而英语以外的其它语言对他来说都是外语。他跟我们一样,不管外语掌握到什么程度,也不会像母语那样使用得那么好,时常也会出一些“拼写错误”问题。
 

     乱码的出现根本原因在于编码和解码使用了不同的编码方案。比如用GBK编码的文件,用UTF-8去解码结果肯定都是火星文。所以要解决这个问题,中心思想就在于使用统一的编码方案。

 

     jsp页面间的参数传递有以下几种方式:1、表单(form)的提交。2、直接使用URL后接参数的形式(超级链接)。3、如果两个jsp页面在两个不同的窗口中,并且这两个窗口是父子的关系,子窗口中的jsp也可以使用javascript和DOM(window.opener.XXX.value)来取得父窗口中的jsp的输入元素的值。下面就前两种方式中出现的乱码问题做一下剖析。

 

     1、表单(form)的提交实现参数页面间的传递

     在介绍表单传递参数的内容之前,先来了解一些预备知识。表单的提交方式和请求报文中对汉字的处理。

 

     表单的提交方式:

     通常使用的表单的提交方式主要是:post和get两种。两者的区别在于:post方式是把数据内容放在请求的数据正文部分,没有长度的限制;get方式则是把数据内容直接跟在请求的头部的URL后面,有长度的限制。下面是同一个页面两种方式的请求报许文。

Requesttest.jsp代码 
<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
</head>  
<body>  
<%-- post方式提交表单 --%>  
<form action="http://localhost:8888/EncodingTest/requestresult.jsp" method="post">  
    UserName:<input type="text" name="username"/>  
    Password:<input type="password" name="password"/>  
    <input type="submit" value="Submit">  
</form>  
</body>  
</html> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%-- post方式提交表单 --%> <form action="http://localhost:8888/EncodingTestb/requestresult.jsp" method="post"> UserName:<input type="text" name="username"/> Password:<input type="password" name="password"/> <input type="submit" value="Submit"> </form> </body> </html>
      在上面的请求页面的username输入框里输入的是“世界杯”三个汉字,password输入框中输入"123"后按下Submit按钮提交请求。截获到的请求报文如下:

Post方式的请求报文代码 
POST /EncodingTest/requestresult.jsp HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*  
Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp  
Accept-Language: zh-cn  
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-ciba; .NET CLR 2.0.50727)  
Content-Type: application/x-www-form-urlencoded  
Accept-Encoding: gzip, deflate  
Host: localhost:8888 
Content-Length: 49 
Connection: Keep-Alive  
Cache-Control: no-cache  
 
username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123 
POST /EncodingTest/requestresult.jsp HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp Accept-Language: zh-cn User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-ciba; .NET CLR 2.0.50727) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8888 Content-Length: 49 Connection: Keep-Alive Cache-Control: no-cache username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123
      以上报文内容,可以看出post方式的请求报文是有专门的数据部的。,

      下面的同一请求页面的get提交方式的请求报文:

Get方式的请求报文代码 
GET /EncodingTest/requestresult.jsp?username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123 HTTP/1.1 
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*  
Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp  
Accept-Language: zh-cn  
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-ciba; .NET CLR 2.0.50727)  
Accept-Encoding: gzip, deflate  
Host: localhost:8888 
Connection: Keep-Alive 
GET /EncodingTest/requestresult.jsp?username=%E4%B8%96%E7%95%8C%E6%9D%AF&password=123 HTTP/1.1 Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Referer: http://localhost:8080/TomcatJndiTest/requesttest.jsp Accept-Language: zh-cn User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; aff-kingsoft-ciba; .NET CLR 2.0.50727) Accept-Encoding: gzip, deflate Host: localhost:8888 Connection: Keep-Alive
     以上报文内容,可以看出get方式的请求报文没有专门的数据部,数据是直接跟在url的后面。

 

       请求报文中对汉字的处理:

       从上面两种报文可以看出页面上输入的“世界杯”三个汉字被替换成了"%E4%B8%96%E7%95%8C%E6%9D%AF”这样一个字符串,然后发给服务器的。看到这,可能会有两个问题:问题一、这个字符串是什么?问题二、为什么要做这样的替换?

 

      这个字符串是“世界杯”这三个汉字对应的"UTF-8”编码"E4B896E7958CE69DAF"在每个字节前追加一个"%"后形成的。至于为什么要做这样的转化,我的理解是:因为请求报文会以"ISO-8859-1"的编码方式编码后,通过网络流的方式传送到服务器端。"ISO-8859-1"仅支持数字、英文字母和一些特殊字符,所以像汉字等这样的字符"ISO-8859-1"是不认识的。所以就必须先给这些"ISO-8859-1"不支持的字符做个“整形”手术。这样才能正确的将页面上的信息传送到服务器端。

 

      这时可能又会有另外一个问题:上面的例子中为什么会选用"UTF-8"编码,其它的编码方案可以吗?答案是可以的。在jsp页面代码的头部有这样一段代码"<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>"其中charset的值就是浏览器在提交请求报文前,对请求报文做“整形”手术时用的字符集,同是也是浏览器解释服务器的响应页面时的字符集。

 

      在了解了以上内容后,开始剖析表单方式传递参数的乱码问题。

      以上例为例,点击"Submit"按钮后,浏览器将做完“整形”手术后的请求报文发送给WEB服务器上的Servlet容器,容器在收到这个请求报文后,会解析这个请求报文并用这个报文的信息生成一个HttpServletRequest对象,然后将这个HttpServletRequest对象传给这个页面所要请求的jsp或Servlet(上例中为"requestresult.jsp")。在这个被请求的jsp或Servlet(上例中为"requestresult.jsp")中,使用HttpServletRequest对象的getParameter("")方法来取得上一页面传来的参数。默认情况下,这一方法使用的是"ISO-8859-1"来解码,所以对于英文或数字的参数值自然能正确取得,但对于汉字这样的字符是解不出来的,因为那几个汉字曾经做过“整形”手术,已经认不出来了。要想再把它们认出来,那就得要把手术的主刀医生找到,然后再做一次“还原”手术。下面提供的几个方案,可用于不同的情况。

 

方案一代码 
<%String str = new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8"); %>  
Username:<%=str %> 
<%String str = new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8"); %> Username:<%=str %>
      既然request.getParameter("username")默认情况下返回的字符串是用"ISO-8859-1"解出来的,那就先把这个不可辨认的字符串再用"ISO-8859-1"来打散,也就是:request.getParameter("username").getBytes("ISO-8859-1")。最后再用跟你的页面的charset一致的字符集来重组这个字符串:new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8")。这样就能见到它的庐山真面目了。

 

      方案一是一种比较万能的方法,不管是post还是get都适用,但可以看出它的缺点是:对于每个可能出现汉字的参数都要显示的做这么一段处理。一个两个还行,要是很多的话,那就应该考虑一下是不是可以选用下一种方案。

  

方案二代码 
<%request.setCharacterEncoding("UTF-8"); %> 
<%request.setCharacterEncoding("UTF-8"); %>
      方案二是在页面的最开始或者是在该页面中使用的第一个request.getParameter("")方法之前加上上述一段代码,它的作用是用作为参数传入的编码集去覆盖request对象中的默认的"ISO-8859-1"编码集。这样request.getParameter("")方法就会用新的编码集去解码,因为"UTF-8"支持中文,所以作为参数传过来的“世界杯”三个汉字就能正确的接收到了。但关于request.setCharacterEncoding("")方法,API文档中有如下的说明:

 

      Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader(). Otherwise, it has no effectb.

 

      所以方案二只对post方式提交的请求有效,因为参数都在request的body区。而对get方式提交的请求则是无效的,这时你会发现同样的做法但显示的还是乱码。所以你的请求要是是以get方式提交的话,那你还是乖乖的选用方案一吧!

 

      从上面的叙述可以知道,方案二需要在每个页面的前头加上<%request.setCharacterEncoding("UTF-8"); %>这段代码,这样做是不是也挺累的,所以我们想到了使用过滤器来帮助我们做这件事儿,那就清爽、简单多了。

Encodingfilter代码 
public class EncodingFilter implements Filter {  
      
    private String charset;  
    @Override  
    public void destroy() {  
        // TODO Auto-generated method stub  
    }  
 
    @Override  
    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
        //用init方法取得的charset覆盖被拦截下来的request对象的charset  
        request.setCharacterEncoding(this.charset);  
        //将请求移交给下一下过滤器,如果还有的情况下。  
        chain.doFilter(request, response);  
    }  
 
    @Override  
    public void init(FilterConfig config) throws ServletException {  
        //从web.xml中的filter的配制信息中取得字符集  
        this.charset = config.getInitParameter("charset");  
    }  

public class EncodingFilter implements Filter { private String charset; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //用init方法取得的charset覆盖被拦截下来的request对象的charset request.setCharacterEncoding(this.charset); //将请求移交给下一下过滤器,如果还有的情况下。 chain.doFilter(request, response); } @Override public void init(FilterConfig config) throws ServletException { //从web.xml中的filter的配制信息中取得字符集 this.charset = config.getInitParameter("charset"); } }
        要想这个过滤器生效,还得到web.xml里加入下面的配制信息。

Web.xml代码 
<filter>  
   <filter-name>EncodingFilter</filter-name>  
   <filter-class>cn.eric.encodingtest.filter.EncodingFilter</filter-class>  
   <init-param>  
       <param-name>charset</param-name>  
       <param-value>UTF-8</param-value>  
   </init-param>  
</filter>  
<filter-mapping>  
   <filter-name>EncodingFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping> 
<filter> <filter-name>EncodingFilter</filter-name> <filter-class>cn.eric.encodingtest.filter.EncodingFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
 

        2、直接使用URL后接参数的形式(超级链接)。

        有些时候可能会遇到通过一个超级链接来把参数传到下一个页面,而刚好这个参数的值有可能会出现中文的情况。就像下面这样:

         <a href="./jstlresult.jsp?content=世界杯">Go South Africa

         跟form提交有些不同的是:当你点击这个超级链接后在浏览器的地址栏里看到的是http://localhost:8080/TomcatJndiTest/jstlresult.jsp?content=世界杯,而不是http://localhost:8080/TomcatJndiTest/jstlresult.jsp?content=%E4%B8%96%E7%95%8C%E6%9D%AF

这里浏览器并没有帮我们把这个转化工作搞定,所以这里要自己动手,丰衣足食了。做法如下:

        <a href="./jstlresult.jsp?content=<%=java.net.URLEncoder.encode("世界杯","utf-8") %>">Go South Africa

        这样的话在第二个页面就能使用<%String str = new String(request.getParameter("content").getBytes("ISO-8859-1"),"utf-8"); %>的方法来正确的得到这个参数值了。

 

        总结一下:

        1、post提交的方式:使用过滤器,将到达页面前的request对象中的字符编码设定成跟你页面统一的编码。

        2、get提交的方式:<%String str = new String(request.getParameter("content").getBytes("ISO-8859-1"),"utf-8"); %>这样的字符串重组的方法。

        3、超级链接方式:先将链接url中的汉字用java.net.URLEncoder.encode("paramValue","charset")方法处理一下,下面的做法参照2。

posted @ 2012-06-18 13:28 chen11-1 阅读(6945) | 评论 (3)编辑 收藏

IT老公伤不起

有个IT老公真伤不起,不知道什么时候就在你的电脑里动点手脚,把你整的云里雾里。
老公为了对付老婆看电视连戏剧,什么都想出来了。。。。
老公,是被老婆逼急了。老婆,被老公整惨了。

以下是原文,源代码都公布了,被逼急了的老公是否试一下。

写几个代码化解家庭纠纷

因老婆迷恋《重案6组》第三部(其实其它电视剧只要迷上也是这德性),这几天晚上都要看到12点多甚至1点才睡觉,让她睡嘛又有意见,强行关机是不可能的,这就是犟脾气。第二天我们都要上班,为了家庭和谐,决定从技术上想办法。


  • 网络限速

通过手机连接无线路由控制,进行查看dhcp客户端列表,根据计算机名获得老婆计算机的ip,然后再通过路由设置进行宽带限速,限制在10-12kbtb,这带宽看视频是不可能了。谁知道优酷一下缓冲了一集的,一集时间太长,所以这个失败了。

  • 偷偷添加计划任务

昨晚00:05趁老婆冲凉的功夫,偷偷在她计算机上添加计划任务,配置了00:30执行shutdown,参数啥都配置好了,然后我脸朝一侧偷笑,想着,等你进屋吹完头发刚坐下没看两分钟,就关机,这样就可以休息了。结果乐了好一会,但居然没关系,看来是shutdown参数或计划任务有问题。

  • 写程序控制

于是呼想做个东西放她电脑上,但可怜的是她也是做it的,所以程序要适当高级一点。这就是需求。

程序要做得方便合理,即她不知道有程序在运行,我控制也要人性化,什么时候想关机就关机,或者重启(因为有时周末我也玩得晚)。所以最后结论:1、用户不知道这个程序的存在;2、程序运行不影响用户正常操作;3、能远程控制。 这就是需求分析。

设计思路:后台开启http服务,晚上要她老看电视剧不休息,我就手机浏览器连接这个http服务,点1下就控制了。

最终思路:

1、因我是做java的,老婆机器上也有jdk,于是就用jdk1.6写一httpserver,运行后可以通过浏览器访问,并能接收关机类型、延迟时间这两个参数。

2、写一个批处理命令,用来悄悄执行这个java程序,运行过程无毒无烟无污染,以免起疑。

3、通过操作系统计划任务或者开机启动功能来运行这个批处理。



posted @ 2012-06-18 13:25 chen11-1 阅读(390) | 评论 (0)编辑 收藏

java 常用数据库连接方式

MySQL:
String Driver="com.mysql.jdbc.Driver"; //驱动程序
String URL="jdbc:mysql://localhost:3306/db_name"; //连接的URL,db_name为数据库名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).new Instance();
Connection con=DriverManager.getConnection(URL,Username,Password);
Microsoft SQL Server:
1)
String Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"; //连接SQL数据库的方法
String URL="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name"; //db_name为数据库名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).new Instance(); //加载数据可驱动
Connection con=DriverManager.getConnection(URL,UserName,Password); //
2)
String Driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //连接SQL数据库的方法
String URL="jdbc:sqlserver://localhost:1433;DatabaseName=db_name"; //db_name为数据库名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).new Instance(); //加载数据可驱动
Connection con=DriverManager.getConnection(URL,UserName,Password);
Sysbase:
String Driver="com.sybase.jdbc.SybDriver"; //驱动程序
String URL="jdbc:Sysbase://localhost:5007/db_name"; //db_name为tb数据可名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
Oracle(用thin模式):
String Driver="oracle.jdbc.driver.OracleDriver"; //连接数据库的方法
String URL="jdbc:oracle:thin:@loaclhost:1521:orcl"; //orcl为数据库的SID
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).newInstance(); //加载数据库驱动
Connection con=DriverManager.getConnection(URL,Username,Password);
PostgreSQL:
String Driver="org.postgresql.Driver"; //连接数据库的方法
String URL="jdbc:postgresql://localhost/db_name"; //db_name为数据可名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
String Driver="org.postgresql.Driver"; //连接数据库的方法
DB2:
String Driver="com.ibm.db2.jdbc.app.DB2.Driver"; //连接具有DB2客户端的Provider实例
//String Driver="com.ibm.db2.jdbc.net.DB2.Driver"; //连接不具有DB2客户端的Provider实例
String URL="jdbc:db2://localhost:50000/db_name"; //db_name为数据可名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
Informix:
String Driver="com.informix.jdbc.IfxDriver";
String URL="jdbc:Informix-sqli://localhost:1533/db_name:INFORMIXSER=myserver"; //db_name为数据可名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);
JDBC-ODBC:
String Driver="sun.jdbc.odbc.JdbcOdbcDriver";
String URL="jdbc:odbc:dbsource"; //dbsource为数据源名
String Username="username"; //用户名
String Password="password"; //密码
Class.forName(Driver).newInstance();
Connection con=DriverManager.getConnection(URL,Username,Password);

posted @ 2012-06-16 09:15 chen11-1 阅读(1443) | 评论 (0)编辑 收藏

假如重新选择

 假设任你选择一种职业,你打算干什么?美国人的回答充分显示了干一行厌一行。一位军界要人说:“去乡间开一个杂货店。”一位女部长说:“到哥斯达黎加的滨海游览区开一家旅馆。”一位市长说:“改行当摄影记者。”而一位劳工部部长说:“出任一家冰激凌公司的总经理。”
  假设有来世,你打算作何选择?日本有一百多位商人接受测试,回答可说是五花八门,尽其想象。其中,表示继续从商的很少,大部分人愿意当艺术家或学者,有男士说想投胎为女子,有人说甘愿退出人的世界化为植物,甚至有人说愿意变为一只狗。
  我觉得这试验很有噱头,于是作东施效颦。一日,拜访作家谌容,趁便问:“假设时光倒流,您会不会重新选择?”谌女士其时正在戒烟,她一边嗑瓜子,一边说:“我想这没什么好选择,我就是喜欢写作。”
  又一日,看望学者金克木。当着金老的面,我什么也没提,只是漫无边际地闲聊。回家后,给金老拨了个电话。金老在电话那头笑了。他说:“花非花,雾非雾,美国人、日本人怎么说,我不管,反正永远当不了真。你要我说吗?一定要?我的答复只能是—哈哈哈哈!”
  随后,我或用电话直接征询,或借助朋友的帮忙,在周围广为撒网。测验的结果是—
  剧作家吴祖光、画家吴冠中与法国文学专家罗大冈全都笑而不答。
  北大中文系著名教授袁行霈则说:“来世,肯定地说,我还想教书。”
  中国市长协会负责人陶斯亮轻盈地一笑:“要有来世,我就学音乐。”
  小提琴演奏家盛中国对今生的选择十分自负:“音乐是一种深入灵魂超越国界的语言,我不想改弦易辙。”
  清华大学电子工程系教授郑君里摇了摇头:“知识分子还是要当的,但不想再搞工程方面的研究,可以搞文学、社会科学。为什么?tb工程方面涉及的人太多,难以出成果。”
  作家袁鹰:“继续当编辑,我觉得这差事很美……”
  作家蓝翎:“这个问题我如此回答你:我最初的愿望是学英语,我的后辈都是工程技术人员。”
  诗人牛汉:“这辈子由于种种原因,没写出大名堂,壮志未酬,遗憾哪遗憾!因此,下一辈子还是要写诗,下两辈子下三辈子也还是要写诗!”
  雕塑家郑于鹤:“我是搞造型艺术的,我觉得几十年时间根本不够,若有可能,我想二百年三百年地连续搞,也许能做出点成绩。”
  书法家徐楚德:“我嘛,来生还是写字,既可躲进小楼成一统,避免外界干扰,又有成就感。”
  经济学家管益忻:“那我就要考虑怎样在陆地和地球之外重建人类的家园了。”
  作家蒋子龙:“下辈子我想做一只鸟。天空多干净,鸟儿多自由,它既可以高飞,也可以享受地面,可以走、跑、停,还可以演唱。”
  作家石英:“若有可能,下辈子当个隐士,怎样?”
  最后,我又拨通了学者季羡林的电话。不久前曾经登门求教,季老赠了我五本书,我讲了一些读后感,末了小心翼翼地探问:“假设有来世,先生……”季老答:“你别问,我不相信有来世。”我连忙申明:“这仅仅是假设,假设……”季老没吱声,也许是没弄明白我的意思,也许是觉着不值得回答。
  灯下翻阅季老赠我的散文集《赋得永久的悔》,在《一个老知识分子的心声》一文篇尾,不期觅得现成的答案。季老在讲了过去七八十年中的酸甜苦辣后,笔锋一转说:“我从来不相信什么轮回转生。现在,如果让我相信一回的话,我就恭肃虔诚祷祝造化小儿,下一辈子无论如何也别再拨弄我,千万别再把我拨弄成知识分子。”

posted @ 2012-06-16 09:13 chen11-1 阅读(156) | 评论 (0)编辑 收藏

pb常用函数(二)(转)

     摘要: GetFocus()功能确定当前焦点位于哪个控件上。语法GetFocus ( )返回值GraphicObject。函数执行成功时返回当前得到焦点控件的引用,发生错误时返回无效引用。用法应用程序利用IsValid()函数可以检测GetFocus()是否返回有效的控件引用。同时,使用TypeOf()函数可以确定控件的类型。 Post()功能将指定消息加入到某个窗口的消息队列中,这个窗口既可以是Powe...  阅读全文

posted @ 2012-06-14 13:10 chen11-1 阅读(872) | 评论 (0)编辑 收藏

pb中数据窗口函数小结(转)

一、连接数据库


连接数据库也就是指定事务对象。PowerBuilder提供了两个函数:SetTrans()和SetTransObject()。
语法格式:
dw_control.SetTrans(TransactionObject)
dw_control.SetTransObject(TransactionObject)
其中,dw_control是所使用的数据窗口控件,transactionObject是所要指定的事务对象。
这两个函数有一个重要的区别就是在使用SetTrans()函数时,用户不需做任何数据初始化或事务对象初始化工作。用户只需要在这里填充一个事务对象,PB就会自动完成对该事物对象的初始化以及和数据库连接的工作。而使用SetTransObject()函数时,用户必须首先把所用的事务对象连接到数据库上。
但是,这并不意味着SetTrans()函数比SetTransObject()函数更好,使用SetTrans()函数时,每调用一次函数必须连接一次数据库,因为这个函数在每个事务处理的末端都会执行Disconnect语句。与此相反,使用SetTransObject()函数可以为数据库维持一个开放性的连接。因此在一般情况下,为了提高效率,总是采用SetTransObject()函数。
这两个函数都是成功时返回1,发生错误时返回-1。

二、检索数据


用于检索数据的函数只有一个,就是Retrieve()函数。
语法格式:
dw_control.Retrieve()
如果数据窗口控件上的数据窗口对象是有检索参数的,就要在这个函数调用时加上检索参数。而且检索参数必须和数据窗口对象中定义顺序一致。
此函数返回一个长整型的数据,代表检索出来的数据行数。如果发生错误,将返回-1。

三、更新数据


当用户对数据窗口对象内的数据修改后,想把这些修改反映到数据库中去时,必须使用Update()函数。
语法格式:
dw_control.Update()
这个更新可能成功,也可能失败。一般在这个函数被调用之后,总是要做一个检查。请看下面的例子:
Int li_return
li_return = dw_1.Update()
IF li_return = 1 THEN
     COMMIT USING SQLCA;
ELSE
     ROLLBACK USING SQLCA;
END IF
在这段代码中,首先对数据窗口控件进行更新操作。但是更新只是把数据写入到客户机的内存,并没有提交到数据库中。如果更新成功,就把它提交到数据库中,如果更新失败,就回滚到当前的事务。

行操作
行操作的函数主要是对数据库中的数据进行插入、删除或选择操作TB

一、插入行


在DataWindow中插入一行,可以使用InsertRow()函数。
语法格式:
dw_control.InsertRow(rownumber)
dw_control
是数据窗口控件名,rownumber是要插入行的的行号。如果这个参数为0,代表在当前DataWindow的最后一行插入一空行。
InsertRow()
函数返回一个长整型值,以此来代表插入的行号。如果插入失败,则返回-1。

二、删除行


要删除DataWindow内的一行数据,则要使用DeleteRow()函数。
语法格式:
dw_control.DeleteRow(rownumber)
其中rownumber是要删除的行号。如果该值为0,表示删除当前行。如果删除成功,返回1,失败则返回-1。

三、设置当前行


如果要设置DataWindow中的某行为当前行,可以使用SetRow()函数。
语法格式:
dw_control.SetRow(rownumber)

其中rownumber是要设置为当前行的行号。如果函数返回1表示成功,返回-1代表失败。

四、获取当前行


如果想要获取DataWindow中的某行为当前行,可以使用GetRow()函数。
语法格式:
dw_control.GetRow()
该函数没有参数,它返回一个长整型,代表当前行号。如果返回-1代表失败。如果返回0代表没有选中任何行。

五、选择行


如果想要在DataWindow中加亮显示某一行或取消加亮显示某一行,可以使用SelectRow()函数。
语法格式:
dw_control.SelectRow(rownumber,select)
其中,rownumber表示要加亮或者取消加这显示的行号,0表示所有行。select是一个布尔类型的值,TRUE表示加亮,FALSE表示取消加亮显示。该函数返回1时表示成功,返回-1时表示失败。
如果想要直接设置某一行为加亮,需要首先取消其它行的加亮显示状态,采用如下的两行代码:
dw_1.SelectRow(0,FALSE)
dw_1.SelectRow(rownumber,TRUE)


六、TB获取选择行


如果想要获取当前DataWindow中加亮显示的行,可以使用GetSelectRow()函数。
语法格式:
dw_control.GetSelectRow(rownumber)
其中,rownumber为开始查找的行的行号,0表示从头开始查找。该函数返回一个长整数,表示从rownumber开始查找第一个加亮显示的行的行号。如果失败返回0。

七、滚动行


如果在DataWindow的末尾插入一行数据,而当前行是在DataWindow的中央,那么这种插入可能不会被用户觉察。为了改变这种情况,可以滚动行到DataWindow的末尾,这样用户就能发现新的改变。要滚动行,可以使用ScrollToRow()函数。
语法格式:
dw_control.ScrollToRow(rownumber)
该函数返回1时表示成功,返回-1时表示失败。
与ScrollToRow()函数据功能相关的还有如下几个函数:
ScrollPriorRow()
:向上滚动一行
ScrollNextRow()
:向下滚动一行

列操作
列操作类的函数主要是选择指定的列和获取列的信息。

一、获取列


如果要获取当前的列号,可以使用GetColumn()函数,如果要获取当前的列名,可以使用GetColumnName()函数。
语法格式:
dw_control.GetColumn()
dw_control.GetColumnName()
这两个函数都没有参数,GetColumn()函数返回一个长整型值,代表当前的列号,GetColumnName()函数返回当前列的列名。如果返回0,表示当前没有任何列被选择返回-1表示失败。

二、设置列


要设置某一列为DataWindow中的当前列,可以使用SetColumn()函数。
语法格式:
dw_control.SetColumn(column)
其中column既可以是列号,也可以是列名。当该函数返回1时表示成功,返回-1时表示失败。

数据操作
数据操作类的函数主要是对DataWindow中的数据进行获取、设置。

一、获取数据


如果要从DataWindow的指定行和列中获取数据,就要使用GetItem系列的函数。

这个系列的函数共有五个,分别是对字符串、数字、日期、日期时间和小数。
语法格式:
dw_control.GetItemString(rownumber,column)
dw_control.GetItemNumber(rownumber,column)
dw_control.GetItemDate(rownumber,column)
dw_control.GetItemDateTime(rownumber,column)
dw_control.GetItemDecimal(rownumber,column)
其中,rownumber参数表示行号,column可以是列号或列名。

二、设置数据


与获取数据所用的函数不同,设置DataWindow内指定行列处的数据只要使用一个SetItem()函数就可以了。
语法格式:
dw_control.SetItem(rownumber, column, value)
其中rownumber表示行号,column可以是列号,也可以是列名,value表示要设置的值。但是该必须与DataWindow中指定的行列处的数据类型一致,不然PowerBuilder会报错。
SetItem()
函数返回1时表示成功,返回-1时表示失败。

三、数据排序


如果希望对DataWindow内的数据进行重新排序,而又不想重新从数据库中检索数据,可以使用SetSort()和Sort()函数。这两个函数一起完成对DataWindow进行排序的功能。其中SetSort()函数用于设置如何排序,Sort()函数用于对DataWindow实际进行排序
语法格式:
dw_control.SetSort(expression)
dw_control.Sort()
其中expression是一个字符串,表示排序的表达式,它的具体值是一个列名后面加一个空格,然后是"A",表示升序,或"D",表示降序。如果有多个列要同时进行排序,它们之间用逗号隔开。
例:dw_1.SetSort("name A,xh D")
这两个函数都是返回1表示成功,返回-1表示失败。

四、数据过滤


如果希望对DataWindow内的数据进行过滤而不重新从数据库中检索数据,可以使用SetFilter()和Filter()函数。它们一起完成对数据的过滤功能。其中

SetFilter()函数用来设置过滤条件,Filter()函数用于对DataWindow进行过滤。
语法格式:
dw_control.SetFiter(expression)
dw_control.Fiter()
其中expression是一个字符串,表示过滤的条件,它实际是一个逻辑表达式。
例:
dw_1.SetFilter("id>\'003\' AND name like\'
%\'")
dw_1.Filter()
这两个函数都是返回1表示成功,返回-1表示失败。

五、数据检查


PowerBuilder
提供了两个函数用于数据的检查,它们是DeleteCount()和ModifiedCount(),其作用分别是检查DataWindow中的数据自上一次更新到现在,被删除的行数和被修改的行数。它们一般在窗口的CloseQuery事件中使用,用来检查该窗口的DataWindow中的数据是否有尚未保存的修改。
语法格式:
dw_control.DeleteCount()
dw.control.ModifiedCount()
它们分别返回从上一次更新到现在,DataWindow中被删除和被修改的行数。如果没有行被删除或被修改,那么它们返回0。如果出现错误则返回-1。
一般情况下,如果窗口中含有可供修改的数据窗口对象,那么在窗口的CloseQuery事件中通常使用如下代码检查数据窗口对象中是否有尚未保存的数据:
Int li_return
IF dw_1.ModifiedCount() > 0 OR dw_1.DeletedCount() >0 THEN
     li_return = MessageBox("
提示","数据尚未保存,是否保存?",Question!,YesNoCancel!,3)
     CHOOSE CASE li_return
            CASE 1
                 TriggerEvent(\'ue_save\')
                 RETURN 0
            CASE 2
                 RETURN 0
            CASE 3
                 RETURN 1
    END CHOOSE
END IF

 

1.    怎么判断数据窗口中指定字段的数据类型?

Dw_1.describe(“colname.coltype”)

返回类型为:string

posted @ 2012-06-14 13:04 chen11-1 阅读(1617) | 评论 (0)编辑 收藏

js控制页面刷新等操作

 

在实际中有时候可能会有不让用户刷新页面,或者在页面点右键等需求,这里简单贴一段我在tb项目中用到的js

function document.oncontextmenu(){event.returnValue=false;}//屏蔽鼠标右键
function window.onhelp(){return false} //屏蔽F1帮助
function document.onkeydown()
{
  if ((window.event.altKey)&&
      ((window.event.keyCode==37)||   //屏蔽 Alt+ 方向键 ←
       (window.event.keyCode==39)))   //屏蔽 Alt+ 方向键 →
  {
     event.returnValue=false;
  }

  if ((event.keyCode==116)||                 //屏蔽 F5 刷新键
      (event.ctrlKey && event.keyCode==82)){ //Ctrl + R
     event.keyCode=0;
     event.returnValue=false;
     }
  if (event.keyCode==122){event.keyCode=0;event.returnValue=false;}  //屏蔽F11
  if (event.ctrlKey && event.keyCode==78) event.returnValue=false;   //屏蔽 Ctrl+n
  if (event.shiftKey && event.keyCode==121)event.returnValue=false;  //屏蔽 shift+F10
  if (window.event.srcElement.tagName == "A" && window.event.shiftKey) 
      window.event.returnValue = false;             //屏蔽 shift 加鼠标左键新开一网页
}
这里退格键没做屏蔽,因为会用到退格键的删除,如果有需求可以自己加

 

posted @ 2012-06-12 13:24 chen11-1 阅读(1734) | 评论 (1)编辑 收藏

主键冲突---一个表可以有两个主键的作用:---表中已有主键新增一个主键语句

一个表可以有两个主键的作用:

primary key for table xs ' is not unique :主键冲突

首先,那两个字段都变成了主键,这话是不确切的.严格的说因为是   你选择的那两个字段共同构成了主键,也就是 "學生編號+課程編號 "的组合是一个主键,这个组合不能够重复,不能够同时为空,   而不是 "學生編號 "     "課程編號 "   各为一个主键,不信你可以查看tb系统表.


表中已有主键新增一个主键:语句
例如:
alter table AC04_blbc DROP PRIMARY KEY;
alter table AC04_blbc modify sbxz VARCHAR(8) NOT NULL,add constraint PK_AC04_blbc primary key (AAE002, AAC001, AAE041,sbxz);

posted @ 2012-06-12 13:22 chen11-1 阅读(2025) | 评论 (0)编辑 收藏

IT“茫一代”:35岁成生死线 无处安放未来(新浪)----------转

一年半的时间里,曾小亮两上八宝山。

  送走的第一位好友,是某著名互联网公司女性频道的主编,突发脑溢血,去世时年仅37岁。新近送走的是《健康与美容》杂志的主编孟玲和,48岁,开会时突发脑溢血,去世前几天曾小亮还曾与其彻夜长聊。

  从八宝山回来的路上,曾小亮一个人沿着长安街走了好久。这位酒尚出版人助理、情感职场专栏作家、总是为别人调制“心灵鸡汤”的人,在那一刻,竟然抑制不住心生强烈的幻灭感。

  他忽然间觉得,金钱、地位、名利都不再那么重要,生命、健康与爱,这些我们人生中更具有本源意义,但是长久被忽视的东西,慢慢清晰地浮现出来。

  这是“压力山大”的一代人。严重透支身体,恨不能每周7*24小时地工作,在跻身上层、功成名就的路上狂奔。他们的不安全感、焦虑感从某种程度上远远超过了父辈。

  他们几乎完整地经历了中国社会经济快速发展的三十年,从物质财富的极度匮乏到迅速富裕;同时也见证了恢复高考、计划生育、打破大锅饭、企业改制、取消福利分房、中国加入WTO等种种既有秩序的被打破。

  当秩序被打破时,总会有人为此付出代价。这一代人身上深深烙上了中国社会经济发展代际变迁的印记。

  35岁老了?

  提前来临的焦虑、无措、迷茫

  科锐国际人力资源公司业务总监刘峰前一阵子刚刚接触了一家叫“豆瓣”的互联网公司。让他这个做了十几年人力资源工作的老“猎头”有些意外的是,豆瓣公司员工的平均年龄非常小,大概在25岁左右。

  大约三年前,刘峰和腾讯的HR有次聊天,让他印象深刻的是腾讯的“特色”之一“很年轻”。

  近十年里,国内一些新晋大公司的出现,像百度、腾讯、阿里巴巴等互联网巨头的崛起,带动了一个大产业,使很多年轻人年纪轻轻就获得了意想不到的成功。

  而且,互联网等新产业的勃兴,正加速着社会对人才的需求和优胜劣汰,也正拉低着职场人群的平均年龄。

  互联网领域里“年轻化”的公司正日益多起来。比如中国第一家女性团购网站“聚美优品”,三个联合创始人都是80后,一些中层管理者甚至是1989年生人,今年29岁的CEO陈欧一直有个想法,在自己30岁以前把聚美优品做上市。他甚至坦言,在事业快速发展的这几年,他暂时不会因为结婚这类“家事”把自己限制住。

  35岁在某种程度上就意味着职场“生死线”,对许多IT人来说,35岁甚至意味着技术生涯的结束。

  现在,对越来越多在职场和事业上打拼的80后来说,29岁就已经临近“过期”:青春的有效期29岁截止,一到30岁,就会被打上“Timeout”(过期)的印记。

  对于那些最早一批进入外资企业“吃螃蟹”的人来说,现在已近人到中年,更是处境尴尬。

  一方面由于年龄的原因,不少外企白领在公司的发展遭遇瓶颈,“在我这个年龄和职位,继续待在外企的话后面的路已经很清楚,升职上遭遇玻璃天花板,年龄上经不起高强度的工作”。

  另一方面,不少人由于产业大环境的变化,“金饭碗”的含金量正在加速褪去。

  科锐国际早期的客户源100%都是外资企业;公司成立五六年时,2000年左右,科锐国际开始与包括华为、李宁等在内的本土企业有初步接触;到2004年、2005年时,公司明确将发展内资企业客户作为重点,彼时内资企业所占科锐国际客户源的比例还很低;从2008年、2009年以后,内资企业的业务能占到科锐国际总业务的百分之二三十。“在高科技、互联网这些行业,外资客户与内资客户的比重甚至是四六开。”

  刘峰认识很多外资企业的高层或者中层以上的经理,在90年代末或者2000年左右,他们的职业很让人艳羡,而tb现在职业的“含金量”已经大不如以前。“那时候的外企中高层,买两套房子很正常,但是你今天进到外企,即使给你八千、一万块钱月薪,你什么时候才能买个房子呢?同样是薪水,含义已经发生了深刻的变化。”

  社会经济的快速发展也让职场危机提前而至,在发达国家,焦虑、无措、迷茫等中年职场危机的表现通常发生在45~55岁,但是在中国却提前了近10年。

  这是“压力山大”的一代人。严重透支身体,恨不能每周7x24小时地工作,在跻身上层、功成名就的路上狂奔。他们的不安全感、焦虑感从某种程度上远远超过了父辈。


退休或重返职场?

  参数未知的将来

  “退休”,对当下这个人群来说,几乎是一种奢望。

  李强是一家私企的老板,早年做生意赚了几百万后觉得足够将来生活了,便结束了生意,开始安享生活。可是不到十年,他发现生活的发展完全脱离了他预设的轨道。“十年前几百万足够一个人安安稳稳过完一辈子,可是我没有想到这几年房价、物价会涨成这样,现在几百万还算个啥。”“安享”计划泡汤的李强不得不重整旗鼓,再次创业。

  刘峰身边也有朋友有过和李强类似“提前退休”的经历。这位朋友为了移民加拿大,在事业发展最顺风顺水的时候,提前结束在中国国内的工作,在加拿大当地随便找了个工作。待到移民必须的居住时间期满后,这位朋友想再回中国来发展,却发现已经错失了事业发展的最好机会。

  对于至少还有些“家底儿”的李强等人来说未来虽然艰难,但还不至于毫无保障,对于更多的中年职场工作者而言未来生活的参数一概未知,这种不确定性和不安全感更加重了这一群体的焦虑。到底有多少资产未来才可以安枕无忧?没人可以给出一个确切的答案。

  20多年前,大学每年的学费只有200元,现在有些专业已经冲上万元,增长了约50倍。中国青年报社会调查中心曾有一项7625人参与的调查统计称,尽管78.8%的人认为和十年前相比收入增加了,但是85.3%的人感觉自己的生活负担比十年前更重了。有人估算了近四十年来中国人结婚的成本:70年代末是600元,80年代是3000元,90年代是3.3万,21世纪达56.6万,越来越贵的中国式婚姻。显而易见的是,中国社会经济获得了前所未有的快速发展,但人们的收入增长速度却远没有跑过物价上涨的速度。

  “在过去几十年的发展过程中,一个不可回避的问题就是国家对中层人群,其实没有好的政策来扶植他们。”刘峰感慨,中层的赋税很高,高到很吓人的程度,而另一方面,国家给予这一阶层的福利几乎是零。“比如说我每月交那么多钱的税,突然有一天失业了,却发现我什么都没有,真的是什么都没有。”

  对于这一现状,资深产业经济学家白益民认为,日本企业的员工对于未来的焦虑感要比中国低得多,“日本有约定俗成的终身雇佣制以及与其相配合的年功序列制、企业工会。这是日本的三大神器。”白益民介绍,在日本的企业中,企业不会轻易裁员,年功序列制是指工资待遇按员工的资历慢慢增长,所以一旦进入一个企业,你就可以知道自己未来在这家公司大概享有的工资待遇水准。

  长期以来,对于中国是否应该采用终身雇佣制的争论一直存在,白益民的看法是一些特定的企业可以尝试这种制度,这对于企业人才的积累、技术的传承以及员工对生活的安全感都将会有很大的帮助。

  异化的人性

  “被高速”的一代

  曾小亮认为,整个社会在追求经济高速发展的时候,同时导致了人性的异化。因为人不可能变成一个经济动物,人有内在的自尊、自我,有对幸福感的追逐,经济并不能满足人们更深的快乐。“很多人在有了基本的物质保证之后,就会发现自己开始寻找新的幸福之道。”

  “你会发现人们这种心理状态的变化和经济发展有一脉相承的地方,特别是在经济高速发展的时候。”曾小亮注意到,中年阶层的这种集体性焦虑和迷茫,曾经出现在美国的上世纪七八十年代,中国台湾的九十年代。

  在中国,一方面是高速发展的经济环境让管理人才的职业晋升速度超过了心智成熟度的提升,另一方面是中国长期以来的应试教育过分注重分数,而忽视了心灵的成长,此外对经济发展的过度追求,也让这一群体缺乏对生活的整体观。

  “升迁官能症”在中层人群中就相当普遍。“或是没有做好准备,或者是能力不够、提拔太快,被提拔上去以后,会发现很多事情自己没有能力驾驭了。”曾小亮认为,因为心智的成熟速度赶不上社会角色的提升速度,很多中层人群在职场角色擢升后就会出现各种问题。“跟同事的关系、家庭的问题,突然就会觉得自己扛不住了。我曾经在专栏中提到过,在这个状态下要学会用一些方法去调试,这就涉及到很多大的课题了。我觉得这跟人才的储备也有关系,经济发展太快,人才储备不够。”

  这种对周遭事物掌控能力的欠缺也极大地加剧了这一人群的焦虑感。

  一直以来,中国都推崇GDP增长的神话,认为面临的首要问题是尽快地发展生产力,提高经济水平,解除贫困状态,增强综合国力。在这种背景下,“GDP崇拜”成为一种普遍情结,唯效率主义或独尊经济指数的发展成为主要甚至惟一的取向。片面追求经济增长也导致了诸多不良的后果,国民教育、就业保障、社会福利、医疗卫生、文化建设等与人民生活质量密切相关的社会领域的发展就被不同程度的牺牲掉了,当置身经济发展大潮的主流阶层人士行至中年才发现自己忽略了身体,忽视了家庭,却并没有从过快发展的经济中获得多少幸福感,甚至于找不到自己的未来。

  近年来,美国、英国等发达国家越来越重视“幸福指数”这一软指标,美国联邦政府和英国内阁甚至拨巨资成立专门的研究机构,聘请诺贝尔经济学奖得主丹尼尔·卡内曼等专家坐镇,设立衡量人们幸福感的指标,使它与GDP一样成为衡量一个国家发展水平的标准。

  “幸福经济”越来越成为人们热议的话题。曾有人发问,如果GDP的增长不能让人们更幸福,政府为什么还要致力于GDP的增长呢?当下“茫一代”既是推动中国社会经济高速发展的蚂蚁雄兵,也是被经济高速发展“副作用”所中伤的一代,他们是否幸福、如何才能幸福,是中国社会经济代际变迁的注脚。

posted @ 2012-06-10 11:31 chen11-1 阅读(366) | 评论 (0)编辑 收藏

网上流传的软件测试工程师级别

初级测试工程师 :年薪约在2-4万左右。他们的工作通常是按照测试方案和流程对产品进行功能测试,检查产品是否有缺陷。 具有一些手工测试经验,开发测试脚本并开始熟悉测试生存周期和测试技术;

中级测试工程师 :年薪在5-6万左右。他们要能够编写测试文案,测试文档,与项目组一起制定测试阶段的工作计划。能够在项目中合理利用测试工具来完成测试任务。能够独立编写自动测试脚本程序并担任测试编程初期的领导工作,进一步拓展编程语言、操作系统、网络与数据库方面的技能;

高级测试工程师 :年薪8-10万左右。他们不但需要掌握测试与开发技术,而且对所测试软件对口的行业非常了解,能够对测试方案可能出现的问题进行分析和评估。帮助开发或维护测试或编程标准与过程,负责同级的评审,并能够指导初级的测试工程师;

Team Leader(测试主管) :年薪8-15w,一般至少具有5年的工作经验,负责管理一个小团队。负责进度安排、工作规模/成本估算、按进度表和预算目标交付产品,负责开发项目的技术方法,能够为用户提供支持和演示;

测试经理 :年薪在12-20w,能够担当测试领域内的整个开发生存周期业务,能够为用户提供交互和大量演示,负责项目成本、进度安排、计划和人员分工;

计划经理(或者说测试总监) :年薪20-30w,具有多年纯熟的开发与支持(测试/质量保证)活动方面的经验,管理从事若干项目的人员以及整个开发生存周期,负责把握项目方向和盈亏责任。

----------------------------------------------------------------------------------
0级:
不了解测试方法;
没有测试计划和测试样例,漫无目的测试,靠运气找BUG;
tb提交BUG的时候描述非常不清楚;


1级:
了解一些测试方法;
有一定的逻辑思考能力;
知道测试重点,了解测试覆盖率,会设计测试样例;
提交BUG的时候描述非常清楚,有详细的BUG重现步骤;


2级:
知道常用测试方法和测试技巧;
有较强逻辑思考能力;
会使用一些自动化测试工具;
有明确的测试计划和测试重点,设计的测试样例覆盖率较高。
提交BUG的时候描述非常清楚,有详细的重现步骤,规律性以及解决的建议。

3级:
熟悉常用测试方法和测试技巧;
不定期学习新的测试方法和测试技巧;
有很强逻辑思考能力;
会使用一些自动化测试工具;
经常上一些测试论坛和同行交流;
会一种编程语言(特别是shell,python等脚本语言);
有明确的测试计划和测试重点,设计的测试样例覆盖率非常高。
提交BUG的时候描述非常清楚,有详细的重现步骤,规律性以及解决的建议。

 

posted @ 2012-06-10 11:28 chen11-1 阅读(588) | 评论 (0)编辑 收藏

仅列出标题
共20页: First 上一页 12 13 14 15 16 17 18 19 20 下一页