惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
博客园_首页
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
美团技术团队
小众软件
小众软件
V
V2EX
博客园 - Franky
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
Attack and Defense Labs
Attack and Defense Labs
S
Security Affairs
Simon Willison's Weblog
Simon Willison's Weblog
I
Intezer
T
The Exploit Database - CXSecurity.com
有赞技术团队
有赞技术团队
S
Schneier on Security
人人都是产品经理
人人都是产品经理
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
K
Kaspersky official blog
PCI Perspectives
PCI Perspectives
AI
AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
O
OpenAI News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The Register - Security
The Register - Security
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
博客园 - 【当耐特】
C
Cisco Blogs
大猫的无限游戏
大猫的无限游戏
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
S
Securelist
Application and Cybersecurity Blog
Application and Cybersecurity Blog
P
Proofpoint News Feed
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
L
LangChain Blog
SecWiki News
SecWiki News
博客园 - 叶小钗
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
L
LINUX DO - 热门话题
Cisco Talos Blog
Cisco Talos Blog

博客园 - 飞翔的Angela

北京到济南的长途汽车一览表 狮 子 座 Leo 07/23~08/22 台湾偶像剧 什么是程序员的优秀品质? 概要设计怎么写? 睡前不能吃的五种食物 初始OpenID 向腹部赘肉大声说byebye 减掉腿部赘肉——easy啦(附插图) 学习Ajax框架之dojo:第十三节——如何编写自己的dojo widget ROME解析器和生成器的使用方法(附有源代码) 喜欢和爱的区别 学习RSS2.0规范 如何保存个性化主页? 让人心疼的12句话,哪句说到你的痛了? B型狮子座 使用 JSON 进行数据的异步传输 dom4j引发的错误 使用 JavaScript 获取 table 行号和列号(附源代码)
基于ajax技术的单一数据源的数据关联的设计与实现
飞翔的Angela · 2008-09-26 · via 博客园 - 飞翔的Angela

 基本构思:

实现单一数据源的数据关联的功能,首先,将数据源设定为关系型数据库SQL Server2000,在数据库中存在两个相互关联的数据表。当在页面选中表1中的数据时,将在页面显示表2中相关联的数据。选用table来呈现表1和表2的数据信息,便于用户查看!

技术支持:

选用技术

完成的功能

1.       ajax技术

实现页面无刷新的呈现表1和表2的数据信息,完成异步交互。

2.       JavaScript

使用xmlHttpRequest对象完成页面与服务器的交互,实现服务器的数据在页面显示。

3.       Java

后台的操作,数据库操作,表1和表2的数据信息在页面以表格形式显示。

4.       JSP

调用Java类,返回表格数据。

5.       Html

主页面设计

示例说明:

1.      HTML页面

触发按钮:

<input id="RelationFieldName" type="button" onclick="javascript:getRelationFieldName();" value="获取表格"/>

显示区域:

<div id="RelationFieldNameList" >getRelationFieldName</div>

<br>

<div id ="RelationDetails">RelationDetails</div>

2.      JavaScript

显示表1的内容:

var xmlHttp;

function getRelationFieldName()

{

           createXMLHttpRequest();

           xmlHttp.open("POST","./getRelationFieldName.jsp",true);

           xmlHttp.onreadystatechange=handleStateChange;

xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

           xmlHttp.send(null);  

}

function createXMLHttpRequest()

{

           if(window.ActiveXObject)

           {

                  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");

           }else if(window.XMLHttRequest)

           {

                  xmlHttp=new XMLHttpRequest();

           }

}

function handleStateChange()

{

           if(xmlHttp.readyState==4)

           {

              if(xmlHttp.status==200)

             {

document.getElementById("RelationFieldNameList").innerHTML=xmlHttp.responseText;

               }else {alert("wrong wrong");}

     }

}

显示表2内容用到的主要function:

    function getdetail(name,value)

{

   createXMLHttpRequest();

           xmlHttp.open("get","./getRealionDetails.jsp?name=" + name + "&" + "value=" + value,true);

          xmlHttp.onreadystatechange=handleStateChangeDetail; xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

       xmlHttp.send(null);    

}

function handleStateChangeDetail()

{

     if(xmlHttp.readyState==4)

     {

        if(xmlHttp.status==200)

{       document.getElementById("RelationDetails").innerHTML=xmlHttp.responseText;

        }else {alert("wrong wrong");}   

     }

}

3.      Java

3.1    连接数据库dblink_sql(databaseName); 代码略

3.2    关闭数据库closeDB();代码略

