随笔 - 20  文章 - 2  trackbacks - 0
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

引用

蒋委员长如何将class打包exe文件
class文件打包exe文件要经过两个步骤:
第一步:将class文件打包成jar文件,请参见我的上一篇文章:http://maidini.blog.163.com/blog/static/37762704200848910573/
第二步:将jar文件打包成exe文件。这是今天的重点

将jar打包exe 有许多工具,我以exe4j为例详解打包过程:
第一步:下载exe4j,最新版本为4.1 如下图 exe4j的官方网站 
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第二步:运行exe4j.exe 我使用的是免安装版(zip) 如下图
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第三步:运行软件exe4j,然后点击Next
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第四步:选择第二项"JAR in EXE mode",然后点击Next
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第五步:在General中填入名称,在Directories填入生成exe的目录位置。如下图:我将生成exe目录设置为C:\ok ,然后点Next
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第六步:Executable name处填入生成exe文件的名称,Icon File处填写图标文件位置,再点Next
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第七步:首先设置Class Path的位置,即jar文件的位置。然后点OK
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第八步:接着设置Main-Class 的位置,即main方法所在的位置。然后点OK 如下图
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

设置完成后,如下图: 一定要先设置Class Path,再设置Main class
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第九步:填写版本号,最好不要填写第二项。否则可能造成错误(见后面),最后点击Finish即可
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

错误内容:No JVM could be found on your system. Please define EXE4J_JAVA_HOME to point to an installed JDK or JRE or download a JRE from www.java.com
当时出现这个错误,查看了JDK和JRE都没有问题,exe4j也是最新版。后来才发现是设置"Maximum version"。如果不填写"Maximum version",就不报错。也不知道是不是exe4j的BUG
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

第十步:完成所有设置,点击“Click Here to Start the Application”可以运行测试生成的EXE文件
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人

生成的最终的EXE程序,双击直接运行。现在可以把自己写的小程序发给朋友们玩玩啦,呵呵
引用 如何将class打包exe文件 - 紫依韵 - 见人还是人



文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520093842753860
posted @ 2009-04-08 16:28 武志强 阅读(1955) | 评论 (0)编辑 收藏

 

引用

蒋委员长如何将Class打包Jar文件--Eclipse
开发环境:Eclipse + Win XP SP2
使用插件:Fatjar、Jigloo

闲话少说,直接切入正题。首先打开Eclipse,创建一个Java工程。如下图:我机子上的是JDK1.6
引用 如何将Class打包Jar文件--Eclipse - 紫依韵 - 见人还是人

第二步:用Jigloo插件创建一个窗体,为了更明显演示我将窗体名字修改为“这是一个测试程序”。如下图:
引用 如何将Class打包Jar文件--Eclipse - 紫依韵 - 见人还是人

第三步:现在就该将运行正常的java程序打包成jar文件。我使用Fatjar插件打包相当方便、傻瓜。直接右键选择要打包的工程,弹出的菜单中选择“Build Fat Jar”。如下图:
引用 如何将Class打包Jar文件--Eclipse - 紫依韵 - 见人还是人

第四步:弹出对话框,需要将引导路径修改,其他选项使用默认设置,然后点击Finish。“Main-Class”这项修改为Main方法所在的文件。此步不可缺少,否则打包的Jar文件双击不可运行。
引用 如何将Class打包Jar文件--Eclipse - 紫依韵 - 见人还是人

稍等一下,就打包成功如下图:出现一个testexe_fat.jar文件。
引用 如何将Class打包Jar文件--Eclipse - 紫依韵 - 见人还是人

进入工程所在的目录也可以看到一个testexe_fat.jar文件,双击它,就运行了。如果无误应该弹出像图2的界面。如下图:
引用 如何将Class打包Jar文件--Eclipse - 紫依韵 - 见人还是人

选择jar文件右键,点击open。相当于双击jar文件如下图:
引用 如何将Class打包Jar文件--Eclipse - 紫依韵 - 见人还是人

总结:打包Jar文件是将分散Class文件统一封装的好办法。双击运行速度与没打包前运行速度没有区别。打包一定要设置好Main-Class的路径,否则JVM找不到入口程序。

如果不知道如何在Eclipse中安装插件,请参见我的另一篇文章:http://maidini.blog.163.com/blog/static/37762704200832671334860/



文章来源:http://wxq594808632.blog.163.com/blog/static/1090797552009384273607
posted @ 2009-04-08 16:27 武志强 阅读(3158) | 评论 (2)编辑 收藏

 

引用

蒋委员长Eclipse的插件安装

众所周知,Eclipse无法方便快速的开发Swing程序。因为Eclipse没有自带图形化编码窗口,如果要开发图形化程序,只有手动敲代码非常不方便。现在有一个插件Jigloo提供图形化程序开发窗口,可以即拖即显。如何将它安装到Eclipse当中呢?

安装插件一般使用Link方式:Link意味链接,Eclipse加载时通过链接找到安装的插件
引用 Eclipse的插件安装 - 紫依韵 - 见人还是人
如上图所示:我的Eclipse路径C:\Program Files\Eclipse 然后将Jigloo解压到Eclipse安装目录中。这里需要注意Jigloo目录下必须要有个叫Eclipse的目录,Eclipse的目录下才是放入features和plugins目录。以上图为例:C:\Program Files\Eclipse\Jigloo\Eclipse 路径里放入features和plugins目录,即features目录路径为:C:\Program Files\Eclipse\Jigloo\Eclipse\features,plugins目录路径为:C:\Program Files\Eclipse\Jigloo\Eclipse\plugins  这里必须要强调目录路径,因为我使用的是Link方式安装插件。

插件安装位置正确后,就该链接了(Link)。在Eclipse路径C:\Program Files\Eclipse下建立一个links目录(必须这个名字),并在links目录下建立一个Jigloo.link的文件(文件名必须同插件目录名相同,后缀名必须是link)。最后用记事本打开Jigloo.link文件,填入path = Jigloo(path = 插件目录名)。保存后,重新启动Eclipse。如下图
引用 Eclipse的插件安装 - 紫依韵 - 见人还是人
在新建项目中出现了一个叫GUI Forms的项目,说明插件安装成功,这就是Jigloo插件提供的图形化开发工具。

写在最后:
向大家推荐一个插件Aptana,这个插件可以调试Javascript代码和HTML代码。此插件还是第一款支持ajax调试的程序。详见http://www.aptana.com/  插件下载地址http://update.aptana.com/install/studio/3.2/
引用 Eclipse的插件安装 - 紫依韵 - 见人还是人
因为新版本要收费(只有一个月免费试用),我使用的老版本,安装到Eclipse中有3个按钮(如上图,黄色惊叹号和红色叉)


文章来源:http://wxq594808632.blog.163.com/blog/static/1090797552009384255251
posted @ 2009-04-08 16:26 武志强 阅读(2282) | 评论 (0)编辑 收藏

如题,废话不多说。

JSP页面

hello.jsp

<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>AJAX提交页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<script type="text/javascript" src="ajax.js"></script>
   <script type="text/javascript">
   function doso(){
     var url = "actAction.do";
     var s="武晓强斯蒂芬34-*(&_(*!$^_*!&#!^$+!*#&&";
     s=encodeURIComponent(s);      //转换特殊字符
     var parameter ="name="+s+"&email=abc@abc.com&www=http://wxq594808632.blog.163.com/";
     var method = "POST";
     function callBack(text){           //回调函数
      alert("调用成功!\n名字为:"+text);
     }
   new Ajax().ajaxRequest(url,parameter,method,callBack);     //调用方法发送Request
   }
   </script>
</head>
<body>
<input type="button" value="提交" onclick="doso()"/>
   </body>
</html>

 

java类

ActAction.java

package ajaxpost;

import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.Action;
import java.io.UnsupportedEncodingException;
import java.io.IOException;
import java.io.PrintWriter;

