国产一区二区日韩,欧洲视频在线免费观看,久草在线看片http://www.aygfsteel.com/1504/category/32242.html不輕易服輸,不輕言放棄.--心是夢(mèng)的舞臺(tái),心有多大,舞臺(tái)有多大。踏踏實(shí)實(shí)做事,認(rèn)認(rèn)真真做人。zh-cnMon, 22 Mar 2010 10:51:48 GMTMon, 22 Mar 2010 10:51:48 GMT60AJAX和Struts的action交互使用[原創(chuàng)總結(jié)]http://www.aygfsteel.com/1504/archive/2009/02/22/256094.htmlweesun一米陽光weesun一米陽光Sun, 22 Feb 2009 11:34:00 GMThttp://www.aygfsteel.com/1504/archive/2009/02/22/256094.htmlhttp://www.aygfsteel.com/1504/comments/256094.htmlhttp://www.aygfsteel.com/1504/archive/2009/02/22/256094.html#Feedback1http://www.aygfsteel.com/1504/comments/commentRss/256094.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/256094.html1.請(qǐng)求頁面的JS,客戶端實(shí)現(xiàn)
<script type="text/javascript">
 var flagvalue=0;
 var rest="";
 var resta="";
 //實(shí)現(xiàn)AJAX驗(yàn)證
 var http_request = false;
 var infoForm_flag=false;
 var lotId="";
function Save()
{
   
      var infoForm=document.projectSetForm;
      infoForm_flag=infoForm;
      lotId=infoForm.lotId.value;
      //表名稱
      var dc = infoForm.tablename.value;
      if(dc==""||dc==null){
       alert("表名稱不能為空!");
       infoForm.tablename.focus();
       infoForm.tablename.select();
       return false;
 }
function send_request(url)
  {//初始化、指定處理函數(shù)、發(fā)送請(qǐng)求的函數(shù)
    http_request = false;
    //開始初始化XMLHttpRequest對(duì)象
    if(window.XMLHttpRequest)
    { //Mozilla 瀏覽器
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType)
      {//設(shè)置MiME類別
           http_request.overrideMimeType('text/xml');
      }
    }
    else if (window.ActiveXObject)
    { // IE瀏覽器
      try
      {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
      }
       catch (e)
      {
        try
        {
             http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e)
        {
        }
      }
    }
    if (!http_request) { // 異常,創(chuàng)建對(duì)象實(shí)例失敗
     window.alert("不能創(chuàng)建XMLHttpRequest對(duì)象實(shí)例.");
     return false;
    }
    http_request.onreadystatechange = processRequest;
    // 確定發(fā)送請(qǐng)求的方式和URL以及是否同步執(zhí)行下段代碼
    http_request.open("GET", url, true);
    http_request.send(null);
  }
     //處理返回信息的函數(shù)
     function processRequest()
     {
         if (http_request.readyState == 4)
         {
             //判斷對(duì)象狀態(tài)
             if (http_request.status == 200)
             {
                 //信息已經(jīng)成功返回,開始處理信息
                 var str=http_request.responseText;//獲得從服務(wù)器返回的文本信息
                 if(str=="no")
                 {
                     alert("您選擇了模型分屬不同的模板,請(qǐng)選擇同一模板對(duì)應(yīng)是模型!");
                     //return false;
                     infoForm_flag.action="projectSet.do?do=add&lotId="+lotId;
                     infoForm_flag.submit();
                 }
                 else
                 {
                  infoForm_flag.action="projectSet.do?do=creattable&save=-1";
               infoForm_flag.submit();
              }
             } else
             {
                 //頁面不正常
                 alert("您所請(qǐng)求的頁面有異常。");
             }
         }
     }
  function userCheck()
  {
    send_request('projectSet.do?do=check&rest='+rest);
  }
</script>
2.ProjectSetAction.java

package com.gpdi.softevaluate.action;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProjectSetAction extends DispatchAction
{
         

/**
  * <p>模板驗(yàn)證</p>
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return
  * @throws Exception
  */
 public ActionForward check(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
 {
   String rest="";
   String lotId="";
   String retn="";
   String flag="";
   CommDaoFactory mgObj = new CommDaoFactory();
   try
   {
       rest=request.getParameter("rest");
       lotId=request.getParameter("lotId");
   }
   catch(Exception e)
   {
   
   }
if(!rest.equals("0")||!rest.equals("")||rest!=null)
 {
     flag="no";
}
else
{
      flag="ok";

}
       PrintWriter out=response.getWriter();
//服務(wù)器返回信息
       out.write(flag);
       out.close();
     //讀取本Action所有的請(qǐng)求參數(shù),將path重新構(gòu)造,加上請(qǐng)求參數(shù)

     //ActionForward forward= new ActionForward("project/projectSet.do?do=add&lotId=6");
     //forward.setRedirect(true);
      //傳參數(shù)后返回
     //return forward;    
    return mapping.findForward(null);
 
 }
public ActionForward creattable(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
{
     //實(shí)現(xiàn)功能代碼
return mapping.findForward("create");
}

}
3.struts.config.xml
 <action attribute="projectSetForm" name="projectSetForm"
    parameter="do" path="/project/projectSet" scope="request"
       type="com.gpdi.softevaluate.action.ProjectSetAction" validate="false">
   <forward name="list" path="/project/viewProject.jsp" />
   <forward name="add" path="/project/addProject.jsp" />
   <forward name="create" path="/project/createTable.jsp" />
  </action>



weesun一米陽光 2009-02-22 19:34 發(fā)表評(píng)論
]]>
js實(shí)現(xiàn)根據(jù)瀏覽器類型自動(dòng)調(diào)用不同CSS文件[收藏]http://www.aygfsteel.com/1504/archive/2008/11/27/242936.htmlweesun一米陽光weesun一米陽光Thu, 27 Nov 2008 02:16:00 GMThttp://www.aygfsteel.com/1504/archive/2008/11/27/242936.htmlhttp://www.aygfsteel.com/1504/comments/242936.htmlhttp://www.aygfsteel.com/1504/archive/2008/11/27/242936.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/242936.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/242936.html<script type="text/javascript">...
<!--
if (window.navigator.userAgent.indexOf("MSIE")>=1){
    
//如果瀏覽器為IE
    setActiveStyleSheet("default.css");
}
 else ...{
    
if (window.navigator.userAgent.indexOf("Firefox")>=1){
        
//如果瀏覽器為Firefox
        setActiveStyleSheet("default2.css");
    }
 else ...{
        
//如果瀏覽器為其他
        setActiveStyleSheet("newsky.css");
    }

}


function setActiveStyleSheet(title)...
    document.getElementsByTagName(
"link")[0].href="style/"+title; 
}

//-->
</script>

以上腳本放在
</head>之前即可.
CSS實(shí)現(xiàn)根據(jù)瀏覽器類型自動(dòng)調(diào)用不同CSS文件。放在元素head中
    <link type="text/css" href="MasterPage.css" media="all" rel="Stylesheet" />
    
<!--[if lte IE 6 ]>
<link rel="Stylesheet" type="text/css" href="css/iebugs/ie6.css" />
<![endif]
-->
    
<!--[if IE 7 ]>
<link rel="Stylesheet" type="text/css" href="css/iebugs/ie7.css" />
<![endif]
-->



weesun一米陽光 2008-11-27 10:16 發(fā)表評(píng)論
]]>
JS時(shí)間格式的判斷和大小的判斷【總結(jié)備用】http://www.aygfsteel.com/1504/archive/2008/11/14/240540.htmlweesun一米陽光weesun一米陽光Fri, 14 Nov 2008 07:18:00 GMThttp://www.aygfsteel.com/1504/archive/2008/11/14/240540.htmlhttp://www.aygfsteel.com/1504/comments/240540.htmlhttp://www.aygfsteel.com/1504/archive/2008/11/14/240540.html#Feedback1http://www.aygfsteel.com/1504/comments/commentRss/240540.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/240540.html

 function   verifyDate(tmpDateValue){    
      var   tmpLength   =   tmpDateValue.length;  
      if   (tmpLength   ==   0||tmpLength==null)
      {  
          return   true;  
      }  
      for   (var   i   =   0;   i   <   tmpLength;i++){  
          aChar   =   tmpDateValue.substring(i,i+1);  
          if(aChar   !=   "-"   &&   (aChar   <   "0"   ||   aChar   >   "9"))   {     
              return   false;  
          }  
      }  
      if   ((tmpLength   <   8   ||   tmpLength   >   10)   &&   tmpLength   !=   0)   {  
              return   false;      
      }  
      for   (var   j=   0;   j   <   4;j++){  
          aChar   =   tmpDateValue.substring(j,j+1);  
          if(aChar   <   "0"   ||   aChar   >   "9")   {  
 
              return   false;      
          }  
      }  
      if   (tmpDateValue.substring(4,5)   !=   "-"   ||   tmpDateValue.substring(5,6)   ==   "-"){  

          return   false;  
       
      }  
      if   (tmpLength   ==   8){  
          if   (tmpDateValue.substring(6,7)   !=   "-"   ||   tmpDateValue.substring(7,8)   ==   "-"   ){  
              return   false;  
          }  
      }  
       
      if   (tmpLength   ==   9){  
          if   (tmpDateValue.substring(8,9)   ==   "-"   ){          
              return   false;          
          }      
      }  
       
      if   (tmpLength   ==   10){  
          if   (tmpDateValue.substring(7,8)   !=   "-"   ||   tmpDateValue.substring(6,7)   ==   "-"   ||   tmpDateValue.substring(8,9)   ==   "-"   ||   tmpDateValue.substring(9,10)   ==   "-"   ){       
              return   false;          
          }      
      }  
      var   count=0;  
      for   (var   k   =   0;   k   <   tmpLength;k++){  
          aChar   =   tmpDateValue.substring(k,k+1);  
          if(aChar   ==   "-")   {  
                  count++;  
          }  
      }  
      if   (count!=2){   
          return   false;  
       
      }  
      return   true;  
  }

2、判斷時(shí)間大小
     var  tmpBeginTime = new Date(start_time.replace(/-/g,"\/"));
        var  tmpEndTime = new Date(end_time.replace(/-/g,"\/"));
        if (tmpBeginTime>tmpEndTime)
        {
           alert("開始時(shí)間不能大于結(jié)束時(shí)間!");
           return false;
        }


weesun一米陽光 2008-11-14 15:18 發(fā)表評(píng)論
]]>
異步加載樹1【總結(jié)】http://www.aygfsteel.com/1504/archive/2008/10/30/237613.htmlweesun一米陽光weesun一米陽光Thu, 30 Oct 2008 07:11:00 GMThttp://www.aygfsteel.com/1504/archive/2008/10/30/237613.htmlhttp://www.aygfsteel.com/1504/comments/237613.htmlhttp://www.aygfsteel.com/1504/archive/2008/10/30/237613.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/237613.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/237613.html
2.manageMenu.jsp菜單顯示頁面

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'ManageMenu.jsp' starting page</title>
   
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
    <link rel="STYLESHEET" type="text/css" href="css/dhtmlXTree.css">   
    <script src="js/dhtmlXCommon.js"></script>   
    <script src="js/dhtmlXTree.js"></script>
    <script type="text/javascript" src="<%=request.getContextPath()%>/dwr/engine.js"></script>
 <script type="text/javascript" src="<%=request.getContextPath()%>/dwr/util.js"></script>
 <script type='text/javascript' src='<%=request.getContextPath()%>/dwr/interface/service.js'> </script>
<style type="text/css">    
    .input
    {  
      width:300px;
      height:20px;
      border:solid 0px;
   }
    .input1
   {  
      width:70px;
      height:20px;
      border:solid 0px;
   }
    .input2
   {  
      width:300px;
      height:20px;
      border:solid 1px;
   }
</style>
<script type="text/javascript">
var oPopup = window.createPopup();
var array_info;
function showmenu(height)
{
    var lefter2 = event.clientY+12;
    var topper2 = event.clientX+10;
    var height2=file_menu.clientHeight;
    oPopup.document.body.innerHTML = oContextHTML.innerHTML+"<input type='hidden' id='file_id' value='"+event.srcElement.id+"' name='file_id'>";
    oPopup.show(topper2, lefter2, 150,height,this_win);
}

