struts 如何把从数据库查出来的数据保存在本地

yerenmeng 2008-01-18 11:37:12
我现在已经完成了保存文件的功能,可以把从数据库查出来的数据显示在页面上,也可以弹出个保存的对话框来把数据保存成文本文件
问题是:我在其他电脑上按保存按钮,保存的对话框是在服务器上打开的,而不是在本地打开的,文本文件也保存在了服务器上,如何让那个对话框在本地打开,把文本文件保存在本地?
...全文
291 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyp0227 2012-08-28
  • 打赏
  • 举报
回复
挺有用
zhangyp0227 2012-08-28
  • 打赏
  • 举报
回复
已经使用
yerenmeng 2008-01-21
  • 打赏
  • 举报
回复
tangshuo

等 级:
发表于:2008-01-21 10:44:3024楼 得分:0
没那么复杂吧,你把response的头设置正确了,然后response.write(),就是向客户端发送数据流,
客户端自然就会显示保存对话框了。
-------------------------------------------------------------------------
这个只是出现下载的那种保存框~~~

我总觉得既然点浏览可以弹出那种打开的对话框,为什么我就不能弄个保存按钮调出保存的对话框呢,真让我失望啊
tangshuo 2008-01-21
  • 打赏
  • 举报
回复
没那么复杂吧,你把response的头设置正确了,然后response.write(),就是向客户端发送数据流,
客户端自然就会显示保存对话框了。
yerenmeng 2008-01-20
  • 打赏
  • 举报
回复
vlinux
神vlinux飘飘
等 级:
发表于:2008-01-19 18:53:2819楼 得分:0
真的不明白LZ的要求,不在服务器上打开,难道你想在客户端打开不成??!!!
---------------------------------------------------------
对,我就是这意思啊,我要把查询出来的数据保存在用户的机器上,是以文本文件的形式保存
就比如下载一样,只不过我想要的是动态生成的数据,由用户来动态选择,用户可以保存查询出来的全部数据,或者是一页,或者是一行,我想,既然有上传用的浏览按钮,点了浏览会出个对话框,为什么保存那个对话框就不在用户机上打开,而是在服务器上打开呢??我不想要把查出来的数据先保存在服务器上,然后出个下载的对话框,如果是这样我也就不用来问了,我也不想用javascript,我只想实现那种按了保存出保存对话框的那种,就算不用swt也可以,其他的也可以呀,swt要调用jni,用户机上装些东西可以实现我要的功能,但我还是不想要用户来装任何东西,各位,有办法吗?我知道你们都是高手,我是菜鸟,请帮帮我吧,诚心诚恳的请求帮助
sunyujia 2008-01-20
  • 打赏
  • 举报
回复
必须得让客户机装东西而且如果没用jre非常复杂

http://blog.csdn.net/sunyujia/archive/2008/01/20/2054006.aspx
sunyujia 2008-01-20
  • 打赏
  • 举报
回复
客户端没有swt,恕我孤陋寡闻,我不认为ie可以直接打开客户端上的程序,如果可以那就可以格式化客户端的硬盘,楼主你说呢,你还是换个思路吧,或者使用applet.
或者让客户下载你写好的基于swt的小程序,就像qq与www.qq.com交互哪种.
limon758 2008-01-20
  • 打赏
  • 举报
回复
swt是调用JNI的,所以想要在用户机上打开对话框,那么就需要用户机上安装第三方软件了
有个软件叫SmartSWT
可以实现你要的功能

SmartSWT简介

为了提高传统WEB应用的界面表现能力,RIA技术应时而生,各种RIA平台通过各种手段来提高丰富的图形界面。如Bindows,它使用动态HTML技术模拟Windows控件,还有Flex,直接使用Flash做为WEB应用的表现层,以弥补DHTML技术的不足。

而SmartSWT则是基于SWT的RIA发布平台。它可以将普通的SWT的应用直接发布成为一个可通过客户端浏览器访问的WEB应用,这样就使通过SWT直接开发 富UI的WEB应用成为了现实。不仅如此,基于SWT扩展的许多扩展包也大都可以直接使用,如JFace、GEF等。

