当柳上原的风吹向天际的时候...

真正的快乐来源于创造

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks

#

类代码:
/*************************
*
*   Class:CheckItem
*   2009.08.23
**************************/
//-- Contructor
function CheckItem(textboxName,msg,validChar,isRequired){
    this.textboxName=textboxName;
    this.msg=msg;
    this.validChar=validChar;
    this.isRequired=isRequired;
}

/*************************
*
*   Class:FormChecker
*   2009.08.23
**************************/
//-- Contructor
function FormChecker(){
    this.checkItemArray=new Array;
}

//-- Add a check Item to array
FormChecker.prototype.addCheckItem=function(textboxName,msg,validChar,isRequired){
    var checkItem=new CheckItem(textboxName,msg,validChar,isRequired);
    this.checkItemArray[this.checkItemArray.length]=checkItem;
}

//-- Check text field in the form 
FormChecker.prototype.checkTextBox=function(checkItem){
    var validChar=checkItem.validChar;
    var isRequired=checkItem.isRequired;
    var inputValue=$(checkItem.textboxName).value;
    
    if(isRequired!="true" && inputValue.length
<1){
        return true;
    }
    else{
        var regexStr
="^"+validChar+"$";
        var regex
=new RegExp(regexStr);
        return regex.test(inputValue);
    }
}

//-- judge the validation of a form
FormChecker.prototype.isValid
=function(){
    
for(var i=0;i<this.checkItemArray.length;i++){
        
var    toBeCheckedObj=this.checkItemArray[i];
        
        
var checkResult=this.checkTextBox(toBeCheckedObj);
        
        
if(checkResult==true){
            
continue;
        }
        else{        
            alert(toBeCheckedObj.msg);
            $(toBeCheckedObj.textboxName).focus();
            
            return false;
        }                
    }

    return true;
}


页面代码:
/*****************************************************
* 窗口载入时调用的启动函数
*****************************************************/
var formChecker;
window.onload=function(){
    // 设置主菜单的当前菜单项
    setMainmenuCurrentItem(0);
    
    // 设置侧边菜单的当前菜单项
    setSidemenuCurrentItemByText("合同起草");
    
    // 取得合同类别的数据
    // 填充下拉列表框数据
    new TypeListbox("contractTypeFirst","0","contractTypeSecond","");
    new TypeListbox("contractTypeSecond",$("contractTypeFirst").value,"contractTypeThird","");
    
    // var today=getToday();
    // $("createTime").value=today; // 屏蔽了合同起草时间,故这里也屏蔽。何杨,2011年5月6日9:20:34
    // $("maintenanceEndTime").value=today;
    
    // 初始化检查项
    formChecker=new FormChecker();
    formChecker.addCheckItem("contractName","请输入一到一百位的合同名",".{1,100}","true");
    formChecker.addCheckItem("contractTypeThird","请点击下拉列表框依次选择合同类别",".{1,100}","true");
    formChecker.addCheckItem("contractAmount","请输入数字形式的合同总金额(金额限制百亿内)","([0-9]{1})(\\d{0,9})","true");
    formChecker.addCheckItem("vendorName","请点击右边图标选择合同对方名称。",".{1,}","true");
    formChecker.addCheckItem("fulfillCycle","请输入数字形式的合同履行期限,以月为单位(最多十位数字)","([1-9]{1})(\\d{0,9})","true");
    formChecker.addCheckItem("maintenanceStartTime","请点击右边的按钮选择模板选择维保起始日期","(\\d{4})-(\\d{1,2})-(\\d{1,2})","false");
    formChecker.addCheckItem("maintenanceEndTime","请点击右边的按钮选择模板选择维保结束日期","(\\d{4})-(\\d{1,2})-(\\d{1,2})","false");
    
    formChecker.addCheckItem("contractBriefFile","请输入零到五百字的合同所属项目概况或依据的文件",".{1,500}","false");
    formChecker.addCheckItem("contractDecision","请输入零到一千字的项目决策过程",".{1,1000}","false");
    formChecker.addCheckItem("remark","请输入零到两百五十个字的补充说明",".{1,250}","false");
    formChecker.addCheckItem("maintenanceDescription","请输入零到一千个字的维保描述",".{1,1000}","false");
}

