【问题标题】:Passing Date from an HTML form to a servlet to an SQL database将日期从 HTML 表单传递到 servlet 到 SQL 数据库
【发布时间】:2011-07-20 14:41:50
【问题描述】:

我在通过 servlet 从 HTML 表单获取输入日期 (yyyyMMdd) 到 sql 数据库时遇到问题。表单中的日期作为字符串传递给 servlet,但后来我需要将其转换为日期以存储在数据库中。

我尝试了多种方法,日期格式化程序等。一种可能的方法是将其转换为 long 然后格式化,但这似乎有点小问题。

任何想法都将不胜感激。

好的,这包括表单和 servlet 的代码。我已将业务对象排除在外。

形式:

<html>
<head>
<title>Inputing Episode Into Sons Of Anarchy Database</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<h1>Add Sons Of Anarchy Episode to Database</h1>
<form name="sonsOfAnarchyForm" method="get" action="EnterpriseCWEverything\src\coursework\Servlet2.java">
  <p>Season Number: 
    <input name="seasonNumber" type="text" id="seasonNumber">
  </p>
  <p>Season Episode Number: 
    <input name="seasonEpisodeNumber" type="text" id="seasonEpisodeNumber">
  </p>
  <p>Series Episode Number: 
    <input name="seriesEpisodeNumber" type="text" id="seriesEpisodeNumber">
  </p>
    <p>Episode Title: 
    <input name="title" type="text" id="title">
  </p>
    <p>Written By: 
    <input name="writtenBy" type="text" id="writtenBy">
  </p>
    <p>DirectedBy: 
    <input name="directedBy" type="text" id="directedBy">
  </p>
    <p>Original Air Date (YYYY-MM-DD): 
    <input name="origionalAirDate" type="text" id="origionalAirDate">
  </p>
    <p>Viewing Figures US (Millions): 
    <input name="viewingFigures" type="text" id="viewingFigures">
  </p>  
  <p>
    <input name="addEpisode" type="submit" value="Add Episode">
  </p>
</form>
</body>
</html>

Servlet:(很抱歉尝试使用代码示例工具,但由于某种原因它不喜欢它。)

    package coursework;

import javax.servlet.*;
import java.util.Date;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

public class Servlet2 extends HttpServlet
{

    public void doGet (HttpServletRequest rq, HttpServletResponse rp) throws ServletException, IOException
    {
        rp.setContentType("text/html");
        PrintWriter out = rp.getWriter();
        out.println("<HTML>");
        out.println("<HEAD><TITLE> Insert - Test </TITLE></HEAD>");
        out.println("<BODY>");
        try 
        {
            ArrayList<Episode> episodes;
            episodes = new ArrayList<Episode>();
            String url = "jdbc:mysql://localhost:3306/sons_of_anarchy";
            String driver = "com.mysql.jdbc.Driver";
            Class.forName(driver);          
            Connection connection = DriverManager.getConnection(url,"root","password");
            
            // Convert string to date
            //String temp1;
            //long temp;
            //temp = Long.parseLong(rq.getParameter("origionalAirDate"));
            //temp1 = rq.getParameter("origionalAirDate");
            
            //Problem Code................................................
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
            Date date = formatter.parse(rq.getParameter("origionalAirDate"));
            
            //SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); 
            //Date date = formatter.format(rq.getParameter("origionalAirDate"));

            

            // Set the new instance of the episode row
            Episode temp;
            episodes.add(temp = new Episode(Integer.parseInt(rq.getParameter("seasonNumber")), Integer.parseInt(rq.getParameter("seasonEpisodeNumber")), Integer.parseInt(rq.getParameter("seriesEpisodeNumber")), rq.getParameter("title"), rq.getParameter("directedBy"), rq.getParameter("writtenBy"), date , Float.parseFloat(rq.getParameter("viewingFigures"))));
            PreparedStatement editStatement = connection.prepareStatement("INSERT into episode_guide");
            // Put in database
            editStatement.setInt(1, temp.getSeasonNumber());
            editStatement.setInt(2, temp.getSeasonEpisodeNumber());
            editStatement.setInt(3, temp.getSeriesEpisodeNumber());
            editStatement.setString(4, temp.getTitle());            
            editStatement.setString(5, temp.getDirectedBy());
            editStatement.setString(6, temp.getWrittenBy());
            editStatement.setDate(7, (java.sql.Date) temp.getOrigionalAirDate());
            editStatement.setFloat(8, temp.getViewingFigures());
            
            editStatement.executeUpdate();
            editStatement.close();
            connection.close();
            
            // Print out new entry
            int i = 0;
            while(i < episodes.size()){
            out.print(episodes.get(i).getSeasonNumber()+
                    "\t"+ episodes.get(i).getSeasonEpisodeNumber()+
                    "\t"+ episodes.get(i).getSeriesEpisodeNumber() +
                    "\t"+ episodes.get(i).getTitle()+
                    "\t"+ episodes.get(i).getDirectedBy()+
                    "\t"+ episodes.get(i).getWrittenBy()+
                    "\t"+ episodes.get(i).getOrigionalAirDate()+
                    "\t"+ episodes.get(i).getViewingFigures());
            
            out.print("<br>");
            i++;
            }
        } 
        catch (Exception e) 
        {
            out.println("Error" + e);
        }
        out.println("<H3> Basic Insert Servlet </H3>");
        out.println("Result...");
        out.println("</BODY></HTML>");
    }
}

