【问题标题】:passing Date parameter to create date range query传递 Date 参数以创建日期范围查询
【发布时间】:2012-05-28 06:18:42
【问题描述】:

使用下面的代码,我想问一下如何传递来自文本字段的“日期”参数。我打算使用 DAO 和 servlet 创建一个简单的日期范围查询。我可以使用此代码显示所有列,但是我想使用 Date 进行过滤...

这是我的代码:

My Servlet




package source;

import java.io.*;
import java.sql.SQLException;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;

/**
 *
 * @author jaypee.martinez
 */
public class parseServlet extends HttpServlet {

    private parseDAO parseDAO;


    @Override
    public void init() throws ServletException {
        String driver = "org.postgresql.Driver";
        String url = "jdbc:postgresql://localhost5432/mydb";
        String username = "postgres";
        String password = "secret";


        Database database = new Database(driver, url, username, password);
        this.parseDAO = new parseDAO(database);
    }


    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


            try {

            List<parseBean> parse_array = parseDAO.results();

            request.setAttribute("parse_array", parse_array);
            request.getRequestDispatcher("results.jsp").forward(request, response);
        }
            catch (SQLException e) {
            throw new ServletException("Cannot retrieve areas", e);
        }
    }

}

和我的 DAO

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package source;

import java.sql.*;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class parseDAO {

    private Database database;

    public parseDAO(Database database) {
        this.database = database;
    }

    public List<parseBean> results() throws SQLException {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<parseBean> parse_array = new ArrayList<parseBean>();
        SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");

        try {
            connection = database.getConnection();
            statement = connection.prepareStatement("select * from dateparse");


            resultSet = statement.executeQuery();


            while (resultSet.next()) {
                parseBean parsearray = new parseBean();
                parsearray.setDate(resultSet.getDate("date"));
                parsearray.setName(resultSet.getString("name"));
                parsearray.setAddress(resultSet.getString("address"));
                parse_array.add(parsearray);
            }
        } finally {
            if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
            if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
            if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
        }

        return parse_array;
    }
}

【问题讨论】:

    标签: java jsp postgresql jdbc


    【解决方案1】:

    使用HttpServletRequest#getParameter()收集请求参数。假设输入字段的名称为date

    String dateString = request.getParameter("date");
    

    使用SimpleDateFormat#parse() 使用特定模式将其转换为java.util.Date,具体取决于要求最终用户输入日期的方式。

    Date date = null;
    
    try {
        date = new SimpleDateFormat("yyyy-MM-dd").parse(dateString);
    }
    catch (ParseException e) {
        // Show error message to enduser about the wrong format and forward back to the JSP with the form.
        request.setAttribute("error", "Invalid format, please enter yyyy-MM-dd");
        request.getRequestDispatcher("search.jsp").forward(request, response);
        return;
    }
    

    将此作为方法参数传递给您的 DAO 方法:

    List<ParseBean> results = parseDAO.search(date);
    

    你需要把它转换成java.sql.Date,这样你就可以在SQL查询上使用PreparedStatement#setDate()来设置它:

    String query = "SELECT * FROM dateparse WHERE date = ?";
    // ...
    statement.setDate(1, new java.sql.Date(date.getTime()));
    

    您可以使用WHERE date &gt; ? 搜索比给定日期新的记录,或使用WHERE date &lt; ? 搜索早于给定日期的记录,或使用WHERE date BETWEEN ? and ? 搜索指定日期之间的记录。

    【讨论】:

    • 再次感谢 BalusC 我真的从你那里学到了很多...只是想澄清一下:List results = parseDAO.search(date);应该放在DAO类吧?
    • 不,就像现在一样在 servlet 中。让 DAO 自己调用是没有意义的 :)
    • @BalusC:date.getTime() 不是已弃用的方法吗?
    • @Hardik:答案就在 javadoc 中。
    • 不客气 :) 请记住,您不应该在 servlet 类中处理 java.sql.Date。仅将其保存在 DAO 类中。此外,模型属性不应为java.sql.Date,而应仅为java.util.Date
    【解决方案2】:

    在您的doGet 中,您将从请求中获得价值

    String dateFromTxt = request.getParameter("DateFromTxtField");
    

    将此传递给您的 dao 的 results 方法

    那么您的 results 方法可能如下所示:

    public List<parseBean> results(String filterDate) throws SQLException {
    
       String query = "select * from dateparse where date = ? ";
    
       // get connection and prepare statement, also format the incoming date as per your database requirement then say you store this in variable myFormattedDate
    
       statement.setDate(1, myFormattedDate);
    
       // Execute query and fetch result.            
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多