/*********************************************************************
*  得到表单的检查结果
*  何杨,2011-4-17 14:31:40
*********************************************************************/
function getCheckResult(){
    // 进行页面输入检查
    if(formChecker.isValid()==false){
        return false;
    }
    
    // 维保起始日期
    var maintenanceStartTime=$("maintenanceStartTime").value;
    
    // 维保结束日期
    var maintenanceEndTime=$("maintenanceEndTime").value;
    
    // 维保起始日期和维保结束日期做比较
    if(isNotEmptyString(maintenanceStartTime)==true && isNotEmptyString(maintenanceEndTime)==true){
        if(isReasonable(maintenanceStartTime,maintenanceEndTime)==false){
            alert("维保结束日期必须晚于维保起始日期.");
            $("maintenanceEndTime").focus();
            return false;
        }
    }
    
    return true;
}
posted @ 2011-05-23 08:58 何杨 阅读(232) | 评论 (0)编辑 收藏



js类代码:
/*************************************
*
*   Class:ContractTypeListboxOne
*   2011-5-18 20:08:00
**************************************/
//-- 构造函数
function TypeListbox(id,parentId,nextId,nextParentId){
    this.id=id;
    this.parentId=parentId;
    this.nextId=nextId;
    this.nextParentId=nextParentId;
    
    this.init();
    this.fillData($(this.id),parentId);
}

//-- 初始化
TypeListbox.prototype.init=function(){
    var ctrl=$(this.id);
    var me=this;
        
    ctrl.onchange=function(){
        me.changeEvent();
    }    
}

//-- 变化事件
TypeListbox.prototype.changeEvent=function(){
    var ctrl=$(this.id);
    
    if(this.nextId.length>0 && this.nextId!="none"){
        this.fillData($(this.nextId),ctrl.value);
    }
}

//-- 填充数据
TypeListbox.prototype.fillData=function(myListbox,parentId){
    /*if(parentId.length
<|| parentId=="none"){
        
return;
    }*/

    var url
=encodeURI('GetContractType.do?parentId='+parentId);
    
url=encodeURI(url);
    
    
new Ajax.Request(url,{     
           method:'get',     
           onSuccess: function(ajaxObj){    
                  // alert(ajaxObj.responseText);  
                var status
=ajaxObj.responseXML.getElementsByTagName("status")[0].firstChild.data;
                                
                
if(status=="ok"){
                    
// 返回正确信息

                    // 找到所有节点放入数组,为避免麻烦,节点名统一都设置成node比较好,不用实例变了,这里就要改变一次。
                    var arr
=ajaxObj.responseXML.getElementsByTagName("node");
                    
var length=arr.length;

                    
for(var i=myListbox.options.length-1;i>=0;i--){
                        myListbox.remove(i);
                    }
                    
                    var newOption=new Option;
                    newOption.value="";
                    newOption.text="--请选择--";
                    myListbox.add(newOption);

                    if(length>0){
                        // 遍历这个数组
                        for(var i=0;i
<length;i++){
                            var node
=arr[i];
                                                
                            
var id=node.getElementsByTagName("id")[0].firstChild.data;
                            
var name=node.getElementsByTagName("name")[0].firstChild.data;
                            
                            
var newOption=new Option;
                            newOption.value
=id;
                            
newOption.text=name;
                            
myListbox.add(newOption);
                        }
                    }
                    
                    myListbox.selectedIndex
=0;
                    
myListbox.fireEvent("onchange");
                }
                else{
                    // 返回错误信息
                    var text
=ajaxObj.responseXML.getElementsByTagName("text")[0].firstChild.data;
                    
alert(text);
                }
           },     
           onFailure: function(){ 
               alert("无法取得服务器的响应");
           }   
        }
      ); 
}


页面下拉列表框:

<tr>

<td width="100%" colspan="10">

<div class="inputText">

<label for="classOneCbo">合同类别:</label>

<select id="classOneCbo">

<option value="" selected>--请选择--</option>

</select>

<font color="#003366">-</font>