function viewRight()
{
     var id=tree.getSelectedItemId();//被選中的節(jié)點(diǎn)
    //tree.insertNewNext(id,'1',"FFTT",viewRight,"tombs_mag.gif","magazines_open.gif","magazines_close.gif","回家","SELECT");
    if(id!="0_0_-1")//當(dāng)不是根菜單時(shí)
    {
         //alert(":::"+array_info[0]);
      var   chs   =   new   Array();
      chs   =   id.split("_");
      var id=chs[0];
      var ids=chs[1];
     
          var v=array_info[0];
          var height=0;
          var adds=document.getElementById("add");
          var edits=document.getElementById("edit");
          var deletes=document.getElementById("delete");
          var st_add="";
          var st_edit="";
          var st_delete="";
         
          var dis_add="";
          var dis_edit="";
          var dis_delete="";
      if(ids==-1)//一級(jí)目錄
      {

            height=75;

            st_add="<SPAN ONCLICK=\"parent.add('"+chs[2]+"')\">新增節(jié)點(diǎn)(<u>A</u>dd)</SPAN> ";
         st_edit="<SPAN ONCLICK=\"parent.edit('"+v[0]+"','"+v[1]+"','"+v[2]+"','"+v[3]+"','"+v[4]+"','"+v[5]+"')\">修改節(jié)點(diǎn)(<u>E</u>dit)</SPAN>  ";
            st_delete=" <SPAN ONCLICK=\"parent.deletes('"+id+"')\">刪除節(jié)點(diǎn)(<u>D</u>elete)</SPAN> ";
            dis_add="";//將設(shè)為顯示
            dis_edit="";//將設(shè)為顯示
            dis_delete="";//將設(shè)為顯示
      }
      else
      {

               height=50;
            st_add="";
         st_edit="<SPAN ONCLICK=\"parent.edit('"+v[0]+"','"+v[1]+"','"+v[2]+"','"+v[3]+"','"+v[4]+"','"+v[5]+"')\">修改節(jié)點(diǎn)(<u>E</u>dit)</SPAN>  ";
            st_delete=" <SPAN ONCLICK=\"parent.deletes('"+id+"')\">刪除節(jié)點(diǎn)(<u>D</u>elete)</SPAN> ";

            dis_add="none";//將設(shè)為顯示
            dis_edit="";//將設(shè)為顯示
            dis_delete="";//將設(shè)為顯示

      }
          adds.innerHTML=st_add;
         edits.innerHTML=st_edit;
            deletes.innerHTML=st_delete;
            adds.style.display=dis_add;//將設(shè)為顯示
            edits.style.display=dis_edit;//將設(shè)為顯示
            deletes.style.display=dis_delete;//將設(shè)為顯示
            showmenu(height);

 }
 else//根目錄
 {
     var adds=document.getElementById("add");
     var edits=document.getElementById("edit");
  var deletes=document.getElementById("delete");
     adds.innerHTML="<SPAN ONCLICK=\"parent.add('root')\">新增節(jié)點(diǎn)(<u>A</u>dd)</SPAN> ";
     edits.innerHTML="";
     deletes.innerHTML="";
    
     adds.style.display="";//將設(shè)為顯示
     edits.style.display="none";//將設(shè)為顯示
     deletes.style.display="none";//將設(shè)為顯示
     var height=25;
     showmenu(height);
 }
 
}
function tonclick()
{
    var id=tree.getSelectedItemId();//被選中的節(jié)點(diǎn)
    if(id!="0_0_-1")//當(dāng)不是根菜單時(shí)
    {
      var   chs   =   new   Array();
      chs   =   id.split("_");
     service.getMenuInfo(chs[0],menuclick);
     var table=document.getElementById("table");//顯示節(jié)點(diǎn)信息的表
     var tdshow=document.getElementById("tdshow");//顯示節(jié)點(diǎn)信息的表
     var add_show=document.getElementById("add_show");
     tdshow.style.display="";//將表格設(shè)為顯示
     add_show.style.display="none";//將表格設(shè)為顯示
     table.style.display="";//將表格設(shè)為顯示
     //alert(table_style);
     //tree.insertNewNext(id,'1',"FFTT",viewRight,"tombs_mag.gif","magazines_open.gif","magazines_close.gif","回家","SELECT");
    }
}
function hander()
{
     //  var id=tree.getSelectedItemId();//被選中的節(jié)點(diǎn)
     //  alert(id);
     tonclick();
     viewRight();
}
function menuclick(data)
{
    array_info=data;
    var array=data[0];
    var cms_name=document.getElementById("name");//顯示節(jié)點(diǎn)的名稱
    var cms_link=document.getElementById("link");//顯示節(jié)點(diǎn)的鏈接
    var cms_orders=document.getElementById("orders");//顯示節(jié)點(diǎn)的排序號(hào)
    var cms_is_show=document.getElementById("is_show");//節(jié)點(diǎn)是否顯示
    var cms_is_quick=document.getElementById("is_quick");//節(jié)點(diǎn)是否作為快速通道
   

    var legend=document.getElementById("legend");//
    legend.innerHTML=array[0];
    cms_name.value=array[0];
    cms_link.value=array[1];
    cms_orders.value=array[2];
    if(array[3]==0)
    {
         cms_is_show.value="顯示";
    }
    else
    {
        cms_is_show.value="不顯示";
    }
    if(array[4]==0)
    {
         cms_is_quick.value="是";
    }
    else
    {
        cms_is_quick.value="否";
    }

}
</script>
<script type="text/javascript">
function add(id)
{
    //菜單響應(yīng)添加時(shí)調(diào)用
    var add_show=document.getElementById("add_show");
    var tdshow=document.getElementById("tdshow");
    var click=document.getElementById("click");
    var add_legend=document.getElementById("add_legend");
    

   
    var add_cms_name=document.getElementById("add_name");//顯示節(jié)點(diǎn)的名稱
    var add_cms_link=document.getElementById("add_link");//顯示節(jié)點(diǎn)的鏈接
    var add_cms_orders=document.getElementById("add_orders");//顯示節(jié)點(diǎn)的排序號(hào)
    var add_cms_is_show=document.getElementById("add_is_show");//節(jié)點(diǎn)是否顯示
    var add_cms_is_quick=document.getElementById("add_is_quick");//節(jié)點(diǎn)是否作為快速通道
   
    add_show.style.display="";
    tdshow.style.display="none";
    //bt.style.display="";
    //bt.value="添加節(jié)點(diǎn)";
    add_legend.innerHTML="添加節(jié)點(diǎn)";
    click.innerHTML="<input type=\"button\" name=\"bt\" value=\"添加節(jié)點(diǎn)\"  onclick=\"adds('"+id+"')\" id=\"bt\">";
 
    add_cms_name.value="";
    add_cms_link.value="";
    add_cms_orders.value="";
    add_cms_is_show.value="0";
    add_cms_is_quick.value="1";

}
</script>
<script type="text/javascript">
function edit(name,link,orders,is_show,is_quick,id)
{
    //菜單響應(yīng)修改時(shí)調(diào)用
    var add_show=document.getElementById("add_show");
    var tdshow=document.getElementById("tdshow");
    var click=document.getElementById("click");
    var add_legend=document.getElementById("add_legend");
    

   
    var add_cms_name=document.getElementById("add_name");//顯示節(jié)點(diǎn)的名稱
    var add_cms_link=document.getElementById("add_link");//顯示節(jié)點(diǎn)的鏈接
    var add_cms_orders=document.getElementById("add_orders");//顯示節(jié)點(diǎn)的排序號(hào)
    var add_cms_is_show=document.getElementById("add_is_show");//節(jié)點(diǎn)是否顯示
    var add_cms_is_quick=document.getElementById("add_is_quick");//節(jié)點(diǎn)是否作為快速通道

    add_show.style.display="";
    tdshow.style.display="none";
    //bt.style.display="";
    //bt.value="修改節(jié)點(diǎn)";
    add_legend.innerHTML="修改"+name;
    click.innerHTML="<input type=\"button\" name=\"bt\" value=\"修改節(jié)點(diǎn)\"  onclick=\"edits('"+id+"')\" id=\"bt\">";
 
    add_cms_name.value=name;
    add_cms_link.value=link;
    add_cms_orders.value=orders;
    add_cms_is_show.value=is_show;
    add_cms_is_quick.value=is_quick;
}
</script>
<script type="text/javascript">
var stname;
function adds(id)
{
   //alert("添加按鈕--"+id);
   //數(shù)據(jù)庫添加時(shí)調(diào)用
   var form =document.form1;
   var name=form.add_name.value;
   var link=form.add_link.value;
   var orders=form.add_orders.value;
   var is_show=form.add_is_show.value;
   var is_quick=form.add_is_quick.value;
   if(name==""||name==null)
   {
        alert("節(jié)點(diǎn)名稱不能為空!");
        return false;
   }
   if(link==""||link==null)
   {
       link="#";
   }
   if(orders==""||orders==null)
   {
       orders="1";
   }
   if(is_show==""||is_show==null)
   {
       is_show="0";
   }
   if(is_quick==""||is_quick==null)
   {
       is_quick="1";
   }
   stname=name;
   //alert(id);
   service.Add(id,name,link,orders,is_show,is_quick,clickAdd);
}
function clickAdd(info)
{
    var   returninfo=new   Array();
 returninfo   =   info.split(";");
 if(returninfo[0]=="true")
 {
       alert("新增【"+stname+"】節(jié)點(diǎn)成功!");
       var id=tree.getSelectedItemId();//被選中的節(jié)點(diǎn)
       var insertid=returninfo[1]+"_"+returninfo[2]+"_"+returninfo[3];
       //alert("::::"+insertid);
       tree.insertNewChild(id,insertid,stname,hander,"book_titel.gif","books_open.gif","book.gif","","")   ;
       //var form2=document.form2;
       //form2.action="cms/manageMenu.jsp";
       //form2.submit();
 }
 else
 {
     alert("新增【"+stname+"】節(jié)點(diǎn)失敗!");
 }

}
</script>
<script type="text/javascript">
function deletes(id)
{
   //菜單,數(shù)據(jù)庫刪除時(shí)調(diào)用
   var bln = window.confirm("您確定要?jiǎng)h除此界面嗎?");
   if(bln==true)
   {
        service.deleteAll(id,clickDelete);
        tree.deleteItem(tree.getSelectedItemId(),true);
       
   }
   else
   {
        return false;
   }
}
function clickDelete(info)
{
    alert(info);
}
</script>
<script type="text/javascript">
function edits(id)
{
   //數(shù)據(jù)庫修改時(shí)調(diào)用
   var form =document.form1;
   var name=form.add_name.value;
   var link=form.add_link.value;
   var orders=form.add_orders.value;
   var is_show=form.add_is_show.value;
   var is_quick=form.add_is_quick.value;
   service.modify(id,name,link,orders,is_show,is_quick,clickModify);

}
function clickModify(info)
{
    alert(info);
}
</script>

</head>
 
<body id="this_win">

   <table>
  <tr>
     
   <td valign="top">
   <form name="form2" method="post" action="">
    <div id="treeboxbox_tree" style="width:250; height:600;background-color:#f5f5f5;border :1px solid Silver;; overflow:auto;"></div>
       <script>   
        tree=new dhtmlXTreeObject("treeboxbox_tree","100%","100%",0);   
        tree.setImagePath("images/imgs/");   
        tree.setXMLAutoLoading("cms/cmsmenu.jsp?op=open");    
        tree.loadXML("cms/cmsmenu.jsp?op=init");
        //tree.enableItemEditor(true);
                    tree.setOnClickHandler(tonclick);//單擊事件調(diào)用方法
        tree.setOnRightClickHandler(viewRight);//設(shè)置右鍵調(diào)用方法
        // tree.insertNewChild('root',5,"新節(jié)點(diǎn)",viewRight,"0","0","0","0","SELECT")   ;
        //tree.insertNewItem('0',100,"New Node 1",0,0,0,0,"SELECT");
       </script>
       </form>
   </td>
   
   <td rowspan="2" style="padding-left:25" valign="top" >
      <form name="form1" method="post" action="">
    <fieldset style="DISPLAY:none " id="tdshow">
        <legend id="legend"></legend>
    
     <table width="554" border="0" id="table" style="DISPLAY: none">
        <tr>
          <td width="102" height="24" scope="col">  
        <div align="left"><font size="2">名字:</font></div>
       </td>
          <td width="168" scope="col">
       <div align="left" >
            <input name="name" type="text" value="name" id="name" readonly class='input' >
          </div>
          </td>
          </tr>
          <tr>
          <td width="98" scope="col">  
        <div align="left"><font size="2">鏈接:</font> </div>
       </td>
          <td width="168" scope="col">
       <div align="left" >
            <input name="link" type="text" value="link" id="link" readonly class='input'>
          </div></td>
        </tr>
        <tr>
          <td height="21"><font size="2">序號(hào):    </font></td>
          <td height="21">
        <div align="left" >
             <input name="orders" type="text" value="orders" id="orders" readonly class='input'>
           </div>
          </td>
          </tr>
          <tr>
          <td>
          <div align="left"><font size="2">是否顯示:</font>    </div></td>
          <td>
           <div align="left" >
                 <input name="is_show" type="text" value="is_show" id="is_show" readonly class='input'>
             </div>
        </td>
        </tr>
        <tr>
          <td height="21"><font size="2">是否快速通道:</font></td>
          <td height="21">
           <div align="left" >
               <input name="is_quick" type="text" value="is_quick" id="is_quick" readonly class='input'>
           </div>
          </td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
        <tr>
          <td height="21"></td>
          <td height="21">
        
       </td>
          <td></td>
          <td>&nbsp;</td>
        </tr>
        </table> 
   </fieldset> 
   
   
   <fieldset style="DISPLAY:none " id="add_show">
        <legend id="add_legend"></legend>
    
     <table width="554" border="0" id="add_table">
        <tr>
          <td width="102" height="24" scope="col">  
        <div align="left"><font size="2">名字:</font></div>
       </td>
          <td width="168" scope="col">
       <div align="left" >
            <input name="add_name" type="text" value="name" id="add_name"  class='input2' >
          </div>
          </td>
          </tr>
          <tr>
          <td width="98" scope="col">  
        <div align="left"><font size="2">鏈接:</font> </div>
       </td>
          <td width="168" scope="col">
       <div align="left" >
            <input name="add_link" type="text" value="link" id="add_link"  class='input2'>
          </div></td>
        </tr>
        <tr>
          <td height="21"><font size="2">序號(hào):    </font></td>
          <td height="21">
        <div align="left" >
             <input name="add_orders" type="text" value="orders" id="add_orders"  class='input2'>
           </div>
          </td>
          </tr>
          <tr>
          <td>
          <div align="left"><font size="2">是否顯示:</font>    </div></td>
          <td>
           <div align="left" >

                 <select name="add_is_show" id="add_is_show">
             <option value="0" selected>顯示
             <option value="1">不顯示

         </select>
             </div>
        </td>
        </tr>
        <tr>
          <td height="21"><font size="2">是否快速通道:</font></td>
          <td height="21">
           <div align="left" >
               <select name="add_is_quick" id="add_is_quick">
             <option value="0" selected>是
             <option value="1">否

         </select>
           </div>
          </td>
          <td>&nbsp;</td>
          <td>&nbsp;</td>
        </tr>
        <tr>
          <td height="21"> </td>
          <td height="21">
        
       </td>
          <td id="click"></td>
          <td>&nbsp;</td>
        </tr>
        </table> 
   </fieldset> 
   </form>
   
  </td>
 </tr>
 <tr>
  <td>
  </td>
 </tr>
</table>


   <DIV ID="oContextHTML" STYLE="display:none;">
  <div id="file_menu">
      <DIV onmouseover="this.style.filter='progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#99ccff, EndColorStr=#FFFFFF)';"
           onmouseout="this.style.filter='';"
           STYLE="font-family:verdana; font-size:70%; height:25px; background:#e4e4e4; border:1px solid black; padding:3px; padding-left:20px;  cursor:hand;DISPLAY: none" id="add">
          
       </DIV>
      <DIV onmouseover="this.style.filter='progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=yellowgreen,EndColorStr=#FFFFFF)';"
           onmouseout="this.style.filter='';" 
           STYLE="font-family:verdana; font-size:70%; height:25px; background:#e4e4e4; border:1px solid black; padding:3px; padding-left:20px; cursor:hand; border-top:0px solid black;DISPLAY: none" id="edit">
           
      </DIV>
      <DIV onmouseover="this.style.filter='progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=gold, EndColorStr=#FFFFFF)';"
           onmouseout="this.style.filter='';" 
            STYLE="font-family:verdana; font-size:70%; height:25px; background:#e4e4e4; border:1px solid black; padding:3px; padding-left:20px;  cursor:hand;DISPLAY: none" id="delete">
           
      </DIV>
  </div>
    </DIV>


</body>
</html>



weesun一米陽光 2008-10-30 15:11 發(fā)表評(píng)論
]]>
實(shí)現(xiàn)類似于google搜索提示的功能【收藏】http://www.aygfsteel.com/1504/archive/2008/08/05/220193.htmlweesun一米陽光weesun一米陽光Tue, 05 Aug 2008 07:56:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/05/220193.htmlhttp://www.aygfsteel.com/1504/comments/220193.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/05/220193.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/220193.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/220193.html

最近和朋友們一起做了一個(gè)搜索提示的功能    使用了ajax+mysql數(shù)據(jù)庫進(jìn)行的操作,代碼貼出來給大家參考一下:

suggest.html:

<html>
<head>
    <style type="text/css" media="screen">
     body {
      font: 11px arial;
     }
     .suggest_link {
      background-color: #FFFFFF;
      padding: 2px 6px 2px 6px;
     }
     .suggest_link_over {
      background-color: #E8F2FE;
      padding: 2px 6px 2px 6px;
     }
     #search_suggest {
         position: absolute;
      background-color: #FFFFFF;
      text-align: left;
      border: 1px solid #000000;   
     }  
    </style>
    <script language="JavaScript" type="text/javascript" src="ajax_search.js"></script>
</head>
<body>
    <h3>Simple AJAX Search Suggest</h3>
    <div style="width: 500px;">
     <form id="frmSearch" action="">
<input type="text" id="txtSearch" name="txtSearch" alt="Search Criteria" onkeyup="searchSuggest();" autocomplete="off" />
    <input type="submit" id="cmdSearch" name="cmdSearch" value="Search" alt="Run Search" /><br />
    <div id="search_suggest">
      </div>
     </form>
    </div>
</body>
</html>

 

ajax_search.js文件:


//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() {
if (window.XMLHttpRequest) {
    return new XMLHttpRequest();
} else if(window.ActiveXObject) {
    return new ActiveXObject("Microsoft.XMLHTTP");
} else {
    alert("Your Browser Sucks!\nIt's about time to upgrade don't you think?");
}
}
function createAjaxObj(){
    var httprequest=false
    if (window.XMLHttpRequest)
    { // if Mozilla, Safari etc
      httprequest=new XMLHttpRequest()
      if (httprequest.overrideMimeType)
        httprequest.overrideMimeType('text/xml')
     }
     else if (window.ActiveXObject)
     { // if IE
       try {
         httprequest=new ActiveXObject("Msxml2.XMLHTTP");
       }
       catch (e){
         try{
            httprequest=new ActiveXObject("Microsoft.XMLHTTP");
         }
         catch (e){}
       }
     }
     return httprequest
}
//Our XmlHttpRequest object to get the auto suggest
var searchReq = createAjaxObj();

//Called from keyup on the search textbox.
//Starts the AJAX request.
function searchSuggest() {
if (searchReq.readyState == 4 || searchReq.readyState == 0) {
    var str = escape(document.getElementById('txtSearch').value);
    searchReq.open("GET", 'search?search=' + str, true);
    searchReq.onreadystatechange = handleSearchSuggest;
    searchReq.send(null);
}  
}

