如何:选择日期,按按钮,创建文件,下载文件。使用JSP

时间:2016-01-14 21:56:11

标签: java jsp download struts2 action

英语不是我的母语,所以请耐心等待。

我想要的是什么:

如果有人访问该页面,可以选择两个日期并点击(单个)按钮下载 数据在所选的两个日期之间。

我已经有的工作:

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&oacute;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>&nbsp;</span><span>&nbsp;</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>

2 个答案:

答案 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&oacute;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>&nbsp;</span><span>&nbsp;</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>

再次感谢您的帮助。