??xml version="1.0" encoding="utf-8" standalone="yes"?>
因ؓ目需要,前几天完成了fusioncharts的基本用,但是q不能满项目需求?br />
目中需要实现按照客L需求导出指定格式的文gQ而且可以图表L{,q就需要自己去扩展fusioncharts本n的导出?br />
下面单介l如何在服务器端使用JSP导出各种文g格式Qƈ能自由扩展。因为时间比较紧Q写的很凌ؕQ希望大家理解?br />
在J2EE框架下用JSP导出文g
1.?exportAtClient导出属性设|ؓ0Q服务器导出Q,exportHandler讄?exp.jsp'?br />
可以在chart.exportChart({exportFormat:'pdf',exportHandler:'exp.jsp',exportFileName:'test',exportParameters:'test'});讄Q也可以在XML里设|。(注意在JS里设|会重写XML里面的导出属性设|)
2.exp.jsp为处理数据的文gQ可实现各种文g格式的导出?/span>
<%@ page language="java" import="com.hjtp.incas.chart.*" pageEncoding="utf-8"%>
<%@ page import="com.hjtp.incas.chart.helper.*"%>
<%@ page import="com.hjtp.incas.chart.exporthelper.*"%>
<%
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>
<title>导出囄</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">
</head>
<body>
<%
try
{
ExportHelperBean exportHelperBean=FusionChartsExportHelper.parseExportRequestStream(request);
ExportFactory exportFactory=ExportFactory.getInstance();
String type=(String)exportHelperBean.getExportParameterValue("exportformat");
String fileName = (String)exportHelperBean.getExportParameterValue("exportfilename");
ExportFormat exportFormat=new ExportFormat(type);
String contentType=exportFormat.getContentType();
String fix=exportFormat.getPostfix();
response.reset();
response.setContentType(contentType);
response.addHeader("Content-Disposition","attachment; filename=\""+fileName+"."+fix+"\"");
java.io.OutputStream os=response.getOutputStream();
IFusionCharts iFusionCharts=exportFactory.getFusionCharts(type);
iFusionCharts.export(exportHelperBean,os);
os.flush();
os.close();
out.clear();
out=pageContext.pushBody();
}
catch (Exception e)
{
e.printStackTrace();
}
%>
</body>
</html>
3.如何扩展导出的文件格式ؓ目所需?br />
1.自定义导?br />
服务器端导出参数设为exportHandler:'exp.jsp'Q即Z用我们自?br />
写的导出方式导出?br />
2.如何扩展自定义导?br />
(1)在exp.jsp中,可以看到如下两行代码
IFusionCharts iFusionCharts=exportFactory.getFusionCharts(type);
iFusionCharts.export(exportHelperBean,os);
其中exportFactoryZ个工厂类,起分发器的作用,通过此类可以Ҏ
扩展实际需求进行自定义扩展?br />
(2)自定义扩展实?Q例如像实现对txt文g格式支持的导出,需要在新增?br />
一个类实现IFusionCharts 接口的exportҎ卛_Q同时在exportFactory
工厂c里dҎ支持的判断分发实现即可?br />
<%@ 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();//被选中的节?br />
//tree.insertNewNext(id,'1',"FFTT",viewRight,"tombs_mag.gif","magazines_open.gif","magazines_close.gif","回家","SELECT");
if(id!="0_0_-1")//当不是根菜单?br />
{
//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)//一U目?br />
{
height=75;
st_add="<SPAN ONCLICK=\"parent.add('"+chs[2]+"')\">新增节点Q?lt;u>A</u>ddQ?lt;/SPAN> ";
st_edit="<SPAN ONCLICK=\"parent.edit('"+v[0]+"','"+v[1]+"','"+v[2]+"','"+v[3]+"','"+v[4]+"','"+v[5]+"')\">修改节点Q?lt;u>E</u>ditQ?lt;/SPAN> ";
st_delete=" <SPAN ONCLICK=\"parent.deletes('"+id+"')\">删除节点Q?lt;u>D</u>eleteQ?lt;/SPAN> ";
dis_add="";//设为显C?br />
dis_edit="";//设为显C?br />
dis_delete="";//设为显C?br />
}
else
{
height=50;
st_add="";
st_edit="<SPAN ONCLICK=\"parent.edit('"+v[0]+"','"+v[1]+"','"+v[2]+"','"+v[3]+"','"+v[4]+"','"+v[5]+"')\">修改节点Q?lt;u>E</u>ditQ?lt;/SPAN> ";
st_delete=" <SPAN ONCLICK=\"parent.deletes('"+id+"')\">删除节点Q?lt;u>D</u>eleteQ?lt;/SPAN> ";
dis_add="none";//设为显C?br /> dis_edit="";//设为显C?br /> dis_delete="";//设为显C?/p>
}
adds.innerHTML=st_add;
edits.innerHTML=st_edit;
deletes.innerHTML=st_delete;
adds.style.display=dis_add;//设为显C?br />
edits.style.display=dis_edit;//设为显C?br />
deletes.style.display=dis_delete;//设为显C?br />
showmenu(height);
}
else//根目?br />
{
var adds=document.getElementById("add");
var edits=document.getElementById("edit");
var deletes=document.getElementById("delete");
adds.innerHTML="<SPAN ONCLICK=\"parent.add('root')\">新增节点Q?lt;u>A</u>ddQ?lt;/SPAN> ";
edits.innerHTML="";
deletes.innerHTML="";
adds.style.display="";//设为显C?br />
edits.style.display="none";//设为显C?br />
deletes.style.display="none";//设为显C?br />
var height=25;
showmenu(height);
}
}
function tonclick()
{
var id=tree.getSelectedItemId();//被选中的节?br />
if(id!="0_0_-1")//当不是根菜单?br />
{
var chs = new Array();
chs = id.split("_");
service.getMenuInfo(chs[0],menuclick);
var table=document.getElementById("table");//昄节点信息的表
var tdshow=document.getElementById("tdshow");//昄节点信息的表
var add_show=document.getElementById("add_show");
tdshow.style.display="";//表D为显C?br />
add_show.style.display="none";//表D为显C?br />
table.style.display="";//表D为显C?br />
//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();//被选中的节?br />
// alert(id);
tonclick();
viewRight();
}
function menuclick(data)
{
array_info=data;
var array=data[0];
var cms_name=document.getElementById("name");//昄节点的名U?br />
var cms_link=document.getElementById("link");//昄节点的链?br />
var cms_orders=document.getElementById("orders");//昄节点的排序号
var cms_is_show=document.getElementById("is_show");//节点是否昄
var cms_is_quick=document.getElementById("is_quick");//节点是否作ؓ快速通道
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="不显C?;
}
if(array[4]==0)
{
cms_is_quick.value="?;
}
else
{
cms_is_quick.value="?;
}
}
</script>
<script type="text/javascript">
function add(id)
{
//菜单响应d时调?br />
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");//昄节点的名U?br />
var add_cms_link=document.getElementById("add_link");//昄节点的链?br />
var add_cms_orders=document.getElementById("add_orders");//昄节点的排序号
var add_cms_is_show=document.getElementById("add_is_show");//节点是否昄
var add_cms_is_quick=document.getElementById("add_is_quick");//节点是否作ؓ快速通道
add_show.style.display="";
tdshow.style.display="none";
//bt.style.display="";
//bt.value="d节点";
add_legend.innerHTML="d节点";
click.innerHTML="<input type=\"button\" name=\"bt\" value=\"d节点\" 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)
{
//菜单响应修改时调?br />
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");//昄节点的名U?br />
var add_cms_link=document.getElementById("add_link");//昄节点的链?br />
var add_cms_orders=document.getElementById("add_orders");//昄节点的排序号
var add_cms_is_show=document.getElementById("add_is_show");//节点是否昄
var add_cms_is_quick=document.getElementById("add_is_quick");//节点是否作ؓ快速通道
add_show.style.display="";
tdshow.style.display="none";
//bt.style.display="";
//bt.value="修改节点";
add_legend.innerHTML="修改"+name;
click.innerHTML="<input type=\"button\" name=\"bt\" value=\"修改节点\" 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("d按钮--"+id);
//数据库添加时调用
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("节点名称不能为空!");
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+"】节Ҏ?");
var id=tree.getSelectedItemId();//被选中的节?br />
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+"】节点失?");
}
}
</script>
<script type="text/javascript">
function deletes(id)
{
//菜单,数据库删除时调用
var bln = window.confirm("您确定要删除此界面吗?");
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)
{
//数据库修Ҏ调用
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);//单击事g调用Ҏ
tree.setOnRightClickHandler(viewRight);//讄右键调用Ҏ
// tree.insertNewChild('root',5,"新节?,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">名字Q?lt;/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">序号Q?nbsp; </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">是否昄Q?lt;/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">是否快速通道Q?lt;/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> </td>
<td> </td>
</tr>
<tr>
<td height="21"></td>
<td height="21">
</td>
<td></td>
<td> </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">名字Q?lt;/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">序号Q?nbsp; </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">是否昄Q?lt;/font> </div></td>
<td>
<div align="left" >
<select name="add_is_show" id="add_is_show">
<option value="0" selected>昄
<option value="1">不显C?/p>
</select>
</div>
</td>
</tr>
<tr>
<td height="21"><font size="2">是否快速通道Q?lt;/font></td>
<td height="21">
<div align="left" >
<select name="add_is_quick" id="add_is_quick">
<option value="0" selected>?br />
<option value="1">?/p>
</select>
</div>
</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td height="21"> </td>
<td height="21">
</td>
<td id="click"></td>
<td> </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>
存储q程为:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);
END TESTA;
然后呢,?/span>java里调用时q下面的代码:
package com.hyq.src;
import java.sql.*;
import java.sql.ResultSet;
public class TestProcedureOne {
public TestProcedureOne() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
CallableStatement proc = null;
proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");
proc.setString(1, "100");
proc.setString(2, "TestOne");
proc.execute();
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
当然了,q就先要求要建张?/span>TESTTB,里面两个字段Q?/span>I_IDQ?/span>I_NAMEQ?/span>
二:有返回值的存储q程Q非列表Q?/span>
存储q程为:
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;
?/span>java里调用时q下面的代码:
package com.hyq.src;
public class TestProcedureTWO {
public TestProcedureTWO() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, " hyq ", " hyq ");
CallableStatement proc = null;
proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
proc.setString(1, "100");
proc.registerOutParameter(2, Types.VARCHAR);
proc.execute();
String testPrint = proc.getString(2);
System.out.println("=testPrint=is="+testPrint);
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
}
注意Q这里的proc.getString(2)中的数?/span>2qL的,而是和存储过E中?/span>out列对应的Q如?/span>out是在W一个位|,那就?/span>proc.getString(1)Q如果是W三个位|,是proc.getString(3)Q当然也可以同时有多个返回|那就是再多加几个out参数了?/span>
三:q回列表
׃oracle存储q程没有q回|它的所有返回值都是通过out参数来替代的Q列表同样也不例外,但由于是集合Q所以不能用一般的参数Q必要?/span>pagkage?/span>.所以要分两部分Q?/span>
1Q?nbsp;Z个程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2Q徏?/span>存储q程Q存储过EؓQ?/span>
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS
BEGIN
OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
END TESTC;
可以看到Q它是把游标Q可以理解ؓ一个指针)Q作Z?/span>out 参数来返回值的?/span>
?/span>java里调用时q下面的代码:
package com.hyq.src;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureTHREE {
public TestProcedureTHREE() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "hyq", "hyq");
CallableStatement proc = null;
proc = conn.prepareCall("{ call hyq.testc(?) }");
proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
rs = (ResultSet)proc.getObject(1);
while(rs.next())
{
System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");
}
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
在这里要注意Q在执行前一定要先把oracle的驱动包攑ֈclass路径里,否则会报错的?/span>
如果有什么问题呢Q?/span>可以和我联系hnlyhyq@163.com;qq:77542728.
我的心愿Q愿中国的程序员早日辑ֈ世界水^Q领先世界科技?br />
补充一个用oracle存储q程分页的小例子Q?
1Q?Z个程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
end TESTPACKAGE;
2Q徏立存储过E,存储q程为:
create or replace procedure TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR,lowerNum in numeric,higherNum in numeric) is
begin
OPEN p_CURSOR FOR select * from ( select row_.*, rownum rownum_ from (select id,title,status from HYQTEST) row_ where rownum <= higherNum) where rownum_ >lowerNum;
end TESTC;
使用plsql试Q?
declare
lowerNum integer;
higherNum integer;
id varchar2(10);
title varchar2(500);
status numeric;
c testpackage.Test_CURSOR;
rownum_ integer;
begin
lowerNum:=1;
higherNum:=10;
TESTC(c,lowerNum,higherNum);
LOOP
FETCH c INTO id,title,status,rownum_;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('=行号='||rownum_||'=='||id||'==='||title||'===='||status||'==');
END LOOP;
CLOSE c;
end;
DWR是一个Open Source?java目。DWR可以让JavaScript调用q行在Web服务器里面的JAVAE序。简单一Ҏ者专业一点就是Easy AJAX for JAVA.
下面一步一步的介绍怎么完成一个简单DEMO
1Q从官方|站下蝲DWR https://dwr.dev.java.net/files/documents/2427/32252/dwr.war 把他直接攑ֈTOMCAT_HOME/webapps 下面
2Q编写一个Javacd下:
DWRTest.java
package com.test.ajax;
/**
*
* @author 方见?br /> *
*/
public class DWRTest {
public DWRTest(){
}
public String getMyName(){
return "James Fang";
}
}
3, 把DRWTestc配|在dwr.xml中,dwr.xml是DWR的配|文Ӟ所有需要在JavaScript中调用的java的类都必dq个文g中描q?nbsp;。这个文件的位于TOMCAT_HOME/webapps/dwr/WEB-INF/dwr.xml. ?lt;allow>标签中添加以下内?/p>
<create creator="new" javascript="MyTest" scope="application">
<param name="class" value="com.test.ajax.DWRTest"/>
</create>
4, ~写调用DWRTestc?getMyName的方法的HTML文gQtest.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, q行Q在览器中输入 http://localhost:8080/dwr/test.html
如果?form 提交到服务器?ASP E序QASP E序要获得用户选择的那?Radio ?value 是非常方便的Q用 request.Form("RadioName")Q不必理会有几个 Radio?/p>
但在 JS(JavaScript) 中就要复杂多了,我们不能像对其它元素Q如Q文本框Q一P使用 formid.objName.value 来取|我们应该循环q个l的 RadioQ判断其 checked 属性,再取倹{?/p>
Z方便使用javascript获取radio的|我写了一个通用的函数来实现Q?/p>
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;
}
比如Q我们有一个name属性ؓQ?#8220;myradio”的单选控件组Q要得到选中的|只需q样调用可以了Q?/p>
var RValue;
RValue=GetRadioValue("myradio");
如果没有l出的radioname控gQ则直接q回nullQ或者这一l控件没有被选择的项Q则也返回null?/p>
// 获取~辑器中HTML内容
function getEditorHTMLContents(EditorName) {
var oEditor = FCKeditorAPI.GetInstance(EditorName);
return(oEditor.GetXHTML(true));
}
// 获取~辑器中文字内容
function getEditorTextContents(EditorName) {
var oEditor = FCKeditorAPI.GetInstance(EditorName);
return(oEditor.EditorDocument.body.innerText);
}
// 讄~辑器中内容
function SetEditorContents(EditorName, ContentStr) {
var oEditor = FCKeditorAPI.GetInstance(EditorName) ;
oEditor.SetHTML(ContentStr) ;
}
FCKeditorAPI是FCKeditor加蝲后注册的一个全局对象Q利用它我们可以完成对~辑器的各种操作?/font>
在当前页获得 FCK ~辑器实例:
var Editor = FCKeditorAPI.GetInstance('InstanceName');
?FCK ~辑器的弹出H口中获?FCK ~辑器实例:
var Editor = window.parent.InnerDialogLoaded().FCK;
从框枉面的子框架中获得其它子框架的 FCK ~辑器实例:
var Editor = window.FrameName.FCKeditorAPI.GetInstance('InstanceName');
从页面弹出窗口中获得父窗口的 FCK ~辑器实例:
var Editor = opener.FCKeditorAPI.GetInstance('InstanceName');
获得 FCK ~辑器的内容Q?br />
oEditor.GetXHTML(formatted); // formatted 为:true|falseQ表C是否按HTML格式取出
也可用:
oEditor.GetXHTML();
讄 FCK ~辑器的内容Q?br /> oEditor.SetHTML("content", false); // W二个参CؓQtrue|falseQ是否以所见即所得方式设|其内容。此Ҏ常用?讄初始??表单重置"哦作?/font>
插入内容?FCK ~辑器:
oEditor.InsertHtml("html"); // "html"为HTML文本
?FCK ~辑器内Ҏ否发生变化:
oEditor.IsDirty();
?FCK ~辑器之外调?FCK ~辑器工h命oQ?br /> 命o列表如下Q?br /> 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
使用Ҏ如下Q?br /> oEditor.Commands.GetCommand('FitWindow').Execute();
= FCKConfig.BasePath + 'plugins/'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>模板验证</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();
//服务器返回信?br />
out.write(flag);
out.close();
//d本Action所有的h参数Q将path重新构造,加上h参数
//ActionForward forward= new ActionForward("project/projectSet.do?do=add&lotId=6");
//forward.setRedirect(true);
//传参数后q回
//return forward;
return mapping.findForward(null);
}
public ActionForward creattable(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
{
//实现功能代码
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>
js代码:
<script language="javascript">
var tag = false;
function doDelete()
{
if(deletecheck())
{
var theForm=document.projectSetForm;
theForm.action = "projectSet.do?do=delete&lotId=<%=request.getParameter("lotId") %>";
theForm.submit();
}
}
function deletecheck()
{
var theForm = document.projectSetForm;
var checked = false;
if(typeof(theForm.checkboxDelete.length)=="undefined"){
if(theForm.checkboxDelete.checked == true){
checked = true;
}
}else{
var len = theForm.checkboxDelete.length;
for (var i=0;i<len;i++){
if(theForm.checkboxDelete[i].checked == true){
checked = true;
break;
}
}
}
if(!checked){
alert("误选择一条要删除的记录!")
return(false);
}
if(confirm("定要删除吗Q?)){
return(true);
}
return(false);
}
function allcheck(){
var theForm = document.projectSetForm;
var len = theForm.checkboxDelete.length;
var i = 0
if (tag == false)
for (i=0;i<len;i++){
theForm.checkboxDelete[i].checked = true;
tag = true;
}
else{
for ( i=0;i<len;i++){
theForm.checkboxDelete[i].checked = false;
tag = false;
}
}
}
</script>
package com.gpdi.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class TestMain {
/**
* 存储一个用?br />
* @param user
*/
public void save(User user){
user.setUsername("TEST");
Card card=new Card();
//Card card1=new Card();
card.setCardnum("HGJUYT");
//card1.setCardnum("fghy55");
user.setCard(card);
//user.setCard(card1);
Session session=HibernateSessionFactory.currentSession();
card.setUser(user);
//card1.setUser(user);
Transaction tr=session.beginTransaction();
session.save(user);
//session.save(card);
tr.commit();
session.close();
}
public static void main(String[] args) throws Exception {
TestMain test=new TestMain();
test.save(new User());
}
}
Card.java
package com.gpdi.test;
/**
* Card generated by MyEclipse - Hibernate Tools
*/
public class Card implements java.io.Serializable {
// Fields
private Integer cardid;
private String cardnum;
private User user;
// Constructors
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/** default constructor */
public Card() {
}
/** full constructor */
public Card(String cardnum) {
this.cardnum = cardnum;
}
// Property accessors
public Integer getCardid() {
return this.cardid;
}
public void setCardid(Integer cardid) {
this.cardid = cardid;
}
public String getCardnum() {
return this.cardnum;
}
public void setCardnum(String cardnum) {
this.cardnum = cardnum;
}
}
User.java
package com.gpdi.test;
import java.util.HashSet;
import java.util.Set;
/**
* User generated by MyEclipse - Hibernate Tools
*/
public class User implements java.io.Serializable {
// Fields
private Integer userid;
private String username;
private Card card;
//private Set card = new HashSet();
// Constructors
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
/** default constructor */
public User() {
}
/** full constructor */
public User(String username) {
this.username = username;
}
// Property accessors
public Integer getUserid() {
return this.userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
}
HibernateSessionFactory.java
package com.gpdi.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
/**
* Configures and provides access to Hibernate sessions, tied to the
* current thread of execution. Follows the Thread Local Session
* pattern, see {@link http://hibernate.org/42.html}.
*/
public class HibernateSessionFactory {
/**
* Location of hibernate.cfg.xml file.
* NOTICE: Location should be on the classpath as Hibernate uses
* #resourceAsStream style lookup for its configuration file. That
* is place the config file in a Java package - the default location
* is the default Java package.<br><br>
* Examples: <br>
* <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml".
* CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code>
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
/** Holds a single instance of Session */
private static final ThreadLocal threadLocal = new ThreadLocal();
/** The single instance of hibernate configuration */
private static final Configuration cfg = new Configuration();
/** The single instance of hibernate SessionFactory */
private static org.hibernate.SessionFactory sessionFactory;
/**
* Returns the ThreadLocal Session instance. Lazy initialize
* the <code>SessionFactory</code> if needed.
*
* @return Session
* @throws HibernateException
*/
public static Session currentSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
try {
cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
/**
* Close the single hibernate session instance.
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* Default constructor.
*/
private HibernateSessionFactory() {
}
}
Card.hbm.xml