SmartSWT和SmartClient不一样,它并不是将SWT应用程序下载到客户端来运行,而是和B/S模式的WEB应用一样,整个应用程序是运行在服务端的,只是运行过程中将图形界面实时显示于客户端的浏览器中,并将客户端的操作事件自动实时返回服务端,触发服务端原SWT应用的事件处理代码进行处理。服务端的SWT应用所进行的数据库操作和文件操作都是相对于服务器端进行的,而不像C/S应用那样,需要客户端自己将数据按自定义的通讯协议传回服务端再进行处理。

SmartSWT底层的通讯是加密而且高效的,在内网的客户端打开服务端的SWT应用,和原来直接在本机使用相比相差不多。相当于将您机器的CPU降一档后运行应用程序的感觉。

SmartSWT目前测试版本是3.1,表示支持SWT3.1的兼容应用程序。

下图是一个SWT应用(SWT Control Example)在SmartSWT平台部署后,客户端通过IE浏览器访问的效果:

安装运行

SmartSWT的测试版仅支持Windows系统,根据其用户手册的说明,它的服务端正式版将支持Linux、Unix等系统。SmartSWT安装运行非常简单,从www.smartswt.com下载SmartSWT31压缩包并解压,在解压目录下有三个子目录SmartSWTClient、SmartSWTServer和WEB。

1. 打开SmartSWTClient目录,运行Setup.exe安装客户端,该程序将在客户端安装一个定制的小型JAVA虚拟机。

2. 打开SmartSWTServer目录,运行Startup.bat,将运行SmartSWT服务端,SmartSWT使用自带的JAVA虚拟机,所以您不用预先准备它。

3. 如果您的客户端和服务端都在同一台机器,则直接进入WEB子目录,用IE打开index.htm文件,大约15秒钟左右即可在IE浏览器中启动SmartSWT桌面,您这时可以通过Start菜单,启动内置的DEMO程序体验一番。

开发SmartSWT应用

开发SmartSWT应用基本上和开发普通的SWT应用相同。您可以使用Eclipse的SWT可视化插件来帮助创建一个SWT应用程序,比较好的有Designer及Eclipse的VisualEditor等。

用于部署到SmartSWT服务器的SWT应用在开发时有些小的限制,幸好这些通常都只是举手之劳:

1. Display的获取必须统一使用Display display = Display.getDefault()方法,不能使用new Deisplay()创建,SmartSWT目前尚不支持多Display的应用,对大多数应用来说这不是问题;

2. 创建的Shell最好必须调用shell.setSize()对其尺寸进行初始化,否则在SmartSWT将默认呈最小化状态;

3. 尽量不要使用非公开的API,因为有少量非公开API,可能SmartSWT并没有实现它;

4. 尽量不要使用其它JNI技术和ActiveX控件,不要使用SWING和AWT等非基于SWT的控件;

5. 避免初始化时一次创建几十上百个控件,这样会造成启动时间较长,应在需要显示时创建控件。

部署SmartSWT应用

SmartSWT的部署一样很简单,只需将调试通过的SWT程序的类文件,按包名目录结构原封不动拷贝至SmartSWTServer的swtapps目录,然后在SmartSWTServer.xml文件中按以下格式注册一下,最后重启SmartSWTServer,你就可以通过客户端浏览器启动SmartSWT桌面,在Start->Programs菜单里启动它:

 