//Called when the AJAX response is returned.
function handleSearchSuggest() {
if (searchReq.readyState == 4) {
    var ss = document.getElementById('search_suggest')
    ss.innerHTML = '';
    var str = searchReq.responseText.split("\n");
    for(i=0; i < str.length - 1; i++) {
     //Build our element string.    This is cleaner using the DOM, but
     //IE doesn't support dynamically added attributes.
     var suggest = '<div onmouseover="javascript:suggestOver(this);" ';
     suggest += 'onmouseout="javascript:suggestOut(this);" ';
     suggest += 'onclick="javascript:setSearch(this.innerHTML);" ';
     suggest += 'class="suggest_link">' + str[i] + '</div>';
     ss.innerHTML += suggest;
    }
}
}

//Mouse over function
function suggestOver(div_value) {
div_value.className = 'suggest_link_over';
}
//Mouse out function
function suggestOut(div_value) {
div_value.className = 'suggest_link';
}
//Click function
function setSearch(value) {
document.getElementById('txtSearch').value = value;
document.getElementById('search_suggest').innerHTML = '';
}

 

數(shù)據(jù)庫的代碼:


CREATE DATABASE /*!32312 IF NOT EXISTS*/ search;
USE search;


DROP TABLE IF EXISTS SUGGEST;
CREATE TABLE SUGGEST (
    SUGGEST_ID int(11) NOT NULL auto_increment,
    TITLE varchar(255) default NULL,
    PRIMARY KEY    (SUGGEST_ID)
)TYPE=MyISAM ;

LOCK TABLES SUGGEST WRITE;
INSERT INTO SUGGEST VALUES (1,'Home'),(2,'TECHNOLOGIES'),(3,'SOLUTIONS    AND SOFTWARE'),(4,'Websites'),(5,'Web Apps'),(6,'Applications'),(7,'E-COMMERCE SOLUTIONS'),(8,'osCommerce'),(9,'CMS / Portals'),(10,'Microsoft .NET'),(11,'J2EE'),(12,'LAMP'),(13,'PHP'),(14,'MySQL'),(15,'Apache'),(16,'ASP.NET'),(17,'Windows Applications'),(18,'JSP'),(19,'SWING'),(20,'Web Technologies'),(21,'XHTML'),(22,'RSS / ATOM'),(23,'XML'),(24,'XSL'),(25,'XAML'),(26,'AJAX'),(27,'About DynamicAJAX'),(28,'CSS'),(29,'The Basics'),(30,'SAJAX'),(31,'About The Site Images'),(32,'About Me'),(33,'JavaScript'),(34,'RSS 2.0'),(35,'ATOM 1.0'),(36,'Search Engine Optimization'),(37,'Flash'),(38,'Open Source'),(39,'HTTP Server'),(40,'Full Text Search'),(41,'Best Practices'),(42,'XML Schema Definitons'),(43,'Web Content Accessibility Guidelines'),(44,'Printable Pages'),(45,'Search Engine'),(46,'Navigation'),(47,'Direct Web Remoting'),(48,'Mars Exploration Rovers'),(49,'Cassini'),(50,'Fun with Queries'),(51,'SEO Tricks and Tactics'),(52,'osCommerce Contributions'),(53,'PHP & IIS'),(54,'Regular Expressions'),(55,'Rants'),(56,'URL Rewrite'),(57,'Fun with CSS'),(58,'ActionScript'),(59,'Visual Studio 2005'),(60,'SQL Server'),(61,'Search Engine Commands'),(62,'Web Site Layout'),(63,'AJAX'),(64,'AJAX Basics'),(65,'ATLAS'),(66,'SAJAX'),(67,'Tutorials'),(68,'Novice'),(69,'Frameworks'),(70,'Ajax.NET'),(71,'Framework Tutorials'),(72,'SAJAX'),(73,'Ajax.NET'),(74,'Direct Web Remoting'),(75,'Intermediate'),(76,'AJAX Example Sites'),(77,'My Tutorials'),(78,'AJAX Web Chat Part 1'),(79,'The JavaScript'),(80,'Sending The Request'),(81,'Color Schemes'),(82,'AJAX Resources'),(83,'The Backend'),(84,'Usability Additions'),(85,'AJAX Instant Messenger Part 1'),(86,'Ruby on Rails'),(87,'Crazy Queries'),(88,'XmlHttpRequest Methods'),(89,'XmlHttpRequest Properties'),(90,'AjaxTags'),(91,'Direct Web Remoting'),(92,'My URL Rewriting'),(93,'Great Quotes'),(94,'IXSSO Queries'),(95,'AFLAX'),(96,'Other Technologies'),(97,'Microsoft Indexing Server'),(98,'.NET & CISSO');
UNLOCK TABLES;

SearchSuggest.java:

package book.suggest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SearchSuggest extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, java.io.IOException {
    String search = request.getParameter("search");//獲得請(qǐng)求中cate的值
    //定義查詢數(shù)據(jù)庫的SQL語句
    String sql = "select title from suggest where title like '"+search+"%' order by title";

    Connection conn = null;//聲明Connection對(duì)象
    Statement stmt = null;//聲明Statement對(duì)象
    ResultSet rs = null;//聲明ResultSet對(duì)象
    Vector vData = new Vector();
    //response.setContentType("text/xml");//設(shè)置返回?cái)?shù)據(jù)類型為xml格式
    java.io.PrintWriter out = response.getWriter();

    try {
     // 加載數(shù)據(jù)庫驅(qū)動(dòng)類
     Class.forName("com.mysql.jdbc.Driver");
     // 訪問數(shù)據(jù)庫的地址
     String url = "jdbc:mysql://localhost/search";
     //創(chuàng)建Connection對(duì)象
     conn = DriverManager.getConnection(url, "root", "");
     // 創(chuàng)建Statement對(duì)象
     stmt = conn.createStatement();
     // 執(zhí)行SQL語句,返回記錄集
     rs = stmt.executeQuery(sql);
     //定義AblumEO實(shí)體對(duì)象
     while (rs.next())
     {
      vData.add(rs.getString("TITLE"));
     }
     StringBuffer buf = new StringBuffer();
     for (int i=0;i<vData.size();i++)
     {
      String keyword = (String)vData.get(i);
      buf.append(keyword+"\n");
     }
     out.print(buf.toString());
//     out.print(parasToXML(vData));//調(diào)用parasToXML()方法
    } catch (Exception e) {

     e.printStackTrace();

    } finally {//最后關(guān)必記錄集,Connection對(duì)象
     try {
      // this will close any associated ResultSets
      if (stmt != null)
       stmt.close();
      if (conn != null)
       conn.close();
     } catch (SQLException sqle) {
     }
    }
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
     throws ServletException, java.io.IOException {

    doPost(request, response);
}
/*
public String parasToXML(Vector v) {// 該方法將數(shù)據(jù)轉(zhuǎn)化成XML格式輸出
    StringBuffer buf = new StringBuffer();
    buf.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    buf.append("<pictures>");
    for (int i = 0; i < v.size(); i++) {
     AlbumEO album = (AlbumEO) v.get(i);
     buf.append("<item>");
     buf.append("<name>" + album.getAlbumName() + "</name>");
     buf.append("<url>" + album.getAlbumURL() + "</url>");
     buf.append("<description>" + album.getAlbumDescription()
       + "</description>");
     buf.append("</item>");
    }
    buf.append("</pictures>");
    return buf.toString();
}
*/
}

 

本示例共有 四部分,請(qǐng)大家復(fù)制到自己的文件中進(jìn)行 運(yùn)行,最后的結(jié)果如圖:



weesun一米陽光 2008-08-05 15:56 發(fā)表評(píng)論
]]>
Javascript 操作select控件大全(新增、修改、刪除、選中、清空、判斷存在等)【收藏】http://www.aygfsteel.com/1504/archive/2008/08/05/220184.htmlweesun一米陽光weesun一米陽光Tue, 05 Aug 2008 07:21:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/05/220184.htmlhttp://www.aygfsteel.com/1504/comments/220184.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/05/220184.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/220184.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/220184.html

2008-03-05 10:45:16 / 個(gè)人分類:js

1判斷select選項(xiàng)中 是否存在Value="paraValue"的Item 
 2向select選項(xiàng)中 加入一個(gè)Item 
 3從select選項(xiàng)中 刪除一個(gè)Item 
 4刪除select中選中的項(xiàng) 
 5修改select選項(xiàng)中 value="paraValue"的text為"paraText" 
 6設(shè)置select中text="paraText"的第一個(gè)Item為選中 
 7設(shè)置select中value="paraValue"的Item為選中 
 8得到select的當(dāng)前選中項(xiàng)的value 
 9得到select的當(dāng)前選中項(xiàng)的text 
10得到select的當(dāng)前選中項(xiàng)的Index 
11清空select的項(xiàng) 
js 代碼
// 1.判斷select選項(xiàng)中 是否存在Value="paraValue"的Item        
function jsSelectIsExitItem(objSelect, objItemValue) {        
    
var isExit = false;        
    
for (var i = 0; i < objSelect.options.length; i++{        
        
if (objSelect.options[i].value == objItemValue) {        
            isExit 
= true;        
            
break;        
        }
        
    }
        
    
return isExit;        
}
         
   
// 2.向select選項(xiàng)中 加入一個(gè)Item        
function jsAddItemToSelect(objSelect, objItemText, objItemValue) {        
    
//判斷是否存在        
    if (jsSelectIsExitItem(objSelect, objItemValue)) {        
        alert(
"該Item的Value值已經(jīng)存在");        
    }
 else {        
        
var varItem = new Option(objItemText, objItemValue);      
        objSelect.options.add(varItem);     
        alert(
"成功加入");     
    }
        
}
        
   
// 3.從select選項(xiàng)中 刪除一個(gè)Item        
function jsRemoveItemFromSelect(objSelect, objItemValue) {        
    
//判斷是否存在        
    if (jsSelectIsExitItem(objSelect, objItemValue)) {        
        
for (var i = 0; i < objSelect.options.length; i++{        
            
if (objSelect.options[i].value == objItemValue) {        
                objSelect.options.remove(i);        
                
break;        
            }
        
        }
        
        alert(
"成功刪除");        
    }
 else {        
        alert(
"該select中 不存在該項(xiàng)");        
    }
        
}
    
   
   
// 4.刪除select中選中的項(xiàng)    
function jsRemoveSelectedItemFromSelect(objSelect) {        
    
var length = objSelect.options.length - 1;    
    
for(var i = length; i >= 0; i--){    
        
if(objSelect[i].selected == true){    
            objSelect.options[i] 
= null;    
        }
    
    }
    
}
      
   
// 5.修改select選項(xiàng)中 value="paraValue"的text為"paraText"        
function jsUpdateItemToSelect(objSelect, objItemText, objItemValue) {        
    
//判斷是否存在        
    if (jsSelectIsExitItem(objSelect, objItemValue)) {        
        
for (var i = 0; i < objSelect.options.length; i++{        
            
if (objSelect.options[i].value == objItemValue) {        
                objSelect.options[i].text 
= objItemText;        
                
break;        
            }
        
        }
        
        alert(
"成功修改");        
    }
 else {        
        alert(
"該select中 不存在該項(xiàng)");        
    }
        
}
        
   
// 6.設(shè)置select中text="paraText"的第一個(gè)Item為選中        
function jsSelectItemByValue(objSelect, objItemText) {            
    
//判斷是否存在        
    var isExit = false;        
    
for (var i = 0; i < objSelect.options.length; i++{        
        
if (objSelect.options[i].text == objItemText) {        
            objSelect.options[i].selected 
= true;        
            isExit 
= true;        
            
break;        
        }
        
    }
              
    
//Show出結(jié)果        
    if (isExit) {        
        alert(
"成功選中");        
    }
 else {        
        alert(
"該select中 不存在該項(xiàng)");        
    }
        
}
        
   
// 7.設(shè)置select中value="paraValue"的Item為選中    
document.all.objSelect.value = objItemValue;    
       
// 8.得到select的當(dāng)前選中項(xiàng)的value    
var currSelectValue = document.all.objSelect.value;    
       
// 9.得到select的當(dāng)前選中項(xiàng)的text    
var currSelectText = document.all.objSelect.options[document.all.objSelect.selectedIndex].text;    
       
// 10.得到select的當(dāng)前選中項(xiàng)的Index    
var currSelectIndex = document.all.objSelect.selectedIndex;    
       
// 11.清空select的項(xiàng)    
document.all.objSelect.options.length = 0;   



weesun一米陽光 2008-08-05 15:21 發(fā)表評(píng)論
]]>
模態(tài)窗口的使用步驟【總結(jié)】http://www.aygfsteel.com/1504/archive/2008/08/05/220174.htmlweesun一米陽光weesun一米陽光Tue, 05 Aug 2008 07:02:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/05/220174.htmlhttp://www.aygfsteel.com/1504/comments/220174.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/05/220174.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/220174.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/220174.html


function open(form)
{
        var apply_id=form.flag.value;
        var srcFile = "/uniframework/configuration.action?actName=applyToDistribut&flag="+apply_id;
        var winFeatures = "dialogWidth=850px;dialogHeight=550px;status=no;help=no;";
        var seleItemValue='';
        var checkbox = form.checkbox;
        if(checkbox){
       
        if(checkbox.length)
        {
         for(var i=0;i<checkbox.length;i++)
         {
          if(i==0)seleItemValue = form.checkbox[i].value;
          else
          seleItemValue+=","+form.checkbox[i].value;
         }
        }else
        {
         seleItemValue = form.checkbox.value;
        }
        }

        var obj = form1;
        var ret = window.showModalDialog(srcFile, seleItemValue, winFeatures);

        if(ret!=undefined){
         addCTItemToTable(ret);
        }
       
}
function addCTItemToTable(data)
{
 var tableobj = document.getElementById("CTTable");
 var appli_id="";
 if (tableobj != null)
 {
     for(var k=0;k<data.length;k++)
        {
            var st=data[k];
            appli_id=st[7];
            var newRow = tableobj.insertRow(tableobj.rows.length);
   c1 = newRow.insertCell(0);
   c1.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;<input type=checkbox name=checkbox checked class=checkbox1 value='"+st[0]+"'>&nbsp;&nbsp;";
   c2 = newRow.insertCell(1);
   c2.innerHTML = '<div align=\"center\">' + st[1] + '</div>';
   c3 = newRow.insertCell(2);
   c3.innerHTML = '<div align=\"center\">'+st[2]+'</div>';
   c4 = newRow.insertCell(3);
   c4.innerHTML = '<div align=\"center\">'+st[3]+'</div>';
   c5 = newRow.insertCell(4);
   c5.innerHTML = '<div align=\"center\">'+st[4]+'</div>';
   c6 = newRow.insertCell(5);
   c6.innerHTML = '<div align=\"center\">'+st[5]+'</div>';
   c7 = newRow.insertCell(6);
   c7.innerHTML = '<div align=\"center\">'+st[6]+'</div>'
        }
    }
}

2.y.jsp

function addCTItemReturnT(form)
{

    applyid=form.info3.value;
 var check= form.checkbox;
 var arr=new Array();
    var string="";
    var index=0;
 if(check.length)
 {
  for(var i=0;i<check.length;i++)
  {
       var checkval = check[i];
     
             if(checkval.checked)
             {
                   var row = checkval.parentElement.parentElement;
                   var data=[];
                   data[0] = checkval.value;//產(chǎn)品型號(hào);
                   data[1] = form.ASSET_CODE[row.rowIndex -1].value;//資產(chǎn)編碼
       data[2] = form.PROJECTNO[row.rowIndex -1].value;//項(xiàng)目編號(hào)
       data[3] = form.CI_NAME[row.rowIndex -1].value;// 配置項(xiàng)名
       data[4] = form.RESPONSIBILITY[row.rowIndex -1].value;//責(zé)任人
       data[5] = form.KEEPER[row.rowIndex -1].value;//使用人
       data[6] = form.PRODUCT_MODLE[row.rowIndex -1].value;//產(chǎn)品型號(hào)
       data[7] = applyid;//產(chǎn)品型號(hào)
                   arr[index]=data;
                   index++;
             }
            
  }
 }
    for(var k=0;k<arr.length;k++)
    {
          var st=arr[k];
          //alert("---"+st[0]+"::"+st[3]);
    }
 window.returnValue=arr;
 window.close();
}

weesun一米陽光 2008-08-05 15:02 發(fā)表評(píng)論
]]>
模態(tài)窗口window.showModalDialog使用手冊(cè)【收藏】http://www.aygfsteel.com/1504/archive/2008/08/05/220171.htmlweesun一米陽光weesun一米陽光Tue, 05 Aug 2008 06:58:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/05/220171.htmlhttp://www.aygfsteel.com/1504/comments/220171.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/05/220171.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/220171.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/220171.html
Window.Open()參數(shù):
<SCRIPT LANGUAGE="javascript">
<!--
window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
//寫成一行
-->
</SCRIPT>
參數(shù)解釋:
<SCRIPT LANGUAGE="javascript"> js腳本開始;
window.open 彈出新窗口的命令;
'page.html' 彈出窗口的文件名;
'newwindow' 彈出窗口的名字(不是文件名),非必須,可用空''代替;
height=100 窗口高度;
width=400 窗口寬度;
top=0 窗口距離屏幕上方的象素值;
left=0 窗口距離屏幕左側(cè)的象素值;
toolbar=no 是否顯示工具欄,yes為顯示;
menubar,scrollbars 表示菜單欄和滾動(dòng)欄。
resizable=no 是否允許改變窗口大小,yes為允許;
location=no 是否顯示地址欄,yes為允許;
status=no 是否顯示狀態(tài)欄內(nèi)的信息(通常是文件已經(jīng)打開),yes為允許;
</SCRIPT>