<select id="classTwoCbo">

<option value="" selected>--请选择--</option>

</select>

<font color="#003366">-</font>

<select id="classThreeCbo">

<option value="" selected>--请选择--</option>

</select>

</div>

</td>

</tr>


页面JS初始化代码:

/*****************************************************

* 窗口载入时调用的启动函数

* 何杨,2011年4月22日16:59:16

*****************************************************/

window.onload=function(){

// 设置主菜单的当前菜单项

setMainmenuCurrentItem(0);

// 设置侧边菜单的当前菜单项

setSidemenuCurrentItemByText("待办事项");

// 填充下拉列表框数据

new TypeListbox("classOneCbo","0","classTwoCbo","");

new TypeListbox("classTwoCbo",$("classOneCbo").value,"classThreeCbo","");

// 开始检索初始数据

search(0);

}




posted @ 2011-05-19 14:50 何杨 阅读(635) | 评论 (1)编辑 收藏

<html>
    
<head>
        
<title>test</title>
    
</head>
    
<body>
        
<select id="mySelect">
            
<option value="1">地球</option>
            
<option value="2">火星</option>
            
<option value="3">木卫二</option>
            
<option value="4">冥王星</option>
            
<option value="5">参宿四</option>
            
<option value="6">人马座</option>
        
</select>
    
</body>
</html>

<script language="javascript">
<!--
window.onload
=function(){
    
var listBox=new ListBox("mySelect");
    
}


function $(id){
    
return document.getElementById(id);
}


//-- 类构造函数
function ListBox(id){
    
this.id=id;
    
this.init();    
}

//--类的初始化函数,将控件的onchange事件交给类的changeEvent事件处理
ListBox.prototype.init=function(){
    
var ctrl=$(this.id);
    
var me=this;
        
    ctrl.onchange
=function(){
        me.changeEvent();
    }

    
}

// onchange事件产生时弹出下拉列表控件的值
ListBox.prototype.changeEvent=function(){
    
var ctrl=$(this.id);
    alert(ctrl.value);
}

//-->
</script>
posted @ 2011-05-19 08:15 何杨 阅读(207) | 评论 (0)编辑 收藏

一般来说,出现这种异常是因为传递给远程方法的参数不能实例化所致,比如有一个参数是复合类型,里面包括Calendar,Date,BigDecimal等形式的数据,需要把这些非基本类型的数据new出来赋值,然后再调用就好办了。基本类型和String等数据则不用理会。



posted @ 2011-04-09 21:16 何杨 阅读(7733) | 评论 (0)编辑 收藏

Table.stock tr{
    onmouseover 
: expression(onmouseover=function (){this.style.backgroundColor ='#b3ddfb'}); 
    onmouseout  : expression(onmouseout=function () 
{this.style.backgroundColor =''});
}
posted @ 2011-03-30 19:51 何杨 阅读(366) | 评论 (0)编辑 收藏

一.以目录形式打开某个较深不易记忆的目录。
explorer  path
例子:explorer C:\Program Files\IBM\SDP70\runtimes\base_v61\profiles\AppSrv01\logs\server1

二.控制台方式进入某个目录。
在此目录下建一个bat文件,里面只写cmd三个字。然后创建快捷方式到桌面就可以了。

posted @ 2011-03-16 23:38 何杨 阅读(213) | 评论 (0)编辑 收藏

将程序从一个容器换到另一个容器,总会有各种意料之外的困难需要解决,近日本人需要将一个Web工程从Tomcat环境转移到WebSphere环境,经历了一番周折,特地将此经过记录下来,也许它能对将要进行如此经历的人其一点帮助作用,另外在此也向网络同仁和工作中的同事表示感谢。

原环境:
程序:SSH
容器:Tomcat6.0
数据库:MySql5

新环境:
程序:SSH
容器:WebSphere6.1
数据库:Oracle10g

移植过程中的第一个困难,是WebSphere不认识Web.xml中的Struts taglib.原文字(适用于Tomcat)如下:
<!-- Struts的TLDS -->
    
<taglib>
        
<taglib-uri>/WEB-INF/tld/app.tld</taglib-uri>
        
