风之语

posts(201) comments(182) trackbacks(1)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • ajax(1)
  • android(1)
  • apache(1)
  • AppFuse(1)
  • BIRT(1)
  • iText(1)
  • JSF(8)
  • kettle(1)
  • linux(5)
  • mac(1)
  • maven(1)
  • MSTR(3)
  • Open XML(1)
  • Oracle(21)
  • RCP
  • Struts(2)
  • Struts2(2)
  • SybaseIQ(6)
  • tapestry
  • tomcat(2)
  • weblogic(1)
  • webservice(1)
  • weka(1)
  • 云计算(1)
  • 收藏(31)
  • 数据仓库(11)
  • 架构设计(3)
  • 生活(2)
  • 集群(1)
  • 项目管理(6)

随笔档案

  • 2012年12月 (4)
  • 2012年11月 (1)
  • 2012年7月 (2)
  • 2011年8月 (1)
  • 2011年7月 (1)
  • 2011年3月 (1)
  • 2010年12月 (2)
  • 2010年11月 (4)
  • 2010年10月 (3)
  • 2010年9月 (5)
  • 2010年8月 (1)
  • 2010年7月 (4)
  • 2010年3月 (1)
  • 2010年2月 (3)
  • 2009年12月 (3)
  • 2009年11月 (4)
  • 2009年9月 (3)
  • 2009年6月 (5)
  • 2009年5月 (3)
  • 2009年4月 (2)
  • 2009年3月 (5)
  • 2009年2月 (4)
  • 2009年1月 (2)
  • 2008年11月 (2)
  • 2008年9月 (1)
  • 2008年7月 (2)
  • 2008年6月 (4)
  • 2008年5月 (6)
  • 2008年4月 (1)
  • 2008年3月 (1)
  • 2007年12月 (2)
  • 2007年11月 (5)
  • 2007年10月 (2)
  • 2007年9月 (3)
  • 2007年8月 (3)
  • 2007年4月 (1)
  • 2007年3月 (2)
  • 2007年2月 (2)
  • 2007年1月 (2)
  • 2006年12月 (3)
  • 2006年8月 (2)
  • 2006年7月 (2)
  • 2006年6月 (2)
  • 2006年4月 (2)
  • 2006年3月 (1)
  • 2006年2月 (3)
  • 2006年1月 (6)
  • 2005年12月 (6)
  • 2005年11月 (4)
  • 2005年10月 (17)
  • 2005年9月 (25)
  • 2005年8月 (16)
  • 2005年7月 (8)

相册

  • 技术图片

收藏夹

  • java

link

My wife

  • My wife's blog

最新随笔

  • 1. apache修改最大连接并用ab网站压力测试
  • 2. Vm虚拟机访问本地硬盘文件
  • 3. NFS文件无法写入的权限问题
  • 4. weblogic设置上传文件访问权限
  • 5. 在android上动态实现ichartjs的3D柱形图
  • 6. 使用Oracle trunc 来指定精确的年月日时分秒
  • 7. Quartz 2.1.5 web应用配置
  • 8. LoginAny 使用笔记
  • 9. MyEclipse 无响应的几种解决办法
  • 10. java.sql.SQLException: No more data to read from socket

搜索

  •  

积分与排名

  • 积分 - 402238
  • 排名 - 139