window.showModalDialog()參數(shù):
JavaScript:window.showModalDialog('Ori_Photo.aspx','','resizable:yes;scroll:yes;status:no;dialogWidth=320px;dialogHeight=230px;center=yes;help=no');


window.showModalDialog(URL,dialogArgments.features) 打開一個(gè)新窗口

URL為要開啟的網(wǎng)頁名字。
dialogArgments為設(shè)定好傳遞給新視窗網(wǎng)頁的參數(shù),可以為任意數(shù)據(jù)類型。
feature 與open()的類似,都是格式方面的設(shè)定。調(diào)用格式為featureName1:featureValue1:(分號(hào))featureName2:featureValue2:

關(guān)于feature具體的參數(shù)我就不詳細(xì)寫了,看名字就應(yīng)該知道什么用處了吧。
certer , dialogHeight, dialogLeft,dialogTop,dialogWidth,help(是否顯示help按鈕,下同),status,resizeable
值=1為yes,0為no.

我認(rèn)為最重要的是dialogArgments,可以傳遞值到新的窗口。
第二重要就是 它的返回值 window.returnValue.可以在showModalDialog開啟的窗口關(guān)閉后前,回傳一個(gè)任意類型的值。




基本介紹:
showModalDialog() (IE 4+ 支持)
showModelessDialog() (IE 5+ 支持)
window.showModalDialog()方法用來創(chuàng)建一個(gè)顯示HTML內(nèi)容的模態(tài)對(duì)話框。
window.showModelessDialog()方法用來創(chuàng)建一個(gè)顯示HTML內(nèi)容的非模態(tài)對(duì)話框。

使用方法:
vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
vReturnValue = window.showModelessDialog(sURL [, vArguments] [,sFeatures])

參數(shù)說明:
sURL--必選參數(shù),類型:字符串。用來指定對(duì)話框要顯示的文檔的URL。
vArguments--可選參數(shù),類型:變體。用來向?qū)υ捒騻鬟f參數(shù)。傳遞的參數(shù)類型不限,包括數(shù)組等。對(duì)話框通過window.dialogArguments來取得傳遞進(jìn)來的參數(shù)。
sFeatures--可選參數(shù),類型:字符串。用來描述對(duì)話框的外觀等信息,可以使用以下的一個(gè)或幾個(gè),用分號(hào)“;”隔開。
1.dialogHeight :對(duì)話框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默認(rèn)的單位是em,而IE5中是px,為方便其見,在定義modal方式的對(duì)話框時(shí),用px做單位。
2.dialogWidth: 對(duì)話框?qū)挾取?
3.dialogLeft: 離屏幕左的距離。
4.dialogTop: 離屏幕上的距離。
5.center: {yes | no | 1 | 0 }:窗口是否居中,默認(rèn)yes,但仍可以指定高度和寬度。
6.help: {yes | no | 1 | 0 }:是否顯示幫助按鈕,默認(rèn)yes。
7.resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改變大小。默認(rèn)no。
8.status: {yes | no | 1 | 0 } [IE5+]:是否顯示狀態(tài)欄。默認(rèn)為yes[ Modeless]或no[Modal]。
9.scroll:{ yes | no | 1 | 0 | on | off }:指明對(duì)話框是否顯示滾動(dòng)條。默認(rèn)為yes。
下面幾個(gè)屬性是用在HTA中的,在一般的網(wǎng)頁中一般不使用。
10.dialogHide:{ yes | no | 1 | 0 | on | off }:在打印或者打印預(yù)覽時(shí)對(duì)話框是否隱藏。默認(rèn)為no。
11.edge:{ sunken | raised }:指明對(duì)話框的邊框樣式。默認(rèn)為raised。
12.unadorned:{ yes | no | 1 | 0 | on | off }:默認(rèn)為no。

參數(shù)傳遞:
1.要想對(duì)話框傳遞參數(shù),是通過vArguments來進(jìn)行傳遞的。類型不限制,對(duì)于字符串類型,最大為4096個(gè)字符。也可以傳遞對(duì)象,例如:
parent.htm
代碼運(yùn)行框:
<script>
var obj = new Object();
obj.name="51js";
window.showModalDialog("modal.htm",obj,"dialogWidth=200px;dialogHeight=100px");
</script>
modal.htm
<script>
var obj = window.dialogArguments
alert("您傳遞的參數(shù)為:" + obj.name)
</script>

[Ctrl+A 全部選擇 提示:你可先修改部分代碼,再按運(yùn)行]
2.可以通過window.returnValue向打開對(duì)話框的窗口返回信息,當(dāng)然也可以是對(duì)象。例如:
代碼運(yùn)行框:
<script>
str =window.showModalDialog("modal.htm",,"dialogWidth=200px;dialogHeight=100px");
alert(str);
</script>
modal.htm
<script>
window.returnValue="/";
</script>


weesun一米陽光 2008-08-05 14:58 發(fā)表評(píng)論
]]>
樹(下拉頁面)的實(shí)現(xiàn)【收藏】http://www.aygfsteel.com/1504/archive/2008/08/05/220149.htmlweesun一米陽光weesun一米陽光Tue, 05 Aug 2008 06:07:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/05/220149.htmlhttp://www.aygfsteel.com/1504/comments/220149.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/05/220149.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/220149.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/220149.html轉(zhuǎn)自:http://shuaijie506.javaeye.com/blog/34865
關(guān)鍵字: javascript,下拉頁面

這幾天又花時(shí)間做了一個(gè),使用起來效果更好,因?yàn)闆]有時(shí)間寫更多的幫助,大家慢慢研究代碼吧!

 

最近項(xiàng)目中要用到下拉多選樹,有人從網(wǎng)上找了一個(gè),用了一段時(shí)間后發(fā)現(xiàn)有一些問題,一個(gè)頁面中只能有一個(gè)下拉樹,我就研究其中的代碼,自己重新寫了一個(gè)下拉頁面的腳本,能夠在一個(gè)頁面中使用多個(gè)下拉樹

其原理其實(shí)就是用DIV的隱藏的顯示來實(shí)現(xiàn)下拉頁面,頁面放在了DIV里的一個(gè)FRAME里,用JS來控制這些顯示與隱藏,廢話不多說了,把源碼給大家公布一下。代碼中如有不足之處敬請(qǐng)大家指出。

給大家說一下它的用法,首先在頁面里加上JS文件:
在需要下拉樹的地方寫一個(gè)DIV:

 

JS里用到了兩個(gè)圖片,你可以把這兩個(gè)圖片放到主頁面同一層的路徑下,或者直接修改JS源文件,把它指向你自己的路徑。

目標(biāo)頁面需要加一些東西,寫一個(gè)函數(shù):

function getUserData(tag){
 var ids = tree1.getAllChecked();
 if(ids.length==0)return "";
 if(tag=="id")
  return tree1.getAllChecked();
 else if(tag=="name"){
  var idArray = ids.split(",");
  var names=tree1.getItemText(idArray[0]);
  for(i=1;i    names += "," + tree1.getItemText(idArray[i]);
  return names;
 }
}
其中的返回值可以根據(jù)你的頁面要實(shí)現(xiàn)的功能改動(dòng)。


在頁面的onload事件中創(chuàng)建:dropDownPage.createNewPage("2.htm","tree1","text1",200);
這個(gè)函數(shù)中的參數(shù)給大家詳細(xì)解釋一下,
第一個(gè)是下拉時(shí)出來的頁面的URL;
第二個(gè)是你創(chuàng)建的DIV的ID;
第三個(gè)是你用來存放頁面返回ID的FORM的字段的(id或name都行,如果你的主頁面里沒有這樣的字段,JS會(huì)幫你創(chuàng)建它);
第四個(gè)是寬度,單位是象素。

/Files/1504/Example.rar          /Files/1504/tree.rar

weesun一米陽光 2008-08-05 14:07 發(fā)表評(píng)論
]]>
Tab【自己備用】http://www.aygfsteel.com/1504/archive/2008/08/05/220103.htmlweesun一米陽光weesun一米陽光Tue, 05 Aug 2008 02:37:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/05/220103.htmlhttp://www.aygfsteel.com/1504/comments/220103.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/05/220103.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/220103.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/220103.html<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="ww" uri="/struts-tags" %>
<%@ taglib prefix="display" uri="/WEB-INF/displaytag-el.tld" %>
<html>
<head>
<title>申請(qǐng)表</title>
<link rel="stylesheet" href="/uniframework/style/default.css">
<link rel="stylesheet" href="/uniframework/style/displaytag.css">
<link rel="stylesheet" href="/uniframework/style/dhtmlxtabbar.css">
<link rel="stylesheet" href="/uniframework/script/jscalendar/skins/theme.css">
<script src="/uniframework/script/jscalendar/calendar.js"></script>
<script src="/uniframework/script/jscalendar/calendar-setup.js"></script>
<script src="/uniframework/script/jscalendar/calendar-lang.js"></script>
<script src="/uniframework/script/clientValid.js"></script>
<script src="/uniframework/script/provider.js"></script>
<script src="/uniframework/script/enterKeydown.js"></script>
<script src="/uniframework/script/dhtmlxcommon.js"></script>
<script src="/uniframework/script/dhtmlxtabbar.js"></script>
<script src="/uniframework/script/dhtmlxtabbar_start.js"></script>
<link rel="stylesheet" href="/uniframework/style/buttonMenu.css">
<script src="/uniframework/script/buttonMenu.js"></script>
<script src="/uniframework/script/incident_userIncident.js"></script>
<script src="/uniframework/script/incidentAjax.js"></script>
<script type='text/javascript' src='/uniframework/dwr/interface/itsmservicelocator.js'></script>
<script type='text/javascript' src='/uniframework/dwr/engine.js'></script>
<script type='text/javascript' src='/uniframework/dwr/util.js'></script> 
<script type="text/javascript">
/**
 * 清空查詢條件
 */
function clean(form)
{
 form.all("model.configApply.NUMBER").value = "";
 form.all("model.configApply.APPLYER_DEPT_NAME").value = "";
 form.all("model.configApply.APPLER").value = "";
}
function queryReturn(form,frame)
{
    frame.name = "iframe1";
    form.target = frame.name;
 form.action="/uniframework/configuration.action?actName=showReturnQuery&info="+currSeleTabId;
 form.submit();
}

var currSeleTabId='returning';
var selectTab="";
function oninit(tabbarId)
{
 var tabbar = window[tabbarId];
 selectTab=tabbar;
 tabbar.setOnSelectHandler(seleTable_func);
}
function seleTable_func(idn,ido)
{
 currSeleTabId = idn;
 //alert(idn);
 var form=document.form1;
 var number=form.NUMBER.value;
 var name=form.APPLYER.value;
 var address=form.APPLYER_DEPT_NAME.value;
 var url="/uniframework/configuration.action?actName=showReturnQuery&info="+idn;
 var url1="&model.configApply.number="+number+"&model.configApply.APPLYER="+name+"&model.configApply.APPLYER_DEPT_NAME="+address;
 selectTab.setContentHref(idn,encodeURI(url+url1))
 return true;
}

</script>
</head>


<body onLoad="form1.NUMBER.focus();">
<form name="form1" method="post" action="" target="_self">
    <table width="98%" border="0" align="center" cellpadding="0" cellspacing="0">
     <tr>
    <td width="100%" height="22" valign="top">
     <table width="100%" border="0" cellpadding="0" cellspacing="0">
      <tr>
        <td width="100%" height="22" class=table_title_bg070><span class="text_l14"><img src="/uniframework/images/a01.gif" width="19" height="18"><a class="ameth" href="/uniframework/jsp/provider/moduleHomepage.jsp">資產(chǎn)借用申請(qǐng)</a> &gt;</span></td>
         <td width="*" valign="top" background="/uniframework/images/table_title_bg070.gif">&nbsp;</td>
        </tr>
       </table>
      </td>
     </tr>
 </table><br>
 
 <table width="97%" height="40" border="0" cellspacing="0" cellpadding="0">
  <tr>
     <td>
       <fieldset class="fieldset" >
        <legend class="legend"><img src="/uniframework/images/dot12.gif">&nbsp;查詢條件</legend>
        <table class="fieldsettable" height="30" >
       <tr height="30">
        <td class="text17">編號(hào):</td>
        <td class="text18"><input type="text" class="Input12" id="NUMBER" name="model.configApply.NUMBER" value="<ww:property value = "model.configApply.NUMBER"/>" title="請(qǐng)輸入要查詢的編號(hào)"></td>
        <td class="text19">部門:</td>
        <td class="text20">   
            <input name="model.configApply.APPLYER_DEPT_NAME" type="text" class="Input12" id="APPLYER_DEPT_NAME" value="<ww:property value = "model.configApply.APPLYER_DEPT_NAME"/>">
       </tr>  
       <tr height="30">
        <td class="text17">歸還人:</td>
        <td class="text18" colspan="2">    
            <input name="model.configApply.APPLYER" type="text" class="Input12" id="APPLYER" value="<ww:property value = "model.configApply.APPLYER"/>">
          </td>
       </tr>  
      </table>
       </fieldset><br>
       <table width="94%" border="0" cellpadding="0" cellspacing="0">
        <tr height="70%">
         <td width="65%" align="right">
        <button  class="btn3_mouseout btn0"   onclick="queryReturn(form1,document.frames[0])">查 詢</button>
       </td>
       <td width="2%"></td>
                <td width="5%" align="right">
                    <button class="btn3_mouseout btn0" onclick="clean(form1)">重 置</button>
    
       </td>   
                <td width="2%"></td>
                <td width="5%"> 
          <button  class="btn3_mouseout btn0" onclick="self.location='/uniframework/configuration.action?actName=toAddAssetsReturn'">新 增</button>
                </td>
        </tr>
     </table>
   </td>
  </tr>
  <tr>
     <td>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
     <td>
             <div hrefmode="iframe" id="a_tabbar" class="dhtmlxTabBar" imgpath="/uniframework/images/dhTabbarImg/" style="width:98%; height:410px;"  skinColors="#FCFBFC,#F4F3EE" oninit="oninit('a_tabbar');">           
                 <div id="returning" width="100" name="歸還中" href="/uniframework/configuration.action?actName=showReturnQuery&info=initreturn" ></div>
                 <div id="returned" width="100" name="已歸還" href="/uniframework/configuration.action?actName=showReturnQuery&info=returned"></div>
              <div id="no" width="100" name="審批未通過" href="/uniframework/configuration.action?actName=showReturnQuery&info=no"></div>
              <div id="all" width="100" name="所有" href="/uniframework/configuration.action?actName=showReturnQuery&info=all" ></div>
             </div>
     </td>
    </tr>