<taglib-location>/WEB-INF/tld/app.tld</taglib-location>
    
</taglib>

    
<!-- Struts Tag Library Descriptors -->
    
<taglib>
        
<taglib-uri>/WEB-INF/tld/struts-bean.tld</taglib-uri>
        
<taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>
    
</taglib>

    
<taglib>
        
<taglib-uri>/WEB-INF/tld/struts-html.tld</taglib-uri>
        
<taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
    
</taglib>

    
<taglib>
        
<taglib-uri>/WEB-INF/tld/struts-logic.tld</taglib-uri>
        
<taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>
    
</taglib>

这个问题因为之前有所准备,在网络上找到了答案,将上述文字包在<jsp-config>节点中即可,修改后(对Tomcat和WebSphere均适用)的文字如下:
<!-- Struts的TLDS -->
    
<jsp-config>
        
<taglib>
            
<taglib-uri>/WEB-INF/tld/app.tld</taglib-uri>
            
<taglib-location>/WEB-INF/tld/app.tld</taglib-location>
        
</taglib>

        
<!-- Struts Tag Library Descriptors -->
        
<taglib>
            
<taglib-uri>/WEB-INF/tld/struts-bean.tld</taglib-uri>
            
<taglib-location>
                /WEB-INF/tld/struts-bean.tld
            
</taglib-location>
        
</taglib>

        
<taglib>
            
<taglib-uri>/WEB-INF/tld/struts-html.tld</taglib-uri>
            
<taglib-location>
                /WEB-INF/tld/struts-html.tld
            
</taglib-location>
        
</taglib>

        
<taglib>
            
<taglib-uri>/WEB-INF/tld/struts-logic.tld</taglib-uri>
            
<taglib-location>
                /WEB-INF/tld/struts-logic.tld
            
</taglib-location>
        
</taglib>
    
</jsp-config>

如此处理后,首页显示出来了,随即翻页遇到了问题,在IE中是翻页出现404错误,在FF中好一点,它告诉我WebSphere无法解析struts配置文件struts-config.xml。
起初我以为是中文问题,删除struts-config.xml中所有中文注释问题依旧,接下来在网络中寻找,还真有和我遇到一样问题的难友,但没人提出解决方案,正在挠头之际,我们的PM忽然说是否JDK不一致,检查一下,本机用的是1.6,而WebSphere自带1.5的,将本机也调成1.5后,问题解决! 真是只有咒语能解开咒语。

再下来,在表单提交时遇到了乱码问题,这是因为之前听信网络意见,将Web.xml中的filter都去掉了,结果自然乱码。此时感觉网络传闻未必可信,于是将filter又重新加上,乱码没有了。看来不经亲自尝试而盲从网络传闻是要吃亏的。

再下来,程序要访问数据库了,于是在WebSphere6.1中设置了数据源,再在Spring配置文件中进行了设置,如下:
<bean id="dataSource"
        class
="org.springframework.jndi.JndiObjectFactoryBean">
        
<property name="jndiName"
            value
="java:comp/env/jdbc/*******DS">
        
</property>
</bean> 


这样写在Tomcat中好用,在WebSphere不好用,正在挠头之际,PM告我别的项目有同样的写法,于是一看,java:comp/env/这部分是不需要的,直接把数据源JNDI名写在Value中就可以了。
<bean id="dataSource"
        class
="org.springframework.jndi.JndiObjectFactoryBean">
        
<property name="jndiName"
            value
="jdbc/*******DS">
        
</property>
</bean> 

其它数据库移植的问题就交给了Hibernate。至此问题全部解决。

事后来看,WebSphere6.1对中文,SSH的支持还是很好的,只是有些特定的地方和传统的Tomcat中的项目不太一样,注意一下就好了,未必有想象中的困难。遇到困难时,向有同样经历的人请教比自己在网络上搜寻要快很多。
posted @ 2011-03-16 22:43 何杨 阅读(408) | 评论 (2)编辑 收藏

下载地址:
http://www.blogjava.net/Files/heyang/RSAWebServiceSample.zip

