2008年8月31日星期日

Talking about failure

A main can fail many times,
but he is not a failure
until he begins to blame somebody else.

2008年8月27日星期三

-> Ajax在jsp java中的案例-1

学习Ajax技术请先不要使用ajax的框架,因为如DWR等优秀的框架虽然有很多的优势但其封装了ajax技术的细节,对初学者来说先了解其原理,对以后使用框架开发有相当大的帮助。

  1. 先看图片了解一下Ajax的运行机理。

    (点击图片看大图)

  2. 看看下面案例:(摘自Ajaxa hack):
    调用过程是这样的:
    首先由:ajax_hack3.html提交请求到后台的ActionServlet.java,然后由其将处理结果异步返回给请求页面ajax_hack3.html,此页面根据返回状态回调事先写好的回调函数将异步接受到的结果(可以接受xml或者txt两种格式的返回结果数据)写入到此页面适当的位置。
    (当然此html页面在以后的应用中也可换成 jsp,提交方式也可改为js的事件焦点改变触发)

  3. 分析代码:(关于j2ee的运行环境和serlet的配置在这里就不在罗嗦了,google一下了)

    ajax_hack3.html —— (发送,接受数据的页面)
    hack3.js ——(Ajax支持的javascript)
    ActionServlet.java —— (后台serlvet)

    ajax_hack3.html
    [因不能显示html代码,故右键查看源码,可以看到]
    --------------------------------------------------------------
    附上:form 的 action="javascript:void%200"
    onsubmit= "sendData();return false"

    First name:


    Last name:


    Gender:


    Country of origin:






    --------------------------------------------------------------

    hack3.js
    --------------------------------------------------------------
    var request;
    var queryString; //将要被post的数据;

    function sendData(){
    setQueryString();
    var url="http://localhost:8080/Ajax/actionSerlvet";//处理请求的serlvet映射地址
    httpRequest("POST",url,true);
    }

    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,事件处理函数
    function handleResponse(){
    if(request.readyState == 1){
    //,,,,,,,,,,,,,,,,,,,,readyState 五状态:(0)未初始化 (1)载入 (2)载入完成 (3)交互 (4)完成
    //,,,,,,,,,,,,,,,,,,,,, 当readyState是1,显示loading gif动画,可以从网上下载一个合适的gif
    var loadgif = "\loading ... ...";
    loadingDiv(loadgif,document.getElementById("loading"));
    }
    if(request.readyState == 2){
    var loadgif = ".";
    loadingDiv(loadgif,document.getElementById("loading"));
    }
    if(request.readyState == 4){
    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, actionServlet处理成功,则返回200!
    if(request.status == 200){
    alert(request.responseText);
    var doc = request.responseXML;
    var info = getDocInfo(doc);
    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,显示结果到div docDisplay
    stylizeDiv(info,document.getElementById("docDisplay"));
    } else {
    alert("A problem occurred with communicating between the XMLHttpRequest object and the server program.");
    }

    }//end outer if
    }


    /* 初始化request对象 */
    function initReq(reqType,url,bool){
    /*指定回调的事件处理函数来处理HTTP的回应 */
    request.onreadystatechange=handleResponse;
    request.open(reqType,url,bool);
    request.setRequestHeader("Content-Type",
    "application/x-www-form-urlencoded; charset=UTF-8");
    /* 网景,火狐*/
    //request.overrideMimeType("text/XML");
    request.send(queryString);
    }

    /* 根据浏览器到不同构造一个HttpRequest对象.
    参数:
    reqType: HTTP 请求类型可以是 GET or POST.
    url: 服务器后台处理地址.
    asynch: 是否是异步. */
    function httpRequest(reqType,url,asynch){
    //Mozilla-浏览器
    if(window.XMLHttpRequest){
    request = new XMLHttpRequest();
    } else if (window.ActiveXObject){
    // IE 浏览器
    request=new ActiveXObject("Msxml2.XMLHTTP");
    if (! request){
    request=new ActiveXObject("Microsoft.XMLHTTP");
    }
    }


    if(request){
    initReq(reqType,url,asynch);
    } else {
    alert("Your browser does not permit the use of all "+
    "of this application's features!");}
    }

    function setQueryString(){
    queryString="";
    var frm = document.forms[0];
    var numberElements = frm.elements.length;
    for(var i = 0; i <>
    if(i <>
    queryString += frm.elements[i].name+"="+
    encodeURIComponent(frm.elements[i].value)+"&";
    } else {
    queryString += frm.elements[i].name+"="+
    encodeURIComponent(frm.elements[i].value);
    }

    }
    }

    function stylizeDiv(bdyTxt,div){
    //reset DIV content
    div.innerHTML="";
    div.style.backgroundColor="yellow";
    div.innerHTML=bdyTxt;
    }
    function loadingDiv(bdyTxt,div){
    div.innerHTML="";
    div.style.backgroundColor="white";
    div.innerHTML=bdyTxt;
    }
    function getDocInfo(doc){
    var root = doc.documentElement;
    var info = "

    Document root element name:

    "+ root.nodeName;
    var nds;
    if(root.hasChildNodes()) {
    nds=root.childNodes;
    info+= "

    Root node's child node names/values:

    ";
    for (var i = 0; i <>
    info+= nds[i].nodeName;
    if(nds[i].hasChildNodes()){
    info+= " : \""+nds[i].firstChild.nodeValue+"\"
    ";

    } else {
    info+= " : Empty
    ";

    }
    }
    }
    return info;
    }

    --------------------------------------------------------------

    ActionServlet.java
    【记得导入apache的commons betwixt包,可以在apache.org网站下载】

    --------------------------------------------------------------
    package com.ata;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.Map;
    import org.apache.commons.betwixt.XMLUtils;

    public class ActionServlet extends HttpServlet{

    protected void doGet
    (HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
    doPost(httpServletRequest, httpServletResponse);
    }

    protected void doPost(HttpServletRequest httpServletRequest,
    HttpServletResponse httpServletResponse) throws ServletException,
    IOException {
    Map reqMap = httpServletRequest.getParameterMap();
    String val=null;
    String tag = null;
    StringBuffer body = new StringBuffer("\n");
    boolean wellFormed = true;
    Map.Entry me = null;

    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,为了演示loading效果,在此sleep一秒钟。
    try {
    System.out.println("sleep 1s");
    Thread.sleep(6000);

    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,遍历j拿到传递的值并封装成xml格式。
    for(Iterator iter= reqMap.entrySet().iterator();iter.hasNext();) {
    me=(Map.Entry) iter.next();
    val= ((String[])me.getValue())[0];
    tag = (String) me.getKey();
    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,apache的XMLUtils工具类,检查标签

    if (! XMLUtils.isWellFormedXMLName(tag)){
    wellFormed=false; break;
    }
    body.append("<").append(tag).append(">").
    append(XMLUtils.escapeBodyValue(val)).append("
    append(">\n");
    }
    if(wellFormed) {
    body.append("");
    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,如果格式没问题,就将封装好的xml格式结果返回
    sendXML(httpServletResponse,body.toString());
    } else {
    sendXML(httpServletResponse,"");
    }
    }

    private void sendXML(HttpServletResponse response,String body) throws
    IOException{
    response.setContentType("text/xml; charset=UTF-8");
    response.setHeader("Cache-Control", "no-cache");
    String content = ""+body;
    System.out.println(content);
    response.getWriter().write(content);

    }
    }

    --------------------------------------------------------------



2008年8月26日星期二

-> JAVA mail 发送电邮 案例(Apache Commons Mail)

apache 提供了一个非常方便的Java Mail接口。

仅仅从其网站上下载commons-email-jar-1.1.jar包,即可轻松使用java编写mail程序。


  1. 到官方下载页面下载commons-email-jar-1.1.jar包,并导入到Eclipse相应的工程里面;

  2. 建立java类:SimpleEmail .java 并导入相关的类;

  3. 写方法:sentByGmai() 此方法是通过gmail信箱向163信箱发送电邮的案例;

    public static void sentByGmail() throws Exception{
    SimpleEmail email = new SimpleEmail();
    email.setDebug(true); //,,,,,,,,,,,,,,,,,,,,,,,,,,, 设置调试信息,对排查错误非常有帮助。
    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 通过Gmail Server 发送邮件
    email.setHostName("smtp.gmail.com"); //设定smtp服务器
    email.setSSL(Boolean.TRUE); //,,,,,,,,设定是否使用SSL
    email.setSslSmtpPort("465"); //,,,,,,,,,设定SSL端口
    //,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,设定smtp服务器的认证资料信息
    email.setAuthentication("yourMailAdd@gmail.com", "yourPassword");

    email.addTo("mincatjava@163.com
    ","Mincat"); //,,,,,,,,,设定收信地址和名字
    email.setCharset("UTF-8");//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,设定内容的语言集
    email.setFrom("liyang.javadoor@gmail.com");//,,,,,,设定发件人的地址
    email.setSubject("Hello,用java发来的问候!");//,,,设定电邮的主题
    email.setMsg("中国\n 你好!");//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,设定邮件内容

    email.send();//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,发送邮件
    }

  4. 将此方法在main方法中运行即可。

2008年8月20日星期三

-> 从现在开始!

开始了,
就从这里开始吧!