简介
XSQL技术是一种轻量级的开发技术,它相比EJB开发复杂度要小很多,只需简单的写两个配置文件及引用ORACLE的几个jar包,就可以代替多个web应用程序所需的多种技术,这些技术包括标准查询语言(SQL)、超文本标记语言(HTML)、超文本传输协议(HTTP)、可扩展标记语言(XML)、Java和Oracle关系数据库管理系统(RDBMS)。这些技术都是开发web应用程序领域内的最佳技术。
在学习该技术前,应该全面了解该技术可以解决哪些问题,首先web应用程序开发的关键问题是web和企业应用程序的结合关系,XSQL极大简化了这种关系的关键部分:数据库访问(JDBC)。有了XSQL,产生和数据库交互的动态web页面几乎就像编写HTML页面一样简单。而之前就需要用java等语言编写一个模块来管理数据库连接,执行数据库的SQL查询,然后才能处理结果,还必须指出对结果的操作,因为结果的数目和类型可能对同一模块发生很大变化,你不得不处理诸如在一个页面上放多少结果和如何对不同类型进行格式化的问题。采用XSQL技术就可以很好的解决上述问题,只需在XSQL页面写里写上标准的sql语言,同时对其两个配置文件添加相应的配置内容,即可实现对数据库的增删改查功能,对查询功能可以自动将数据以XML方式返回给客户端,客户端只需采用XSLT即可轻松的实现所需要的格式。所以如果采用XSQL开放web应用程序, XSQL就是该web应用程序的一种关键技术。
XSQL可以和任何支持JDBC的数据库一起使用,但是作为Oracle产品,最优的选择还是和Oracle数据库一起使用。Oracle为数据库访问和XML提供了丰富的Java应用程序接口(API)。可以在扩展带有行为处理程序和串行器的XSQL时使用这些接口,也可以在使用内部程序中的XSQL时使用它们。XSQL技术的核心是XSQL页面,XSQL页面是XML文档,所以XML语法检查将使文档保持规范。XSQL除了自带的行为处理程序外,还允许用户进行自定义行为处理程序,更加方便实现各种web应用程序不同的业务规则。
以上是XSQL内容的简单介绍,相信大家看后对XSQL会有初步的了解。如果有什么疑问,欢迎大家发帖提问。
第一讲:用XSQL建立一个简单的J2EE项目实例程序
本讲的内容是通过一个实例来讲解如何快速开发一个简单的J2EE项目实例程序;
该实例的功能是将数据库中EMP表的内容显示到web页面上。
一.搭建开发环境
1.安装JDK1.5
下载地址:http://java.sun.com/javase/downloads/index_jdk5.jsp
2.安装IDE工具:Eclipse Web Tools Project (WTP),下载地址: http://archive.eclipse.org/webtools/downloads/drops/R1.5/R-1.5.5-200708291442/wtp-all-in-one-sdk-R-1.5.5-200708291442-win32.zip
3.安装应用服务器 Tomact5.5 下载地址:
http://apache.mirror.phpchina.com/tomcat/tomcat-5/v5.5.25/bin/apache-tomcat-5.5.25.zip
4.安装数据库ORACLE9i
二.建立J2EE项目
1.打开WTP工具,关闭welcome,选择J2EE透视图(点击windowàOpen Perspectiveàother,在弹出窗口中选择J2EE)
2.新建一个动态web项目
a.点击FileàNewàother,在弹出窗口中展开web项,选择Dynamic Web Project,点击Next;
b.在Dynamic Web project的project name中填入demo,Target Runtime项选择New按纽,在弹出窗口展开Apach,选择Apach Tomact5.5,点击Next,在Tomact installation directory:中选择安装tomact的目录。其他默认,点击finish,关闭弹出窗口,回到原来窗口,其他默认,点击finish;
3.导入XSQL需要的jar包
a.在Project Explorer中将附件中的6个jar包copy到demoàWebContentàWEB-INFàlib中。
4.导入XSQLConfig.XML配置文件
a. 在Project Explorer中将附件中的XSQLConfig.XML文件copy到demoàbuildàclasses中,这个是用来数据库和xsql处理行为的配置文件,本实例只用到连接数据库,所以可以在XSQLConfig.xml中查看如下内容
<connectiondefs>
<connection name="demo">
<username>scott</username>
<password>tiger</password>
<dburl>jdbc:oracle:thin:@localhost:1521:oracle</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
<autocommit>false</autocommit>
</connection>
</connectiondefs>
需要修改的有dburl中jdbc:oracle:thin:@localhost:1521:oracle改为jdbc:oracle:thin:@localhost:1521:XXXX(自己安装oracle定义的数据库名称).如果是远程数据库,则将localhost修改成远程IP.
5.修改web.xml配置文件
a.在Project Explorer中打开web.xml(demoàWebContentàWEB-INFàweb.xml
b.将如下代码替换原来的代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>demo</display-name>
<servlet>
<servlet-name>xsql</servlet-name>
<servlet-class>oracle.xml.xsql.XSQLServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xsql</servlet-name>
<url-pattern>*.xsql</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
</web-app>
6.新建index.htm文件
a. 在Project Explorer中选中WebContent(demoàWebContent)右键选择new File,在File name选项输入index.htm,点击finish。
b.将如下代码copy到index.htm中
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>demo</TITLE>
<script language="javascript">
var xmlhttp=null;
function showdata(){
var url = "/demo/data/queryEmp.xsql";
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=showdatacallback;
xmlhttp.open("POST",url,true);
xmlhttp.setRequestHeader("Content-Type","text/xml");
xmlhttp.send();
}
function showdatacallback(){
if(xmlhttp.readyState==4){
xmlDom = new ActiveXObject("Microsoft.XMLDOM");
xmlDom.async=false;
xmlDom.loadXML(xmlhttp.responseXML.xml);
var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument");
var xslt = new ActiveXObject("Msxml2.XSLTemplate");
var xslurl="/demo/data/transform/showEmp.xsl";
xslDoc.async = false;
xslDoc.resolveExternals = false;
xslDoc.load(xslurl);
xslt.stylesheet = xslDoc;
var xslProc = xslt.createProcessor();
xslProc.input = xmlDom;
xslProc.transform();
document.all("demo").innerHTML = xslProc.output;//插入到DIV
}
}
</script>
</HEAD>
<body>
<input type="button" name="test" value="显示数据" onClick="showdata()" />
<div id="demo"/>
</body>
</html>
7. 新建queryEmp.xsql文件
a.在WebConten下新建一个目录data(这步操作也是起规范作用,对应index.htm中js指定的路径)
b.在data目录下新建queryEmp.xsql文件,文件代码如下:
<?xml version ='1.0' encoding="utf-8"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:query>
select * from Emp
</xsql:query>
</page>
解析一下:
connection="demo" 中demo为XSQLConfig.xml中数据库连接配置定义的名称
<xsql:query>是专门用于数据库查询的标签,在中间为标准的sql语句。
8.新建showEmp.xsl文件
a.在data目录下新建一个目录transform(这步操作也是起规范作用,对应index.htm中js指定的路径)
b.在transform新建showEmp.xsl文件,文件代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://www.cs-air.com/etktgroup">
<xsl:param name="segnum" />
<xsl:template match="/">
<table width="100%" border="1" cellpadding="1" cellspacing="1">
<tr>
<td>EMPNO</td>
<td>ENAME</td>
<td>JOB</td>
<td>MGR</td>
<td>HIREDATE</td>
<td>SAL</td>
<td>DEPTNO</td>
</tr>
<xsl:for-each select="//ROWSET/ROW">
<tr>
<td><xsl:value-of select="EMPNO"/></td>
<td><xsl:value-of select="ENAME"/></td>
<td><xsl:value-of select="JOB"/></td>
<td><xsl:value-of select="MGR"/></td>
<td><xsl:value-of select="HIREDATE"/></td>
<td><xsl:value-of select="SAL"/></td>
<td><xsl:value-of select="DEPTNO"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
三.运行
1.选择项目,点击右键,选择Run AsàRun on Server,在弹出对话框中选择finish,即可运行该实例,点击显示数据即可看到相应的信息。
2.在服务器视图启动服务器,在IE输入http://localhost:8080/demo也可看到效果。
以上内容,建立了一个查询数据库到页面显示过程的实例,希望对大家XSQL技术入门有所帮助,如果有什么疑问,欢迎大家发帖提问。
下面具体讲解几个XSQL常用的标签定义及用途。
1.<xsql:query>
该行为用来检索数据库中的信息,可以通过设置其row-element和rowset-element属性来实现其行(默认ROW)和行集(默认ROWSET的元素名.在页面可以有多个该行为,则可以按顺序逐个获取对应SQL语句查询的结果;
常用属性有row-element(行元素名),rowset-element(行集元素名) ,bind-params(传入参数或设置私有参数名称)
例如:<xsql:query rowset-element=”EMPS” row-element=”EMP” bind-params=”id”>
Select * from emp where EMPNO=?(代表id参数值)
</xsql:query>
2.<xsql:dml>
该行为用来代表数据操作语言。它意味着您将改变数据库中的内容。该行为用于修改语句,包括插入,修改和删除,甚至是数据库对象的创建和删除。虽然对实际删除整个表应慎重,但xsql:dml对处理数据库的输入非常有用。当然也可以使用它来执行PL/SQL代码块。
常用属性有commit(是否提交),bind-params(同xsql:query)。
例如:
<xsql:dml commit=”yes” bind-params=”id”>
Sql statement
</xsql:dml>
3.<xsql:include-param>
该行为允许将一个单独的参数包含到自己的XML数据报中,其name属性是必须的。
例如:<xsql:include-param name=”paramname”/>
4.<xsql:set-page-param>
该行为允许为XSQL页面设置页面私有参数。可以把参数设置为文本,或者是文本和其他参数值,或是一个SQL语句的结果。其name属性是必须的
常用属性name(设置参数名),value(设置参数值)
例如:<xsql:set-page-param name=”paramname” value=”{@org-param}”
{@org-param}为传入的参数值,也可以直接赋值
还有一种直接用SQL语句的结果赋给该参数
例如:<xsql:set-page-param name=”sql-baseed-param”>
Sql statement
</xsql:set-page-param>
5.<xsql:include-xsql>
该行为可用来在当前XSQL页面中包含其他XSQL页面的结果。这增强了XSQL页面的可重用性。
常用属性href(引用其他XSQL页面路径)
例如:<xsql:include-xsql href=”other.xsql”/>
6.<xsql:insert-request>
该行为允许把XML文档插入到数据库(即批量插入),如果需批量插入数据到某一个表中,则将多条记录数据写成规范的模式(行集用ROWSET,行用ROW,节点用字段名),执行该行为就可以将需要插入的多条记录插入到数据库中。
常用属性有table(插入的表名),是必须定义的属性,transform(用于将传入的xml规范化的XSL的URL),date-format(规范化传入xml中的日期参数),commit(是否提交)
例如<xsql:inser-request commit==”yes” table=”emp” transform=”test.xsl”,date-format=”YYYY-MM-DD”/>
7.<xsql:update-request>
该行为允许对数据库更新XML文档(即批量修改数据库),如果需要批量修改数据库数据,则将需要修改的字段和主键写成规范的模式(同insert-request),执行该行为就可批量更新数据库对应字段的数据。
常用属性有table(更新的表名),是必须定义的属性,key(主键名),columns(更新的字段名),transform(用于将传入的xml规范化的XSL的URL),date-format(规范化传入xml中的日期参数, commit(是否提交)
例如
<xsql:update-request commit=”yes” table=”emp” key-columns=”EMPNO” transform=”test.xsl”,date-format=”YYYY-MM-DD”/>
自定义ACTION
1. 在xsql里做如下定义
<xsql:queryEmp empno="{@id}"/>
2. 在XSQLConfig.xml的actiondefs节点集里增加配置
<action>
<elementname>queryEmp</elementname>
<handlerclass>com.xsql.action.queryEmpAction</handlerclass>
</action>
3. 在javaSource里定义action文件
/*
* 创建日期 2005-11-12
*
* TODO 要更改此生成的文件的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
package com.xsql.action;
import java.io.StringReader;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import oracle.xml.parser.v2.XMLDocument;
import oracle.xml.xsql.XSQLActionHandlerImpl;
import oracle.xml.xsql.XSQLPageRequest;
import oracle.xml.xsql.XSQLServletPageRequest;
/**
* @author Administrator
*
* TODO 要更改此生成的类型注释的模板,请转至
* 窗口 - 首选项 - Java - 代码样式 - 代码模板
*/
public class QueryEmpAction extends XSQLActionHandlerImpl {
/* (非 Javadoc)
* @see oracle.xml.xsql.XSQLActionHandler#handleAction(org.w3c.dom.Node)
*/
String empno = null;
public void init (XSQLPageRequest env, Element e ) {
super.init(env,e);
empno = getAttributeAllowingParam("id", e );
}
public void handleAction(Node arg0) throws SQLException {
// TODO 自动生成方法存根
XSQLServletPageRequest pagerequest = (XSQLServletPageRequest)this.getPageRequest();
HttpServletRequest request = pagerequest.getHttpServletRequest();
pagerequest.setPageParam("empno", "ddddd");
try{
Document xmldoc = arg0.getOwnerDocument();
StringBuffer sb = new StringBuffer();
sb.append("<?xml version='1.0' encoding='GB2312' ?><page><QUERYCONDITION><ENTRYNO>1</ENTRYNO><SEGTYPE>S</SEGTYPE><CABINORDER>0</CABINORDER><FLIGHTTYPE>1</FLIGHTTYPE><ADULTNUM>1</ADULTNUM><CHILDNUM>0</CHILDNUM><CITIES><CITY><DEPCITY>SHA</DEPCITY><ARRCITY>SHE</ARRCITY></CITY></CITIES><DATES><FLIGHTDATE><DAY>20080910</DAY><CLOCK>0000-2359</CLOCK></FLIGHTDATE></DATES></QUERYCONDITION></page>");
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
//Read from string Buffer
Document doc = domBuilder.parse(new InputSource(new StringReader(sb.toString())));
arg0.appendChild(xmldoc.importNode(doc.getFirstChild() , true));
}catch(Exception e){
}
}
}