抱歉,运球过长,但在上下文中可能更有意义。

【问题讨论】:

  • 当您说“sql”时,您是指 MS SQL Server 还是其他类型的 RDBMS?你说你已经尝试了很多方法:为什么这些方法都不适合你?另外,您是使用框架还是手动编写所有内容?您向我们提供的详细信息越多,就越有可能有人能够帮助您。
  • 当然,它使用 Access 作为数据库,但是目前我使用 MySQL 设置它。我正在手动编写所有代码,所有代码都在 servlet 与数据库通信并以 html 表单显示所有内容,并生成一个用于向数据库添加行的表单。除了用户预定义的日期外,我可以将所有内容都传递到数据库中。我的意思是 SQL,因为我使用 SQL 传递数据。
  • 哦,表单方面的当前错误是 Errorjava.text.ParseException: Unparseable date: "2011-02-01"
  • 这确实与yyyyMMdd的格式不匹配。格式可能是yyyy-MM-dd
  • 感谢 BalusC 我尝试了几种日期的变体,其他输出是关于无法将 javaSQL 转换为 Java.util

标签: java sql forms servlets jdbc


【解决方案1】:

要将 String 转换为 java.util.Date,请使用 Gursel 回答的 SimpleDateFormat

String string = "2011-03-22";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(string);

要将java.util.Date 转换为java.sql.Date,只需使用其构造函数即可。

preparedStatement.setDate(index, new java.sql.Date(date.getTime()));

由于SimpleDateFormat 不会返回java.sql.Date 的实例,因此无法进行转换。

【讨论】:

    【解决方案2】:

    您可以使用 SimpleDateFormat。

    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
    Date date = formatter.format("20110322");
    

    【讨论】:

    • 嗨 Koca,谢谢你,但是我目前有 // 将字符串转换为日期 //SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); //日期 date = formatter.parse(rq.getParameter("originalAirDate"));而且那个或你的例子都不起作用....我想知道我是否从表单中错误地提取数据。
    • 我将重新编写 servlet 和表单并在此处发布代码。如果您愿意看,我将不胜感激。
    【解决方案3】:
                ArrayList<BuisnessObject> episodes;
            episodes = new ArrayList<BuisnessObject>();
            String url = "jdbc:mysql://localhost:3306/sons_of_anarchy";
            String driver = "com.mysql.jdbc.Driver";
            Class.forName(driver);          
            Connection connection = DriverManager.getConnection(url,"root","password");
    
    
            BuisnessObject newEpisode;
    
            // Takes the date from the form in String and converts it java.util.date which is how the buisness object is written
            java.util.Date date = new SimpleDateFormat("yyyy-MM-dd").parse(rq.getParameter("origionalAirDate")); 
    
            // Creates an instance of the buisness object
            episodes.add(newEpisode = new BuisnessObject(Integer.parseInt(rq.getParameter("seasonNumber")), Integer.parseInt(rq.getParameter("seasonEpisodeNumber")), Integer.parseInt(rq.getParameter("seriesEpisodeNumber")), rq.getParameter("title"), rq.getParameter("directedBy"), rq.getParameter("writtenBy"), date, Float.parseFloat(rq.getParameter("viewingFigures"))));
            PreparedStatement editStatement = connection.prepareStatement("INSERT into episode_guide VALUES (null,?,?,?,?,?,?,?,?)");
    
            // Takes date from java.util.date and converts it to java.sql.date
            java.sql.Date mySqlDate = new java.sql.Date(newEpisode.origionalAirDate.getTime());
    
    
            editStatement.setInt(1, newEpisode.getSeasonNumber());
            editStatement.setInt(2, newEpisode.getSeasonEpisodeNumber());
            editStatement.setInt(3, newEpisode.getSeriesEpisodeNumber());
            editStatement.setString(4, newEpisode.getTitle());          
            editStatement.setString(5, newEpisode.getDirectedBy());
            editStatement.setString(6, newEpisode.getWrittenBy());
            editStatement.setDate(7, mySqlDate);
            editStatement.setFloat(8, (float) newEpisode.getViewingFigures());
    
            editStatement.executeUpdate();
            editStatement.close();
            connection.close();
    

    几个小时后,它起作用了......谢谢

    【讨论】:

    • 谢谢java.util.Date date = new SimpleDateFormat("yyyy-MM-dd").parse(rq.getParameter("origionalAirDate")); 用于获取并将其添加到 PreparedStatement 但如何验证是否已选择日期String param=request.getParameter("date"); if(param!=null) {/* set param*/} else setNull("date"); 这不起作用请您帮助我如何验证日期。
    【解决方案4】:
    java.util.Date date = new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("date"));
    System.out.println(date);
    
    java.sql.Date sqlDate = new java.sql.Date(date.getTime());
    
    PreparedStatement st = con  .prepareStatement("insert into emp values(?,?)");
    
    st.setString(2, "AAAAAAA");
    st.setDate(1, sqlDate);
    st.execute();
    

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 1970-01-01
      • 2019-03-17
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多