3.3    查询数据库中表1的内容

      /**

       * @param databaseName

       * @param tablename

       * @return 页面动态显示的表格,其表的内容可以点击

       */

      public String DynamicTable_onclick(String databaseName,String tablename)

      {

             String sql1="select   name   from   syscolumns   where    id=object_id";

             sql1=sql1+"(";

             sql1=sql1+"'";

             String sql = (new StringBuilder(sql1)).append(tablename).toString();

             sql=sql+"');";

             System.out.println(sql);

             String fieldnameList="";

             StringBuffer fieldname=new StringBuffer();

             StringBuffer field=new StringBuffer();

             try

             {

                    dblink_sql(databaseName);

                    Statement stmt= conn.createStatement();

                    rs=stmt.executeQuery(sql);                   

                 while (rs.next())

                 {    

                       for (int i=0; i< rs.getMetaData().getColumnCount(); i++)

                       {                               

                              field.append(rs.getString(i+1)+",");

                       }

                 }

                 String fieldList=field.toString();

                 String FieldName=fieldList.substring(0, fieldList.length()-1);

                String search="select "+ FieldName+ " from " + tablename ;

                System.out.println(search);

                ResultSet rs1=stmt.executeQuery(search);

                    ResultSetMetaData rsmd = rs1.getMetaData();           

                    int numberOfColumns = rsmd.getColumnCount();

                    fieldname.append(""n<table border=1 algin=""center"">");

                    fieldname.append("<tr>");

                    for (int j = 1; j <= numberOfColumns; j++)

                    {

                           fieldname.append((new StringBuilder("<th>")).append(rsmd.getColumnName(j)).append("</th>").toString());

                    }

                    fieldname.append("</tr>");

                    fieldname.append("<tbody>");

                    for (; rs1.next(); fieldname.append("</tr>"))

                    {

                           fieldname.append("<tr>");

                           for (int k = 1; k <= numberOfColumns; k++)

                           {

                                  String colname = rsmd.getColumnName(k);

                                  fieldname.append((new StringBuilder("<td onclick=""return getdetail('")).append(colname).append("','").append(rs1.getString(k)).append("');"">").append(rs1.getString(k)).append("</td>").toString());

                           }

                    }

                fieldname.append("</tbody></table>");

                 fieldnameList=fieldname.toString();

                 System.out.println(fieldnameList);

                 rs.close();  

                 stmt.close();

                 conn.close();

             }

             catch(SQLException e){e.printStackTrace();}

             return fieldnameList;

      }

3.4    根据点击table的单元获取namevalue值,查询数据库中表2的内容

      /**

       * @param name 从表格中得到的“列名”

       * @param value 从表格中得到的“列名”的“属性值”

       * @return 关联的详细信息

       */

      public String RelationsDetails(String databaseName, String tablename, String name, String value)

      {

             String tdatevalue = "";

             String sql="select * from " + tablename + " where " + name + " = " + "'"+ value + "'";    

             System.out.println(sql);

             try

             {

                    dblink_sql(databaseName);

                    Statement st = conn.createStatement();

                    ResultSet rs = st.executeQuery(sql);

                    ResultSetMetaData rsmd = rs.getMetaData();

                    int numberOfColumns = rsmd.getColumnCount();

                    StringBuffer tdate = new StringBuffer();

                    tdate.append(""n<table border=1 algin=""center"">");

                    tdate.append("</tr>");

                    for (int i = 1; i <= numberOfColumns; i++)

                           tdate.append((new StringBuilder("<th>")).append(rsmd.getColumnName(i)).append("</th>").toString());

                    tdate.append("</tr>");

                    for (; rs.next(); tdate.append("</tr>"))

                    {

                           tdate.append("<tr>");

                           for (int i = 1; i < 6; i++)

                                  tdate.append((new StringBuilder("<td>")).append(rs.getString(i)).append("</td>").toString());

                    }

                    tdate.append("</Table>");

                    tdatevalue = tdate.toString();

             }

             catch (Exception e)

             {

                    e.printStackTrace();

             }

             return tdatevalue;

      }    

4.      JSP

下面,JSP如何调用java类?方法如下:

<%@ page contentType="text/html;charset=GB2312"%>

<%@ page import="manage.*" %>

<%

      String result="";

      ShowRelationFieldName test = new ShowRelationFieldName();

      result += test.DynamicTable_onclick("dschema_test", "student");

      response.setContentType("text/html");

      out.clear();

      out.print(result);

%>

另一个java类的调用方法同上,代码略。

5. 效果图:

当单击主页面button时,在主页面显示如下的表格信息:

name

id

age

aa

1

21

bb

2

24

cc

1

20

当单击“aa”时,将在该表格下方显示如下的表格信息:

name

id

age

Phone

Address

Number

aa

1

21

0532

济南

20022458

小结:

目前实现了单一数据源的数据关联,下一步即将实现不同数据源的数据关联!