昨天搞了一大天,终于搞明白了swt用在web上的的基本思想
先说说我的想要实现的功能,我是想在用户机上把查询出来的数据保存,可是我在用户机上点了保存按钮后,那个保存的对话框竟然是在服务器上打开的,我还以为我写的代码有问题,经过昨天一天的搜罗资料,我才明白,下面是重点了,swt是调用JNI的,所以想要在用户机上打开对话框,那么就需要用户机上安装第三方软件了,如果没有安装,那么用户是对服务器进行操作的,远程控制?汗。。
虽然下在swt上的心血白费了,可毕竟是我的劳动成果啊,还是把保存的功能粘贴在下边
首先jsp上需要有保存按钮
<html:button property="DriverQueryInsertButton" οnclick="DriverQueryJavaScript('driverQueryInsertButton');">保存</html:button>
<script language="javascript" type="text/javascript">
function DriverQueryJavaScript(driverQueryButton)
{
var insertButton = 'driverQueryInsertButton' ;
if(driverQueryButton==insertButton)
{
document.forms[0].action='DriverQuery.do?driverQueryType=driverQueryInsertButton' ;
document.forms[0].submit();
}
</script>
接下来判断是否点了保存按钮
if(driverQueryPageSaveNoncePage!=null)
{
DriverQuerySaveFileSqlBean dqsfsb = new DriverQuerySaveFileSqlBean();
if(dqsfsb.sqlDriverQuerySaveFileSqlBeanPage(response,sessionDriverQueryNameInput,sessionDriverQueryIdentityCardNumberInput,sessionDriverQueryRecordNumberInput,sessionDriverQueryAccumulativeTotalIntegralInput,sessionDriverQueryPermitDriverModelInput,sessionDriverQueryManageDepartmentInput,sessionPageStartRow,sessionPageEndRow))
{
System.out.println("驾驶员保存本页验证成功,允许保存本地文件");
}
保存功能的页面
package bean;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import util.PageDBConnection;
public class DriverQuerySaveFileSqlBean
{
//保存一页
public boolean sqlDriverQuerySaveFileSqlBeanPage(HttpServletResponse response,String sessionDriverQueryNameInput,String sessionDriverQueryIdentityCardNumberInput,String sessionDriverQueryRecordNumberInput,String sessionDriverQueryAccumulativeTotalIntegralInput,String sessionDriverQueryPermitDriverModelInput,String sessionDriverQueryManageDepartmentInput,Object sessionPageStartRow,Object sessionPageEndRow) throws Exception
{
boolean sqlDriverQuerySaveFileSqlError = false ;
try
{
FileDialog dlg; //定义一个文件存取窗口
// 每个swt程序在最开始都必须创建一个Display对象。它负责swt和操作系统之间的通信。它将swt/JFace的各种调用转化为系统的底层调用
// Display display = new Display();
Display display = Display.getDefault();
System.out.println(display);
Shell shell = new Shell(display);//一个Shell对象就是一个窗口。你可以在上面放置各种部件创建丰富的图形界面。
dlg = new FileDialog(shell, SWT.SAVE);// 设置为保存对话框
// 设置保存类型
dlg.setFilterNames(new String[]{
"Text Files(*.txt)",
"Excel Files (*.xls)",
"All Files (*.*)"
});
dlg.setFilterExtensions(new String[] {
"*.txt", "*.xls", "*.*"
});
String fileName = null;//所填写的文件名字
String fn = "";//用来判断用户有没填写文件名字
if (fn.equals(""))
{
fileName = dlg.open();//打开保存窗口
if(fileName != null)
fn = fileName;
}
if (fn != "")
{
final String SQL = "select * from person where name = '李猛' " ;
System.out.println(SQL);
rs = PageDBConnection.getResultSet(SQL);
byte[] b = null;
FileOutputStream fos = new FileOutputStream(fn);
OutputStreamWriter out = new OutputStreamWriter(fos);//写入文件流
out.write(dlg.getText());
ResultSetMetaData meta = rs.getMetaData();//获得ResultSetMeataData对象。所有方法的参数都是列的索引号,即第几列,从1开始
for(int i=1; i<meta.getColumnCount();i++)//获得该ResultSet所有列的数目
{
b = (meta.getColumnName(i) + "\t").getBytes();//获得i列对应数据类型的类,输出列
fos.write(b);//写入文件
}
// thisPageStartRow是获得了当前页面的起始行,thisPageEndRow是当前页面的结束行
int thisPageStartRow = Integer.parseInt(sessionPageStartRow.toString());
int thisPageEndRow = Integer.parseInt(sessionPageEndRow.toString());
//利用thisPageStartRowOne判断应该保存的是哪页
int thisPageStartRowOne = 0 ;
while(rs.next())
{
//一直循环到想保存的页,保存页之前的不进行操作
if(thisPageStartRowOne<thisPageStartRow)
{
thisPageStartRowOne++ ;
}
//判断是否是需要保存的页
else if(thisPageStartRowOne>=thisPageStartRow&&thisPageStartRowOne<=thisPageEndRow)
{
thisPageStartRowOne++;
fos.write("\r\n".getBytes());//让数据换行
for(int i=1;i<meta.getColumnCount();i++)
{
b = (rs.getString(i) + "\t").getBytes();//输出数据,循环一次数据一个字段
fos.write(b);
}
}
//一旦保存完毕,则退出循环
if(thisPageStartRowOne>=thisPageEndRow)
{
sqlDriverQuerySaveFileSqlError = true;
break ;
}
}
fos.close();//该关的关
out.close();
shell.setText(fn);
MessageBox successBox = new MessageBox(shell);
successBox.setText("信息");
successBox.setMessage("保存文件成功!");
successBox.open();
}
//display.dispose();和display.sleep();其中有一个能够执行到程序都可以正常
display.dispose(); // 释放底层的资源
shell.dispose();
while (!shell.isDisposed()) // 当窗体未被关闭时执行循环体内的代码
{
// 如果未发生事件,通过sleep方法进行监视事件队列
if (!display.readAndDispatch())
{
display.sleep();//关闭线程
}
}
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
if (rs != null)
{
try
{
rs.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
return sqlDriverQuerySaveFileSqlError;
}
}
这个保存的功能是可以保存一页的功能,要想保存全部数据,可以while(rs.next())中的判断