posted @ 2011-03-16 00:30 何杨 阅读(237) | 评论 (0)编辑 收藏

     摘要:   第一部分:页面中JavaScript的写法:   function isSoleContractName(contractNameTextBox){                 var&nb...  阅读全文
posted @ 2011-03-14 11:35 何杨 阅读(364) | 评论 (0)编辑 收藏

第一部分:Web.Xml中ContextLoaderListener的相关配置
在工程目录下的\WebContent\WEB-INF\web.xml中,我们可以发现以下配置:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-*.xml</param-value>
</context-param>

 

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

以上第一段XML中,contextConfigLocation参数定义了要载入Spring上下文的配置文件,这里采用了通配符的方式,也可以通过逗号符来分隔多个文件。
以上第二段XML定义了一个监听器,它适用于Servlet2.3及其以上版本,这个监听器会随着WebApp的启动而启动,并加载contextConfigLocation参数中定义好的Spring配置文件。若是在Servlet2.3以下版本中,则需要定义org.springframework.web.context.ContextLoaderServlet来载入配置文件。

第二部分:Action Bean的配置
接下来我们需要将Struts2的Action交给Spring管理,以com.heyang.module.contract.action. CheckSoleContractNameAction类为例,它在Spring配置文件\WebContent\WEB-INF\applicationContext-action.xml中的相应配置为:

<bean id="checkSoleContractNameAction"   class="com.heyang.module.contract.action.CheckSoleContractNameAction" singleton="false">
        
<property name="contractService">
            
<ref bean="contractService"/>
        
</property>
</bean>

由上面的XML知道,如果我们取得名为checkSoleContractNameAction的bean,Spring将通过反射调用一个com.heyang.module.contract.action.CheckSoleContractNameAction类的实例,并将一个名为contractService的bean注入进去,当然CheckSoleContractNameAction需要拥有此属性并具备对应的setter/getter。

第三部分:在Struts配置文件中将url映射到Spring上下文中的bean
这种方式是通过指定<action>的class属性为Spring配置文件中相应bean的id值来做到的,再以CheckSoleContractNameAction为例,它在Struts2配置文件WebContent\WEB-INF\struts-cfg\contract\struts.xml中的相应设置为:
<action name="checkSoleContractName" class="checkSoleContractNameAction" method="execute"/>
这样,当页面中url有对应用上下文/contract/checkSoleContractName.action?...
时,com.heyang.module.contract.action.CheckSoleContractNameAction类的execute方法将会来处理用户的请求。注意,这段url中,应用上下文是WebApp Context,contract是action所在包的名称空间,checkSoleContractName则是action的name。

至此,Struts2和Spring的整合配置讲述完毕。

第四部分:Struts2与Spring的整合原理
在\WebContent\WEB-INF\lib\下存在一个struts2-spring-plugin-2.0.9.jar,这个插件包的作用是通过覆盖(override)Struts2的ObjectFactory来增强核心框架对象的创建。当Struts2需要根据配置文件创建一个Action的时候,它会用Struts2配置文件中的class属性去和Spring配置文件中的id属性进行关联,如果能找到,则由Spring创建;否则由Struts 2框架自身创建。这个功能是通过插件提供的两个拦截器实现的,默认情况下框架使用的自动装配策略是name,也就是说框架会去Spring中寻找与Action属性名字相同的bean,可选的装配策略还有:type、auto、constructor等。

第五部分:Spring与Hibernate的整合
通常来说,每个负责具体请求的Action都会被注入一个或多个Service bean(参见applicationContext-action.xml),而每个Service Bean都会被注入一个DAO bean(参见applicationContext-dao.xml),而每个dao bean都被被注入一个hibernateTemplate来与数据库交互(参见applicationContext-dao.xml),而在applicationContext-db.xml中,说明了hibernateTemplate的由来,它最终会找到一个datasource从而找到数据库。

这样,从前台Struts2的控制器到后台数据库,S2SH整个链条就被串起来了。

posted @ 2011-03-13 23:41 何杨 阅读(604) | 评论 (0)编辑 收藏

仅列出标题
共28页: First 上一页 10 11 12 13 14 15 16 17 18 下一页 Last