</table>
   </td>
  </tr>
 </table>
 </form>
</body>

</html>



weesun一米陽光 2008-08-05 10:37 發(fā)表評(píng)論
]]>
checkbox的判斷【收藏】http://www.aygfsteel.com/1504/archive/2008/08/04/219983.htmlweesun一米陽光weesun一米陽光Mon, 04 Aug 2008 08:44:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/04/219983.htmlhttp://www.aygfsteel.com/1504/comments/219983.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/04/219983.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/219983.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/219983.html {
 var chkbox = form.checkbox;
 if(chkbox){
 var chkLength = chkbox.length;
 if (chkLength) {
  for (var i = chkLength-1; i >=0; i--) {
   if (chkbox[i].checked) {
    var cid = chkbox[i].value;
    var row = -1;
    try {
     row = chkbox[i].parentElement.parentElement.rowIndex;
    }
    catch (e) {
    }
    if (row > 0) {
     var tableobj = document.getElementById("CTTable");
     if (tableobj != null) {
      tableobj.deleteRow(row);
     }
    }
   }
  }
 }else{
  //row = chkbox.parentElement.parentElement.rowIndex;
  
 }
 }
 
}

weesun一米陽光 2008-08-04 16:44 發(fā)表評(píng)論
]]>
DWR與Struts整合2007-08-07 【收藏】http://www.aygfsteel.com/1504/archive/2008/08/03/219703.htmlweesun一米陽光weesun一米陽光Sun, 03 Aug 2008 07:34:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/03/219703.htmlhttp://www.aygfsteel.com/1504/comments/219703.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/03/219703.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/219703.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/219703.html1.下載DWR Version 2
https://dwr.dev.java.net/files/documents/2427/47504/dwr.jar

2.安裝DWR,把dwr.jar放到WEB-INF/lib下

web.xml中加入DWRServlet & ActionServlet
其中<load-on-startup>的部分要特別注意,ActionServlet要先初始化,所以數(shù)字要比較小.
  <servlet>    
<servlet-name>action</servlet-name>    
<servlet-class>org.apache.struts.action.ActionServlet
</servlet-class>    
<init-param>      
<param-name>config</param-name>      
<param-value>/WEB-INF/struts-config.xml</param-value>    
</init-param>    
<init-param>      
<param-name>debug</param-name>      
<param-value>2</param-value>    
</init-param>    
<load-on-startup>2</load-on-startup>  
</servlet>  
<servlet-mapping>    
<servlet-name>action</servlet-name>    
<url-pattern>*.do</url-pattern>  
</servlet-mapping>  
<servlet>    
<servlet-name>dwr-invoker</servlet-name>    
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>    
<init-param>      
<param-name>debug</param-name>      
<param-value>true</param-value>    
</init-param>    
<load-on-startup>10</load-on-startup>  
</servlet>  
<servlet-mapping>   
 <servlet-name>dwr-invoker</servlet-name>    
<url-pattern>/dwr/*</url-pattern>  
</servlet-mapping>
dwr.xml中加入struts的設(shè)定,其中formBean的參數(shù)的value值,會(huì)對(duì)應(yīng)到struts-config.xml中<form-beans>的設(shè)定
<dwr> 
<allow>    
<create creator="struts" javascript="testFrm">      
<param name="formBean" value="testActionForm"/>    
</create>  
</allow>  
</dwr>  


struts-config.xml
 
<struts-config>  
<form-beans>    
<form-bean name="testActionForm" type="test.struts.testActionForm" />  
</form-beans>  
<action-mappings>    
<action name="testActionForm" path="/testAction" scope="session" type="test.struts.testAction" validate="false">      
<forward name="display" path="/display.jsp" />    
</action>  
</action-mappings>  
<message-resources parameter="ApplicationResources" />
</struts-config>


testActionForm.java,getDate()會(huì)透過dwr,取得現(xiàn)在最新的日期
 
package test.struts; 
import org.apache.struts.action.*;
import java.util.*; 
public class testActionForm extends ActionForm {     
private String strDate;     
public void setStrDate(String strDate) {        
this.strDate = strDate;    
}     
public String getStrDate() {        
return strDate;    
}    
 //dwr    public String getDate() {        
Date date = new Date();        
return date.toString();   
 } 
}


testAction.java
package test.struts; 
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 org.apache.struts.action.*; 
public class testAction extends Action {    
	public ActionForward execute(ActionMapping mapping, ActionForm form,                                 
HttpServletRequest request,                                 
HttpServletResponse response) {         
testActionForm actionForm = (testActionForm) form;       
 System.out.println(actionForm.getStrDate());        
return mapping.findForward("display");    
}
}



date.jsp,在form的部分,請(qǐng)用struts 的 tag library,我把<html:text property="strDate" size="30" >改成<input type="text" name="strDate">後,無法正常的接受到值.
<%@ page contentType="text/html; charset=Big5" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html><head>
<title>title</title>  
<script type='text/javascript' src='dwr/interface/testFrm.js'></script>  
<script type='text/javascript' src='dwr/engine.js'></script>  
<script type='text/javascript' src='dwr/util.js'></script>
</head>
<SCRIPT LANGUAGE="JavaScript" type=""
function refreshDate() {   
 testFrm.getDate(populateDate)
;} 
function populateDate(data){   
DWRUtil.setValue('strDate', data);
} 
</script> 
<body> 
<html:form action="testAction.do">
date:<html:text property="strDate" size="30" ></html:text> 
<input type="button" onclick="refreshDate();" value="更新日期"/><br/>   
<html:submit>送出  </html:submit>
</html:form></body></html>



display.jsp
<%@ page contentType="text/html; charset=Big5" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
%@page import="test.struts.*"%
<html>
<head>
<title>test</title>
</head><body bgcolor="#ffffff"><h1>您送出的日期:<br>
<bean:write name="testActionForm" property="strDate"/></h1>
</body>
</html>


 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1621900


<script src="http://localhost:82/PromoteIcon.aspx?id=1621900"></script>[收藏到我的網(wǎng)摘]   會(huì)上樹的豬發(fā)表于 2007年05月23日 09:24:00


weesun一米陽光 2008-08-03 15:34 發(fā)表評(píng)論
]]>
struts+hibernate+spring+dwr的一個(gè)小小的DEMO【收藏】http://www.aygfsteel.com/1504/archive/2008/08/03/219702.htmlweesun一米陽光weesun一米陽光Sun, 03 Aug 2008 07:31:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/03/219702.htmlhttp://www.aygfsteel.com/1504/comments/219702.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/03/219702.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/219702.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/219702.html最近無聊,做了一個(gè)DWR的驗(yàn)證和eXtremeTable的應(yīng)用的例子

前期的系統(tǒng)創(chuàng)建、struts、hibernate、spring的集成工作就不用說了,一路下來…………

主要看DWR的應(yīng)用,它用于表單驗(yàn)證:

1、先看它的配置:

(1)在web.xml里加上:

xml 代碼
  1.   <servlet>  
  2.    <servlet-name>dwr-invokerservlet-name>     
  3.    <servlet-class>uk.ltd.getahead.dwr.DWRServletservlet-class>  
  4.      <init-param>  
  5.      <param-name>debugparam-name>  
  6.      <param-value>trueparam-value>  
  7.    init-param>  
  8.     <load-on-startup>1load-on-startup>    
  9.  servlet>     
  10.     
  11.    <servlet-mapping>  
  12.   <servlet-name>dwr-invokerservlet-name>  
  13.   <url-pattern>/dwr/*url-pattern>  
  14. servlet-mapping>  
  15.    

 

(2)再建一個(gè)類,用于獲取驗(yàn)證輸出信息的屬性文件,這個(gè)文件是參考了良葛格 的DWR 入門與應(yīng)用(一)

里的Book代碼

java 代碼

  1. package test.common;   
  2.   
  3. import java.util.ResourceBundle;   
  4.   
  5. public class GetProperties{   
  6.     private ResourceBundle resource;   
  7.        
  8.     public GetProperties()   
  9.     {   
  10.            
  11.                               resource = ResourceBundle.getBundle("dwrPro");   
  12.      }   
  13.                
  14.     public String getDescription(String key)    
  15.     {   
  16.        return resource.getString(key);   
  17.     }   
  18.   
  19. }  

(3)編寫屬性文件dwrPro_zh_CN.propertie(中文)和dwr_en.properties(英文)

java 代碼
  1. username_hasUsed = 用戶名已用,請(qǐng)選擇別的用戶名   
  2. username_canUse  = 恭喜!用戶名可以使用   
  3.   
  4. username_hasUsed =username has used!   
  5. username_canUse  = username can use!  

 

(4)配置dwr.xml,里面用了spring的bean 和java類

xml 代碼
  1. <dwr>  
  2.   
  3.   <allow>  
  4.      <create creator="spring" javascript="userManager">  
  5.         <param name="beanName" value="userManager"/>  
  6.        <include method="findUserIsExist"/>  
  7.     create>  
  8.        
  9.   <create creator="new" javascript="User" scope="application">  
  10.             <param name="class" value="test.common.GetProperties"/>  
  11.         create>         
  12.   allow>  
  13. dwr>  

spring beanName  的value =“userManager”從applicationContext.xml里取得

xml 代碼
  1. <bean id="userManagerTarget" class="test.spring.serviceImpl.UserServiceImpl">  
  2. <property name="userDao">  
  3.   <ref bean="userDao"/>  
  4. property>  
  5. bean>  
  6.        
  7.        
  8.  <bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">  
  9.     <property name="proxyInterfaces">  
  10.     <value>test.spring.service.IUserServicevalue>  
  11.     property>  
  12.     <property name="interceptorNames">  
  13.        <list>    
  14.         <idref bean="transactionInterceptor"/>    
  15.           <idref bean="userManagerTarget"/>  
  16.        list>  
  17.     property>       
  18.  bean>   

這里應(yīng)該大家都懂,就不羅嗦了

 

(5)配好了這些,就可以在頁面里用了

java 代碼
  1.   
  2.   
  3.   
  4. "-//W3C//DTD HTML 4.01 Transitional//EN">   
  5.   
  6.      
  7.        
  8.        
  9.        
  10.        
  11.          
  12.      interface/userManager.js'>   
  13.        
  14.      interface/GetProperties.js'>   
  15.        
  16.     
  17.     }   
  18.        
  19.        
  20.        
  21.        
  22.      
  23.      
  24.      
  25.        
  26.       "0">   
  27.            
  28.              Login:   
  29.              "text" name="user.name" id="username" onblur="checkName()"/>"check_username">   
  30.            
  31.            
  32.              Password:   
  33.              "password" name="user.password" id="username" onblur="checkpassword()"/>"check_password">   
  34.            
  35.            
  36.           "2" align="center">   
  37.            
  38.          
  39.     
  40.      

 

這里當(dāng)填了Login框,當(dāng)光標(biāo)從輸入框移開時(shí)就實(shí)行了

js 代碼
  1. function checkName()   
  2.     {   
  3.         var username = document.userForm.username.value;   
  4.         userManager.findUserIsExist(username,callback);   
  5.     }  

 

userManager.findUserIsExist(username,callback)時(shí)關(guān)鍵,這里就用了

 

 

讀取dwr.xml的userManager,然后讀取applicationContext.xml里userManager  bean ,進(jìn)而實(shí)行findUserIsExist方法。

 



]]>
使用 CAS 在 Tomcat 中實(shí)現(xiàn)單點(diǎn)登錄http://www.aygfsteel.com/1504/archive/2008/08/03/219699.htmlweesun一米陽光weesun一米陽光Sun, 03 Aug 2008 07:19:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/03/219699.htmlhttp://www.aygfsteel.com/1504/comments/219699.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/03/219699.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/219699.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/219699.html轉(zhuǎn)自:http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/index.html
文檔選項(xiàng)

未顯示需要 JavaScript 的文檔選項(xiàng)

將打印機(jī)的版面設(shè)置成橫向打印模式

打印本頁

將此頁作為電子郵件發(fā)送

將此 頁作為電子郵件發(fā)送


級(jí) 別: 初級(jí)

張 濤 (zzhangt@cn.ibm.com), 軟件工程師, IBM
王 秉坤 (wangbk@cn.ibm.com), 軟件工程師, IBM

2008 年 4 月 10 日

單點(diǎn)登錄(Single Sign On , 簡稱 SSO )是目前比較流行的服務(wù)于企業(yè)業(yè)務(wù)整合的解決方案之一, SSO 使得在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。CAS(Central Authentication Service)是一款不錯(cuò)的針對(duì) Web 應(yīng)用的單點(diǎn)登錄框架,本文介紹了 CAS 的原理、協(xié)議、在 Tomcat 中的配置和使用,對(duì)于采用 CAS 實(shí)現(xiàn)輕量級(jí)單點(diǎn)登錄解決方案的入門讀者具有一定指導(dǎo)作用。

CAS 介紹

CAS 是 Yale 大學(xué)發(fā)起的一個(gè)開源項(xiàng)目,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄方法,CAS 在 2004 年 12 月正式成為 JA-SIG 的一個(gè)項(xiàng)目。CAS 具有以下特點(diǎn):

  • 開源的企業(yè)級(jí)單點(diǎn)登錄解決方案。
  • CAS Server 為需要獨(dú)立部署的 Web 應(yīng)用。
  • CAS Client 支持非常多的客戶端(這里指單點(diǎn)登錄系統(tǒng)中的各個(gè) Web 應(yīng)用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

CAS 原理和協(xié)議

從結(jié)構(gòu)上看,CAS 包含兩個(gè)部分: CAS Server 和 CAS Client。CAS Server 需要獨(dú)立部署,主要負(fù)責(zé)對(duì)用戶的認(rèn)證工作;CAS Client 負(fù)責(zé)處理對(duì)客戶端受保護(hù)資源的訪問請(qǐng)求,需要登錄時(shí),重定向到 CAS Server。圖1 是 CAS 最基本的協(xié)議過程:


圖 1. CAS 基礎(chǔ)協(xié)議
CAS 基礎(chǔ)協(xié)議

CAS Client 與受保護(hù)的客戶端應(yīng)用部署在一起,以 Filter 方式保護(hù)受保護(hù)的資源。對(duì)于訪問受保護(hù)資源的每個(gè) Web 請(qǐng)求,CAS Client 會(huì)分析該請(qǐng)求的 Http 請(qǐng)求中是否包含 Service Ticket,如果沒有,則說明當(dāng)前用戶尚未登錄,于是將請(qǐng)求重定向到指定好的 CAS Server 登錄地址,并傳遞 Service (也就是要訪問的目的資源地址),以便登錄成功過后轉(zhuǎn)回該地址。用戶在第 3 步中輸入認(rèn)證信息,如果登錄成功,CAS Server 隨機(jī)產(chǎn)生一個(gè)相當(dāng)長度、唯一、不可偽造的 Service Ticket,并緩存以待將來驗(yàn)證,之后系統(tǒng)自動(dòng)重定向到 Service 所在地址,并為客戶端瀏覽器設(shè)置一個(gè) Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新產(chǎn)生的 Ticket 過后,在第 5,6 步中與 CAS Server 進(jìn)行身份合適,以確保 Service Ticket 的合法性。

在該協(xié)議中,所有與 CAS 的交互均采用 SSL 協(xié)議,確保,ST 和 TGC 的安全性。協(xié)議工作過程中會(huì)有 2 次重定向的過程,但是 CAS Client 與 CAS Server 之間進(jìn)行 Ticket 驗(yàn)證的過程對(duì)于用戶是透明的。

另外,CAS 協(xié)議中還提供了 Proxy (代理)模式,以適應(yīng)更加高級(jí)、復(fù)雜的應(yīng)用場(chǎng)景,具體介紹可以參考 CAS 官方網(wǎng)站上的相關(guān)文檔。

準(zhǔn)備工作

本文中的例子以 tomcat5.5 為例進(jìn)行講解,下載地址:

http://tomcat.apache.org/download-55.cgi

到 CAS 官方網(wǎng)站下載 CAS Server 和 Client,地址分別為:

http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip

http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip





回頁首


部署 CAS Server

CAS Server 是一套基于 Java 實(shí)現(xiàn)的服務(wù),該服務(wù)以一個(gè) Java Web Application 單獨(dú)部署在與 servlet2.3 兼容的 Web 服務(wù)器上,另外,由于 Client 與 CAS Server 之間的交互采用 Https 協(xié)議,因此部署 CAS Server 的服務(wù)器還需要支持 SSL 協(xié)議。當(dāng) SSL 配置成功過后,像普通 Web 應(yīng)用一樣將 CAS Server 部署在服務(wù)器上就能正常運(yùn)行了,不過,在真正使用之前,還需要擴(kuò)展驗(yàn)證用戶的接口。

在 Tomcat 上部署一個(gè)完整的 CAS Server 主要按照以下幾個(gè)步驟:

配置 Tomcat 使用 Https 協(xié)議

如果希望 Tomcat 支持 Https,主要的工作是配置 SSL 協(xié)議,其配置過程和配置方法可以參考 Tomcat 的相關(guān)文檔。不過在生成證書的過程中,會(huì)有需要用到主機(jī)名的地方,CAS 建議不要使用 IP 地址,而要使用機(jī)器名或域名。

部署 CAS Server

CAS Server 是一個(gè) Web 應(yīng)用包,將前面下載的 cas-server-3.1.1-release.zip 解開,把其中的 cas-server-webapp-3.1.1.war 拷貝到 tomcat的 webapps 目錄,并更名為 cas.war。由于前面已配置好 tomcat 的 https 協(xié)議,可以重新啟動(dòng) tomcat,然后訪問:https://localhost:8443/cas ,如果能出現(xiàn)正常的 CAS 登錄頁面,則說明 CAS Server 已經(jīng)部署成功。

雖然 CAS Server 已經(jīng)部署成功,但這只是一個(gè)缺省的實(shí)現(xiàn),在實(shí)際使用的時(shí)候,還需要根據(jù)實(shí)際概況做擴(kuò)展和定制,最主要的是擴(kuò)展認(rèn)證 (Authentication) 接口和 CAS Server 的界面。

擴(kuò)展認(rèn)證接口

CAS Server 負(fù)責(zé)完成對(duì)用戶的認(rèn)證工作,它會(huì)處理登錄時(shí)的用戶憑證 (Credentials) 信息,用戶名/密碼對(duì)是最常見的憑證信息。CAS Server 可能需要到數(shù)據(jù)庫檢索一條用戶帳號(hào)信息,也可能在 XML 文件中檢索用戶名/密碼,還可能通過 LDAP Server 獲取等,在這種情況下,CAS 提供了一種靈活但統(tǒng)一的接口和實(shí)現(xiàn)分離的方式,實(shí)際使用中 CAS 采用哪種方式認(rèn)證是與 CAS 的基本協(xié)議分離開的,用戶可以根據(jù)認(rèn)證的接口去定制和擴(kuò)展。

擴(kuò)展 AuthenticationHandler

CAS 提供擴(kuò)展認(rèn)證的核心是 AuthenticationHandler 接口,該接口定義如清單 1 下:


清單 1. AuthenticationHandler定義
                
public interface AuthenticationHandler {
/**
* Method to determine if the credentials supplied are valid.
* @param credentials The credentials to validate.
* @return true if valid, return false otherwise.
* @throws AuthenticationException An AuthenticationException can contain
* details about why a particular authentication request failed.
*/
boolean authenticate(Credentials credentials) throws AuthenticationException;
/**
* Method to check if the handler knows how to handle the credentials
* provided. It may be a simple check of the Credentials class or something
* more complicated such as scanning the information contained in the
* Credentials object.
* @param credentials The credentials to check.
* @return true if the handler supports the Credentials, false othewrise.
*/
boolean supports(Credentials credentials);
}

