英语不是我的母语,所以请耐心等待。
我想要的是什么:
如果有人访问该页面,可以选择两个日期并点击(单个)按钮以下载 数据在所选的两个日期之间。
我已经有的工作:
JSP / Web开发对我来说是新的。这是我的方案,使用 datepicker 和 JSP 有一个页面可以查询数据库,在两个日期之间返回某些数据,并创建一个 .txt文件使用此数据可以节省本地。
创建文件后,可以按下另一个按钮下载文件。
我需要做什么:
我需要只有一个按钮,他们这两个操作,所以一旦文件保存在本地,就会出现提示下载和访问者可以下载。
由于这些词有多常见,很难在搜索引擎上找到我需要的东西。
我需要一个按钮。我不想要看起来像按钮的链接或锚点,对于一些人来说这可能是一件容易的事,但我已经失去了两天。
我被困住了,真的需要这个工作,任何帮助都会受到赞赏。
的信息:
Apache Tomcat:8.0.27&& Netbeans 8.1&& Ubuntu 14.04
JSP
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="resources/css/jtable.css" type="text/css">
<link rel="stylesheet" href="resources/css/style.css" type="text/css">
<link rel="stylesheet" href="resources/css/jquery-ui-1.10.3.custom.css" type="text/css">
<link href="resources/css/jquery-ui-1.10.3.custom.css" rel="stylesheet" type="text/css" />
<script src="resources/js/jquery-1.11.3.js" type="text/javascript"></script>
<script src="resources/js/jquery-ui-1.10.3.custom.js" type="text/javascript"></script>
<script src="resources/js/recuperacion-datos.js" type="text/javascript"></script>
<title></title>
<script>
$(document).ready(function(){
$("#datepicker1").datepicker({
maxDate: 0
});
$("#datepicker2").datepicker({
maxDate: 0,
onSelect: function(selected) {
$("#datepicker1").datepicker("option","maxDate", selected);
}
});
});
</script>
</head>
<body>
<center>
<div class="jtable-main-container" style="width: 60%;">
<div class="jtable-title">
<div class="jtable-title-text">
Recuperación de Datos
</div>
</div>
<div id="LecturasTableContainer" style="position: relative; text-align: center; font-size: 17px; top: 10px;">
Fecha Inicio: <input type="text" name="fechaInicio" id="datepicker1"> <span> </span><span> </span>
Fecha Fin: <input type="text" name="fechaFin" id="datepicker2">
<!-- Button who generate the file -->
<button type="submit" id="LoadRecordsButton" onclick="return confirm('Datos Recuperados');">Generar</button>
</div>
<br>
<!-- Button who download the file -->
<s:form action="download" method="POST">
<s:submit value="Descargar" type="button"/>
</s:form>
</div>
</center>
</body>
</html>
“Generar”按钮的操作类:
package com.raspberry.struts.action;
import static com.opensymphony.xwork2.Action.SUCCESS;
import com.opensymphony.xwork2.ActionSupport;
import com.raspberry.dao.control.DBControl;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import java.sql.Connection;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class DataRecovery extends ActionSupport implements ServletRequestAware {
public HttpSession session;
public Connection c;
public String fechaFin;// = null;
public String fechaInicio; // = null;
public String goDataRecovery(){
session.setAttribute("mainopt", "dataRecovery");
return SUCCESS;
}
public String doDataRecovery() throws ParseException, FileNotFoundException{
DBControl dato = new DBControl();
fechaInicio = getFechaInicio();
fechaFin = getFechaFin();
DateFormat df = new SimpleDateFormat("yyyMMMddkkmm");
String fecha = df.format(Calendar.getInstance().getTime());
String lectura = dato.selecAlltLecturasFecha(fechaInicio, fechaFin);
File archivo = new File ("/media/recovery"+fecha+".txt");
archivo.getParentFile().mkdirs();
PrintWriter printWriter;
printWriter = new PrintWriter(archivo);
printWriter.println (lectura);
printWriter.close ();
return SUCCESS;
}
public String getFechaFin() {
return fechaFin;
}
public String getFechaInicio() {
return fechaInicio;
}
@Override
public void setServletRequest(HttpServletRequest hsr) {
session = hsr.getSession();
}
}
“Descargar”按钮的动作类
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.ActionSupport;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class DownloadAction extends ActionSupport{
private InputStream fileInputStream;
public InputStream getFileInputStream() throws Exception {
return fileInputStream;
}
public String execute() throws Exception {
DateFormat df = new SimpleDateFormat("yyyMMMddkkmm");
String fecha = df.format(Calendar.getInstance().getTime());
fileInputStream = new FileInputStream(new File ("/media/recovery"+fecha+".txt"));
return SUCCESS;
}
}
struts.xml中:
<action name="GetDataRecovery" class="com.raspberry.struts.action.DataRecovery"
method="doDataRecovery">
<interceptor-ref name="SessionValidationStack" />
<result name="success">main.jsp</result>
<result name="sessionexpired">index.jsp</result>
</action>
<action name="download" class="com.raspberry.struts.action.DownloadAction">
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">fileInputStream</param>
<param name="contentDisposition">attachment;filename="recovery.txt"</param>
<param name="bufferSize">1024</param>
</result>
</action>
答案 0 :(得分:0)
如果您已关注example,则应该会看到他正在使用两个操作。一个操作映射到JSP页面,另一个操作用于下载。第一个用于返回无动作结果(缺少类属性)。需要通过操作访问JSP页面。如果你遵循这个技术 - 第一个动作,第二个JSP,那么你可以使用Struts2。
您还可以在返回此JSP的不同操作之间共享相同的JSP。如果要为两个或多个操作共享相同的JSP,则应添加包含文件名称/路径的结果。
您可以使用操作类属性(不是无操作结果)来保存JSP中可通过OGNL / JSTL或JSP EL访问的操作范围对象的状态。
你应该在表单中使用“提交”类型的元素,否则使用“按钮”类型并使用javascript提交表单(虽然它不涉及s:submit
标签)。
在DataRecovery
操作类中,您应该为下载链接或某些boolean
创建一个属性,以指示下载已准备就绪。只需保留操作"download"
的名称即可。如果属性具有值,则显示下载按钮。
<s:if test="downloadReady">
<s:form action="download" method="POST">
<s:submit type="button" cssClass="btn btn-primary" value="Descargar" />
</s:form>
</s:if>
private boolean isDownloadReady = false;
//getters and setters
并在保存文件后设置此变量。
答案 1 :(得分:0)
首先,感谢@ user3659052 @BalusC @Tiny和@Roman C,感谢您的评论。一切都非常有帮助。
我很困惑,所以在评论启示之后,决定先从一些教程开始,然后让网络应用程序正常工作。
修复“下载按钮”的struts操作后,我尝试在 Descargar Action Class 中生成该文件,但对数据库的查询为null。
错误是日期选择器上的表单ID 指向 Generar Action Class ,因此 Descargar Action Class 永远不会获取数据。因此,在将指针更改为“正确”操作后,能够获取日期,创建文件(本地)并在一个操作中下载。 (所以删除了Generar Action Class)
Struts .xml(片段)
<action name="DataRecovery" class="com.raspberry.struts.action.DownloadAction" method="goDataRecovery">
<interceptor-ref name="SessionValidationStack" />
<result name="success">main.jsp</result>
<result name="sessionexpired">index.jsp</result>
</action>
<action name="GetRecovery" class="com.raspberry.struts.action.DownloadAction">
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">fileInputStream</param>
<param name="contentDisposition">attachment;filename="recovery.txt"</param>
<param name="bufferSize">1024</param>
</result>
</action>
Descargar Action Class
package com.raspberry.struts.action;
import static com.opensymphony.xwork2.Action.SUCCESS;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.ActionSupport;
import com.raspberry.dao.control.DBControl;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
public class DownloadAction extends ActionSupport implements ServletRequestAware {
public InputStream fileInputStream;
public HttpSession session;
public Connection c;
public String fechaFin;// = null;
public String fechaInicio; // = null;
public String goDataRecovery(){
session.setAttribute("mainopt", "dataRecovery");
return SUCCESS;
}
public InputStream getFileInputStream() throws Exception {
return fileInputStream;
}
public String doDataRecovery() throws ParseException, FileNotFoundException{
DBControl dato = new DBControl();
fechaInicio = getFechaInicio();
fechaFin = getFechaFin();
DateFormat df = new SimpleDateFormat("yyyMMMddkkmm");
String fecha = df.format(Calendar.getInstance().getTime());
String lectura = dato.selecAlltLecturasFecha(fechaInicio, fechaFin);
File archivo = new File ("/media/recovery"+fecha+".txt");
archivo.getParentFile().mkdirs();
PrintWriter printWriter;
printWriter = new PrintWriter(archivo);
printWriter.println (lectura);
printWriter.close();
return SUCCESS;
}
public String getFechaFin() {
return fechaFin;
}
public String getFechaInicio() {
return fechaInicio;
}
public String execute() throws Exception {
doDataRecovery();
DateFormat df = new SimpleDateFormat("yyyMMMddkkmm");
String fecha = df.format(Calendar.getInstance().getTime());
fileInputStream = new FileInputStream(new File ("/media/recovery"+fecha+".txt"));
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest hsr) {
session = hsr.getSession();
}
}
<强> JSP 强>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="resources/css/jtable.css" type="text/css">
<link rel="stylesheet" href="resources/css/style.css" type="text/css">
<link rel="stylesheet" href="resources/css/jquery-ui-1.10.3.custom.css" type="text/css">
<link href="resources/css/jquery-ui-1.10.3.custom.css" rel="stylesheet" type="text/css" />
<script src="resources/js/jquery-1.11.3.js" type="text/javascript"></script>
<script src="resources/js/jquery-ui-1.10.3.custom.js" type="text/javascript"></script>
<script src="resources/js/recuperacion-datos.js" type="text/javascript"></script>
<title></title>
<script>
$(document).ready(function(){
$("#datepicker1").datepicker({
maxDate: 0
});
$("#datepicker2").datepicker({
maxDate: 0,
onSelect: function(selected) {
$("#datepicker1").datepicker("option","maxDate", selected);
}
});
});
</script>
</head>
<body>
<center>
<div class="jtable-main-container" style="width: 60%;">
<div class="jtable-title">
<div class="jtable-title-text">
Recuperación de Datos
</div>
</div>
<div style="position: relative; text-align: center; font-size: 17px; top: 10px;">
<s:form theme="simple" action="GetRecovery" method="POST" id="LecturasTableContainer">
Fecha Inicio: <input type="text" name="fechaInicio" id="datepicker1">
<span> </span><span> </span>
Fecha Fin: <input type="text" name="fechaFin" id="datepicker2">
<s:submit value="Descargar" id="LoadRecordsButton" type="button"/>
</s:form>
</div>
</div>
</center>
</body>
</html>
再次感谢您的帮助。