public class ActAction extends Action {

    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws
            UnsupportedEncodingException {
        //设置字符编码返回的编码
        response.setContentType("text/html;charset=UTF-8");
        //接收字符的编码
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        PrintWriter out = null;
        try {
            out = response.getWriter();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        String name = request.getParameter("name");
        String email = request.getParameter("email");
        String www = request.getParameter("www");
        System.out.println(email);
        System.out.println(name);
        System.out.println(www);
     //   out.print(name+"\n"+email+"\n"+www);
        out.print(name);         //返回值
        return null;
    }
}

最重要滴

ajax.js

我用别人的。感谢这位大哥。。

/*
author zhangshuling
email 
zhangshuling1214@126.com
*/
function  Ajax(){
    var _xmlHttp = null;
 this.createXMLHttpRequest = function(){
  try{
   if (window.ActiveXObject) {                                                     
    _xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");                                     
   }                                                                               
   else if (window.XMLHttpRequest) {                                                   
    _xmlHttp = new XMLHttpRequest();                                               
   }
  }catch(e){
     alert(e.name +" : " + e.message);
  }
 }
 
 this.backFunction = function(_backFunction){
  if(_xmlHttp.readyState == 4) {
   if(_xmlHttp.status == 200) {
    _backFunction(_xmlHttp.responseText);//这里可以设置返回类型
   }
  }
   _xmlHttp.onreadystatechange = null;
 }

 this.doPost = function(_url,_parameter,_backFunction){
     try{
      _xmlHttp.open("POST",_url, false);
   _xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   _xmlHttp.send(_parameter);
   }catch(e){
    alert(e.name +" : " + e.message);
     }
 }
 
 this.doGet = function(_url,_parameter,_backFunction){
    try{
        var _random = Math.round(Math.random()*10000);
        _xmlHttp.open("GET", (_url+"?random=" +_random +"&" + _parameter), false);
     _xmlHttp.send(null);
   }catch(e){
      alert(e.name +" : " + e.message);
   }
 }
 
    this.ajaxRequest = function(_url,_parameter,_method,_backFunction){
          try{
            this.createXMLHttpRequest();
         if(_method.toLowerCase() == "post"){
            this.doPost(_url,_parameter,_backFunction);
         }else{
            this.doGet(_url,_parameter,_backFunction); 
         }
         try{
           _xmlHttp.onreadystatechange = this.backFunction(_backFunction);
         }catch(err){
            //??????IE?????????????????
         }
      }catch(e){
      alert(e.name +" : " + e.message);
   }
     }

}

/*
 var url = "ajax.do";
 var parameter = "parameter=parameter";
 var method = "post"
 
 function callBack(text){
  ....
 }
 
 new Ajax().ajaxRequest(url,parameter,method,callBack);

*/

 

经过本人FF,IE6,IE7,测试。完全好用


文章来源:http://wxq594808632.blog.163.com/blog/static/109079755200923121054225
posted @ 2009-03-31 14:11 武志强 阅读(828) | 评论 (0)编辑 收藏

import java.io.IOException;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.io.BufferedInputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.File;
import javax.imageio.ImageIO;

public class Img2 {
//读取远程url图片,得到宽高
    public int[] returnImgWH(String imgurl) {
        boolean b=false;
        try {
            //实例化url
            URL url = new URL(imgurl);
            //载入图片到输入流
            java.io.BufferedInputStream bis = new BufferedInputStream(url.openStream());
            //实例化存储字节数组
            byte[] bytes = new byte[100];
            //设置写入路径以及图片名称
            OutputStream bos = new FileOutputStream(new File( "C:\\thetempimg.gif"));
            int len;
            while ((len = bis.read(bytes)) > 0) {
                bos.write(bytes, 0, len);
            }
            bis.close();
            bos.flush();
            bos.close();
            //关闭输出流
            b=true;
        } catch (Exception e) {
            //如果图片未找到
            b=false;
        }
        int[] a = new int[2];
        if(b){    //图片存在
            //得到文件
            java.io.File file = new java.io.File("C:\\thetempimg.gif");
            BufferedImage bi = null;
            try {
                //读取图片
                bi = javax.imageio.ImageIO.read(file);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            a[0] = bi.getWidth(); //获得 宽度
            a[1] = bi.getHeight(); //获得 高度
            //删除文件
            file.delete();
        }else{     //图片不存在
            a=null;
        }
       return a;

    }

    public static void main(String[] args) {
        Img2 i = new Img2();
        int[] a=i.returnImgWH("http://www.baidu.com/img/baidu_logo.gif");
        if(a==null){
            System.out.println("图片未找到!");
        }else{
            System.out.println("宽为" + a[0]);
            System.out.println("高为" + a[1]);
        }
    }
}


文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520092274458465
posted @ 2009-03-27 16:05 武志强 阅读(2337) | 评论 (0)编辑 收藏

如题

默认排序方式为asc,可省略...

select   *   from   table   order   by   t1   desc,   t2   desc  ,   t3 desc;


文章来源:http://wxq594808632.blog.163.com/blog/static/109079755200922444356457
posted @ 2009-03-24 16:44 武志强 阅读(161) | 评论 (0)编辑 收藏

 function jsTrim(value)
       {
              var reg=/^\S$/;
              if (!value) return "";
              if(value.length==0)
                     return value;
              else
              {
                     var lp,rp;
                     lp=0;rp=value.length-1;
                     while ((value.charAt(lp)==" "||(value.charCodeAt(lp)<128?(reg.test(value.charAt(lp))==false?true:false):false)||value.charAt(rp)==" "||(value.charCodeAt(rp)<128?(reg.test(value.charAt(rp))==false?true:false):false))&&rp>=lp)
                     {
                            if (value.charAt(lp)==" "||value.charCodeAt(lp)<128?(reg.test(value.charAt(lp))==false?true:false):false)
                                   lp++;
                            if (value.charAt(rp)==" "||value.charCodeAt(rp)<128?(reg.test(value.charAt(rp))==false?true:false):false)
                                   rp--;
                     }
                     if(lp>rp)
                            return "";
                     else
                            return (value.substring(lp,rp+1));

              }
       }


文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520092205931780
posted @ 2009-03-20 17:10 武志强 阅读(977) | 评论 (0)编辑 收藏

 

引用

邵波的空间Java实现给图片添加水印
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import com.sun.image.codec.jpeg.*;

public class WaterMark ...{
/** *//**
* 给图片添加水印
* @param filePath 需要添加水印的图片的路径
* @param markContent 水印的文字
* @param markContentColor 水印文字的颜色
* @param qualNum 图片质量
* @return
*/
public boolean createMark(String filePath,String markContent,Color markContentColor,float qualNum,String watermark)
...{
ImageIcon imgIcon=new ImageIcon(filePath);
Image theImg =imgIcon.getImage();
int width=theImg.getWidth(null);
int height= theImg.getHeight(null);
//ImageIcon waterIcon=new ImageIcon(watermark);
//Image waterImg =waterIcon.getImage();
BufferedImage bimage = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB);
Graphics2D g=bimage.createGraphics();
g.setColor(markContentColor);
g.setBackground(Color.white);
g.drawImage(theImg, 0, 0, null );
//g.drawImage(waterImg, width*2, height, null );
g.drawString(markContent,width-100,height-30); //添加水印的文字和设置水印文字出现的内容
g.dispose();
try...{
FileOutputStream out=new FileOutputStream(filePath);
JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
param.setQuality(qualNum, true);
encoder.encode(bimage, param);
out.close();
}catch(Exception e)
...{ return false; }
return true;
}
public static void main(String arg[])
...{
WaterMark wk=new WaterMark();
if(wk.createMark("D:\1.jpg","Welcome!",Color.WHITE,70f,""))...{
System.out.println("制作成功");
}else...{
System.out.println("失败了!");
}
}
}


文章来源:http://wxq594808632.blog.163.com/blog/static/109079755200921911832219
posted @ 2009-03-19 13:19 武志强 阅读(231) | 评论 (0)编辑 收藏

 

引用

邵波的空间如何防止同一个账户被多个人同时登陆?

1.用session超时,session为null就表示下线了      
     
  2.也可以采用数据库中设置     临时表     来处理      
  一个用户登陆时向表中插进一条记录,用户离开时候删除该记录      
  如想统计在线人数,简单地执行      
  select     count(*)     from     table...     即可      
     
  3.application对象中可以记住现在的人数,application的生命周期和服务器的生命周期一样长。      
     
  4.还有一种方法要用到一个文件global.jsa     ,方法是(在JSP中)是sessionDestroy(),其中它是以session对象为参数的。还有要把global.jsa文件必须房子和JSP程序相同的文件目录内才行。      
     
  5.网页自动刷新的代码是:      
  在文件头部加上      
  <meta     http-equiv="refresh"     content="15">      
  刷新间隔时间是15秒      
     
     
  6.在session中加入监听类,类的示例代码如下:      

onLineUser.java-------------------------------------------------------------------------------------------

package com.shaobo.struts.action;

import javax.servlet.http.*;
import javax.servlet.*;
import java.util.*;

public class onLineUser implements HttpSessionBindingListener {
 public onLineUser() {
 }

 private Vector users = new Vector();

 public int getCount() {
  users.trimToSize();
  return users.capacity();
 }

 public boolean existUser(String userName) {
  users.trimToSize();
  boolean existUser = false;
  for (int i = 0; i < users.capacity(); i++) {
   if (userName.equals((String) users.get(i))) {
    existUser = true;
    break;
   }
  }
  return existUser;
 }

 public boolean deleteUser(String userName) {
  users.trimToSize();
  if (existUser(userName)) {
   int currUserIndex = -1;
   for (int i = 0; i < users.capacity(); i++) {
    if (userName.equals((String) users.get(i))) {
     currUserIndex = i;
     break;
    }
   }
   if (currUserIndex != -1) {
    users.remove(currUserIndex);
    users.trimToSize();
    return true;
   }
  }
  return false;
 }

 public Vector getOnLineUser() {
  return users;
 }

 public void valueBound(HttpSessionBindingEvent e) {
  users.trimToSize();
  if (!existUser(e.getName())) {
   users.add(e.getName());
   System.out.print(e.getName() + "\t登入到系统\t"
     + (new Date()));
   System.out.println("在线用户数为:" + getCount());
  } else
   System.out.println(e.getName() + "已经存在");
 }

