`
boogie
  • 浏览: 237785 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

在基于Spring架构的通用查询系统中用DWR实现查询条件的动态显示

阅读更多
一、首先有必要对通用查询系统做个简单介绍:该系统基于Spring+Hibernate+Struts架构,主要包括查询设计器(查询脚本维护、查询分类排序、查询条件维护、查询类型维护)和信息查询两大功能,其主要目的是为应用于软件项目开发当中,解决其全部查询模块和功能模块的条件部分,以加快项目开发速度。
二、说说系统开发中的难点:第一、在应用于项目当中去时怎样保持自己的独立性,也就是解耦的问题,第二、怎样根据各个项目的特点动态地扩展其跟业务逻辑相关的查询条件,这里就涉及到一个查询条件的动态显示问题。
三、接下去就讲正题,用DWR实现查询条件的动态显示
   1、构建查询条件服务:业务逻辑相关的查询条件就通过实现ICxtjValues接口的插件通过Spring配置文件注入给查询条件服务CxtjService,这样就解决了在解耦的情况下实现查询条件扩展。
CxtjService.java代码:
package gov.nbgs.sql.service.impl;
import gov.nbgs.common.bean.Entity;
import gov.nbgs.common.dao.IEntityDao;
import gov.nbgs.common.service.impl.EntityService;
import gov.nbgs.sql.plugin.ICxtjValues;
import java.util.Collection;
import java.util.Map;
import org.apache.log4j.Logger;

public class CxtjService extends EntityService {
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger.getLogger(CxtjService.class);
	private Map cxtjValuesMap;
	protected IEntityDao getDao(Entity arg0) {
		return null;
	}
	public Map getCxtjValuesMap() {
		return cxtjValuesMap;
	}
	public void setCxtjValuesMap(Map cxtjValuesMap) {
		this.cxtjValuesMap = cxtjValuesMap;
	}
	public Collection getCollectionCxtjValues(String key) {
		if (logger.isDebugEnabled()) {
			logger.debug("getCollectionCxtjValues(String)=>"+key);
		}
		ICxtjValues cxtjValues = (ICxtjValues)this.getCxtjValuesMap().get(key);
		if(cxtjValues==null) return null;
		if (logger.isDebugEnabled()) {
			logger.debug("getCollectionCxtjValues(String)=>"+cxtjValues.getCollectionCxtjValues().size());
		}
		return cxtjValues.getCollectionCxtjValues();
	}
	public Map getMapCxtjValues(String key) {
		if (logger.isDebugEnabled()) {
			logger.debug("getCxtjValuesMap(String)=>"+key);
		}
		ICxtjValues cxtjValues = (ICxtjValues)this.getCxtjValuesMap().get(key);
		if(cxtjValues==null) return null;
		if (logger.isDebugEnabled()) {
			logger.debug("getCxtjValuesMap(String)=>"+cxtjValues.getMapCxtjValues().size());
		}
		return cxtjValues.getMapCxtjValues();
	}	
}


Spring相关配置:
<beans default-autowire="byName">
  <bean id="swjgCxtjValues" class="gov.nbgs.demo.plugin.SwjgCxtjValues"/>  
  <bean id="cxtjService" class="gov.nbgs.sql.service.impl.CxtjService">
    <property name="cxtjValuesMap">
      <map>
        <entry key="dddd">
          <ref bean="swjgCxtjValues"/>
        </entry>  
        <entry key="djzclxdm">
          <ref bean="swjgCxtjValues"/>
        </entry>             
      </map>
    </property>        
  </bean>
</beans>


DWR配置文件:
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
    "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
	<allow>	
		<convert converter="bean"
			match="org.apache.struts.util.LabelValueBean" />
		<create creator="spring" javascript="CxtjService">
			<param name="beanName">cxtjService</param>
			<include method="getCollectionCxtjValues" />
			<include method="getMapCxtjValues" />
		</create>
	</allow>
</dwr>


查询条件显示CxLayout.jsp部分代码:
<%@ page contentType="text/html; charset=gb2312"%>
<%@ taglib uri="struts-bean" prefix="bean"%>
<%@ taglib uri="struts-html" prefix="html"%>
<%@ taglib uri="struts-logic" prefix="logic"%>
<%@ taglib uri="struts-tiles" prefix="tiles"%>

<jsp:useBean id="cxtjForm" scope="session"
	class="gov.nbgs.sql.web.form.CxtjForm" />

<html:html>
<head>
<title><tiles:getAsString name="title" /></title>

<script src='dwr/interface/CxtjService.js'></script>
<script src='dwr/engine.js'></script>
<script src='dwr/util.js'></script>
<script>
  var cxtjAreaId = "cxtjArea";
  var cxtjTagName = "span";
  
  function onload() {   
    var cxtjList = getPluginCxtjList();
    for(var i = 0; i < cxtjList.length; i++){
      var cxtj = cxtjList[i];
      var cxtjId = cxtj.cxtjId;        
      CxtjService.getMapCxtjValues(cxtjId, {
  	  		callback:function(dataFromServer) {
    			populateCxtjValues(dataFromServer, cxtj);
  			},
  			async:false
	  });      
    }
  }  
  
  function getPluginCxtjList() { 
    var result = new Array();
  
    var cxtjArea = document.getElementById(cxtjAreaId);
   
    var cxtjTagList = document.getElementsByTagName(cxtjTagName);
    //alert("cxtjTagList.length=>" + cxtjTagList.length);
    
    for(var i = 0; i < cxtjTagList.length; i++){
      var cxtjTag = cxtjTagList[i];
      //alert("cxtjTag.className=>" + cxtjTag.className);
      if(cxtjTag.className=="PluginCxtj"){
        var cxtjId = cxtjTag.childNodes[0].nodeValue;
        var cxtjTagId = cxtjTag.id;
        var cxtjType = cxtjTag.getAttribute("type");
        //alert("cxtjType=>" + cxtjType);
        
        var cxtj = {cxtjId: cxtjId, cxtjTagId: cxtjTagId, cxtjType: cxtjType};
        result[result.length] = cxtj;       		
      }
    }
    return result;
  }

  function createCxtjObject(cxtjId,cxtjTagId,cxtjType){
    var select = document.createElement("select");
    select.setAttribute("id",cxtjId);

    var tagCxtj = document.getElementById(cxtjTagId);
    tagCxtj.removeChild(tagCxtj.childNodes[0]);
    tagCxtj.appendChild(select);
  }    

  function createCxtjInputBox(dataFromServer,cxtjId,cxtjTagId,cxtjType){
    var tagCxtj = document.getElementById(cxtjTagId);
    tagCxtj.removeChild(tagCxtj.childNodes[0]);
    var i = 0;
    for (var key in dataFromServer) {
      var val = dataFromServer[key];
      //alert(key + "=" + val);
      var input_id = cxtjId + "_" + i;
      //alert(input_id);
      if(cxtjType=='radio'){
        var input = createElement("input", cxtjId);   
      }else{
        var input = createElement("input", input_id); 
      } 
      input.setAttribute("type",cxtjType); 
      input.setAttribute("value",key); 
      input.setAttribute("id",input_id);
      tagCxtj.appendChild(input);
      
      var label = document.createElement("label");
      label.setAttribute("for",input_id);
      label.appendChild(document.createTextNode(val));    
      tagCxtj.appendChild(label);  
      
      i++;
    }         
  }    
       
  function populateCxtjValues(dataFromServer, cxtj){  
    var cxtjId = cxtj.cxtjId;
    var cxtjTagId = cxtj.cxtjTagId;
    var cxtjType = cxtj.cxtjType;  
    if(cxtjType=='select'){
      createCxtjObject(cxtjId,cxtjTagId,cxtjType);
      DWRUtil.removeAllOptions(cxtjId);
      DWRUtil.addOptions(cxtjId, dataFromServer);      
    }else{
      createCxtjInputBox(dataFromServer,cxtjId,cxtjTagId,cxtjType);
    }
  }
  
  function createElement(type, name) {
    var element = null;

    try {
      // First try the IE way; if this fails then use the standard way
      element = document.createElement('<'+type+' name="'+name+'">');
    } catch (e) {
      // Probably failed because we’re not running on IE
    }
    if (!element) {
      element = document.createElement(type);
      element.name = name;
    }
    return element;
  }      
</script>
</head>
<body onload="onload()">
................
................
  <div id="cxtjArea">	
    <logic:present name="cxtjForm" property="cxtjMap">
    <bean:define id="cxtjMap" name="cxtjForm" property="cxtjMap" type="java.util.Map" />
    <logic:iterate id="cxtj" name="cxtjMap">
      <tr class=jnfont1>
 	 <td><bean:write name="cxtj" property="key"/></td>
 	 <td>
 	      <bean:define id="cxtjvalue" name="cxtj" property="value"/>
 	       <% out.println(cxtjvalue); %>
 	 </td>
       </tr>
     </logic:iterate> 
    </logic:present>	
  </div>
..................
.................
</body>
</html:html>


四、初次写技术博客文章,不当之处望各位网友提醒指正!
分享到:
评论
5 楼 javachs 2008-05-07  
你好,你能给我这个通用查询的详细代码吗?我的邮件chsboy@hotmail.com,我要被boss弄疯了
4 楼 iorit2003 2008-03-14  
你好,你能给我这个通用查询的详细代码吗?我的邮件iorit2003@yahoo.com.cn
3 楼 chris_in 2007-08-07  
大美女!!!
2 楼 yeshucheng 2007-07-10  
可以再结合extremecomponents的AutoGenerateColumns来得到动态列集合
1 楼 boogie 2007-04-28  
YES

相关推荐

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    少儿编程scratch项目源代码文件案例素材-绝地求生.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    嵌入式八股文面试题库资料知识宝典-文思创新面试题2010-04-08.zip

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    一种基于剪切波和特征信息检测的太阳斑点图融合算法.pdf

    并联型APF有源电力滤波器Matlab Simulink仿真:dq与αβ坐标系下的谐波无功检测与PI控制及SVPWM调制

    内容概要:本文详细介绍了并联型有源电力滤波器(APF)在Matlab/Simulink环境下的仿真研究。主要内容涵盖三个关键技术点:一是dq与αβ坐标系下的谐波和无功检测,利用dq变换和FBD技术实现实时检测;二是两相旋转坐标系(dq)与两相静止坐标系(αβ)下的PI控制,通过调整比例和积分环节实现精准控制;三是SVPWM调制方式的应用,通过优化开关时序提升系统效率和性能。文中还提供了详细的仿真介绍文档,包括模型搭建、参数设定以及结果分析。 适合人群:从事电力电子、自动化控制领域的研究人员和技术人员,尤其是对电力滤波器仿真感兴趣的读者。 使用场景及目标:适用于需要深入了解并联型APF工作原理和实现方式的研究人员,旨在通过仿真工具掌握谐波和无功检测、PI控制及SVPWM调制的具体应用。 其他说明:本文不仅提供了理论知识,还结合了实际操作步骤,使读者能够通过仿真模型加深对APF的理解。

    Arduino KEY实验例程【正点原子ESP32S3】

    Arduino KEY实验例程,开发板:正点原子EPS32S3,本人主页有详细实验说明可供参考。

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    嵌入式八股文面试题库资料知识宝典-嵌入式C语言面试题汇总(66页带答案).zip

    .archivetempdebug.zip

    .archivetempdebug.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬.zip

    嵌入式系统开发_CH551单片机_USB_HID复合设备模拟_基于CH551单片机的USB键盘鼠标复合设备模拟器项目_用于通过CH551微控制器模拟USB键盘和鼠标输入设备_实现硬

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    少儿编程scratch项目源代码文件案例素材-火影.zip

    两极式单相光伏并网系统的Boost电路与桥式逆变仿真及优化方法

    内容概要:本文详细介绍了两极式单相光伏并网系统的组成及其仿真优化方法。前级采用Boost电路结合扰动观察法(P&O)进行最大功率点跟踪(MPPT),将光伏板输出电压提升至并网所需水平;后级利用全桥逆变加L型滤波以及电压外环电流内环控制,确保并网电流与电网电压同频同相,实现高效稳定的并网传输。文中还提供了具体的仿真技巧,如开关频率设置、L滤波参数计算和并网瞬间软启动等,最终实现了98.2%的系统效率和低于0.39%的总谐波失真率(THD)。 适合人群:从事光伏并网系统研究、设计和开发的技术人员,特别是对Boost电路、MPPT算法、逆变技术和双环控制系统感兴趣的工程师。 使用场景及目标:适用于希望深入了解两极式单相光伏并网系统的工作原理和技术细节的研究人员和工程师。目标是在实际项目中应用这些理论和技术,提高光伏并网系统的效率和稳定性。 其他说明:文中提供的仿真技巧和伪代码有助于读者更好地理解和实现相关算法,在实践中不断优化系统性能。同时,注意电网电压跌落时快速切换到孤岛模式的需求,确保系统的安全性和可靠性。

    昭通乡镇边界,矢量边界,shp格式

    矢量边界,行政区域边界,精确到乡镇街道,可直接导入arcgis使用

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-嵌入式c面试.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    嵌入式八股文面试题库资料知识宝典-I2C总线.zip

    岩土工程中随机裂隙网络注浆模型及其应用:不同压力下注浆效果的研究

    内容概要:本文详细介绍了三种注浆模型——随机裂隙网络注浆模型、基于两相达西定律的注浆模型、基于层流和水平集的注浆扩散模型。首先,随机裂隙网络注浆模型基于地质学原理,模拟裂隙网络发育的实际地质情况,在不同注浆压力下进行注浆作业,以增强地基稳定性和提高承载能力。其次,基于两相达西定律的注浆模型利用数学公式模拟裂隙网络中的流体输送过程,适用于裂隙网络地质条件下的注浆效果分析。最后,基于层流和水平集的注浆扩散模型通过引入层流特性和水平集方法,更准确地模拟注浆过程中的扩散过程。文中还讨论了不同注浆压力对注浆效果的影响,并提出了优化建议。 适合人群:从事岩土工程、地基加固等相关领域的工程师和技术人员。 使用场景及目标:①帮助工程师选择合适的注浆模型和注浆压力;②为实际工程项目提供理论支持和技术指导;③提升地基加固的效果和效率。 其他说明:文章强调了在实际应用中需要结合地质条件、裂隙网络特点等因素进行综合分析,以达到最佳注浆效果。同时,鼓励不断创新注浆工艺和方法,以满足日益增长的地基加固需求。

    COMSOL Multiphysics 5.5与6.0版本Ar棒板粗通道流注放电仿真的电子特性分析

    内容概要:本文详细比较了COMSOL Multiphysics软件5.5和6.0版本在模拟Ar棒板粗通道流注放电现象方面的异同。重点探讨了不同版本在处理电子密度、电子温度、电场强度以及三维视图等方面的优缺点。文中不仅介绍了各版本特有的操作方式和技术特点,还提供了具体的代码实例来展示如何进行精确的仿真设置。此外,文章还讨论了网格划分、三维数据提取和电场强度后处理等方面的技术难点及其解决方案。 适合人群:从事等离子体物理研究的专业人士,尤其是熟悉COMSOL Multiphysics软件并希望深入了解其最新特性的研究人员。 使用场景及目标:帮助用户选择合适的COMSOL版本进行高效、精确的等离子体仿真研究,特别是在处理复杂的Ar棒板粗通道流注放电现象时提供指导。 其他说明:文章强调了在实际应用中,选择COMSOL版本不仅要考虑便捷性和视觉效果,还需兼顾仿真精度和可控性。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    通信系统中波形优化与捷变频、PRT抗干扰技术及ISRJ联合优化的应用研究

    内容概要:本文详细介绍了在现代通信系统中,抗干扰技术的重要性和具体应用方法。首先阐述了抗干扰技术的背景及其重要性,随后分别讨论了捷变频技术和波形优化技术的具体机制和优势。捷变频技术能快速改变工作频率,防止被干扰源锁定;波形优化技术则通过改进信号波形来提升抗干扰性能。接着,文章探讨了两种技术相结合的协同效应,最后重点介绍了发射信号及接收滤波器联合优化的抗干扰策略(ISRJ),这是一种综合性优化手段,旨在最大化抗干扰效果并提高通信质量。 适合人群:从事通信工程及相关领域的研究人员和技术人员,尤其是关注抗干扰技术的专业人士。 使用场景及目标:适用于需要提升通信系统稳定性和可靠性的场合,如军事通信、卫星通信等领域。目标是帮助技术人员理解和掌握先进的抗干扰技术,应用于实际项目中。 其他说明:文中提到的技术不仅限于理论层面,还涉及具体的实施细节和应用场景,有助于读者深入理解并应用于实践中。

    少儿编程scratch项目源代码文件案例素材-吉他英雄.zip

    少儿编程scratch项目源代码文件案例素材-吉他英雄.zip

    独立光伏系统仿真模型研究:Boost升压与双闭环控制策略及技术应用分析

    内容概要:本文详细探讨了独立光伏系统的仿真模型及其控制策略。首先介绍了光伏组串模型的搭建方法,利用Simulink中的S函数实现特性曲线,确保高精度输出。接着重点讨论了Boost升压电路的改进型功率环控制策略,通过非线性积分器有效避免了占空比过高的风险,使系统震荡幅度显著降低。对于储能部分,采用双向DCDC转换器,实现了充放电模式间的平滑切换,并通过互补PWM技术增强了硬件死区保护效果。逆变器部分则采用了单极调制方式,减少了开关损耗,并优化了LC滤波参数的设计,确保了低谐波失真率。此外,还设计了一个基于继电器的智能负载模拟系统,能够根据交流电压的变化自动调节负载,提高了仿真的效率和准确性。最后,通过对整个系统的动态优先级管理,使得光伏出力波动时储能系统可以迅速响应,保持直流母线电压稳定。 适合人群:从事光伏系统设计、仿真建模以及电力电子领域的工程师和技术人员。 使用场景及目标:适用于需要深入了解独立光伏系统内部工作原理的研究人员,帮助他们掌握从光伏组串到逆变器各环节的具体实现细节,为实际工程项目提供可靠的理论支持和技术指导。 其他说明:文中提供了大量MATLAB/Simulink代码片段和具体参数设置建议,便于读者理解和复现实验结果。同时强调了不同控制策略之间的对比分析,指出了最优解的选择依据。

Global site tag (gtag.js) - Google Analytics