該接口定義了 2 個(gè)需要實(shí)現(xiàn)的方法,supports ()方法用于檢查所給的包含認(rèn)證信息的Credentials 是否受當(dāng)前 AuthenticationHandler 支持;而 authenticate() 方法則擔(dān)當(dāng)驗(yàn)證認(rèn)證信息的任務(wù),這也是需要擴(kuò)展的主要方法,根據(jù)情況與存儲(chǔ)合法認(rèn)證信息的介質(zhì)進(jìn)行交互,返回 boolean 類型的值,true 表示驗(yàn)證通過,false 表示驗(yàn)證失敗。

CAS3中還提供了對(duì)AuthenticationHandler 接口的一些抽象實(shí)現(xiàn),比如,可能需要在執(zhí)行authenticate() 方法前后執(zhí)行某些其他操作,那么可以讓自己的認(rèn)證類擴(kuò)展自清單 2 中的抽象類:


清單 2. AbstractPreAndPostProcessingAuthenticationHandler定義
                
public abstract class AbstractPreAndPostProcessingAuthenticationHandler
implements AuthenticateHandler{
protected Log log = LogFactory.getLog(this.getClass());
protected boolean preAuthenticate(final Credentials credentials) {
return true;
}
protected boolean postAuthenticate(final Credentials credentials,
final boolean authenticated) {
return authenticated;
}
public final boolean authenticate(final Credentials credentials)
throws AuthenticationException {
if (!preAuthenticate(credentials)) {
return false;
}
final boolean authenticated = doAuthentication(credentials);
return postAuthenticate(credentials, authenticated);
}
protected abstract boolean doAuthentication(final Credentials credentials)
throws AuthenticationException;
}


AbstractPreAndPostProcessingAuthenticationHandler 類新定義了 preAuthenticate() 方法和 postAuthenticate() 方法,而實(shí)際的認(rèn)證工作交由 doAuthentication() 方法來執(zhí)行。因此,如果需要在認(rèn)證前后執(zhí)行一些額外的操作,可以分別擴(kuò)展 preAuthenticate()和 ppstAuthenticate() 方法,而 doAuthentication() 取代 authenticate() 成為了子類必須要實(shí)現(xiàn)的方法。

由于實(shí)際運(yùn)用中,最常用的是用戶名和密碼方式的認(rèn)證,CAS3 提供了針對(duì)該方式的實(shí)現(xiàn),如清單 3 所示:


清單 3. AbstractUsernamePasswordAuthenticationHandler 定義
                
public abstract class AbstractUsernamePasswordAuthenticationHandler extends
AbstractPreAndPostProcessingAuthenticationHandler{
...
protected final boolean doAuthentication(final Credentials credentials)
throws AuthenticationException {
return authenticateUsernamePasswordInternal((UsernamePasswordCredentials) credentials);
}
protected abstract boolean authenticateUsernamePasswordInternal(
final UsernamePasswordCredentials credentials) throws AuthenticationException;
protected final PasswordEncoder getPasswordEncoder() {
return this.passwordEncoder;
}
public final void setPasswordEncoder(final PasswordEncoder passwordEncoder) {
this.passwordEncoder = passwordEncoder;
}
...
}

基于用戶名密碼的認(rèn)證方式可直接擴(kuò)展自 AbstractUsernamePasswordAuthenticationHandler,驗(yàn)證用戶名密碼的具體操作通過實(shí)現(xiàn) authenticateUsernamePasswordInternal() 方法達(dá)到,另外,通常情況下密碼會(huì)是加密過的,setPasswordEncoder() 方法就是用于指定適當(dāng)?shù)募用芷鳌?/p>

從以上清單中可以看到,doAuthentication() 方法的參數(shù)是 Credentials 類型,這是包含用戶認(rèn)證信息的一個(gè)接口,對(duì)于用戶名密碼類型的認(rèn)證信息,可以直接使用 UsernamePasswordCredentials,如果需要擴(kuò)展其他類型的認(rèn)證信息,需要實(shí)現(xiàn)Credentials接口,并且實(shí)現(xiàn)相應(yīng)的 CredentialsToPrincipalResolver 接口,其具體方法可以借鑒 UsernamePasswordCredentials 和 UsernamePasswordCredentialsToPrincipalResolver。

JDBC 認(rèn)證方法

用戶的認(rèn)證信息通常保存在數(shù)據(jù)庫中,因此本文就選用這種情況來介紹。將前面下載的 cas-server-3.1.1-release.zip 包解開后,在 modules 目錄下可以找到包 cas-server-support-jdbc-3.1.1.jar,其提供了通過 JDBC 連接數(shù)據(jù)庫進(jìn)行驗(yàn)證的缺省實(shí)現(xiàn),基于該包的支持,我們只需要做一些配置工作即可實(shí)現(xiàn) JDBC 認(rèn)證。

JDBC 認(rèn)證方法支持多種數(shù)據(jù)庫,DB2, Oracle, MySql, Microsoft SQL Server 等均可,這里以 DB2 作為例子介紹。并且假設(shè)DB2數(shù)據(jù)庫名: CASTest,數(shù)據(jù)庫登錄用戶名: db2user,數(shù)據(jù)庫登錄密碼: db2password,用戶信息表為: userTable,該表包含用戶名和密碼的兩個(gè)數(shù)據(jù)項(xiàng)分別為 userName 和 password。

1. 配置 DataStore

打開文件 %CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xml,添加一個(gè)新的 bean 標(biāo)簽,對(duì)于 DB2,內(nèi)容如清單 4 所示:


清單 4. 配置 DataStore
                
<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.ibm.db2.jcc.DB2Driver</value>
</property>
<property name="url">
<value>jdbc:db2://9.125.65.134:50000/CASTest</value>
</property>
<property name="username">
<value>db2user</value>
</property>
<property name="password">
<value>db2password</value>
</property>
</bean>


其中 id 屬性為該 DataStore 的標(biāo)識(shí),在后面配置 AuthenticationHandler 會(huì)被引用,另外,需要提供 DataStore 所必需的數(shù)據(jù)庫驅(qū)動(dòng)程序、連接地址、數(shù)據(jù)庫登錄用戶名以及登錄密碼。

2. 配置 AuthenticationHandler

在 cas-server-support-jdbc-3.1.1.jar 包中,提供了 3 個(gè)基于 JDBC 的 AuthenticationHandler,分別為 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler。其中 BindModeSearchDatabaseAuthenticationHandler 是用所給的用戶名和密碼去建立數(shù)據(jù)庫連接,根據(jù)連接建立是否成功來判斷驗(yàn)證成功與 否;QueryDatabaseAuthenticationHandler 通過配置一個(gè) SQL 語句查出密碼,與所給密碼匹配;SearchModeSearchDatabaseAuthenticationHandler 通過配置存放用戶驗(yàn)證信息的表、用戶名字段和密碼字段,構(gòu)造查詢語句來驗(yàn)證。

使用哪個(gè) AuthenticationHandler,需要在 deployerConfigContext.xml 中設(shè)置,默認(rèn)情況下,CAS 使用一個(gè)簡單的 username=password 的 AuthenticationHandler,在文件中可以找到如下一行:<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePassword
AuthenticationHandler" />,我們可以將其注釋掉,換成我們希望的一個(gè) AuthenticationHandler,比如,使用QueryDatabaseAuthenticationHandler 或 SearchModeSearchDatabaseAuthenticationHandler 可以分別選取清單 5 或清單 6 的配置。


清單 5. 使用 QueryDatabaseAuthenticationHandler
                
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref=" casDataSource " />
<property name="sql"
value="select password from userTable where lower(userName) = lower(?)" />
</bean>


清單 6. 使用 SearchModeSearchDatabaseAuthenticationHandler
                
<bean id="SearchModeSearchDatabaseAuthenticationHandler"
class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="tableUsers">
<value>userTable</value>
</property>
<property name="fieldUser">
<value>userName</value>
</property>
<property name="fieldPassword">
<value>password</value>
</property>
<property name="dataSource" ref=" casDataSource " />
</bean>


另外,由于存放在數(shù)據(jù)庫中的密碼通常是加密過的,所以 AuthenticationHandler 在匹配時(shí)需要知道使用的加密方法,在 deployerConfigContext.xml 文件中我們可以為具體的 AuthenticationHandler 類配置一個(gè) property,指定加密器類,比如對(duì)于 QueryDatabaseAuthenticationHandler,可以修改如清單7所示:


清單 7. 添加 passwordEncoder
                
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref=" casDataSource " />
<property name="sql"
value="select password from userTable where lower(userName) = lower(?)" />
<property name="passwordEncoder" ref="myPasswordEncoder"/>
</bean>


其中 myPasswordEncoder 是對(duì)清單 8 中設(shè)置的實(shí)際加密器類的引用:


清單 8. 指定具體加密器類
                
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.MyPasswordEncoder"/>

這里 MyPasswordEncoder 是根據(jù)實(shí)際情況自己定義的加密器,實(shí)現(xiàn) PasswordEncoder 接口及其 encode() 方法。

3. 部署依賴包

在以上配置完成以后,需要拷貝幾個(gè)依賴的包到 cas 應(yīng)用下,包括:

  • 將 cas-server-support-jdbc-3.1.1.jar 拷貝到 %CATALINA_HOME%/webapps/cas/ WEB-INF/lib 目錄。
  • 數(shù)據(jù)庫驅(qū)動(dòng),由于這里使用 DB2,將 %DB2_HOME%/java 目錄下的 db2java.zip (更名為 db2java.jar), db2jcc.jar, db2jcc_license_cu.jar 拷貝到 %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目錄。對(duì)于其他數(shù)據(jù)庫,同樣將相應(yīng)數(shù)據(jù)庫驅(qū)動(dòng)程序拷貝到該目錄。
  • DataStore 依賴于 commons-collections-3.2.jar, commons-dbcp-1.2.1.jar, commons-pool-1.3.jar,需要到 apache 網(wǎng)站的 Commons 項(xiàng)目下載以上 3 個(gè)包放進(jìn) %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目錄。

擴(kuò)展 CAS Server 界面

CAS 提供了 2 套默認(rèn)的頁面,分別為“ default ”和“ simple ”,分別在目錄“ cas/WEB-INF/view/jsp/default ”和“ cas/WEB-INF/view/jsp/simple ”下。其中 default 是一個(gè)稍微復(fù)雜一些的頁面,使用 CSS,而 simple 則是能讓 CAS 正常工作的最簡化的頁面。

在部署 CAS 之前,我們可能需要定制一套新的 CAS Server 頁面,添加一些個(gè)性化的內(nèi)容。最簡單的方法就是拷貝一份 default 或 simple 文件到“ cas/WEB-INF/view/jsp ”目錄下,比如命名為 newUI,接下來是實(shí)現(xiàn)和修改必要的頁面,有 4 個(gè)頁面是必須的:

  • casConfirmView.jsp: 當(dāng)用戶選擇了“ warn ”時(shí)會(huì)看到的確認(rèn)界面
  • casGenericSuccess.jsp: 在用戶成功通過認(rèn)證而沒有目的Service時(shí)會(huì)看到的界面
  • casLoginView.jsp: 當(dāng)需要用戶提供認(rèn)證信息時(shí)會(huì)出現(xiàn)的界面
  • casLogoutView.jsp: 當(dāng)用戶結(jié)束 CAS 單點(diǎn)登錄系統(tǒng)會(huì)話時(shí)出現(xiàn)的界面

CAS 的頁面采用 Spring 框架編寫,對(duì)于不熟悉 Spring 的使用者,在修改之前需要熟悉該框架。

頁面定制完過后,還需要做一些配置從而讓 CAS 找到新的頁面,拷貝“ cas/WEB-INF/classes/default_views.properties ”,重命名為“ cas/WEB-INF/classes/ newUI_views.properties ”,并修改其中所有的值到相應(yīng)新頁面。最后是更新“ cas/WEB-INF/cas-servlet.xml ”文件中的 viewResolver,將其修改為如清單 9 中的內(nèi)容。


清單 9. 指定 CAS 頁面
                
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:order="0">
<property name="basenames">
<list>
<value>${cas.viewResolver.basename}</value>
<value> newUI_views</value>
</list>
</property>
</bean>





回頁首


部署客戶端應(yīng)用