 public void valueUnbound(HttpSessionBindingEvent e) {
  users.trimToSize();
  String userName = e.getName();
  deleteUser(userName);
  System.out.print(userName + "\t退出系统\t" + (new Date()));
  System.out.println("在线用户数为:" + getCount());
 }
}

login.jsp--------------------------------------------------------------------------------------------

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<jsp:useBean id="onlineuser" class="com.shaobo.struts.action.onLineUser"
 scope="application" />
<html>
 <head>
 </head>
 <body onUnload="postMessage()">
  <center>
   <p>
   <h1>
    登陆成功,欢迎访问
   </h1>
   </p>
  </center>
  <%
  session = request.getSession(false);
  %>
  <%
   String username = request.getParameter("username");
   if (onlineuser.existUser(username)) {
    out.println("用户<font color=red>" + username
    + "</font>已经登陆!");
   } else {
    session.setMaxInactiveInterval(50); //Sesion有效时长,以秒为单位      
    session.setAttribute(username, onlineuser);
    out.println("欢迎新用户:<font color=red>" + username
    + "</font>登陆到系统!");
   }
   out.println("<br>当前在线用户人数:<font color=red>"
     + onlineuser.getCount() + "</font><br>");
   String ip = request.getRemoteAddr();
   out.println("<br>IP:<font color=red>" + ip + "</font><br>");
   Vector vt = onlineuser.getOnLineUser();
   Enumeration e = vt.elements();
   out.println("在线用户列表");
   out.println("<table border=1>");
   out.println("<tr><td>用户名</td></tr>");
   while (e.hasMoreElements()) {
    out.println("<tr><td>");
    out.println((String) e.nextElement() + "<br>");
    out.println("</td></tr>");
   }
   out.println("</table>");
  %>
  <center>
   <p>
   </p>
   [
   <a href="javascript:window.close()">关闭窗口</a>]
   <%
    out.println("<p><a href='index.jsp'>退出系统</a></p>");
   %>
  </center>
  <Script>      
              function postMessage(){                                                                  
                 <%onlineuser.deleteUser(request.getParameter("username"));%>      
            }      
  </Script>
 </body>
</html>

欢迎光临邵波的空间` http://blog.sina.com.cn/shaobolive

QQ:343269876


文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520092191192874
posted @ 2009-03-19 13:19 武志强 阅读(791) | 评论 (0)编辑 收藏
一.获得控制台用户输入的信息

/** *//**获得控制台用户输入的信息
     * @return
     * @throws IOException
     */
    public String getInputMessage() throws IOException...{
        System.out.println("请输入您的命令∶");
        byte buffer[]=new byte[1024];
        int count=System.in.read(buffer);
        char[] ch=new char[count-2];//最后两位为结束符,删去不要
        for(int i=0;i<count-2;i++)
            ch[i]=(char)buffer[i];
        String str=new String(ch);
        return str;
    }
可以返回用户输入的信息,不足之处在于不支持中文输入,有待进一步改进。

二.复制文件

1.以文件流的方式复制文件

/** *//**以文件流的方式复制文件
     * @param src 文件源目录
     * @param dest 文件目的目录
     * @throws IOException 
     */
    public void copyFile(String src,String dest) throws IOException...{
        FileInputStream in=new FileInputStream(src);
        File file=new File(dest);
        if(!file.exists())
            file.createNewFile();
        FileOutputStream out=new FileOutputStream(file);
        int c;
        byte buffer[]=new byte[1024];
        while((c=in.read(buffer))!=-1)...{
            for(int i=0;i<c;i++)
                out.write(buffer[i]);       
        }
        in.close();
        out.close();
    }
该方法经过测试,支持中文处理,并且可以复制多种类型,比如txt,xml,jpg,doc等多种格式

三.写文件

1.利用PrintStream写文件

/** *//**
     * 文件输出示例
     */
    public void PrintStreamDemo()...{
        try ...{
            FileOutputStream out=new FileOutputStream("D:/test.txt");
            PrintStream p=new PrintStream(out);
            for(int i=0;i<10;i++)
                p.println("This is "+i+" line");
        } catch (FileNotFoundException e) ...{
            e.printStackTrace();
        }
    }
2.利用StringBuffer写文件

public void StringBufferDemo() throws IOException......{
        File file=new File("/root/sms.log");
        if(!file.exists())
            file.createNewFile();
        FileOutputStream out=new FileOutputStream(file,true);       
        for(int i=0;i<10000;i++)......{
            StringBuffer sb=new StringBuffer();
            sb.append("这是第"+i+"行:前面介绍的各种方法都不关用,为什么总是奇怪的问题 ");
            out.write(sb.toString().getBytes("utf-8"));
        }       
        out.close();
    }
该方法可以设定使用何种编码,有效解决中文问题。

四.文件重命名


    /** *//**文件重命名
     * @param path 文件目录
     * @param oldname  原来的文件名
     * @param newname 新文件名
     */
    public void renameFile(String path,String oldname,String newname)...{
        if(!oldname.equals(newname))...{//新的文件名和以前文件名不同时,才有必要进行重命名
            File oldfile=new File(path+"/"+oldname);
            File newfile=new File(path+"/"+newname);
            if(newfile.exists())//若在该目录下已经有一个文件和新文件名相同,则不允许重命名
                System.out.println(newname+"已经存在!");
            else...{
                oldfile.renameTo(newfile);
            }
        }        
    }五.转移文件目录


转移文件目录不等同于复制文件,复制文件是复制后两个目录都存在该文件,而转移文件目录则是转移后,只有新目录中存在该文件。

    /** *//**转移文件目录
     * @param filename 文件名
     * @param oldpath 旧目录
     * @param newpath 新目录
     * @param cover 若新目录下存在和转移文件具有相同文件名的文件时,是否覆盖新目录下文件,cover=true将会覆盖原文件,否则不操作
     */
    public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{
        if(!oldpath.equals(newpath))...{
            File oldfile=new File(oldpath+"/"+filename);
            File newfile=new File(newpath+"/"+filename);
            if(newfile.exists())...{//若在待转移目录下,已经存在待转移文件
                if(cover)//覆盖
                    oldfile.renameTo(newfile);
                else
                    System.out.println("在新目录下已经存在:"+filename);
            }
            else...{
                oldfile.renameTo(newfile);
            }
        }      
    }



六.读文件

1.利用FileInputStream读取文件


    /** *//**读文件
     * @param path
     * @return
     * @throws IOException
     */
    public String FileInputStreamDemo(String path) throws IOException...{
        File file=new File(path);
        if(!file.exists()||file.isDirectory())
            throw new FileNotFoundException();
        FileInputStream fis=new FileInputStream(file);
        byte[] buf = new byte[1024];
        StringBuffer sb=new StringBuffer();
        while((fis.read(buf))!=-1)...{
            sb.append(new String(buf));   
            buf=new byte[1024];//重新生成,避免和上次读取的数据重复
        }
        return sb.toString();
    }


2.利用BufferedReader读取

在IO操作,利用BufferedReader和BufferedWriter效率会更高一点

    /** *//**读文件
     * @param path
     * @return
     * @throws IOException
     */
    public String BufferedReaderDemo(String path) throws IOException...{
        File file=new File(path);
        if(!file.exists()||file.isDirectory())
            throw new FileNotFoundException();
        BufferedReader br=new BufferedReader(new FileReader(file));
        String temp=null;
        StringBuffer sb=new StringBuffer();
        temp=br.readLine();
        while(temp!=null)...{
            sb.append(temp+" ");
            temp=br.readLine();
        }
        return sb.toString();
    }


3.利用dom4j读取xml文件

    /** *//**从目录中读取xml文件
     * @param path 文件目录
     * @return
     * @throws DocumentException
     * @throws IOException
     */
    public Document readXml(String path) throws DocumentException, IOException...{
        File file=new File(path);
        BufferedReader bufferedreader = new BufferedReader(new FileReader(file));
        SAXReader saxreader = new SAXReader();
        Document document = (Document)saxreader.read(bufferedreader);
        bufferedreader.close();
        return document;
    }


七.创建文件(文件夹)

1.创建文件夹  /** *//**创建文件夹
     * @param path  目录
     */
    public void createDir(String path)...{
        File dir=new File(path);
        if(!dir.exists())
            dir.mkdir();
    }
2.创建新文件 /** *//**创建新文件
     * @param path 目录
     * @param filename 文件名
     * @throws IOException
     */
    public void createFile(String path,String filename) throws IOException...{
        File file=new File(path+"/"+filename);
        if(!file.exists())
            file.createNewFile();
    }
八.删除文件(目录)

1.删除文件     /** *//**删除文件
     * @param path 目录
     * @param filename 文件名
     */
    public void delFile(String path,String filename)...{
        File file=new File(path+"/"+filename);
        if(file.exists()&&file.isFile())
            file.delete();
    }
2.删除目录
要利用File类的delete()方法删除目录时,必须保证该目录下没有文件或者子目录,否则删除失败,因此在实际应用中,我们要删除目录,必须利用递归删除该目录下的所有子目录和文件,然后再删除该目录。  /** *//**递归删除文件夹
     * @param path
     */
    public void delDir(String path)...{
        File dir=new File(path);
        if(dir.exists())...{
            File[] tmp=dir.listFiles();
            for(int i=0;i<tmp.length;i++)...{
                if(tmp[i].isDirectory())...{
                    delDir(path+"/"+tmp[i].getName());
                }
                else...{
                    tmp[i].delete();
                }
            }
            dir.delete();
        }
    }

文章来源:http://wxq594808632.blog.163.com/blog/static/109079755200921911749952
posted @ 2009-03-19 13:18 武志强 阅读(215) | 评论 (0)编辑 收藏

 

引用

邵波的空间java中文件操作大全
一.获得控制台用户输入的信息

  1. /**获得控制台用户输入的信息  
  2.  * @return  
  3.  * @throws IOException  
  4.  */  
  5.  public String getInputMessage() throws IOException...{   
  6.  System.out.println("请输入您的命令∶");   
  7.  byte buffer[]=new byte[1024];   
  8.  int count=System.in.read(buffer);   
  9.  char[] ch=new char[count-2];//最后两位为结束符,删去不要   
  10.  for(int i=0;i<count-2;i++)   
  11.  ch[i]=(char)buffer[i];   
  12.  String str=new String(ch);   
  13.  return str;   
  14.    
/**获得控制台用户输入的信息 * @return * @throws IOException */ public String getInputMessage() throws IOException...{ System.out.println("请输入您的命令∶"); byte buffer[]=new byte[1024]; int count=System.in.read(buffer); char[] ch=new char[count-2];//最后两位为结束符,删去不要 for(int i=0;i<count-2;i++) ch[i]=(char)buffer[i]; String str=new String(ch); return str;
可以返回用户输入的信息,不足之处在于不支持中文输入,有待进一步改进
二.复制文件
以文件流的方式复制文件
  1. **以文件流的方式复制文件   
  2.  * @param src 文件源目录   
  3.  * @param dest 文件目的目录   
  4.  * @throws IOException   
  5.  */   
  6.  public void copyFile(String src,String dest) throws IOException...{   
  7.  FileInputStream in=new FileInputStream(src);   
  8.  File file=new File(dest);   
  9.  if(!file.exists())   
  10.  file.createNewFile();   
  11.  FileOutputStream out=new FileOutputStream(file);   
  12.  int c;   
  13.  byte buffer[]=new byte[1024];   
  14.  while((c=in.read(buffer))!=-1)...{   
  15.  for(int i=0;i<c;i++)   
  16.  out.write(buffer[i]);   
  17.  }   
  18.  in.close();   
  19.  out.close();  
**以文件流的方式复制文件 * @param src 文件源目录 * @param dest 文件目的目录 * @throws IOException */ public void copyFile(String src,String dest) throws IOException...{ FileInputStream in=new FileInputStream(src); File file=new File(dest); if(!file.exists()) file.createNewFile(); FileOutputStream out=new FileOutputStream(file); int c; byte buffer[]=new byte[1024]; while((c=in.read(buffer))!=-1)...{ for(int i=0;i<c;i++) out.write(buffer[i]); } in.close(); out.close();

该方法经过测试,支持中文处理,并且可以复制多种类型,比如txt,xml,jpg,doc等多种格式
三.写文件
1.利用PrintStream写文件
  1. /**  
  2.  * 文件输出示例  
  3.  */  
  4.  public void PrintStreamDemo()...{   
  5.  try ...{   
  6.  FileOutputStream out=new FileOutputStream("D:/test.txt");   
  7.  PrintStream p=new PrintStream(out);   
  8.  for(int i=0;i<10;i++)   
  9.  p.println("This is "+i+" line");   
  10.  } catch (FileNotFoundException e) ...{   
  11.  e.printStackTrace();   
  12.  }   
  13.  }  
/** * 文件输出示例 */ public void PrintStreamDemo()...{ try ...{ FileOutputStream out=new FileOutputStream("D:/test.txt"); PrintStream p=new PrintStream(out); for(int i=0;i<10;i++) p.println("This is "+i+" line"); } catch (FileNotFoundException e) ...{ e.printStackTrace(); } }

2.利用StringBuffer写文件

  1. public void StringBufferDemo() throws IOException......{   
  2.  File file=new File("/root/sms.log");   
  3.  if(!file.exists())   
  4.  file.createNewFile();   
  5.  FileOutputStream out=new FileOutputStream(file,true);   
  6.  for(int i=0;i<10000;i++)......{   
  7.  StringBuffer sb=new StringBuffer();   
  8.  sb.append("这是第"+i+"行:前面介绍的各种方法都不关用,为什么总是奇怪的问题 ");   
  9.  out.write(sb.toString().getBytes("utf-8"));   
  10.  }   
  11.  out.close();   
  12.  }  
public void StringBufferDemo() throws IOException......{ File file=new File("/root/sms.log"); if(!file.exists()) file.createNewFile(); FileOutputStream out=new FileOutputStream(file,true); for(int i=0;i<10000;i++)......{ StringBuffer sb=new StringBuffer(); sb.append("这是第"+i+"行:前面介绍的各种方法都不关用,为什么总是奇怪的问题 "); out.write(sb.toString().getBytes("utf-8")); } out.close(); }
该方法可以设定使用何种编码,有效解决中文问题。
四.文件重命名
  1. /** *//**文件重命名  
  2. * @param path 文件目录  
  3. * @param oldname 原来的文件名  
  4. * @param newname 新文件名  
  5. */  
  6. public void renameFile(String path,String oldname,String newname)...{   
  7. if(!oldname.equals(newname))...{//新的文件名和以前文件名不同时,才有必要进行重命名   
  8. File oldfile=new File(path+"/"+oldname);   
  9. File newfile=new File(path+"/"+newname);   
  10. if(newfile.exists())//若在该目录下已经有一个文件和新文件名相同,则不允许重命名   
  11. System.out.println(newname+"已经存在!");   
  12. else...{   
  13. oldfile.renameTo(newfile);   
  14. }   
  15. }   
  16. }  
/** *//**文件重命名 * @param path 文件目录 * @param oldname 原来的文件名 * @param newname 新文件名 */ public void renameFile(String path,String oldname,String newname)...{ if(!oldname.equals(newname))...{//新的文件名和以前文件名不同时,才有必要进行重命名 File oldfile=new File(path+"/"+oldname); File newfile=new File(path+"/"+newname); if(newfile.exists())//若在该目录下已经有一个文件和新文件名相同,则不允许重命名 System.out.println(newname+"已经存在!"); else...{ oldfile.renameTo(newfile); } } }
五.转移文件目录
转移文件目录不等同于复制文件,复制文件是复制后两个目录都存在该文件,而转移文件目录则是转移后,只有新目录中存在该文件。
  1. /**转移文件目录  
  2.  * @param filename 文件名  
  3.  * @param oldpath 旧目录  
  4.  * @param newpath 新目录  
  5.  * @param cover 若新目录下存在和转移文件具有相同文件名的文件时,是否覆盖新目录下文件,cover=true将会覆盖原文件,否则不操作  
  6.  */  
  7.  public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{   
  •  if(!oldpath.equals(newpath))...{   
  •  File oldfile=new File(oldpath+"/"+filename);   
  •  File newfile=new File(newpath+"/"+filename);   
  •  if(newfile.exists())...{//若在待转移目录下,已经存在待转移文件   
  •  if(cover)//覆盖   
  •  oldfile.renameTo(newfile);   
  •  else  
  •  System.out.println("在新目录下已经存在:"+filename);   
  •  }   
  •  else...{   
  •  oldfile.renameTo(newfile);   
  •  }   
  •  }   
  •  }  
  • /**转移文件目录 * @param filename 文件名 * @param oldpath 旧目录 * @param newpath 新目录 * @param cover 若新目录下存在和转移文件具有相同文件名的文件时,是否覆盖新目录下文件,cover=true将会覆盖原文件,否则不操作 */ public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{ if(!oldpath.equals(newpath))...{ File oldfile=new File(oldpath+"/"+filename); File newfile=new File(newpath+"/"+filename); if(newfile.exists())...{//若在待转移目录下,已经存在待转移文件 if(cover)//覆盖 oldfile.renameTo(newfile); else System.out.println("在新目录下已经存在:"+filename); } else...{ oldfile.renameTo(newfile); } } }
    六.读文件
    1.利用FileInputStream读取文件
    1. /** *//**读文件  
    2.  * @param path  
    3.  * @return  
    4.  * @throws IOException  
    5.  */  
    6.  public String FileInputStreamDemo(String path) throws IOException...{   
  •  File file=new File(path);   
  •  if(!file.exists()||file.isDirectory())   
  •  throw new FileNotFoundException();   
  •  FileInputStream fis=new FileInputStream(file);   
  •  byte[] buf = new byte[1024];   
  •  StringBuffer sb=new StringBuffer();   
  •  while((fis.read(buf))!=-1)...{   
  •  sb.append(new String(buf));   
  •  buf=new byte[1024];//重新生成,避免和上次读取的数据重复   
  •  }   
  •  return sb.toString();   
  •  }  
  • /** *//**读文件 * @param path * @return * @throws IOException */ public String FileInputStreamDemo(String path) throws IOException...{ File file=new File(path); if(!file.exists()||file.isDirectory()) throw new FileNotFoundException(); FileInputStream fis=new FileInputStream(file); byte[] buf = new byte[1024]; StringBuffer sb=new StringBuffer(); while((fis.read(buf))!=-1)...{ sb.append(new String(buf)); buf=new byte[1024];//重新生成,避免和上次读取的数据重复 } return sb.toString(); }
    2.利用BufferedReader读取

    在IO操作,利用BufferedReader和BufferedWriter效率会更高一点

    1. /** *//**读文件  
    2.  * @param path  
    3.  * @return  
    4.  * @throws IOException  
    5.  */  
    6.  public String BufferedReaderDemo(String path) throws IOException...{   

  •  File file=new File(path);   
  •  if(!file.exists()||file.isDirectory())   
  •  throw new FileNotFoundException();   
  •  BufferedReader br=new BufferedReader(new FileReader(file));   
  •  String temp=null;   
  •  StringBuffer sb=new StringBuffer();   
  •  temp=br.readLine();   
  •  while(temp!=null)...{   
  •  sb.append(temp+" ");   
  •  temp=br.readLine();   
  •  }   
  •  return sb.toString();   
  •  }  
  • /** *//**读文件 * @param path * @return * @throws IOException */ public String BufferedReaderDemo(String path) throws IOException...{ File file=new File(path); if(!file.exists()||file.isDirectory()) throw new FileNotFoundException(); BufferedReader br=new BufferedReader(new FileReader(file)); String temp=null; StringBuffer sb=new StringBuffer(); temp=br.readLine(); while(temp!=null)...{ sb.append(temp+" "); temp=br.readLine(); } return sb.toString(); }
    3.利用dom4j读取xml文件
    1. /**从目录中读取xml文件  
    2.  * @param path 文件目录  
    3.  * @return  
    4.  * @throws DocumentException  
    5.  * @throws IOException  
    6.  */  
    7.  public Document readXml(String path) throws DocumentException, IOException...{   
    8.  File file=new File(path);   
    9.  BufferedReader bufferedreader = new BufferedReader(new FileReader(file));   
    10.  SAXReader saxreader = new SAXReader();   
    11.  Document document = (Document)saxreader.read(bufferedreader);   
    12.  bufferedreader.close();   
    13.  return document;   
    14.  }  
    /**从目录中读取xml文件 * @param path 文件目录 * @return * @throws DocumentException * @throws IOException */ public Document readXml(String path) throws DocumentException, IOException...{ File file=new File(path); BufferedReader bufferedreader = new BufferedReader(new FileReader(file)); SAXReader saxreader = new SAXReader(); Document document = (Document)saxreader.read(bufferedreader); bufferedreader.close(); return document; }
    七.创建文件(文件夹)
    1.创建文件夹
    1. **创建文件夹   
    2.  * @param path 目录   
    3.  */   
    4.  public void createDir(String path)...{   
    5.  File dir=new File(path);   
    6.  if(!dir.exists())   
    7.  dir.mkdir();   
    8.  }  
    **创建文件夹 * @param path 目录 */ public void createDir(String path)...{ File dir=new File(path); if(!dir.exists()) dir.mkdir(); }
    2.创建新文件
    1. /**创建新文件  
    2.  * @param path 目录  
    3.  * @param filename 文件名  
    4.  * @throws IOException  
    5.  */  
    6.  public void createFile(String path,String filename) throws IOException...{   
    7.  File file=new File(path+"/"+filename);   
    8.  if(!file.exists())   
    9.  file.createNewFile();   
    10.  }  
    /**创建新文件 * @param path 目录 * @param filename 文件名 * @throws IOException */ public void createFile(String path,String filename) throws IOException...{ File file=new File(path+"/"+filename); if(!file.exists()) file.createNewFile(); }
    八.删除文件(目录)
    1.删除文件
    1. /** *//**删除文件  
    2.  * @param path 目录  
    3.  * @param filename 文件名  
    4.  */  
    5.  public void delFile(String path,String filename)...{   
    6.  File file=new File(path+"/"+filename);   
    7.  if(file.exists()&&file.isFile())   
    8.  file.delete();   
    9.  }  
    /** *//**删除文件 * @param path 目录 * @param filename 文件名 */ public void delFile(String path,String filename)...{ File file=new File(path+"/"+filename); if(file.exists()&&file.isFile()) file.delete(); }
    2.删除目录
    要利用File类的delete()方法删除目录时,必须保证该目录下没有文件或者子目录,否则删除失败,因此在实际应用中,我们要删除目录,必须利用递归删除该目录下的所有子目录和文件,然后再删除该目录。
    1. **递归删除文件夹   
    2.  * @param path   
    3.  */   
    4.  public void delDir(String path)...{   
    5.  File dir=new File(path);   
    6.  if(dir.exists())...{   
    7.  File[] tmp=dir.listFiles();   
    8.  for(int i=0;i<tmp.length;i++)...{   
    9.  if(tmp[i].isDirectory())...{   
    10.  delDir(path+"/"+tmp[i].getName());   
    11.  }   
    12.  else...{   
    13.  tmp[i].delete();   
    14.  }   
    15.  }   
    16.  dir.delete();   
    17.  }   
    18.  }  
    **递归删除文件夹 * @param path */ public void delDir(String path)...{ File dir=new File(path); if(dir.exists())...{ File[] tmp=dir.listFiles(); for(int i=0;i<tmp.length;i++)...{ if(tmp[i].isDirectory())...{ delDir(path+"/"+tmp[i].getName()); } else...{ tmp[i].delete(); } } dir.delete(); } }


    文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520092191175196
    posted @ 2009-03-19 13:17 武志强 阅读(64) | 评论 (0)编辑 收藏

     

    引用

    邵波的空间Javamail操作指南
    怎样才算比较完整的Javamail操作指南?我想应该包括绝大多数基本的email操作,能够应付一般的应用。在本指南中打算囊括以下内容:

     ● 发送email:包括文本邮件、HTML邮件、带附件的邮件、SMTP验证
     ● 接收email:pop3远程连接、收取不同MIME的邮件、处理附件

     我想有了上述功能的介绍,应该可以应付很多email的相关应用了。所以请允许我给本文拟了一个比较狂妄的名字,这样才能保证收视率,。还是那句话,写这个post的原因就是没有在网上看到更全面的,你看过的话记得要告诉我。

     下面的所有例子都经过实际测试,你可以说它写得不够OO,不够plugable,但是它的确是可以参考的。自从有了javamail,发垃圾邮件就方便多了。本文代码多说明少,这倒不是我偷懒,而是很多东西都涉及pop3等协议的规范,如果不了解这些规范的话,由的东西我实在不知道怎么跟你解释;如果了解的话,那我基本上就不用再解释。所以本着实用的原则就省略了,由兴趣的话自己去翻翻协议规范。

     废话少说,首先需要配置环境。需要的包是mail.jar和activation.jar。高版本的J2SDK EE自带。地址嘛,再java.sun.com上搜索一下,很容易找到。放到classpath中就KO。

     一、 邮件的发送

     下面了弄个发邮件的Hello World,热热身:

     /*************
     Name:TextMailSender.java
     Author:Bromon
     Version:1.0
     Date:2004-4-26
     Note:发送email到bromon@163.com,需要安装SMTP服务器
     *************/
     package org.bromon.mail;
     import javax.mail.*;
     import javax.mail.internet.*;
     import java.util.*;
     public class TextMailSender
     {
     public static void main(String args[])
     {
      try
      {
       Properties prop=new Properties();
       //指定要使用的SMTP服务器为bromon2k
       prop.put("mail.smtp.host","bromon2k");
       Session mailSession=Session.getDefaultInstance(prop);

       //发件人地址
       InternetAddress from=new InternetAddress("bromon@bromon2k");
       //收件人地址
       InternetAddress to=new InternetAddress("bromon@163.com");
       
       MimeMessage msg=new MimeMessage(mailSession);
       msg.setFrom(from);
       msg.addRecipient(javax.mail.Message.RecipientType.TO,to);
       //发信日期
       msg.setSentDate(new java.util.Date());
       //title
       msg.setSubject("你好");
       //邮件正文
       msg.setText("hello,bromon");
       Transport.send(msg);
      }catch(Exception e)
      {
       System.out.println(e);
      }
     }
     } 


     程序很简单,但是它是不能运行的(倒)。除非你的机器上安装了一个SMTP服务器,而且你的机器还叫做bromon2k。写这么一段不能执行的程序不是为了找打,而是让各位对javamail有个基本印象,我就懒得改了。下面演示的是如何通过163、sohu等email服务商提供的免费邮箱来发邮件,基本操作和上面的一样,只是多一个SMTP验证而已:

     /*
     * Created on 2004-4-26
     */
     package org.bromon.mail;
     import javax.mail.*;
     import java.util.*;
     import javax.mail.internet.*;

     /**
     * @author Bromon
     */
     public class SenderWithSMTPVer
     {
     String host="";
     String user="";
     String password="";

     public void setHost(String host)
     {
      this.host=host;
     }

     public void setAccount(String user,String password)
     {
      this.user=user;
      this.password=password;
     }

     public void send(String from,String to,String subject,String content)
     {
      Properties props = new Properties();
      props.put("mail.smtp.host", host);//指定SMTP服务器
      props.put("mail.smtp.auth", "true");//指定是否需要SMTP验证
      try
      {
       Session mailSession = Session.getDefaultInstance(props);
       
       mailSession.setDebug(true);//是否在控制台显示debug信息
       
       Message message=new MimeMessage(mailSession);
       message.setFrom(new InternetAddress(from));//发件人
       message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));//收件人
       
       message.setSubject(subject);//邮件主题
       message.setText(content);//邮件内容
       message.saveChanges();
       
       Transport transport = mailSession.getTransport("smtp");
       transport.connect(host, user, password);
       transport.sendMessage(message, message.getAllRecipients());
       transport.close();
      }catch(Exception e)
      {
       System.out.println(e);
      }
      
     }

     public static void main(String args[])
     {
      SenderWithSMTPVer sm=new SenderWithSMTPVer();

      sm.setHost("smtp.163.com");//指定要使用的邮件服务器
      sm.setAccount("abc","123");//指定帐号和密码

      /*
     * @param String 发件人的地址
       * @param String 收件人地址
       * @param String 邮件标题
       * @param String 邮件正文
      */
      sm.send("abc@163.com","bromon@163.com","标题","内容");
     }

     } 


     这段程序好像也不需要解释了吧,把SMTP地址、帐号、密码等配置信息写到Properties里面,Java里面很多API都需要这么干,比如再程序中加入对代理服务器的支持等。

     上面的程序修改一下服务器地址、帐号、密码就可以使用,非常简单。

     如何发送一个HTML格式的Email呢?也很简单,再邮件正文中写入HTML代码,然后指定邮件的ContentType就OK,下面只给出关键代码:

     ………..
     MimeMessage msg=new MimeMessage(mailSession);
     msg.setContent(content,"text/html");
     msg.setText(“<html><body><h1>下面的,你们好吗?</body></html>”);
     ………..

     下面是发送带有附件的email,稍微复杂一点,而且和前面的程序有一些不同,请仔细一点,同时需要一点IO的知识。相同的代码就不在列出,只写关键部分,谁都想偷懒不是?

     import javax.mail.*;
     import javax.mail.internet.*;
     import javax.activation.*;
     import java.util.*;
     ……….
     MimeMessage msg=new MimeMessage(mailSession);
     msg.setSentDate(new Date());
     msg.setSubject("hello");

     MimeBodyPart textBodyPart=new MimeBodyPart();
     textBodyPart.setText(“邮件正文”);

     MimeBodyPart fileBodyPart=new MimeBodyPart();
     FileDataSource fds=new FileDataSource("GIS.rar");//要发送的附件
     fileBodyPart.setDataHandler(new DataHandler(fds));
     fileBodyPart.setFileName(fds.getName());
     Multipart container=new MimeMultipart();
     container.addBodyPart(textBodyPart);
     container.addBodyPart(fileBodyPart);
     msg.setContent(container);
     Transport.send(msg);
     ………… 


     这里的msg由两个MimeBodyPart构成,这个东西解释起来基本上比较难,如果不了解相关的规范就不太好解释,如果了解的话,我就不用解释了,这个这个………唉。

      二、 邮件的收取

     通常情况下我们都使用pop3协议来收邮件,IMAP嘛现在就不涉及了。收邮件的功能虽然我用了很多时间才基本搞清楚,不过讲起来就so easy了,一个程序就可以基本包括。

     邮件大致可以分三种:纯文本邮件、含有其他数据的文本邮件、含有附件的邮件。


     CODE  
     /*
     * Created on 2004-4-26
     */
     package org.bromon.mail;
     import javax.mail.*;
     import java.util.*;
     import java.io.*;

     /**
     * @author Bromon
     */
     public class Receiver
     {
     Folder inbox;
     Store store;

     //连接邮件服务器,获得所有邮件的列表
     public Message[] getMail(String host,String name,String password) throws Exception
     {
      Properties prop=new Properties();
      prop.put("mail.pop3.host",host);
      Session session=Session.getDefaultInstance(prop);
      store=session.getStore("pop3");
      store.connect(host,name,password);
      
      inbox=store.getDefaultFolder().getFolder("INBOX");
      inbox.open(Folder.READ_ONLY);
      
      Message[] msg=inbox.getMessages();
      
      FetchProfile profile=new FetchProfile();
      profile.add(FetchProfile.Item.ENVELOPE);
      inbox.fetch(msg,profile);
      
      return(msg);
     }

     //处理任何一种邮件都需要的方法
     private void handle(Message msg) throws Exception
     {
      System.out.println("邮件主题:"+msg.getSubject());
      System.out.println("邮件作者:"+msg.getFrom()[0].toString());
      System.out.println("发送日期:"+msg.getSentDate());
     }

     //处理文本邮件
     public void handleText(Message msg) throws Exception
     {
      this.handle(msg);
      System.out.println("邮件内容:"+msg.getContent());
     }

     //处理Multipart邮件,包括了保存附件的功能
     public void handleMultipart(Message msg) throws Exception
     {
      String disposition;
      BodyPart part;
      
      Multipart mp=(Multipart)msg.getContent();
      int mpCount=mp.getCount();//Miltipart的数量,用于除了多个part,比如多个附件
      for(int m=0;m<mpCount;m++)
      {
       this.handle(msg);
       
       part=mp.getBodyPart(m);
       disposition=part.getDisposition();
       if(disposition!=null && disposition.equals(Part.ATTACHMENT))//判断是否有附件
       {
        //this.saveAttach(part);//这个方法负责保存附件,注释掉是因为附件可能有病毒,请清理信箱之后再取掉注释
       }else{
        System.out.println(part.getContent());
       }
      }
     }

     private void saveAttach(BodyPart part) throws Exception
     {
      String temp=part.getFileName();//得到未经处理的附件名字
      String s=temp.substring(11,temp.indexOf("?=")-1);//去到header和footer
      
      //文件名一般都经过了base64编码,下面是解码
      String fileName=this.base64Decoder(s);
      System.out.println("有附件:"+fileName);
      
      InputStream in=part.getInputStream();
      FileOutputStream writer=new FileOutputStream(new File(fileName));
      byte[] content=new byte[255];
      int read=0;
      while((read=in.read(content))!=-1)
      {
       writer.write(content);
      }
      writer.close();
      in.close();
     }

     //base64解码
     private String base64Decoder(String s) throws Exception
     {
      sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
      byte[] b=decoder.decodeBuffer(s);
      
      return(new String(b));
     }

     //关闭连接
     public void close() throws Exception
     {
      if(inbox!=null)
      {
       inbox.close(false);
      }
      
      if(store!=null)
      {
       store.close();
      }
     }

     public static void main(String args[])
     {
      String host="pop.163.com";
      String name="bromon";
      String password="My password";
      
      Receiver receiver=new Receiver();
      
      try
      {   
       Message[] msg=receiver.getMail(host,name,password);
       
       for(int i=0;i<msg.length;i++)
       {
        if(msg[i].isMimeType("text/*"))//判断邮件类型
        {
         receiver.handleText(msg[i]);
        }else{
         receiver.handleMultipart(msg[i]);
        }
        System.out.println("****************************");
       }
       receiver.close();
      }catch(Exception e)
      {
       System.out.println(e);
      }
     }
     } 


     没有习惯读java代码的兄弟可能会觉得麻烦了一点,其中有个小问题,下载的附件会再文件名后面加上一个”#”符号,不知道这是javamail的特别处理还是pop3的规范。通过程序更改文件名很简单,就不说了。对于email还有很多其他的操作,可以自己取查看一下javadoc,我就不影响大家探索的乐趣了。在Properties里配置代理服务器,可以让程序通过代理收发邮件,一般的HTTP、socks 4、socks 5都支持。


    文章来源:http://wxq594808632.blog.163.com/blog/static/109079755200921911412688
    posted @ 2009-03-19 13:14 武志强 阅读(654) | 评论 (0)编辑 收藏

     

    引用

    邵波的空间java的几种对象(PO,VO,DAO,BO,POJO)解释
    一、PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。

    二、VO:value object值对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象),在web上传递。

    三、DAO:data access object 数据访问对象,此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。

    四、BO:business object 业务对象,封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。

    五、POJO:plain ordinary java object 简单无规则java对象,我个人觉得它和其他不是一个层面上的东西,VO和PO应该都属于它。

    O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。

      VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成。从结构上看,它们并没有什么不同的地方。但从其意义和本质上来看是完全不同的。

    1.VO是用new关键字创建,由GC回收的。

      PO则是向数据库中添加新数据时创建,删除数据库中数据时削除的。并且它只能存活在一个数据库连接中,断开连接即被销毁。

    2.VO是值对象,精确点讲它是业务对象,是存活在业务层的,是业务逻辑使用的,它存活的目的就是为数据提供一个生存的地方。

      PO则是有状态的,每个属性代表其当前的状态。它是物理数据的对象表示。使用它,可以使我们的程序与物理数据解耦,并且可以简化对象数据与物理数据之间的转换。

    3.VO的属性是根据当前业务的不同而不同的,也就是说,它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。

      PO的属性是跟数据库表的字段一一对应的。

    PO对象需要实现序列化接口。

    文章来源:http://wxq594808632.blog.163.com/blog/static/109079755200921911144620
    posted @ 2009-03-19 13:12 武志强 阅读(323) | 评论 (0)编辑 收藏

     

    引用

    邵波的空间JS通用表单验证函数
    Check.js   JS函数文件
    ////////////////////////////////////////////////////////////////////////////////
    /*
     *--------------- 客户端表单通用验证CheckForm(oForm) -----------------
     * 功能:通用验证所有的表单元素.
     * 使用:
     *    <form name="form1" onsubmit="return CheckForm(this)">
     *    <input type="text" name="id" check="^\S+$" warning="id不能为空,且不能含有空格">
     *    <input type="submit">
     *    </form>
     * author:wanghr100(灰豆宝宝.net)
     * email:wanghr100@126.com
     * update:19:28 2004-8-23
     * 注意:写正则表达式时一定要小心.不要让"有心人"有空子钻.
     * 已实现功能:
     * 对text,password,hidden,file,textarea,select,radio,checkbox进行合法性验证
     * 待实现功能:把正则表式写成个库.
     *--------------- 客户端表单通用验证CheckForm(oForm) -----------------
     */
    ////////////////////////////////////////////////////////////////////////////////

    //主函数
    function CheckForm(oForm)
    {
        var els = oForm.elements;
        //遍历所有表元素
        for(var i=0;i<els.length;i++)
        {
            //是否需要验证
            if(els[i].check)
            {
                //取得验证的正则字符串
                var sReg = els[i].check;
                //取得表单的值,用通用取值函数
                var sVal = GetValue(els[i]);
                //字符串->正则表达式,不区分大小写
                var reg = new RegExp(sReg,"i");
                if(!reg.test(sVal))
                {
                    //验证不通过,弹出提示warning
                    alert(els[i].warning);
                    //该表单元素取得焦点,用通用返回函数
                    GoBack(els[i])  
                    return false;
                }
            }
        }
    }

    //通用取值函数分三类进行取值
    //文本输入框,直接取值el.value
    //单多选,遍历所有选项取得被选中的个数返回结果"00"表示选中两个
    //单多下拉菜单,遍历所有选项取得被选中的个数返回结果"0"表示选中一个
    function GetValue(el)
    {
        //取得表单元素的类型
        var sType = el.type;
        switch(sType)
        {
            case "text":
            case "hidden":
            case "password":
            case "file":
            case "textarea": return el.value;
            case "checkbox":
            case "radio": return GetValueChoose(el);
            case "select-one":
            case "select-multiple": return GetValueSel(el);
        }
        //取得radio,checkbox的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
        function GetValueChoose(el)
        {
            var sValue = "";
            //取得第一个元素的name,搜索这个元素组
            var tmpels = document.getElementsByName(el.name);
            for(var i=0;i<tmpels.length;i++)
            {
                if(tmpels[i].checked)
                {
                    sValue += "0";
                }
            }
            return sValue;
        }
        //取得select的选中数,用"0"来表示选中的个数,我们写正则的时候就可以通过0{1,}来表示选中个数
        function GetValueSel(el)
        {
            var sValue = "";
            for(var i=0;i<el.options.length;i++)
            {
                //单选下拉框提示选项设置为value=""
                if(el.options[i].selected && el.options[i].value!="")
                {
                    sValue += "0";
                }
            }
            return sValue;
        }
    }

    //通用返回函数,验证没通过返回的效果.分三类进行取值
    //文本输入框,光标定位在文本输入框的末尾
    //单多选,第一选项取得焦点
    //单多下拉菜单,取得焦点
    function GoBack(el)
    {
        //取得表单元素的类型
        var sType = el.type;
        switch(sType)
        {
            case "text":
            case "hidden":
            case "password":
            case "file":
            case "textarea": el.focus();var rng = el.createTextRange(); rng.collapse(false); rng.select();
            case "checkbox":
            case "radio": var els = document.getElementsByName(el.name);els[0].focus();
            case "select-one":
            case "select-multiple":el.focus();
        }

    demo.htm  演示文件

    <script language="JavaScript" src="Check.js"></script>
    通用表单函数测试:
    <form name="form1" onsubmit="return CheckForm(this)">
    test:<input type="text" name="test">不验证<br>
    账号:<input type="text" check="^\S+$" warning="账号不能为空,且不能含有空格" name="id">不能为空<br>
    密码:<input type="password" check="\S{6,}" warning="密码六位以上" name="id">六位以上<br>
    电话:<input type="text" check="^\d+$" warning="电话号码含有非法字符" name="number" value=""><br>
    相片上传:<input type="file" check="(.*)(\.jpg|\.bmp)$" warning="相片应该为JPG,BMP格式的" name="pic" value="1"><br>
    出生日期:<input type="text" check="^\d{4}\-\d{1,2}-\d{1,2}$" warning="日期格式2004-08-10"  name="dt" value="">日期格式2004-08-10<br>
    省份:
    <select name="sel" check="^0$" warning="请选择所在省份">
    <option value="">请选择
    <option value="1">福建省
    <option value="2">湖北省
    </select>
    <br>
    选择你喜欢的运动:<br>
    游泳<input type="checkbox" name="c" check="^0{2,}$" warning="请选择2项或以上">
    篮球<input type="checkbox" name="c">
    足球<input type="checkbox" name="c">
    排球<input type="checkbox" name="c">
    <br>
    你的学历:
    大学<input type="radio" name="r" check="^0$" warning="请选择一项学历">
    中学<input type="radio" name="r">
    小学<input type="radio" name="r">
    <br>
    个人介绍:
    <textarea name="txts" check="^[\s|\S]{20,}$" warning="个人介绍不能为空,且不少于20字"></textarea>20个字以上
    <input type="submit">
    </form>

    不管是动态网站,还是其它B/S结构的系统,都离不开表单
    表单做为客户端向服务器提交数据的载体担当相当重要的角色.
    这就引出了一个问题,提交的数据合法吗?摆在我们面前的问题就是验证这些数据
    保证所提交的数据是合法的.所以,我们写了一个大堆的验证函数.当我们开始新的一个
    项目的开发时,我们又得写一大堆的验证函数,然后再调试这一大堆的函数...

    本文将介绍一种方法来提高我的代码的可重用性,提高我们的开发效率.

    个人以为表单的验证应该包含两部分:
    第一,判断用户输入的数据是否合法.
    第二,提示用户你的数据为什么是不合法的.

    所以,我们的通用表单验证函数要实现的功能就是:
    第一,取得用户输入的数据GetValue(el)
    第二,验证用户的数据CheckForm(oForm)
    IE支持自定义属性,这就是这个通用函数实现的基础
    我们可以在表单元素上加入描述自身信息的属性.有点像XML吧.
    check属性:该属性用于存储数据合法性的正则表达式.
    warning属性:该性性用于存储出错误提示信息.
    第三,返回有误的表单提示GoBack(el)
    这三个步骤的触发事件是onsubmit,记住是return CheckForm(this)
    搞错了就全功尽弃了 :)
    <form onsubmit="return CheckForm(this)">

    写到这里,整体框架就出来了,通过取得表单元素的check属性,取得字符串,构建正则表达式.再验证其值.如果通过验证就提交,如是数据不合法则取得表单元素的warning属性,产生提示信息.并返回到该表单元素.整个的框架也比较简单.
    我们要做的就是写好正则表达式!

    接下来我们来分析一下所有的表单元素
    按其共性,我们将它们分为三类
    每类表单的特点不一样,我们的目标就是写出通用的.

    1.文输入框Text
    <input type="text" name="txt">
    <input type="password" name="pwd">
    <input type="hidden" name="hid">
    <input type="file" name="myfile">
    <textarea name="txts"></textarea>
    2.单多选框Choose
    <input type="checkbox" name="c">
    <input type="checkbox" name="c">
    <input type="radio" name="r">
    <input type="radio" name="r">
    3.单多下拉菜单Select
    <select name="sel"></select>
    <select name="sels" multiple></select>


    讲了一堆"大道理"太抽象了,代码更有说服力!


    文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520092191820882
    posted @ 2009-03-19 13:08 武志强 阅读(311) | 评论 (0)编辑 收藏

     

    引用

    邵波的空间JavaScript密码强度检测源代码
    1.Body代码部分
    1. <body>
    2.  <h4>密码强度检测</h4>
    3.  <table width="100%" border="0" cellspacing="1" cellpadding="0">
    4.  <tr>
    5.  <td width="100" align="right">强度显示:</td>
    6.  <td>
    7.  <script language="javascript">
    8. var ps = new PasswordStrength();
    9. ps.setSize("200","20");
    10. ps.setMinLength(5);
    11.  </script>
    12.  </td>
    13.  </tr>
    14.  <tr>
    15.  <td align="right">密码检测:</td>
    16.  <td><input name="pwd" type="password" id="pwd" style="width:200px" onKeyUp="ps.update(this.value);"></td>
    17.  </tr>
    18.  </table>
    19.  </body>

    2.JS代码部分

    1. //密码强度;
    2.  function PasswordStrength(showed){
    3.  this.showed = (typeof(showed) == "boolean")?showed:true;
    4.  this.styles = new Array();
    5.  this.styles[0] = {backgroundColor:"#EBEBEB",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #BEBEBE",borderBottom:"solid 1px #BEBEBE"};
    6.  this.styles[1] = {backgroundColor:"#FF4545",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #BB2B2B",borderBottom:"solid 1px #BB2B2B"};
    7.  this.styles[2] = {backgroundColor:"#FFD35E",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #E9AE10",borderBottom:"solid 1px #E9AE10"};
    8.  this.styles[3] = {backgroundColor:"#95EB81",borderLeft:"solid 1px #FFFFFF",borderRight:"solid 1px #3BBC1B",borderBottom:"solid 1px #3BBC1B"};
    9.  
    10.  this.labels= ["弱","中","强"];
    11.  
    12.  this.divName = "pwd_div_"+Math.ceil(Math.random()*100000);
    13.  this.minLen = 5;
    14.  
    15.  this.width = "150px";
    16.  this.height = "16px";
    17.  
    18.  this.content = "";
    19.  
    20.  this.selectedIndex = 0;
    21.  
    22.  this.init();
    23.  }
    24.  PasswordStrength.prototype.init = function(){
    25.  var s = '<table cellpadding="0" id="'+this.divName+'_table" cellspacing="0" style="width:'+this.width+';height:'+this.height+';">';
    26.  s += '<tr>';
    27.  for(var i=0;i<3;i++){
    28.  s += '<td id="'+this.divName+'_td_'+i+'" width="33%" align="center"><span style="font-size:1px"> </span><span id="'+this.divName+'_label_'+i+'" style="display:none;font-family: Courier New, Courier, mono;font-size: 12px;color: #000000;">'+this.labels[i]+'</span></td>';
    29.  }
    30.  s += '</tr>';
    31.  s += '</table>';
    32.  this.content = s;
    33.  if(this.showed){
    34.  document.write(s);
    35.  this.copyToStyle(this.selectedIndex);
    36.  }
    37.  }
    38.  PasswordStrength.prototype.copyToObject = function(o1,o2){
    39.  for(var i in o1){
    40.  o2[i] = o1[i];
    41.  }
    42.  }
    43.  PasswordStrength.prototype.copyToStyle = function(id){
    44.  this.selectedIndex = id;
    45.  for(var i=0;i<3;i++){
    46.  if(i == id-1){
    47.  this.$(this.divName+"_label_"+i).style.display = "inline";
    48.  }else{
    49.  this.$(this.divName+"_label_"+i).style.display = "none";
    50.  }
    51.  }
    52.  for(var i=0;i<id;i++){
    53.  this.copyToObject(this.styles[id],this.$(this.divName+"_td_"+i).style);
    54.  }
    55.  for(;i<3;i++){
    56.  this.copyToObject(this.styles[0],this.$(this.divName+"_td_"+i).style);
    57.  }
    58.  }
    59.  PasswordStrength.prototype.$ = function(s){
    60.  return document.getElementById(s);
    61.  }
    62.  PasswordStrength.prototype.setSize = function(w,h){
    63.  this.width = w;
    64.  this.height = h;
    65.  }
    66.  PasswordStrength.prototype.setMinLength = function(n){
    67.  if(isNaN(n)){
    68.  return ;
    69.  }
    70.  n = Number(n);
    71.  if(n>1){
    72.  this.minLength = n;
    73.  }
    74.  }
    75.  PasswordStrength.prototype.setStyles = function(){
    76.  if(arguments.length == 0){
    77.  return ;
    78.  }
    79.  for(var i=0;i<arguments.length && i < 4;i++){
    80.  this.styles[i] = arguments[i];
    81.  }
    82.  this.copyToStyle(this.selectedIndex);
    83.  }
    84.  PasswordStrength.prototype.write = function(s){
    85.  if(this.showed){
    86.  return ;
    87.  }
    88.  var n = (s == 'string') ? this.$(s) : s;
    89.  if(typeof(n) != "object"){
    90.  return ;
    91.  }
    92.  n.innerHTML = this.content;
    93.  this.copyToStyle(this.selectedIndex);
    94.  }
    95.  PasswordStrength.prototype.update = function(s){
    96.  if(s.length < this.minLen){
    97.  this.copyToStyle(0);
    98.  return;
    99.  }
    100.  var ls = -1;
    101.  if (s.match(/[a-z]/ig)){
    102.  ls++;
    103.  }
    104.  if (s.match(/[0-9]/ig)){
    105.  ls++;
    106.  }
    107.  if (s.match(/(.[^a-z0-9])/ig)){
    108.  ls++;
    109.  }
    110.  if (s.length < 6 && ls > 0){
    111.  ls--;
    112.  }
    113.  switch(ls) {
    114.  case 0:
    115.  this.copyToStyle(1);
    116.  break;
    117.  case 1:
    118.  this.copyToStyle(2);
    119.  break;
    120.  case 2:
    121.  this.copyToStyle(3);
    122.  break;
    123.  default:
    124.  this.copyToStyle(0);
    125.  }
    126.  }

    文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520092191710543
    posted @ 2009-03-19 13:07 武志强 阅读(87) | 评论 (0)编辑 收藏

     

    引用

    邵波的空间javascript 取table中内容
    1,有如下表格,我们要取第2行第2列的值
    <table id="table1">
         <tr>
             <td>1行1列</td>
             <td>1行2列</td>
          </tr>
         <tr>
             <td>2行1列</td>
             <td>2行2列</td>
          </tr>
    </table>
    2,取值方法
       var value==window.table1.rows.item(0).cells.item(0).innerText;
    注意:行号,列号是从 0 开始的
      例如 var value =window.table1.rows.item(1).cells.item(1).innerText;
      这就取到了第2行第2列的值
    3.改进方法
       上面的方法,需要知道行号,实践中是不方便获得的,下面是改进的方法
    <script language="javascript">
     var str;
    </script>
      <table >
         <tr onMouseDown="str=this.cells.item(0).innerText">
             <td>1行1列</td>
             <td>1行2列</td>
          </tr>
         <tr onMouseDown="str=this.cells.item(0).innerText">
             <td>2行1列</td>
             <td>2行2列</td>
          </tr>
    </table>
    当鼠标按下时,我们就取到了该行第1列的值
    <td onMouseDown="str=this.innerText">2行1列</td>  
    这可以取鼠标所在列的值

    文章来源:http://wxq594808632.blog.163.com/blog/static/10907975520092191328268
    posted @ 2009-03-19 13:03 武志强 阅读(46) | 评论 (0)编辑 收藏
         摘要:   引用 邵波的空间 的 Dwr-EditTable完整版Dwr是Java领域一个著名的服务器端Ajax框架,借助Dwr的帮助,我们可以直接在客户端页面通过Javascript调用远程Java的方法。   看Dwr的示例中有一个EditTable的示例,觉得在实际使用中会非常的有用,就把此示例进行了扩展,实现与数据库的交互,在页面上可以直接添加用户、修改用户和删除用户操作。   数据...  阅读全文
    posted @ 2009-03-19 13:00 武志强 阅读(236) | 评论 (0)编辑 收藏
         摘要:   引用 邵波的空间 的 SQL语句精妙集合  1一、基础  2  31、说明:创建数据库  4Create DATABASE database-name  5  62、说明:删除数据库  7drop database&nbs...  阅读全文
    posted @ 2009-03-19 12:57 武志强 阅读(122) | 评论 (0)编辑 收藏
         摘要:   引用 邵波的空间 的 Dw入门Person.java Java代码 package com.wangyu;    public class Person    {        private String ...  阅读全文
    posted @ 2009-03-19 12:56 武志强 阅读(219) | 评论 (0)编辑 收藏

    无聊在电脑上乱点.点出一个DWR的例子.于是乎开始学习DWR

    拿出自己的练习晒下;

    在做练习的时候遇到一个问题。web-inf下不生成classes文件夹,也不生成.class文件

    经过研究解决办法为:右键点击webmodule   选择properties,再选择Content,选择Include All classes and  resources  确定。OK

    web.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
      <display-name>WebModule1</display-name>
      <servlet>
        <servlet-name>dwr-invoker</servlet-name>
        <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
        <init-param>
          <param-name>debug</param-name>
          <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>dwr-invoker</servlet-name>
        <url-pattern>/dwr/*</url-pattern>
      </servlet-mapping>
    </web-app>

     

     

    dwr.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "
    http://www.getahead.ltd.uk/dwr/dwr20.dtd">
    <dwr>
        <allow>
        <!-- javascript的对象是jsmethodname,create="new"是DWR自己创建类 -->
            <create javascript="jsmethodname" creator="new" scope="application">
                <!-- value是java中的类名 -->
                <param name="class" value="org.li.dwr.Hello"></param>
    <!--<include>标签指定要公开给javascript的方法。不指定的话就公开所有方法。
      <exclude>标签指定要防止被访问的方法。-->

               <include method="alertStr"/>
               <include method="alertJSStr"/>
               <include method="returnAl"/>
               <include method="getList"/>
               <include method="getObj"/>
            </create>

      <!--转换java类型   -->
           <convert converter="bean" match="org.li.dwr.InputRecord">
          </convert>
        </allow>
    </dwr>

    jsp页面:

     

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>DWR</title>
        <meta http-equiv="content-type" content="text/html; charset=GBK">
        <script type='text/javascript' src='dwr/interface/jsmethodname.js'></script>
        <script type='text/javascript' src='dwr/engine.js'></script>
        <script type='text/javascript' src='dwr/util.js'></script>
        <script type="text/javascript" src="hello.js"></script>
       <!--其中jsmethodname.js是dwr根据配置文件自动生成的,engine.js和util.js是dwr自带的脚本文件。
     -->
      </head>
      <body>
        <input id="jbutton" type="button" value="Hello World" onclick="jbClick()"/>
        <div id="jdiv"></div>
        <div id="jdiv2"></div>
       
        <div id="uid"></div>
        <div id="uname"></div>
        <div id="usex"></div>
        <div id="uaddress"></div>

      </body>
    </html>

    js :hello.js

     

    /*
    function load()//载入的时候调用
    {
        var jbutton = document.getElementById("jbutton");
        jbutton.onclick=function(event)//注册按钮点击事件
        {
            jbClick();
        };
    }
    */
    function jbClick()//按钮点击事件
    {
      //  jshello.getHelloWorld(callback);//没有参数传递,只传递回调函数就行
     //   jsmethodname.alertStr(callback1);//无参数
        var data="js传入java中的值";
      //  jsmethodname.alertJSStr(data,callback);//有参数。第一个为参数,第二个为回调方法接收返回值
      jsmethodname.getList(callbackList);  //无参数,返回list
      //jsmethodname.getObj(callbackObj);
    }
    function callback1(msg)//回调函数 ,调用java方法的javascript函数
    {
         //msg就是java方法的返回值
         alert(msg);
    }

    function callback(msg)//回调函数
    {
        //这里可以进行参数处理DWRUtil 的 setValue() 方法会将传回的 msg 设定给指定 id 的 DOM
        DWRUtil.setValue('jdiv',msg);
    }
    function callbackList(data){

    for(var i=0;i<data.length;i++){
      DWRUtil.setValue("uid", data[i].id);
      DWRUtil.setValue("uname", data[i].name);
      DWRUtil.setValue("usex", data[i].sex);
      DWRUtil.setValue("uaddress", data[i].address);
    }
    }


    function callbackObj(data){
     
     //知道属性
      DWRUtil.setValue("uid", data.id);
      DWRUtil.setValue("uname", data.name);
      DWRUtil.setValue("usex", data.sex);
      DWRUtil.setValue("uaddress", data.address);
     
     /**
     * 不知道属性
    for(var property in data){
      //alert("property:"+property);
      alert(property+":"+data[property]);
      }
     */

    }

     

    java类

    Hello.java

     

    package org.li.dwr;

    import java.util.Date;
    import java.util.ArrayList;
    import java.util.List;

    public class Hello {
      public String getHelloWorld() {
        return "现在的时间为:" + new Date();
      }

      public String alertStr() {
        return "DWR框架:无参数";
      }

      public String alertJSStr(String jsvalue) {
        return "DWR框架:" + jsvalue;
      }

      public ArrayList returnAl() {
        ArrayList al = new ArrayList();
        al.set(1, "a");
        al.set(2, "b");
        al.set(3, "c");
        al.set(4, "d");
        return al;
      }
     
      public List getList() {
      List list = new ArrayList();
      for(int i=0;i<5;i++){
        InputRecord ir = new InputRecord();
        ir.setId(1);
        ir.setName("依韵");
        ir.setSex("男");
        ir.setAddress("北京市");
        list.add(ir);
      }
      return list;
     }
     
     public InputRecord getObj() {
     InputRecord ir = new InputRecord();
     ir.setId(2);
     ir.setName("白色黄昏");
     ir.setSex("女");
     ir.setAddress("河南");
     return ir;
     }


    }

     

    InputRecord.java

    package org.li.dwr;

    public class InputRecord {
      private int id;
      private String name;
      private String sex;
      private String address;
      public String getAddress() {
        return address;
      }

      public int getId() {
        return id;
      }

      public String getName() {
        return name;
      }

      public String getSex() {
        return sex;
      }

      public void setSex(String sex) {
        this.sex = sex;
      }

      public void setName(String name) {
        this.name = name;
      }

      public void setAddress(String address) {
        this.address = address;
      }

      public void setId(int id) {
        this.id = id;
      }
    }

     


    文章来源:http://wxq594808632.blog.163.com/blog/static/1090797552009219050210
    posted @ 2009-03-19 12:50 武志强 阅读(225) | 评论 (0)编辑 收藏