最新评论

  • 1. re: 使用Oracle trunc 来指定精确的年月日时分秒[未登录]
  • 政治
  • --张三
  • 2. re: 干掉流氓软件vrvrf_c.exe,vrvedp_m.exe[未登录]
  • `
  • --1
  • 3. re: 无需刻录DMG光盘,教你在VMWare下安装MAC OS X Snow Leopard 10.6
  • 我走到了换DMG映像的时候,然后就没有反应了,这个是什么情况,是不是我的映像文件有问题,还是。。。。
  • --玉竹常青
  • 4. re: LoginAny 使用笔记
  • 怎么没一个人留言,现在来是不是在挖坟啊
  • --ellipse
  • 5. MSTR web应用的部署[未登录]
  • 请问,如何用oracle Application Server服务器部署mstr web应用?
  • --rocky

阅读排行榜

评论排行榜

调整 Java I/O 性能

     摘要: 这篇文章讨论和阐明了提供 JavaTM I/O 性能的多种技术。大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出。第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题。然而这个讨论没有包含应用设计问题,例如搜索算法和数据结构,也没有讨论系统级的问题,例如文件高速缓冲。 ...  阅读全文

posted @ 2006-01-16 02:32 风 阅读(1469) | 评论 (2) | 编辑 收藏

下载 eclipse3.11+ My Eclipse4.03GA +破解方法

1、下载Eclipse3.11
http://eclipse.openwebeng.com/downloads/drops/R-3.1.1-200509290840/eclipse-SDK-3.1.1-win32.zip

2、下载My Eclipse4.03GA

下载地址:
http://downloads.myeclipseide.com/downloads/products/eworkbench/4.0.3GA/EnterpriseWorkbenchInstaller_4.0.3GA_E3.1.exe


3、破解方法:
破解:
http://www.matrix.org.cn/resource/upload/content/2005_08_31_155716_ZPUFTrSVyl.rar
用破解的4.0 core.jar中的com.genuitec.eclipse.core.c.class替换掉4.0.3中的相同类。

posted @ 2006-01-12 20:45 风 阅读(3485) | 评论 (15) | 编辑 收藏

所有weblogic版本下载的FAQ(欢迎补充)

所有weblogic版本下载的FAQ(欢迎补充)


platform & Server

8.X
英文版
http://download2.bea.com/pub/platform/81/platform815_win32.exe
http://download2.bea.com/pub/platform/81/platform815_linux32.bin        (linux)
中文版
http://download2.bea.com/pub/platform/81/platform812_zh_CN_win32.exe
http://download2.bea.com/pub/platform/81/platform814_zh_CN_win32.exe
http://download2.bea.com/pub/platform/81/platform815_zh_CN_win32.exe
http://download2.bea.com/pub/platform/81/platform815_zh_CN_hpux32.bin   (hp_unix)
9.X
英文版
http://download2.bea.com/pub/platform/90/server900_win32.exe
http://download2.bea.com/pub/platform/90/server900_linux32.bin
中文版
http://download2.bea.com/pub/platform/90/server900_zh_CN_win32.exe
http://download2.bea.com/pub/platform/90/server900_zh_CN_hpux32.bin     (hp_uxix
http://download2.bea.com/pub/platform/90/server900_zh_CN_solaris32.bin  (Solaris(8\9\10)版)
http://download2.bea.com/pub/platform/91/server910_win32.exe
http://download2.bea.com/pub/platform/91/server910_linux32.bin          (linux)
http://download2.bea.com/pub/platform/91/server910_hpux32.bin           (hpux)
http://download2.bea.com/pub/platform/91/server910_solaris32.bin        (solaris)


==============需要注册的下载==========
1.在哪里下得着中文版的
http://commerce.bea.com/index.jsp
进去后,点击
International
Versions
然后就会到
http://commerce.bea.com/products/intl_versions.jsp
再选简体中文就OK了。
2.下载所有英文版本地址:
http://commerce.bea.com/showallversions.jsp?family=WLP
3.下载所有中文版本地址:
http://commerce.bea.com/showallversions.jsp?family=WLPCH

posted @ 2006-01-11 10:29 风 阅读(2626) | 评论 (2) | 编辑 收藏

使用Axis发布简单的Web服务

使用Axis,要发布一个Web服务非常简单,简直不能再简单了,尽管看起来过程和相关代码有些长。我这个帖子里用到了这些软件:Axis 1.1、Eclipse 2.1和Eclipse的Tomcat插件2.2(Sysdeo Tomcat plugin)。发布的方法如下:

我要发布的服务是一个图书商店,公布的方法有添加图书addBook、列表图书listBooks、删除图书deleteBook等等,为简单起见这里就只发布一个添加图书方法,因为其他方法的发布是类似的。

1、首先在Eclipse里新建一个名为bookstore的Tomcat工程,注意要安装了前面说的Tomcat插件才有这个选项的。如果没有安装可以建立一个java工程,然后手动建立必要的目录结构(WEB-INF等),并在Tomcat的server.xml里手动增加与项目对应的<context>项。

2、接下来建立图书类(com.bookstore.model.Book),图书有名称、ISDN号和页数三个属性,这是一个Bean类,代码如下:

package com.bookstore.model;

public class Book {
    private String name;
    private String ISDN;
    private 
int page;

    public String getISDN() {
        
return ISDN;
    }

    public String getName() {
        
return name;
    }

    public 
int getPage() {
        
return page;
    }

    public 
void setISDN(String string) {
        ISDN 
= string;
    }

    public 
void setName(String string) {
        name 
= string;
    }

    public 
void setPage(int i) {
        page 
= i;
    }

}

3、接下来建立用来提供服务的类(com.bookstore.BookSvc),这个类就是实际的功能类了,它里面只有一个public的addBook()方法,而它的参数只有一个就是要添加的图书。代码如下:

package com.bookstore;

import com.bookstore.model.Book;

public class BookSvc {
    
    public 
void addBook(Book book){
        
//here you save a book into database
        System.out.println("Book has been added.");
    }
}

4、现在,把下载来的Axis解压缩到一个文件夹,这里假设你解到C:\axis-1_1。把C:\axis-1_1\webapps\axis\WEB-INF\lib目录下的所有.jar文件复制到你的这个web应用程序的WEB-INF\lib下,再把C:\axis-1_1\webapps\axis\WEB-INF目录下的web.xml复制到你的web应用程序的WEB-INF下。这个步骤相当于在你的web应用程序中配置了Axis。

5、为了让Axis知道你要发布哪些服务,你得在WEB-INF下建立一个名为server-config.wsdd的文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 
<globalConfiguration>
  
<parameter name="adminPassword" value="admin"/>
  
<parameter name="attachments.Directory" value="C:\eclipse\workspace\bookstore\WEB-INF\attachments"/>
  
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
  
<parameter name="sendXsiTypes" value="true"/>
  
<parameter name="sendMultiRefs" value="true"/>
  
<parameter name="sendXMLDeclaration" value="true"/>
  
<parameter name="axis.sendMinimizedElements" value="true"/>
  
<requestFlow>
   
<handler type="java:org.apache.axis.handlers.JWSHandler">
    
<parameter name="scope" value="session"/>
   
</handler>
   
<handler type="java:org.apache.axis.handlers.JWSHandler">
    
<parameter name="scope" value="request"/>
    
<parameter name="extension" value=".jwr"/>
   
</handler>
  
</requestFlow>
 
</globalConfiguration>
 
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
 
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
 
<service name="Version" provider="java:RPC">
  
<parameter name="allowedMethods" value="getVersion"/>
  
<parameter name="className" value="org.apache.axis.Version"/>
 
</service>
 
<service name="BookSvc" provider="java:RPC">
  
<parameter name="allowedMethods" value="*"/>
  
<parameter name="className" value="com.bookstore.BookSvc"/>
 
</service>
 
<service name="AdminService" provider="java:MSG">
  
<parameter name="allowedMethods" value="AdminService"/>
  
<parameter name="enableRemoteAdmin" value="false"/>
  
<parameter name="className" value="org.apache.axis.utils.Admin"/>
  
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
 
</service>
 
<transport name="local">
  
<responseFlow>
   
<handler type="LocalResponder"/>
  
</responseFlow>
 
</transport>
 
<transport name="http">
  
<requestFlow>
   
<handler type="URLMapper"/>
   
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  
</requestFlow>
 
</transport>
</deployment>

这个文件里发布了三个服务:Version、AdminService和我们的BookSvc。还有一个方法可以生成这个文件,好象Axis推荐使用这种生成的方法,就是在同样目录下写一个deploy.wsdd文件(如果不想看可以直接跳到下一步),内容如下:

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java
="http://xml.apache.org/axis/wsdd/providers/java">
 
<service name="BookSvc" provider="java:RPC">
  
<parameter name="className" value="com.bookstore.BookSvc"/>
  
<parameter name="allowedMethods" value="*"/>
 
</service>
</deployment>

也就是说deploy.wsdd里只包含关于我们的服务的描述,确认Tomcat已经启动,然后在同一目录下用下面这个命令生成server-config.wsdd文件:

java org.apache.axis.client.AdminClient -lhttp://localhost:8080/bookstore/services/AdminService deploy.wsdd

其中bookstore是我这个web应用程序的虚拟路径。

6、重新启动Tomcat,访问路径http://localhost:8080/bookstore/services,就可以看到现在发布了三个Web服务,如下图。点击每个服务后的wsdl链接可以看到对应的WSDL描述。

o_axis-services.gif

可以看出,在Axis里书写deploy.wsdd并利用org.apache.axis.client.AdminClient发布,其主要工作就是把<service>标签中的内容添加在server-config.wsdd里,所以一般直接编辑server-config.wsdd文件会更方便一些。不过当你还没有server-config.wsdd文件时,使用deploy.wsdd的方法会更方便些,因为AdminClient会帮你生成一些额外的xml元素(<handler>等等),而这些元素是必要的。

服务发布以后,就可以在IE浏览器里看到它的WSDL,一般是服务的URL后面加一个“?wsdl”,例如添加图书的WSDL可以通过http://localhost:8080/bookstore/services/BookSvc?wsdl看到。至于Java类是以何种规则映射到WSDL的,请参考JAX-RPC规范;WSDL本身的说明见这里;为了搞清生成的WSDL中各种URL格式的名称空间,最好对XML Schema有所了解,我觉得这篇文章还不错。

我们还可以通过IE浏览器直接调用服务,方法是在服务URL后加“method=xxx”,其中xxx是要调用的方法名称。例如可以通过http://localhost:8080/bookstore/services/BookSvc?method=addBook调用添加图书方法,按照我们的服务类,在Tomcat的控制台上应该可以看到打出了“Book has been added.”的字样。

因为添加图书方法的参数是一个自定义类型,所以在IE里调用时不能指定参数值(或者是可以以其他格式指定,但我还不知道);如果参数是简单类型,就可以指定了。例如我们可以为BookSvc增加一个echo()方法,参数是一个java.lang.String类型的值,如下所示,然后重新编译并启动Tomcat(server-config.wsdd文件不必更改)。

public void echo(String str){
    System.out.println(
"Hello "+str);
}

在IE里输入http://localhost:8080/bookstore/services/BookSvc?method=echo&str=Mike,就会看到Tomcat的控制台里打出了“Hello Mike”。如果有多个参数,只要把这些参数都列在URL里即可。

posted @ 2006-01-10 12:11 风 阅读(1486) | 评论 (0) | 编辑 收藏

MyEclipse+struts+Hibernate配置开发手册

     摘要: MyEclipse+struts+Hibernate配置开发手册   说明:   这个手册只是为初学者制作的环境配置和快速开发的一些基本方法,为的是广大爱好者能快速上手,少走我走过的弯路,里面没有任何关于java模式和其他相关的说明。本人水平有限,也没有能力去讨论关于模式设计和开发细节的一些内容。  ...  阅读全文

posted @ 2005-12-23 18:56 风 阅读(2526) | 评论 (2) | 编辑 收藏

运用Jsp技术生成彩色汉字验证码

运用Jsp技术生成彩色汉字验证码

 


  一些网站采用了字母和数字的验证码,数字和字母加起来一共30多个,如果有心,还是能够通过方法识别出来。
  
  我在网上看到一篇文章"jsp彩色验证码",我进行了加强,生成的验证码内容为汉字,可以方便应用在面向汉语网民的网站认证上。
  
  当然,我还看到别人考虑的几种方法:
  
  1.生成计算题,比如20+34*(23-12)=?,用户必须输入正确的答案才能通过验证,这个想法挺好,但是用户必须打开计算器进行计算,增加了用户的难度
  
  2.问一些常见的问题,比如“人”这个字由几笔组成。这也是不错的想法,关键是必须有上万条的题库,而且题库的答案必须是明确的,简单易比较的,这个难度也较大。
  
  下面是彩色汉字验证码的代码。
  
  <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
  <%!
  //create by smallnest
  //email: smallnest@gmail.com
  //website:www.kuaff.com
  
  //生成随机颜色
  Color getRandColor(Random random,int fc,int bc)
  {
  if(fc>255) fc=255;
  if(bc>255) bc=255;
  int r=fc+random.nextInt(bc-fc);
  int g=fc+random.nextInt(bc-fc);
  int b=fc+random.nextInt(bc-fc);
  return new Color(r,g,b);
  }
  %>
  <%
  //设置页面不缓存
  response.setHeader("Pragma","No-cache");
  response.setHeader("Cache-Control","no-cache");
  response.setDateHeader("Expires", 0);
  
  // 设置图片的长宽
  int width=176, height=30;
  //设置备选汉字,剔除一些不雅的汉字
  String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";
  //备选汉字的长度
  int length = base.length();
  
  //创建内存图像
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  // 获取图形上下文
  Graphics g = image.getGraphics();
  
  //创建随机类的实例
  Random random = new Random();
  
  // 设定图像背景色(因为是做背景,所以偏淡)
  g.setColor(getRandColor(random,200,250));
  g.fillRect(0, 0, width, height);
  
  //备选字体
  String[] fontTypes = {"\u5b8b\u4f53","\u65b0\u5b8b\u4f53","\u9ed1\u4f53","\u6977\u4f53","\u96b6\u4e66"};
  int fontTypesLength = fontTypes.length;
  
  //在图片背景上增加噪点
  g.setColor(getRandColor(random,160,200));
  g.setFont(new Font("Times New Roman",Font.PLAIN,14));
  for (int i=0;i<6;i++)
  {
  g.drawString("*********************************************",0,5*(i+2));
  }
  
  //取随机产生的认证码(6个汉字)
  
  //保存生成的汉字字符串
  String sRand="";
  for (int i=0;i<6;i++)
  {
  int start = random.nextInt(length);
  String rand=base.substring(start,start+1);
  sRand+=rand;
  
  //设置字体的颜色
  g.setColor(getRandColor(random,10,150));
  //设置字体
  g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],Font.BOLD,18 + random.nextInt(6)));
  //将此汉字画到图片上
  g.drawString(rand,24*i+ 10 + random.nextInt(8),24);
  }
  
  //将认证码存入session
  session.setAttribute("rand",sRand);
  
  g.dispose();
  
  //输出图象到页面
  ImageIO.write(image, "JPEG", response.getOutputStream());
  
  %>

posted @ 2005-12-23 18:52 风 阅读(735) | 评论 (0) | 编辑 收藏

web开发框架——JSF开发实战二

 JSF开发实战的第一篇(jsf开发实战一)演示了如何建立一个最简单的JSF应用,从那个例子中我们可以观察到JSF的页面组件是如何与后台的javabean绑定的,也看到了JSF标签的最基本使用。在本文中我们会演示一个更加复杂的应用,它包含了更丰富的JSF标签。
  
  要开发的例子是一个用户管理程序,管理员输入帐号与密码登陆,然后它可以看到所有用户的列表,并且可以修改或者删除其中的一些数据。利用myeclipse所带的jsf-config.xml设计器,页面流程如下:
  
 

  可以看出,这个应用设计到的业务逻辑有:
  
  用户登陆、修改用户信息、增加新用户、删除用户
  
  我们在后台的数据库操作中使用hibernate框架来辅助开发,相关的技术细节请自行查阅文档。
  
  首先建立pojo文件:User.java,它包含几个基本属性:
  
  private int id;
  private String name;
  private String password;
  private int power;
  
  请自行完成set/get方法,并且编写对应的hbm.xml文件。
  
  我们的主要工作之一,是要建立好供jsf页面组件使用的javabean,把它命名为UMDelegater.java。它会调用UserManager来完成业务逻辑,这里是一个代理模式。UserManager的内容只是简单的增/删/查/改的操作,这里不再具体列出。UMDelegater的内容是:
  package org.bromon.jsf.control;
  
  import java.util.List;
  
  import javax.faces.model.DataModel;
  import javax.faces.model.ListDataModel;
  
  import org.bromon.jsf.model.UserManager;//自行建立的工具类,负责所有的hibernate操作
  import org.bromon.jsf.model.pojo.User;//pojo对象
  
  public class UMDeletager {
  private UserManager um=new UserManager();//所有具体的方法都由它来实现
  private User user=new User();
  private DataModel allUsers=new ListDataModel();//JSF的内置对象,用来封装html中table的数据
  
  //----------set/get方法---------------------
  public DataModel getAllUsers() {
  return allUsers;
  }
  
  public void setAllUsers(List list) {
  allUsers.setWrappedData(list);
  }
  public UserManager getUm() {
  return um;
  }
  public void setUm(UserManager um) {
  this.um = um;
  }
  public User getUser() {
  return user;
  }
  public void setUser(User user) {
  this.user = user;
  }
  
  //-----功能方法---------
  public String login()
  {
  String s=um.login(this.getUser());
  if(s.equals("ok"))
  {
  this.setAllUsers(um.loadAll());//如果登陆成功,就取出所有的用户信息
  return "login:ok";
  }else
  {
  swapper.setLoginFailInfo(s);
  return "login:fail";
  }
  }
  
  public String edit()
  {
  this.user=(User)allUsers.getRowData();//页面中的table自动返回含有id的user对象
  this.user=um.loadById(user.getId());
  if(user!=null)
  {
  return "edit";
  }else
  {
  return "error";
  }
  }
  
  public String update()
  {
  um.update(this.getUser());
  this.setAllUsers(um.loadAll());//重新取一次数据,目的是更新缓存
  return "update:ok";
  }
  
  public String addNew()
  {
  this.setUser(new User());//生成一个新的user对象,不含任何数据,它会被自动映射成一个没有数据的form
  return "add";
  }
  
  public String add()
  {
  um.add(this.getUser());
  this.setAllUsers(um.loadAll());//重新取一次数据,目的是更新缓存
  return "add:ok";
  }
  }
  
  在jsf-config.xml中声明这个bean:
  
  <managed-bean>
  <managed-bean-name>UMDelegater</managed-bean-name>
  <managed-bean-class>org.bromon.jsf.control.UMDeletager</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  
  业务逻辑就设计完成了,下面可以开始编写jsf文件,首先是index.jsp:
  
  首先引入标签库,并且声明page属性:
  
  <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
  <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
  <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  
  然后是构建页面:
  
  <body>
  <f:view>
  <h:form>
  <h:panelGrid columns="3">
  <h:outputLabel for="name" value="帐号:"/>
  <h:inputText id="name" value="#{UMDelegater.user.name}" required="true"/>
  <h:message for="name"/>
  
  <h:outputLabel for="password" value="密码:"/>
  <h:inputSecret id="password" value="#{UMDelegater.user.password}" required="true" />
  <h:message for="password"/>
  </h:panelGrid>
  <h:panelGroup>
  <h:commandButton value="登陆" action="#{UMDelegater.login}"/>
  </h:panelGroup>
  </h:form>
  </f:view>
  </body>
  
  页面中声明了两个文本框,分别映射UMDelegater对象中user对象的name属性,和UMDelegater对象中user对象的password属性。一旦这个表单被提交,这两个文本框的值就会被自动赋给user对象,我们只需要从user中取数据就行了,不用再去执行麻烦的request.getParameter(“”),更改编码,转换数据类型等操作。
  
  我们同时还声明了一个button,它与UMDelegater对象的login方法绑定,点击该按钮,系统会执行UMDelegater.login方法,该方法从user对象中取出name和password,和数据库中的记录进行比较。如果合法,那么就取出所有的数据,放到一个DataModel对象中,具体代码是:
  
  List userList=UserManager.getAllUser();//取得所有用户数据,放到一个List中
  DataModel allUser=new ListDataModel ();//DataModel是一个接口,ListDataModel是它的一个实现
  
  allUsers.setWrappedData(userList);//将数据填充进去备用
  
  使用DataModel意义何在呢?JSF中,我们可以把一个html页面上的table和一个DataModel绑定起来,这些数据会自动填充到table中,我们不必再自己去写循环,生成若干的<tr>、<td>来生成一个table。在list.jsp中我们会看到如何使用DataModel。
  
  放好数据之后,登陆成功的操作就完成了,返回一个login:ok,就可以重定向到list.jsp。如果用户登陆失败,那么会返回login:fail,重定向到error.jsp,它的内容就不叙说了。下面我们看看list.jsp里面有什么,下面是它的<body>代码:
  
  <body>
  <f:view>
  <h:form>
  <h:dataTable id="users" value="#{UMDelegater.allUsers}" var="u" border="1" width="80%" >
  <h:column>
  <f:facet name="header">
  <h:outputText value="id"/>
  </f:facet>
  <h:outputText value="#{u.id}"/>
  </h:column>
  
  <h:column>
  <f:facet name="header">
  <h:outputText value="帐号"/>
  </f:facet>
  <h:commandLink action="#{UMDelegater.edit}">
  <h:outputText value="#{u.name}"/>
  </h:commandLink>
  </h:column>
  
  <h:column>
  <f:facet name="header">
  <h:outputText value="密码"/>
  </f:facet>
  <h:outputText value="#{u.password}"/>
  </h:column>
  
  <h:column>
  <f:facet name="header">
  <h:outputText value="权限代码"/>
  </f:facet>
  <h:outputText value="#{u.power}"/>
  </h:column>
  </h:dataTable>
  <p>
  <h:commandLink action="#{UMDelegater.addNew}" value="增加用户" />
  </p>
  </h:form>
  </f:view>
  </body>
  
  我们使用了一个h:dataTable标签,它是JSF独有的东西,它会被翻译为一个html的table,通过指定h:dataTable的value="#{UMDelegater.allUsers}"属性,它就与我们刚才生成的DataModel对象关联起来,数据会被自动填充。我们只需要声明dataTable中的每一列的表头,数据来自哪个字段就可以了,如下:
  <h:column>
  <f:facet name="header">
  <h:outputText value="id"/>
  </f:facet>
  <h:outputText value="#{u.id}"/>
  </h:column>
  
  表格最后还有一个“增加用户”的按钮,它与UMDelegater.addNew绑定,它会把我们重定向到add.jsp。
  
  需要注意的是,每个用户名都是个超链接,点击之后可以重定向到edit.jsp,这个页面可以修改用户资料。这是通过如下代码实现的:

posted @ 2005-12-23 18:37 风 阅读(1304) | 评论 (2) | 编辑 收藏

利用jawin完成调用window中dll的调用

最近由于项目的特殊需求,我们必须在程序调用window的dll。
开始我们用jni,后来由于调用的dll太多,而且很烦琐。所以,我们决定用开源的jawin调用。
jawin 可以对dll中的方法进行调用,也可以调用com中的方法.内部还提供了一个工具,直接对 com组件导出成 java的类,个人认为很方便。

下面是我们作的一个测试,很顺利便通过了。
1、下载jawin:http://jawinproject.sourceforge.net/。
2、配置:
    》将jawin.jar放于%JAVA_HOME%\jre\lib\ext下 。
    》将jawin.dll放于c:\winnt\system32下。否则将出现错误:COMException : no jawin in java.library.path;
    也可将jawin.dll放于每个项目目录下。

   》至此在Editplus中调试Jawin/NJawin的例子,可以通过。 而在Eclipse中有时还会出上面的错误:COMException : no jawin in java.library.path。
   》在Eclipse中,菜单->window->preference->Java->installed JREs 将原来的remove,重新建一个指到你的java sdk目录。 
   》 ok了。
 3、程序测试:

     》调用 dll,dll 的方式不需要导出了,直接调用就可以了,下面是下载的包中提供的一个例子:
     》我在win2000下,测试通过。
/*
 * Created on Dec 22, 2005
 *
 */
import org.jawin.FuncPtr;

import org.jawin.ReturnFlags;

/**
 * @author gf  mail to gf@163.com
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class GfJawinTest {

       public static void main(String[] args) {

              try {

                     FuncPtr msgBox = new FuncPtr("USER32.DLL", "MessageBoxW");

                    

                     msgBox.invoke_I(0, "Hello From a DLL", "From Jawin", 0, ReturnFlags.CHECK_NONE);

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

}

 

posted @ 2005-12-22 11:23 风 阅读(8485) | 评论 (0) | 编辑 收藏

字符的全角和半角转换

在web应用中,开发者经常会面临字符的全角和半角转换问题。那么什么是全角?什么是半角呢?简单说就是中文系统用双字节显示汉字造成的与世界标准(由美国制订的)不一的问题。
举一个简单的例子,中文逗号“,”就是全角的,相对的西文逗号“,”就是半角的。这样的例子很多,比如“~”与“~”、“+”与“+”等等。

那么,字符的全角和半角转换有什么用处呢?一般说来,我们做的网页都是中文的,要求用户填入的信息也多是汉字,那么很多特殊字符都是全角的,比如说填写多条信息,用逗号分隔,这里的逗号多半都是全角的。而提交到后台(服务器端)处理,或者是查询(构建select语句)或者是入库(提交给DBMS),都是基于西文体系的,因此必须将这些字符转换成对应的半角字符。
下面举一个JavaScript的通用代码例子,详细介绍一下如何将这些全角字符转换成半角字符。
function SD(sbc, dbc)
{
 this.sbc = sbc;
 this.dbc = dbc;
}

var sdArray = new Array();
var sdCount;
var i = 0;

sdArray[i++] = new SD("0", "0");
sdArray[i++] = new SD("1", "1");
sdArray[i++] = new SD("2", "2");
sdArray[i++] = new SD("3", "3");
sdArray[i++] = new SD("4", "4");
sdArray[i++] = new SD("5", "5");
sdArray[i++] = new SD("6", "6");
sdArray[i++] = new SD("7", "7");
sdArray[i++] = new SD("8", "8");
sdArray[i++] = new SD("9", "9");
sdArray[i++] = new SD("a", "a");
sdArray[i++] = new SD("b", "b");
sdArray[i++] = new SD("c", "i");
sdArray[i++] = new SD("d", "d");
sdArray[i++] = new SD("e", "e");
sdArray[i++] = new SD("f", "f");
sdArray[i++] = new SD("g", "g");
sdArray[i++] = new SD("h", "h");
sdArray[i++] = new SD("i", "i");
sdArray[i++] = new SD("j", "j");
sdArray[i++] = new SD("k", "k");
sdArray[i++] = new SD("l", "l");
sdArray[i++] = new SD("m", "m");
sdArray[i++] = new SD("n", "n");
sdArray[i++] = new SD("o", "o");
sdArray[i++] = new SD("p", "p");
sdArray[i++] = new SD("q", "q");
sdArray[i++] = new SD("r", "r");
sdArray[i++] = new SD("s", "s");
sdArray[i++] = new SD("t", "t");
sdArray[i++] = new SD("u", "u");
sdArray[i++] = new SD("v", "v");
sdArray[i++] = new SD("w", "w");
sdArray[i++] = new SD("x", "x");
sdArray[i++] = new SD("y", "y");
sdArray[i++] = new SD("z", "z");
sdArray[i++] = new SD("A", "A");
sdArray[i++] = new SD("B", "B");
sdArray[i++] = new SD("C", "C");
sdArray[i++] = new SD("D", "D");
sdArray[i++] = new SD("E", "E");
sdArray[i++] = new SD("F", "F");
sdArray[i++] = new SD("G", "G");
sdArray[i++] = new SD("H", "H");
sdArray[i++] = new SD("I", "I");
sdArray[i++] = new SD("J", "J");
sdArray[i++] = new SD("K", "K");
sdArray[i++] = new SD("L", "L");
sdArray[i++] = new SD("M", "M");
sdArray[i++] = new SD("N", "N");
sdArray[i++] = new SD("O", "O");
sdArray[i++] = new SD("P", "P");
sdArray[i++] = new SD("Q", "Q");
sdArray[i++] = new SD("R", "R");
sdArray[i++] = new SD("S", "S");
sdArray[i++] = new SD("T", "T");
sdArray[i++] = new SD("U", "U");
sdArray[i++] = new SD("V", "V");
sdArray[i++] = new SD("W", "W");
sdArray[i++] = new SD("X", "X");
sdArray[i++] = new SD("Y", "Y");
sdArray[i++] = new SD("Z", "Z");
sdArray[i++] = new SD(".", ".");
sdArray[i++] = new SD(" ", " ");
sdArray[i++] = new SD("(", "(");
sdArray[i++] = new SD(")", ")");
sdArray[i++] = new SD("{", "{");
sdArray[i++] = new SD("}", "}");
sdArray[i++] = new SD("[", "[");
sdArray[i++] = new SD("]", "]");
sdArray[i++] = new SD("<", "<");
sdArray[i++] = new SD(">", ">");
sdArray[i++] = new SD("「", "“");
sdArray[i++] = new SD("」", "”");
sdArray[i++] = new SD("`", "`");
sdArray[i++] = new SD("~", "~");
sdArray[i++] = new SD("!", "!");
sdArray[i++] = new SD("@", "@");
sdArray[i++] = new SD("#", "#");
sdArray[i++] = new SD("%", "%");
sdArray[i++] = new SD("^", "^");
sdArray[i++] = new SD("※", "&");
sdArray[i++] = new SD("*", "*");
sdArray[i++] = new SD("-", "-");
sdArray[i++] = new SD("_", "_");
sdArray[i++] = new SD("+", "+");
sdArray[i++] = new SD("=", "=");
sdArray[i++] = new SD("|", "|");
sdArray[i++] = new SD("\", "\\");
sdArray[i++] = new SD("■", "-");
sdArray[i++] = new SD("'", "'");
sdArray[i++] = new SD(""", "\"");
sdArray[i++] = new SD("/", "/");
sdArray[i++] = new SD(";", ";");
sdArray[i++] = new SD(":", ":");
sdArray[i++] = new SD(",", ",");
sdArray[i++] = new SD("。", ".");
sdArray[i++] = new SD("?", "?");

sdCount = i;


function sbc2dbc(src)
{
 var k;
 var i;
 var len = src.length;
 var result = "";
 
 for (k=0; k<len; k++)
 {
  ch = src.charAt(k);
  for (i=0; i<sdCount; i++)
  {
   if (sdArray[i].sbc == ch)
   {
    result += sdArray[i].dbc;
    break;
   }
  }
  
  if (i == sdCount) //没有查到对应的全角字符
  {
   result += ch;
  }
 }
 
 return result;
}
代码的原理就不详细介绍了, src参数就是需要转换的字符串,直接调用sbc2dbc函数就可以把src里面所有的全角字符转换成半角字符。
为什么没有半角字符转换成全角字符的函数?呵呵,因为没有想到那里会用到,如果你在开发中真有此需求,相信根据上面的源码,你也可以写出对应的转换函数。祝你顺利。

 

posted @ 2005-12-21 15:40 风 阅读(1526) | 评论 (0) | 编辑 收藏

final注意要素

final注意要素:


1.abstract
和final不能同时修饰一个类。
2.
修饰方法保证该方法不能被子类重载,已经被private修饰的方法以及所有包含在final类中的方法,都被缺省认为是fianl的。
3.
如果是修饰primitive数据,那么这份数据是不可更改的,如果是修饰对象的话,那么其指向不可更改。但例如一个对象内部有另外一个对象,这另外一个对象可以变更。
两者重点不同:
       static
强调只有一份
       final
强调是常量
       static
和final是不同的两个修饰,static是修饰方法或变量是静态的,而final是修饰定义的变量为常量。

posted @ 2005-12-03 16:13 风 阅读(291) | 评论 (0) | 编辑 收藏

仅列出标题
共20页: First 上一页 9 10 11 12 13 14 15 16 17 下一页 Last 
 
Powered by:
BlogJava
Copyright © 风