<!-- Configuration of each SWT Application name: the name of the SWT Application mainClass: the main class to start the SWT Application startup: will it start just after the smartswt desktop started(haven't supported) description: the description of the SWT Application--><Application name="ControlExample"mainClass="org.eclipse.swt.examples.controlexample.ControlExample"> <startup>false</startup> <description>ControlExample Application</description></Application>

SmartSWT: RIA平台的强有力竞争者

SmartSWT同其它RIA平台比较有一些独特的优势。首先它是基于SWT的RIA平台,依托强大的Eclipse阵营,有许多扩展技术可用,如JFace、GEF、EMF等,像UML设计器、报表、动画这样的复杂图形应用都可以通过SWT实现后,发布到SmartSWT,从而在WEB上很轻松地使用这些桌面应用独有的表现技术。还有OpenGL、RCP这类应用也有可能在将来得到支持,而且Eclipse不断发展中,SWT相关技术的不断成熟,都将以最快的速度同时运用于WEB应用。而且多年来用积累的用SWT开发的软件,不需要修改,或只需少量的修改,即可同时拥有WEB版本。

其次,很多JAVA应用开发者往往只对JAVA服务端的技术感兴趣,而对表现层采用的HTML、JS、JSP这类标签语言和脚本技术并不喜欢。而事实上兼通JAVA技术、HTML和脚本技术的程序员也是少之又少。这也是造成许多传统J2EE应用的界面表现不佳的原因。由于SmartSWT直接采用了SWT,使的整个应用的开发完全是纯JAVA技术的开发过程,开发者不再需要与非面向对象的HTML、JS、JSP等标签语言和脚本技术打交道,整个开发过程完全是桌面应用的开发模式,基于事件驱动。这使得应用开发在技术人员的配备上要容易得多。

此外,发布到SmartSWT的SWT应用,客户端通过浏览器使用时,仍然具有和原SWT一样的具有Windows本地风格的界面,具有和真正桌面应用一样的表现能力和事件机制,其表现能力和功能是Bindows以及Flex等技术无法真正模拟的。
SmartSWT的局限性

尽管SmartSWT有诸多好处,但也存在一些局限性。 由于技术实现的原因,对网络传输速度要求较高。SmartSWT在内网内访问时,其使用效果和本机上直接使用相差不多,但在外网上却几乎不具可用性。这决定了SmartSWT只能用于开发企业内网应用。

另外,和Flex类似,Flex要求客户端的浏览器安装一个Flash ActiveX控件,SmartSWT也有类似要求。SmartSWT客户端需要在浏览器中实时表现服务端SWT应用的图形界面,并对用户操作做出响应,这就需要在客户端安装一个特制的小型JAVA虚拟机,并以ActiveX控件的形式在IE中使用。某些政府机关的敏感部门对这种方式 可能比较反感。


选择SmartSWT,还是...

是否选择SmartSWT,取决于您的软件应用范围和客户。如果您的软件是内网的企业应用,您的用户日常办公使用的是Windows系统,而且对客户端安装一个小小的虚拟机不介意的话,选择SmartSWT无疑是上佳选择 。它将使您的WEB应用开发充分享受SWT开发的各种便利性和各方的丰富技术支持,完成普通WEB无法完成的功能。SWT界面的表现力和操作便利性,也会使客户满意度大大提高。

参考资料

您可以通过http://www.smartswt.net获得进一步的SmartSWT资料和试用软件。


http://www.eclipse.org/swt/这里是Eclipse SWT的基地,可以得到最新的SWT开发包和开发资料。


http://www.eclipse.org/上还有很多SWT相关的扩展项目,如GEF、EMF等。


您可以通过http://www.swt-designer.com/获得SWT应用开发的可视化Eclipse插件。

关于作者

黄林榕,J2EE软件工程师,多年的J2EE项目开发经验和Eclipse应用开发经验,目前从事RIA技术研究。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=620227
yerenmeng 2008-01-19
  • 打赏
  • 举报
回复
拜托大家,,,
这到底是因为什么原因呀
是不是因为我把这个保存功能写到后台的原因呀?保存功能要写到jsp页面上?
还是在后台需要用到response啊,我的保存功能不是在一个servlet里
还是需要在jsp上设置什么头文件呀?
帮帮忙好吗,哪怕给些思路也好
我真的没办法了
yerenmeng 2008-01-19
  • 打赏
  • 举报
回复
feirne2004
敢死队
不知道你说的那段代码需要放到哪里,应该放带open()的前边吧?
yerenmeng 2008-01-19
  • 打赏
  • 举报
回复
不用jsp调用,直接想办法让swt窗口弹出来,看看不经过jsp的窗口能否在客户端弹出
我在登陆的过程中调用了open,还是在服务器这打开的

-------------------------------------------------------------------------
我把swt打开对话框的代码贴在这,大家帮帮忙啊,不胜感激
package test;

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

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 DQtest
{
public boolean sqlDriverQuerySaveFileSqlBean() throws Exception
{
boolean sqlDriverQuerySaveFileSqlError = false ;
ResultSet rs = null;

try
{
FileDialog dlg;
Display display = new Display();
System.out.println(display);
Shell shell = new Shell(display);
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 abc where xm='zhangsan' " ;
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();
for(int i=1; i<meta.getColumnCount();i++)
{
b = (meta.getColumnName(i) + "\t").getBytes();
fos.write(b);
}
while(rs.next())
{
fos.write("\r\n".getBytes());
for(int i=1;i<meta.getColumnCount();i++)
{
b = (rs.getString(i) + "\t").getBytes();
fos.write(b);
}
sqlDriverQuerySaveFileSqlError = true;
}
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())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
}

catch (SQLException e)
{
e.printStackTrace();
}
finally
{
if (rs != null)
{
try
{
rs.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
return sqlDriverQuerySaveFileSqlError;
}
}

这段代码是由点了保存按钮调用的
DriverQuerySaveFileSqlBean dqsfsb = new DriverQuerySaveFileSqlBean();
dqsfsb.sqlDriverQuerySaveFileSqlBeanPage();
jsp上是这样的
<%@ page language="java" pageEncoding="gbk"%>

<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
<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>
<head>
<html:base />

<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">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
<h2>查询条件选择</h2>
<html:errors property="errorDriverQuery"/>
<html:form action="/DriverQuery.do" method="post">
<html:checkbox property="driverQueryCheckBox1" value="driverQuery01">姓名</html:checkbox>
<html:text property="driverQueryNameInput"/>
<br>
<html:button property="DriverQueryInsertButton" onclick="DriverQueryJavaScript('driverQueryInsertButton');">保存</html:button>
</html:form>
</body>
</html:html>

指点指点我吧,在我们屋任何一台机器上执行到fileName = dlg.open();//打开保存窗口这句,就在服务器上打开了
lihui157 2008-01-19
  • 打赏
  • 举报
回复
另存为excel文档撒,不是有那样的程序么?另外,采用cookes的方式应该也可以,但不够现实。
vlinux 2008-01-19
  • 打赏
  • 举报
回复
这样是做不到的,根据浏览器安全的限制,想想,如果任何一个网站都能随便向你的本地机读、写数据,那还了得--以前的IE5就是一个非常典型的例子

这种问题得求助其他的工具,并且浏览器和用户得信任这些插件
yerenmeng 2008-01-19
  • 打赏
  • 举报
回复
我也看到了这段,但是这个跟swt不冲突吗
我刚才把我保存功能全给提取出来了,放到另外一个项目里了
正在启动,单步测试一下,一会我给报告结果
feirne2004 2008-01-19
  • 打赏
  • 举报
回复
上面这段程序就是修改http协议里面的
响应头header
这样做,肯定没错
feirne2004 2008-01-19
  • 打赏
  • 举报
回复
private void exportData(
HttpServletResponse response, List resultList) throws
Exception {
OutputStream bos = response.getOutputStream();
if(filetype!=null&filetype.trim().equals("xls"))
{
response.setContentType("application/x-msexcel;charset=gb2312");
response.addHeader("Content-Disposition",
"attachment;filename=" + filename);
StringUtil.unloadToExcel(bos,resultList,null,"\\|");
}
else
{

response.setContentType("text/html;charset=iso8859-1");
response.addHeader("Content-Disposition",
"attachment;filename=" + DEFAULT_FILENAME);

for (Iterator it = resultList.iterator(); it.hasNext(); ) {
String obj = (String) it.next();
bos.write(obj.getBytes());
bos.write('\r');
bos.write('\n');
}
}


bos.close();
response.setStatus(response.SC_OK);
response.flushBuffer();
}
yerenmeng 2008-01-19
  • 打赏
  • 举报
回复
冬瓜
你以前还帮我解决了一个控制用户权限的问题
再谢你一次
我一会到公司了再按你说的测一下
有劳了,起身~
olivesoup 2008-01-19
  • 打赏
  • 举报
回复
我觉得跟你具体的保存处理可能关系不大,问题可能出在jsp调用swt,以及swt弹出窗口这两步上
你可以先将其他处理注释掉,只关注调用swt弹窗口
或者可以先不用jsp调用,直接想办法让swt窗口弹出来,看看不经过jsp的窗口能否在客户端弹出,
先保证这一点再看jsp与swt的衔接是否有问题

只能给你提供一些解决问题的办法,我还会继续关注的
vlinux 2008-01-19
  • 打赏
  • 举报
回复
真的不明白LZ的要求,不在服务器上打开,难道你想在客户端打开不成??!!!
yerenmeng 2008-01-19
  • 打赏
  • 举报
回复
帮忙看看啊各位
加载更多回复(7)

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