單點(diǎn)登錄的目的是為了讓多個(gè)相關(guān)聯(lián)的應(yīng)用使用相同的登錄過程,本文在講解過程中構(gòu)造 2個(gè)簡單的應(yīng)用,分別以 casTest1 和 casTest2 來作為示例,它們均只有一個(gè)頁面,顯示歡迎信息和當(dāng)前登錄用戶名。這 2 個(gè)應(yīng)用使用同一套登錄信息,并且只有登錄過的用戶才能訪問,通過本文的配置,實(shí)現(xiàn)單點(diǎn)登錄,即只需登錄一次就可以訪問這兩個(gè)應(yīng)用。

與 CAS Server 建立信任關(guān)系

假設(shè) CAS Server 單獨(dú)部署在一臺(tái)機(jī)器 A,而客戶端應(yīng)用部署在機(jī)器 B 上,由于客戶端應(yīng)用與 CAS Server 的通信采用 SSL,因此,需要在 A 與 B 的 JRE 之間建立信任關(guān)系。

首先與 A 機(jī)器一樣,要生成 B 機(jī)器上的證書,配置 Tomcat 的 SSL 協(xié)議。其次,下載http://blogs.sun.com/andreas/entry/no_more_unable_to_find 的 InstallCert.java,運(yùn)行“ java InstallCert compA:8443 ”命令,并且在接下來出現(xiàn)的詢問中輸入 1。這樣,就將 A 添加到了 B 的 trust store 中。如果多個(gè)客戶端應(yīng)用分別部署在不同機(jī)器上,那么每個(gè)機(jī)器都需要與 CAS Server 所在機(jī)器建立信任關(guān)系。

配置 CAS Filter

準(zhǔn)備好應(yīng)用 casTest1 和 casTest2 過后,分別部署在 B 和 C 機(jī)器上,由于 casTest1 和casTest2,B 和 C 完全等同,我們以 casTest1 在 B 機(jī)器上的配置做介紹,假設(shè) A 和 B 的域名分別為 domainA 和 domainB。

將 cas-client-java-2.1.1.zip 改名為 cas-client-java-2.1.1.jar 并拷貝到 casTest1/WEB-INF/lib目錄下,修改 web.xml 文件,添加 CAS Filter,如清單 10 所示:


清單 10. 添加 CAS Filter
                
<web-app>
...
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
<param-value>https://domainA:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://domainA:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>domainB:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/protected-pattern/*</url-pattern>
</filter-mapping>
...
</web-app>


對(duì)于所有訪問滿足 casTest1/protected-pattern/ 路徑的資源時(shí),都要求到 CAS Server 登錄,如果需要整個(gè) casTest1 均受保護(hù),可以將 url-pattern 指定為“/*”。

從清單 10 可以看到,我們可以為 CASFilter 指定一些參數(shù),并且有些是必須的,表 格 1表 格 2 中分別是必需和可選的參數(shù):


表格 1. CASFilter 必需的參數(shù)
參數(shù)名 作用
edu.yale.its.tp.cas.client.filter.loginUrl 指定 CAS 提供登錄頁面的 URL
edu.yale.its.tp.cas.client.filter.validateUrl 指定 CAS 提供 service ticket 或 proxy ticket 驗(yàn)證服務(wù)的 URL
edu.yale.its.tp.cas.client.filter.serverName 指定客戶端的域名和端口,是指客戶端應(yīng)用所在機(jī)器而不是 CAS Server 所在機(jī)器,該參數(shù)或 serviceUrl 至少有一個(gè)必須指定
edu.yale.its.tp.cas.client.filter.serviceUrl 該參數(shù)指定過后將覆蓋 serverName 參數(shù),成為登錄成功過后重定向的目的地址


表格 2. CASFilter 可選參數(shù)
參數(shù)名 作用
edu.yale.its.tp.cas.client.filter.proxyCallbackUrl 用于當(dāng)前應(yīng)用需要作為其他服務(wù)的代理(proxy)時(shí)獲取 Proxy Granting Ticket 的地址
edu.yale.its.tp.cas.client.filter.authorizedProxy 用于允許當(dāng)前應(yīng)用從代理處獲取 proxy tickets,該參數(shù)接受以空格分隔開的多個(gè) proxy URLs,但實(shí)際使用只需要一個(gè)成功即可。當(dāng)指定該參數(shù)過后,需要修改 validateUrl 到 proxyValidate,而不再是 serviceValidate
edu.yale.its.tp.cas.client.filter.renew 如果指定為 true,那么受保護(hù)的資源每次被訪問時(shí)均要求用戶重新進(jìn)行驗(yàn)證,而不管之前是否已經(jīng)通過
edu.yale.its.tp.cas.client.filter.wrapRequest 如果指定為 true,那么 CASFilter 將重新包裝 HttpRequest,并且使 getRemoteUser() 方法返回當(dāng)前登錄用戶的用戶名
edu.yale.its.tp.cas.client.filter.gateway 指定 gateway 屬性

傳遞登錄用戶名

CAS 在登錄成功過后,會(huì)給瀏覽器回傳 Cookie,設(shè)置新的到的 Service Ticket。但客戶端應(yīng)用擁有各自的 Session,我們要怎么在各個(gè)應(yīng)用中獲取當(dāng)前登錄用戶的用戶名呢?CAS Client 的 Filter 已經(jīng)做好了處理,在登錄成功后,就可以直接從 Session 的屬性中獲取,如清單 11 所示:


清單 11. 在 Java 中通過 Session 獲取登錄用戶名
                
// 以下兩者都可以
session.getAttribute(CASFilter.CAS_FILTER_USER);
session.getAttribute("edu.yale.its.tp.cas.client.filter.user");


在 JSTL 中獲取用戶名的方法如清單 12 所示:


清單 12. 通過 JSTL 獲取登錄用戶名
                
<c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/>

另外,CAS 提供了一個(gè) CASFilterRequestWrapper 類,該類繼承自HttpServletRequestWrapper,主要是重寫了 getRemoteUser() 方法,只要在前面配置 CASFilter 的時(shí)候?yàn)槠湓O(shè)置“ edu.yale.its.tp.cas.client.filter.wrapRequest ”參數(shù)為 true,就可以通過 getRemoteUser() 方法來獲取登錄用戶名,具體方法如清單 13 所示:


清單 13. 通過 CASFilterRequestWrapper 獲取登錄用戶名
                
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
out.println("The logon user:" + reqWrapper.getRemoteUser());





回頁首


效果

在 casTest1 和 casTest2 中,都有一個(gè)簡單 Servlet 作為歡迎頁面 WelcomPage,且該頁面必須登錄過后才能訪問,頁面代碼如清單 14 所示:


清單 14. WelcomePage 頁面代碼
                
public class WelcomePage extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Welcome to casTest2 sample System!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Welcome to casTest1 sample System!</h1>");
CASFilterRequestWrapper reqWrapper=new CASFilterRequestWrapper(request);
out.println("<p>The logon user:" + reqWrapper.getRemoteUser() + "</p>");
HttpSession session=request.getSession();
out.println("<p>The logon user:" +
session.getAttribute(CASFilter.CAS_FILTER_USER) + "</p>");
out.println("<p>The logon user:" +
session.getAttribute("edu.yale.its.tp.cas.client.filter.user") + "</p>");
out.println("</body>");
out.println("</html>");
}
}


在上面所有配置結(jié)束過后,分別在 A, B, C上啟動(dòng) cas, casTest1 和 casTest2,按照下面步驟來訪問 casTest1 和 casTest2:

  1. 打開瀏覽器,訪問 http://domainB:8080/casTest1/WelcomePage ,瀏覽器會(huì)彈出安全提示,接受后即轉(zhuǎn)到 CAS 的登錄頁面,如圖 2 所示:

圖 2. CAS 登錄頁面
CAS 登錄頁面
  1. 登錄成功后,再重定向到 casTest1 的 WelcomePage 頁面,如 所示:

圖 3. 登錄后訪問 casTest1 的效果
登錄后訪問 casTest1 的效果

可以看到 中地址欄里的地址多出了一個(gè) ticket 參數(shù),這就是 CAS 分配給當(dāng)前應(yīng)用的 ST(Service Ticket)。

  1. 再在同一個(gè)瀏覽器的地址欄中輸入 http://domainC:8080/casTest2/WelcomePage ,系統(tǒng)不再提示用戶登錄,而直接出現(xiàn)如圖 4 所示的頁面,并且顯示在 casTest1 中已經(jīng)登錄過的用戶。

圖 4. 在 casTest1 中登錄過后訪問 casTest2 的效果
在 casTest1 中登錄過后訪問 casTest2 的效果
  1. 重新打開一個(gè)瀏覽器窗口,先輸入 http://domainC:8080/casTest2/WelcomePage ,系統(tǒng)要求登錄,在登錄成功過后,正確顯示 casTest2 的頁面。之后再在地址欄重新輸入 http://domainB:8080/casTest1/WelcomePage ,會(huì)直接顯示 casTest1 的頁面而無需再次登錄。




回頁首


結(jié)束語

本文介紹了 CAS 單點(diǎn)登錄解決方案的原理,并結(jié)合實(shí)例講解了在 Tomcat 中使用 CAS 的配置、部署方法以及效果。CAS 是作為開源單點(diǎn)登錄解決方案的一個(gè)不錯(cuò)選擇,更多的使用細(xì)節(jié)可以參考 CAS 官方網(wǎng)站。



參考資料



作者簡介


張濤,IBM 中國軟件開發(fā)實(shí)驗(yàn)室工程師,目前主要致力于基于 Rational 平臺(tái)解決方案的開發(fā)。



王秉坤,IBM 中國軟件開發(fā)實(shí)驗(yàn)室工程師,目前主要致力于基于 Rational 平臺(tái)解決方案的開發(fā)。




weesun一米陽光 2008-08-03 15:19 發(fā)表評(píng)論
]]>
一個(gè)簡單的DWR例子[收藏]http://www.aygfsteel.com/1504/archive/2008/08/03/219696.htmlweesun一米陽光weesun一米陽光Sun, 03 Aug 2008 07:00:00 GMThttp://www.aygfsteel.com/1504/archive/2008/08/03/219696.htmlhttp://www.aygfsteel.com/1504/comments/219696.htmlhttp://www.aygfsteel.com/1504/archive/2008/08/03/219696.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/219696.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/219696.html什么是DWR?

   DWR是一個(gè)Open Source的 java項(xiàng)目。DWR可以讓JavaScript調(diào)用運(yùn)行在Web服務(wù)器里面的JAVA程序。簡單一點(diǎn)或者專業(yè)一點(diǎn)就是Easy AJAX for JAVA.

下面將一步一步的介紹怎么完成一個(gè)簡單DEMO

1,從官方網(wǎng)站下載DWR https://dwr.dev.java.net/files/documents/2427/32252/dwr.war 把他直接放到TOMCAT_HOME/webapps 下面

2,編寫一個(gè)Java類如下:

   DWRTest.java

 package com.test.ajax;

/**
 *
 * @author 方見華
 *
 */
public class DWRTest {
 public DWRTest(){
  
 }
 public String getMyName(){
  return "James Fang";
 }
}
 

3, 把DRWTest類配置在dwr.xml中,dwr.xml是DWR的配置文件,所有需要在JavaScript中調(diào)用的java的類都必須在這個(gè)文件中描述 。這個(gè)文件的位于TOMCAT_HOME/webapps/dwr/WEB-INF/dwr.xml. 在<allow>標(biāo)簽中添加以下內(nèi)容

    <create creator="new" javascript="MyTest" scope="application">
      <param name="class" value="com.test.ajax.DWRTest"/>
    </create>

4, 編寫調(diào)用DWRTest類 getMyName的方法的HTML文件,test.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " <html>
<head>
  <title>DWR - My First AJAX</title>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <script type='text/javascript' src='/dwr/dwr/interface/MyTest.js'></script>
  <script type='text/javascript' src='/dwr/dwr/engine.js'></script>
  <script type='text/javascript' src='/dwr/dwr/util.js'></script>
  <script language="javascript">
   var mycall=function callBack(data){
   DWRUtil.setValue("demo1",data);
   
   }
   function showMyName(){
    MyTest.getMyName(mycall); 
   }

   function clearName(){
    demo1.value=""; 
   }
  </script>
  </head>
<body>
<h1>Ajax Test Page</h1>
<input type="button" value="setMyName" onclick="javascript:showMyName()"><input type="button" value="Clear" onclick="javascript:clearName()"><br>
<input type="text" id="demo1"></select><br>
</body></html>

 5, 運(yùn)行,在瀏覽器中輸入 http://localhost:8080/dwr/test.html



weesun一米陽光 2008-08-03 15:00 發(fā)表評(píng)論
]]>
javascript中獲取radio值得方法 【收藏】http://www.aygfsteel.com/1504/archive/2008/07/30/218614.htmlweesun一米陽光weesun一米陽光Wed, 30 Jul 2008 02:37:00 GMThttp://www.aygfsteel.com/1504/archive/2008/07/30/218614.htmlhttp://www.aygfsteel.com/1504/comments/218614.htmlhttp://www.aygfsteel.com/1504/archive/2008/07/30/218614.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/218614.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/218614.htmlRadio 是 HTML 中的單選框,同一個(gè) form 中,name 相同的 Radio 構(gòu)成一組,這一組中最多只允許有一個(gè) Radio 被選中。

如果將 form 提交到服務(wù)器端 ASP 程序,ASP 程序要獲得用戶選擇的那個(gè) Radio 的 value 是非常方便的,用 request.Form("RadioName"),不必理會(huì)有幾個(gè) Radio。

但在 JS(JavaScript) 中就要復(fù)雜多了,我們不能像對(duì)其它元素(如:文本框)一樣,使用 formid.objName.value 來取值,我們應(yīng)該循環(huán)這個(gè)組的 Radio,判斷其 checked 屬性,再取值。

為了方便使用javascript獲取radio的值,我寫了一個(gè)通用的函數(shù)來實(shí)現(xiàn):

function GetRadioValue(RadioName){
    var obj;   
    obj=document.getElementsByName(RadioName);
    if(obj!=null){
        var i;
        for(i=0;i<obj.length;i++){
            if(obj[i].checked){
                return obj[i].value;           
            }
        }
    }
    return null;
}

比如,我們有一個(gè)name屬性為:“myradio”的單選控件組,要得到選中的值,只需這樣調(diào)用就可以了:

var RValue;

RValue=GetRadioValue("myradio");

如果沒有給出的radioname控件,則直接返回null,或者這一組控件沒有被選擇的項(xiàng),則也返回null。



weesun一米陽光 2008-07-30 10:37 發(fā)表評(píng)論
]]>
利用Javascript獲得和設(shè)置FCKeditor值[收藏]http://www.aygfsteel.com/1504/archive/2008/07/30/218613.htmlweesun一米陽光weesun一米陽光Wed, 30 Jul 2008 02:36:00 GMThttp://www.aygfsteel.com/1504/archive/2008/07/30/218613.htmlhttp://www.aygfsteel.com/1504/comments/218613.htmlhttp://www.aygfsteel.com/1504/archive/2008/07/30/218613.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/218613.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/218613.html利用Javascript取和設(shè)FCKeditor值也是非常容易的,如下:

// 獲取編輯器中HTML內(nèi)容
function getEditorHTMLContents(EditorName) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName);
    return(oEditor.GetXHTML(true));
}

// 獲取編輯器中文字內(nèi)容
function getEditorTextContents(EditorName) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName);
    return(oEditor.EditorDocument.body.innerText);
}

// 設(shè)置編輯器中內(nèi)容
function SetEditorContents(EditorName, ContentStr) {
    var oEditor = FCKeditorAPI.GetInstance(EditorName) ;
    oEditor.SetHTML(ContentStr) ;
}

FCKeditorAPI是FCKeditor加載后注冊(cè)的一個(gè)全局對(duì)象,利用它我們就可以完成對(duì)編輯器的各種操作。

在當(dāng)前頁獲得 FCK 編輯器實(shí)例:
var Editor = FCKeditorAPI.GetInstance('InstanceName');

從 FCK 編輯器的彈出窗口中獲得 FCK 編輯器實(shí)例:
var Editor = window.parent.InnerDialogLoaded().FCK;

從框架頁面的子框架中獲得其它子框架的 FCK 編輯器實(shí)例:
var Editor = window.FrameName.FCKeditorAPI.GetInstance('InstanceName');

從頁面彈出窗口中獲得父窗口的 FCK 編輯器實(shí)例:
var Editor = opener.FCKeditorAPI.GetInstance('InstanceName');

獲得 FCK 編輯器的內(nèi)容:
oEditor.GetXHTML(formatted); // formatted 為:true|false,表示是否按HTML格式取出
也可用:
oEditor.GetXHTML();

設(shè)置 FCK 編輯器的內(nèi)容:
oEditor.SetHTML("content", false); // 第二個(gè)參數(shù)為:true|false,是否以所見即所得方式設(shè)置其內(nèi)容。此方法常用于"設(shè)置初始值"或"表單重置"哦作。

插入內(nèi)容到 FCK 編輯器:
oEditor.InsertHtml("html"); // "html"為HTML文本

檢查 FCK 編輯器內(nèi)容是否發(fā)生變化:
oEditor.IsDirty();

在 FCK 編輯器之外調(diào)用 FCK 編輯器工具條命令:
命令列表如下:
DocProps, Templates, Link, Unlink, Anchor, BulletedList, NumberedList, About, Find, Replace, Image, Flash, SpecialChar, Smiley, Table, TableProp, TableCellProp, UniversalKey, Style, FontName, FontSize, FontFormat, Source, Preview, Save, NewPage, PageBreak, TextColor, BGColor, PasteText, PasteWord, TableInsertRow, TableDeleteRows, TableInsertColumn, TableDeleteColumns, TableInsertCell, TableDeleteCells, TableMergeCells, TableSplitCell, TableDelete, Form, Checkbox, Radio, TextField, Textarea, HiddenField, Button, Select, ImageButton, SpellCheck, FitWindow, Undo, Redo

使用方法如下:
oEditor.Commands.GetCommand('FitWindow').Execute();

= FCKConfig.BasePath + 'plugins/'  
// FCKConfig.Plugins.Add( 'placeholder', 'en,it' ) ;


去 掉//后,就相當(dāng)于把placeholder這個(gè)插件功能加上了,fckeditor的插件文件都在/editor/plugins/文件夾下分類按文件 夾放置的,對(duì)于fckeditor2.0來說,里面有兩個(gè)文件夾,也就是有兩個(gè)官方插件,placeholder這個(gè)文件夾就是我們剛才加上去的,主要用 于多參數(shù)或單參數(shù)自定義標(biāo)簽的匹配,這個(gè)在制作編輯模板時(shí)非常管用,要想看具體實(shí)例的話,大家可以去
下載acms 這個(gè)系統(tǒng)查看學(xué)習(xí),另一個(gè)文件夾tablecommands就是編輯器里的表格編輯用到的了。當(dāng)然,如果你想制作自己其它用途的插件,那就只要按照 fckeidtor插件的制作規(guī)則制作完放置在/editor/plugins/下就行,然后再在fckeidtor.js里再添加 FCKConfig.Plugins.Add('Plugin Name',',lang,lang');就可以了。

第二部分 ,如何讓編輯器一打開的時(shí)候,編輯工具條不出現(xiàn),等點(diǎn)“展開工具欄”時(shí)才出現(xiàn)?Easy,F(xiàn)CKeditor本身提供了這個(gè)功能啦,打開fckconfig.js,找到

FCKConfig.ToolbarStartExpanded = true ;
改成
FCKConfig.ToolbarStartExpanded = false ;
就可以啦!

第三部分,使用自己的表情圖標(biāo),同樣打開fckcofnig.js到最底部那一段


FCKConfig.SmileyPath = FCKConfig.BasePath + 'images/smiley/msn/' ;
FCKConfig.SmileyImages = ['regular_smile.gif','sad_smile.gif','wink_smile.gif'] ;
FCKConfig.SmileyColumns = 8 ;
FCKConfig.SmileyWindowWidth    = 320 ;
FCKConfig.SmileyWindowHeight = 240 ;

上面這段已經(jīng)是我修改過的了,為了我發(fā)表此文的版面不會(huì)被撐得太開,我把FCKConfig.SmileyImages那一行改得只有三個(gè)表情圖了。

第一行,當(dāng)然是表情圖標(biāo)路徑的設(shè)置,第二行是相關(guān)表情圖標(biāo)文件名的一個(gè)List,第三行是指彈出的表情添加窗口最每行的表情數(shù),下面兩個(gè)參數(shù)是彈出的模態(tài)窗口的寬和高嘍。

第四部分,文件上傳管理部分

此部分可能是大家最為關(guān)心的,上一篇文章簡單的講了如何修改來上傳文件以及使用fckeidtor2.0才提供的快速上傳功能。再我們繼續(xù)再深層次的講解上傳功能

FCKConfig.LinkBrowser = true ;
FCKConfig.ImageBrowser = true ;
FCKConfig.FlashBrowser = true ;在fckconfig.js找到這三句,這三句不是連著的哦,只是我把他們集中到這兒來了,設(shè)置為true的意思就是允許使用fckeditor來瀏覽 服務(wù)器端的文件圖像以及flash等,這個(gè)功能是你插入圖片時(shí)彈出的窗口上那個(gè)“瀏覽服務(wù)器”按鈕可以體現(xiàn)出來,如果你的編輯器只用來自己用或是只在后臺(tái) 管理用,這個(gè)功能無疑很好用,因?yàn)樗屇愫苤庇^地對(duì)服務(wù)器的文件進(jìn)行上傳操作。但是如果你的系統(tǒng)要面向前臺(tái)用戶或是像blog這樣的系統(tǒng)要用的話,這個(gè)安 全隱患可就大了哦。于是我們把其一律設(shè)置為false;如下

FCKConfig.LinkBrowser = false ;
FCKConfig.ImageBrowser = false ;
FCKConfig.FlashBrowser = false ;

這樣一來,我們就只有快速上傳可用了啊,好!接下來就來修改,同樣以asp為范例進(jìn)行,進(jìn)入/editor/filemanager/upload/asp/打開config.asp,修改
ConfigUserFilesPath = "/UserFiles/"這個(gè)設(shè)置是上傳文件的總目錄,我這里就不動(dòng)了,你想改自己改了

好,再打開此目錄下的upload.asp文件,找到下面這一段


Dim resourceType
If ( Request.QueryString("Type") <> "" ) Then
resourceType = Request.QueryString("Type")
Else
resourceType = "File"
End If
然后再在其后面添加


ConfigUserFilesPath = ConfigUserFilesPath & resourceType &"/"& Year(Date()) &"/"& Month(Date()) &"/"
這樣的話,上傳的文件就進(jìn)入“/userfiles/文件類型(如image或file或flash)/年/月/”這樣的文件夾下了,這個(gè)設(shè)置對(duì)單用戶來用已經(jīng)足夠了,如果你想給多用戶系統(tǒng)用,那就這樣來改


ConfigUserFilesPath = ConfigUserFilesPath & Session("username") & resourceType &"/"& Year(Date()) &"/"& Month(Date()) &"/"
這樣上傳的文件就進(jìn)入“/userfiles/用戶目錄/文件類型/年/月/”下了,當(dāng)然如果你不想這么安排也可以修改成別的,比如說用戶目錄再深一層等,這里的Session("username")請(qǐng)根據(jù)自己的需要進(jìn)行修改或換掉。

上傳的目錄設(shè)置完了,但是上傳程序還不會(huì)自己創(chuàng)建這些文件夾,如果不存在的話,上傳不會(huì)成功的,那么我們就得根據(jù)上面的上傳路徑的要求進(jìn)行遞歸來生成目錄了。

找到這一段


Dim sServerDir
sServerDir = Server.MapPath( ConfigUserFilesPath )
If ( Right( sServerDir, 1 ) <> "\" ) Then
    sServerDir = sServerDir & "\"
End If

把它下面的這兩行


Dim oFSO
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
用下面這一段代碼來替換


dim arrPath,strTmpPath,intRow
strTmpPath = ""
arrPath = Split(sServerDir, "\")
Dim oFSO
Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
for intRow = 0 to Ubound(arrPath)
    strTmpPath = strTmpPath & arrPath(intRow) & "\"
    if oFSO.folderExists(strTmpPath)=false then
     oFSO.CreateFolder(strTmpPath)
    end if
next
用這段代碼就可以生成你想要的文件夾了,在上傳的時(shí)候自動(dòng)生成。

好 了,上傳文件的修改到現(xiàn)在可以暫時(shí)告一段落了,但是,對(duì)于中文用戶還存在這么個(gè)問題,就是fckeditor的文件上傳默認(rèn)是不改名的,同時(shí)還不支持中文 文件名,這樣一來是上傳的文件會(huì)變成“.jpg”這樣的無法讀的文件,再就是會(huì)有重名文件,當(dāng)然重名這點(diǎn)倒沒什么,因?yàn)閒ckeditor會(huì)自動(dòng)改名,會(huì) 在文件名后加(1)這樣來進(jìn)行標(biāo)識(shí)。但是,我們通常的習(xí)慣是讓程序自動(dòng)生成不重復(fù)的文件名

在剛才那一段代碼的下面緊接著就是
' Get the uploaded file name.
sFileName = oUploader.File( "NewFile" ).Name
看清楚了,這個(gè)就是文件名啦,我們來把它改掉,當(dāng)然得有個(gè)生成文件名的函數(shù)才行,改成下面這樣

'//取得一個(gè)不重復(fù)的序號(hào)
Public Function GetNewID()
dim ranNum
dim dtNow
randomize
dtNow=Now()
ranNum=int(90000*rnd)+10000
GetNewID=year(dtNow) & right("0" & month(dtNow),2) & right("0" & day(dtNow),2) & right("0" & hour(dtNow),2) & right("0" & minute(dtNow),2) & right("0" & second(dtNow),2) & ranNum
End Function

' Get the uploaded file name.
sFileName = GetNewID() &"."& split(oUploader.File( "NewFile" ).Name,".")(1)

這樣一來,上傳的文件就自動(dòng)改名生成如20050802122536365.jpg這樣的文件名了,是由年月日時(shí)分秒以及三位隨機(jī)數(shù)組成的文件名了


weesun一米陽光 2008-07-30 10:36 發(fā)表評(píng)論
]]>
AJAX和Struts的action交互使用[原創(chuàng)總結(jié)] http://www.aygfsteel.com/1504/archive/2008/06/18/208949.htmlweesun一米陽光weesun一米陽光Wed, 18 Jun 2008 09:47:00 GMThttp://www.aygfsteel.com/1504/archive/2008/06/18/208949.htmlhttp://www.aygfsteel.com/1504/comments/208949.htmlhttp://www.aygfsteel.com/1504/archive/2008/06/18/208949.html#Feedback0http://www.aygfsteel.com/1504/comments/commentRss/208949.htmlhttp://www.aygfsteel.com/1504/services/trackbacks/208949.html1.請(qǐng)求頁面的JS,客戶端實(shí)現(xiàn)
<script type="text/javascript">
 var flagvalue=0;
 var rest="";
 var resta="";
 //實(shí)現(xiàn)AJAX驗(yàn)證
 var http_request = false;
 var infoForm_flag=false;
 var lotId="";
function Save()
{
   
      var infoForm=document.projectSetForm;
      infoForm_flag=infoForm;
      lotId=infoForm.lotId.value;
      //表名稱
      var dc = infoForm.tablename.value;
      if(dc==""||dc==null){
       alert("表名稱不能為空!");
       infoForm.tablename.focus();
       infoForm.tablename.select();
       return false;
 }
function send_request(url)
  {//初始化、指定處理函數(shù)、發(fā)送請(qǐng)求的函數(shù)
    http_request = false;
    //開始初始化XMLHttpRequest對(duì)象
    if(window.XMLHttpRequest)
    { //Mozilla 瀏覽器
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType)
      {//設(shè)置MiME類別
           http_request.overrideMimeType('text/xml');
      }
    }
    else if (window.ActiveXObject)
    { // IE瀏覽器
      try
      {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
      }
       catch (e)
      {
        try
        {
             http_request = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (e)
        {
        }
      }
    }
    if (!http_request) { // 異常,創(chuàng)建對(duì)象實(shí)例失敗
     window.alert("不能創(chuàng)建XMLHttpRequest對(duì)象實(shí)例.");
     return false;
    }
    http_request.onreadystatechange = processRequest;
    // 確定發(fā)送請(qǐng)求的方式和URL以及是否同步執(zhí)行下段代碼
    http_request.open("GET", url, true);
    http_request.send(null);
  }
     //處理返回信息的函數(shù)
     function processRequest()
     {
         if (http_request.readyState == 4)
         {
             //判斷對(duì)象狀態(tài)
             if (http_request.status == 200)
             {
                 //信息已經(jīng)成功返回,開始處理信息
                 var str=http_request.responseText;//獲得從服務(wù)器返回的文本信息
                 if(str=="no")
                 {
                     alert("您選擇了模型分屬不同的模板,請(qǐng)選擇同一模板對(duì)應(yīng)是模型!");
                     //return false;
                     infoForm_flag.action="projectSet.do?do=add&lotId="+lotId;
                     infoForm_flag.submit();
                 }
                 else
                 {
                  infoForm_flag.action="projectSet.do?do=creattable&save=-1";
               infoForm_flag.submit();
              }
             } else
             {
                 //頁面不正常
                 alert("您所請(qǐng)求的頁面有異常。");
             }
         }
     }
  function userCheck()
  {
    send_request('projectSet.do?do=check&rest='+rest);
  }
</script>
2.ProjectSetAction.java

package com.gpdi.softevaluate.action;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProjectSetAction extends DispatchAction
{
         

/**
  * <p>模板驗(yàn)證</p>
  * @param mapping
  * @param form
  * @param request
  * @param response
  * @return
  * @throws Exception
  */
 public ActionForward check(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
 {
   String rest="";
   String lotId="";
   String retn="";
   String flag="";
   CommDaoFactory mgObj = new CommDaoFactory();
   try
   {
       rest=request.getParameter("rest");
       lotId=request.getParameter("lotId");
   }
   catch(Exception e)
   {
   
   }
if(!rest.equals("0")||!rest.equals("")||rest!=null)
 {
     flag="no";
}
else
{
      flag="ok";

}
       PrintWriter out=response.getWriter();
//服務(wù)器返回信息
       out.write(flag);
       out.close();
     //讀取本Action所有的請(qǐng)求參數(shù),將path重新構(gòu)造,加上請(qǐng)求參數(shù)

     //ActionForward forward= new ActionForward("project/projectSet.do?do=add&lotId=6");
     //forward.setRedirect(true);
      //傳參數(shù)后返回
     //return forward;    
    return mapping.findForward(null);
 
 }
public ActionForward creattable(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
{
     //實(shí)現(xiàn)功能代碼
return mapping.findForward("create");
}

}
3.struts.config.xml
 <action attribute="projectSetForm" name="projectSetForm"
    parameter="do" path="/project/projectSet" scope="request"
       type="com.gpdi.softevaluate.action.ProjectSetAction" validate="false">
   <forward name="list" path="/project/viewProject.jsp" />
   <forward name="add" path="/project/addProject.jsp" />
   <forward name="create" path="/project/createTable.jsp" />
  </action>



weesun一米陽光 2008-06-18 17:47 發(fā)表評(píng)論
]]>
主站蜘蛛池模板: 毕节市| 阳西县| 晋城| 平罗县| 兰州市| 天水市| 宁陵县| 宜丰县| 洛宁县| 汽车| 伊金霍洛旗| 舞钢市| 方城县| 巴东县| 康定县| 大竹县| 连州市| 南澳县| 安溪县| 霍邱县| 临安市| 三河市| 牟定县| 兴文县| 江阴市| 同仁县| 北川| 绵竹市| 东辽县| 八宿县| 吉水县| 武安市| 横峰县| 尼勒克县| 黔西县| 健康| 高碑店市| 胶南市| 邓州市| 隆子县| 外汇|