Avatar billede madseksperten Nybegynder
11. marts 2014 - 12:36 Der er 33 kommentarer og
1 løsning

Servlet og javascript til at vise timer

Okay, jeg har haft en del tråde omkring dette emne, og jeg har ikke fået løst det endnu desværre efter 7 dages programmering kun med dette, så mit hoved er ved at gå amok disse dage.

Meningen med dette projekt er at man kan regne ud hvor meget man har arbejdet i en given periode. Her har man 3 form fields, hvor man skriver en dato (yyyy-mm-dd), hvor mange timer og minutter man har arbejdet på én dag i forskellige jobs. Dette bliver så gemt i min MySQL database.

Min database består af følgende kolonner:

            P_id  |  Date                |  Day_hours  |  Day_minutes  I Allday_hours  I
Job 1      1        2014-03-10              4                      45                    4.45
Job 2      2        2014-03-10              5                      15                    5.15
Job 3      3        2014-03-09              3                      30                    3.30
Job 4      4        2014-03-09              1                      45                    1.45

Det der sker her er at Day_hours og Day_minutes bliver lagt sammen i en fiktiv Allday_hours COLUMN. Det skulle gerne ske med følgende SQL query:
String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE Date = ?";
Herefter får jeg udskrevet det samlede timeantal, hvor det i dette tilfælde ville være: 15.15 timer

Pointen i dette er at man har en side hvor man vælger en "fra" dato og en "til" dato. Dette har jeg lavet i javascript, som ser sådan ud:

http://postimg.org/image/91rxb47ef/

Problemet ligger i at jeg skal KUN have det time antal der er arbejdet i den periode jeg vælger. Det vil sige jeg i min form har en "startDate" og en "endDate" hvor igennem min servlet så skal hente de pågældende datoer, hvorefter jeg får vist mine timer. Jeg har haft mange forskellige fejl, men fejlen er lige nu at der ikke bliver udskrevet noget som helst i mine divtags, men der er connection til databasen når jeg kører min JSP/Javascript side.

jeg håber virkelig der er nogle der kan hjælpe mig i mål med dette, så jeg kan komme videre i mit lille projekt? Så hvad er det der går galt her?

Mvh Mads

Mit java script:

<form>
        <input id="startDate"/>                    
        <input id="endDate"/>
    </form>
    <div id="startresult"></div>
    <div id="endresult"></div>
    <script>
     
    $(function(){
        $("#startDate").datepicker({
            dateFormat: 'yy-mm-dd',
            onSelect: function(dateText,inst){
                $('.selected-date').html(dateText);
               
                $.ajax({
                      url: "../getHoursSQL",
                      type: "post",
                      data: JSON,
                      success: function(data){
                          start: $("#startDate").val();
                          alert("success");
                          $("#startresult").html(data);
                         
                      },
                      error:function(){
                          alert("failure");
                          $("#startresult").html('there is error while submit');
                      } 
                    });
            }
        });
    });

    $(function(){
            $("#endDate").datepicker({
                dateFormat: 'yy-mm-dd',
                onSelect: function(dateText,inst){
                    $('.selected-date').html(dateText);
                 
                    $.ajax({
                          url: "../getHoursSQL",
                          type: "post",
                          data: JSON,
                          success: function(data){
                              end: $("#endDate").val();
                              alert("success");
                              $("#endresult").html(data);
                          },
                          error:function(){
                              alert("failure");
                              $("#result").html('there is error while submit');
                          } 
                        });
                }
            });
        });

</script>

(Her skal det lige siges at man kan lave det på en smartere måned, som en flink mand herinde har hjulpet mig med. Det venter jeg dog lige med, indtil jeg har fået det hele til at fungere)

Min Servlet:

package WorkPackage;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
        String startDate = req.getParameter("Date");
        String endDate= req.getParameter("Date");
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE Date = ?";
            PreparedStatement pst = connection.prepareStatement(sql);
                pst.setString(1,startDate);
                pst.setString(2,endDate);
            //Show the result from database
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            System.out.println(e);
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede arne_v Ekspert
12. marts 2014 - 01:51 #1
Indeholder:

        String startDate = req.getParameter("Date");
        String endDate= req.getParameter("Date");

de rigtige vaerdier?

Og skal de vaere ens?
Avatar billede arne_v Ekspert
12. marts 2014 - 01:52 #2
String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE Date = ?";
PreparedStatement pst = connection.prepareStatement(sql);
pst.setString(1,startDate);
pst.setString(2,endDate);

en ? og 2 set kan vist ikke passe.
Avatar billede arne_v Ekspert
12. marts 2014 - 01:53 #3
Jeg tror at du skal konvertere fra String til java.sql.Date og saa bruge setDate fremfor setString.
Avatar billede madseksperten Nybegynder
12. marts 2014 - 11:35 #4
Hej igen Arne.
Mange tak for svarene. Jeg håber jeg kan få lavet det idag eller inden imorgen tidlig.

#1 Det skal selvfølgelig være:
                String startDate = req.getParameter("startDate");
        String endDate= req.getParameter("endDate");

Hvis jeg har følgende:

                String startDate = req.getParameter("startDate");
        String endDate= req.getParameter("endDate");

#2 Min query

String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE Date = ?";

havde jeg først lavet som(eller efter din hjælp selvfølgelig :-) ):

String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE startDate = ? AND endDate = ? ";

Men jeg har ikke nogle startDate og endDate i min database. Kun Date.. men skal jeg have startDate = ? AND endDate = ? "; her?

Jeg kigger lige på java.sql.Date og uploader koden her
Avatar billede madseksperten Nybegynder
12. marts 2014 - 11:49 #5
Hvad med noget hen ala dette her. Jeg får så en fejl ved: format.parse(req.getParameter("endDate")); som hedder:
Type mismatch: cannot convert from java.util.Date to java.sql.Date

package WorkPackage;

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

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
        //String startDate = req.getParameter("startDate");
        //String endDate= req.getParameter("endDate");
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + "WHERE Date = startdate = ? AND endDate = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            //Date startDate;
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date startDate = format.parse(req.getParameter("startDate"));
            Date endDate = format.parse(req.getParameter("endDate"));
            pst.setDate(1,startDate);
            pst.setDate(2, endDate);
           
            //Show the result from database
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            System.out.println(e);
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede madseksperten Nybegynder
12. marts 2014 - 13:56 #6
Hej Arne. Jeg har prøvet at lave noget nyt kode med Date. Hvad siger du til det? Der kommer ingen fejl på min servlet, men når jeg kører min servlet får jeg beskeden i min console:

java.lang.NullPointerException

Exception er ikke mere specificeret end det.

package WorkPackage;

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

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
        //String startDate = req.getParameter("startDate");
        //String endDate= req.getParameter("endDate");
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + "WHERE Date = startdate = ? AND endDate = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            //Date startDate;
           
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
           
            java.util.Date util_StartDate = format.parse( req.getParameter("startDate") );
            java.sql.Date sql_StartDate = new java.sql.Date( util_StartDate.getTime() );
           
            java.util.Date util_EndDate = format.parse( req.getParameter("endDate") );
            java.sql.Date sql_EndDate = new java.sql.Date( util_EndDate.getTime() );
           
            pst.setDate( 1, sql_StartDate );
            pst.setDate(2, sql_EndDate );
           
            //Show the result from database
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            System.out.println(e);
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede madseksperten Nybegynder
12. marts 2014 - 14:05 #7
Men min servlet henter den startDate og endDate fra mit javascript her? I min database har jeg jo kun en "Date" column:

            P_id  |  Date                  |  Day_hours    |  Day_minutes      I Allday_hours  I
Job 1      1        2014-03-10              4                      45                    4.45
Job 2      2        2014-03-10              5                      15                    5.15
Job 3      3        2014-03-09              3                      30                    3.30
Job 4      4        2014-03-09              1                      45                    1.45
Avatar billede arne_v Ekspert
13. marts 2014 - 01:56 #8
Er der ikke mere i Tomcat's log fil?
Avatar billede arne_v Ekspert
13. marts 2014 - 01:56 #9
mere besked om fejl
Avatar billede arne_v Ekspert
13. marts 2014 - 01:57 #10
naeppe

men proev og erstat:

catch (Exception e){
            System.out.println(e);

med:

catch (Exception e){
            e.printStackTrace();
Avatar billede madseksperten Nybegynder
13. marts 2014 - 08:10 #11
Jo så får jeg meget mere:

java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at WorkPackage.getHoursSQL.doPost(getHoursSQL.java:40)
    at WorkPackage.getHoursSQL.doGet(getHoursSQL.java:18)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)


Jeg skal vel nok have kigget noget mere på det Dateformat?
Avatar billede madseksperten Nybegynder
13. marts 2014 - 10:28 #12
Arne jeg har fået optimeret min Javascript kode, som skulle fungere nu som jeg ser det. Jeg hentede jo ikke noget fra min gamle script. Når jeg kører min servlet får jeg en blank side, og når jeg kører min form og trykker submit, får jeg en 404 fejl.

Det nye ser sådan ud:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Working Hours</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
 
  <script>
    $(function() {
        $(".datepicker" ).datepicker();
    });
  </script>
  </head>
<body>
   
      <form method="post" id="myForm" action="getHoursSQL">
    Start Date:
        <input type="text" name="startDate" class="datepicker"/><br/>                   
        End Date:
        <input type="text" name="endDate" class="datepicker"/><br/>
   
        <input type="submit"/>
    </form>
    <div id="startresult"></div>
    <div id="endresult"></div>
     
</body>
<script type="text/javascript">

    $("input[name=endDate]").datepicker({
        dateFormat: 'yy-mm-dd',
        onSelect: function(date, instance){           
            var jsonStr = $('#myForm').serializeArray();
            console.log(JSON.stringify(jsonStr));
              $.ajax({
                  url: "../getHoursSQL",
                  type: "post",
                  data: JSON,
                  success: function(data){
                      start: $("#startDate").val();
                      alert("success");
                      $("#startresult").html(data);

                  },
                  error:function(){
                      alert("failure");
                      $("#startresult").html('there is error while submit');
                  } 
                });
        }
    });
</script>
</html>

Min servlet ser nu sådan ud:

package WorkPackage;

import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        System.out.println(req.getParameter("startDate"));
        System.out.println(req.getParameter("endDate"));
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + "WHERE startdate = ? AND endDate = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
           
            java.util.Date util_StartDate = format.parse( req.getParameter("startDate") );
            java.sql.Date sql_StartDate = new java.sql.Date( util_StartDate.getTime() );
           
            java.util.Date util_EndDate = format.parse( req.getParameter("endDate") );
            java.sql.Date sql_EndDate = new java.sql.Date( util_EndDate.getTime() );
                pst.setDate( 1, sql_StartDate );
                pst.setDate(2, sql_EndDate );
           
            //Show the result from database
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
   
Servlet:

package WorkPackage;

import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        System.out.println(req.getParameter("startDate"));
        System.out.println(req.getParameter("endDate"));
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + "WHERE startdate = ? AND endDate = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
           
            java.util.Date util_StartDate = format.parse( req.getParameter("startDate") );
            java.sql.Date sql_StartDate = new java.sql.Date( util_StartDate.getTime() );
           
            java.util.Date util_EndDate = format.parse( req.getParameter("endDate") );
            java.sql.Date sql_EndDate = new java.sql.Date( util_EndDate.getTime() );
                pst.setDate( 1, sql_StartDate );
                pst.setDate(2, sql_EndDate );
           
            //Show the result from database
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede madseksperten Nybegynder
13. marts 2014 - 10:29 #13
Java Console siger:

null
null
java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at WorkPackage.getHoursSQL.doPost(getHoursSQL.java:43)
    at WorkPackage.getHoursSQL.doGet(getHoursSQL.java:18)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
Avatar billede arne_v Ekspert
14. marts 2014 - 00:28 #14
Det virker helt klart som om at JavaScript ikke faar postet de felter rigtigt.
Avatar billede madseksperten Nybegynder
14. marts 2014 - 09:13 #15
Hey Arne.

Men min servlet ser ok ud nu, eller? Jeg er godt nok i tvivl om hvordan jeg gør det med min database. Når jeg kører min jsp side og vælger datoer får jeg printet de valgte datoerne ud:

2014-03-02
2014-03-25
SQLException caught: Unknown column 'startDate' in 'where clause'

Men jeg får også fejlen med at SQL query ikke kan finde startDate i min SQL. Det er jo så fordi jeg kun har Date i min database:


P_id  |  Date                  |  Day_hours    |  Day_minutes      I Allday_hours  I
Job 1      1        2014-03-10              4                      45                    4.45
Job 2      2        2014-03-10              5                      15                    5.15
Job 3      3        2014-03-09              3                      30                    3.30
Job 4      4        2014-03-09              1                      45                    1.45

Men hvordan kan jeg lave den query? Endvidere får jeg stadigvæk fejlen NullPointerException. Men det er mest min query jeg er interesseret i, hvis du har en ide til det?

java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at getHoursSQL.doPost(getHoursSQL.java:42)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
Avatar billede madseksperten Nybegynder
14. marts 2014 - 09:43 #16
Det må jo næsten være dette her så:

String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + " WHERE Date = ? AND Date = ? ";

Nu får jeg kun printet min dato, men får så returneret 0.0. Men det er nok noget at gøre med den NullPointerException jeg får
Avatar billede madseksperten Nybegynder
14. marts 2014 - 11:19 #17
Hey Arne.

Jeg har en fornemmelse af der er noget i vejen med min parse? Jeg får stadigvæk fejlen:

java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at getHoursSQL.doPost(getHoursSQL.java:40)
    at getHoursSQL.doGet(getHoursSQL.java:18)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)

Opdateret servlet:

import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + " WHERE Date = ? AND Date = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd");
           
            java.util.Date util_StartDate = format.parse( req.getParameter("startDate") );   
            java.sql.Date sql_StartDate = new java.sql.Date( util_StartDate.getTime() );
           
            java.util.Date util_EndDate = format.parse( req.getParameter("endDate") );       
            java.sql.Date sql_EndDate = new java.sql.Date( util_EndDate.getTime() );
                pst.setDate( 1, sql_StartDate );
                pst.setDate(2, sql_EndDate );
                System.out.println(req.getParameter("startDate"));                           
                System.out.println(req.getParameter("endDate"));
            //Show the result from database
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede madseksperten Nybegynder
14. marts 2014 - 11:52 #18
Så tror jeg sku det virker Arne. Eller jeg får ikke nogle exceptions mere. Jeg får dig udskrevet 0.0, når jeg vælger et interval hvor der skulle udskrives Allday_hours. Men ser det ikke fornuftigt ud?

<head>
  <script type="text/javascript">
  $(function() {
    $(".datepicker" ).datepicker({
      dateFormat: 'yy-mm-dd',
      onSelect: function(date, instance){
       
      },
    });
   
    $("input[name=endDate]").datepicker({
      dateFormat: 'yy-mm-dd',
      onSelect: function(date, instance){
        $.post( "../getHoursSQL", {start:$("#startDate").val(),end:$("#endDate").val()}, function( data ) {
          $( "#startresult" ).html( data );
        },'json');
      }
    });
  });
</script>

  </head>
<body>
   
    DatePicker Ajax Post Example:

    <form method="post" id="myForm" action="../getHoursSQL">
    Start Date:
        <input type="text" name="startDate" class="datepicker"/><br/>                   
    End Date:
        <input type="text" name="endDate" class="datepicker"/><br/>
   
        <input type="submit"/>
    </form>
    <div id="startresult"></div>
    <div id="endresult"></div>
</body>

Servlet:



import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + " WHERE Date = ? AND Date = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            SimpleDateFormat format = new SimpleDateFormat("yy-mm-dd");
           
            java.util.Date util_StartDate = format.parse( req.getParameter("startDate") );   
            java.sql.Date sql_StartDate = new java.sql.Date( util_StartDate.getTime() );
           
            java.util.Date util_EndDate = format.parse( req.getParameter("endDate") );       
            java.sql.Date sql_EndDate = new java.sql.Date( util_EndDate.getTime() );
                pst.setDate( 1, sql_StartDate );
                pst.setDate(2, sql_EndDate );
                System.out.println(req.getParameter("startDate"));                           
                System.out.println(req.getParameter("endDate"));
            //Show the result from database
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede madseksperten Nybegynder
14. marts 2014 - 13:43 #19
Det er godt nok ærgeligt der ikke er en redigere eller slet knap her, så man er fri for at poste næsten det samme tusind gange. Men jeg har ændret

java.util.Date util_StartDate til  java.util.Date util_startDate og på end også. Jeg får ikke nogle exceptions eller noget. Jeg får bare printet 0.0 ud

import java.io.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

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

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{
       
        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
       
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
         
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata "
                    + " WHERE Date = ? AND Date = ? ";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd");
           
            java.util.Date util_startDate = format.parse( req.getParameter("startDate") );   
            java.sql.Date sql_startDate = new java.sql.Date( util_startDate.getTime() );
           
            java.util.Date util_endDate = format.parse( req.getParameter("endDate") );       
            java.sql.Date sql_endDate = new java.sql.Date( util_endDate.getTime() );
               
                pst.setDate( 1, sql_startDate );
                pst.setDate(2, sql_endDate );
                System.out.println(req.getParameter("startDate"));                           
                System.out.println(req.getParameter("endDate"));
           
                //Show the result from database
           
                ResultSet rs = pst.executeQuery();
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
                pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede madseksperten Nybegynder
16. marts 2014 - 09:36 #20
Arne skal jeg ikke få lukket spørgsmålet.  Smider du et svar?

Mvh Mads
Avatar billede arne_v Ekspert
17. marts 2014 - 02:56 #21
Skal:

" WHERE Date = ? AND Date = ? "

ikke vaere:

" WHERE Date >= ? AND Date <= ? "

?
Avatar billede arne_v Ekspert
17. marts 2014 - 02:56 #22
Hvis det ikke virker skal du nok checke om det er de rigtige datoer som kommer over.
Avatar billede arne_v Ekspert
17. marts 2014 - 02:57 #23
Jeg kan godt smide et svar.

Men skal vi ikke have det til at virke??
Avatar billede madseksperten Nybegynder
17. marts 2014 - 09:53 #24
Jo jeg vil rigtig gerne have det til at virke, men ved snart ikke hvor jeg skal kigge mere. Der er i hvert fald et eller andet i vejen med mit SimpleDateFormat. Jeg har en fornemmelse af at req.getParameter("startDate") returnerer null, fordi den ikke kan finde startDate parameteret? (Udfra at getHoursSQL.doPost(getHoursSQL.java:40) ) :

java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at getHoursSQL.doPost(getHoursSQL.java:40)
    at getHoursSQL.doGet(getHoursSQL.java:18)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

Jeg tænker endvidere om det har noget med thread safe at gøre? :

http://www.palantir.com/2007/07/simpledateformat-is-not-thread-safe/

Om jeg skulle have en kode som lignede noget ala dette her:

SimpleDateFormat format = new SimpleDateFormat("yy-mm-dd");
           
            java.util.Date util_startDate = format.parse( req.getParameter("startDate") );   
            java.sql.Date sql_startDate = new java.sql.Date( util_startDate.getTime() );

SimpleDateFormat format_1 = new SimpleDateFormat("yy-mm-dd");
           
            java.util.Date util_endDate = format_1.parse( req.getParameter("endDate") );       
            java.sql.Date sql_endDate = new java.sql.Date( util_endDate.getTime() );
               
                pst.setDate( 1, sql_startDate );
                pst.setDate(2, sql_endDate );
                System.out.println(req.getParameter("startDate"));                           
                System.out.println(req.getParameter("endDate"));

Jeg kan bare ikke finde ud af om det er i min servlet eller javascript min fejl er. Men jo jeg ville gøre alt for at få det til at fungere lige nu.

Mvh Mads
Avatar billede arne_v Ekspert
17. marts 2014 - 14:23 #25
Proev og udskriv alle parametre som servlet modtager for at se hvad den JavaScript faktisk sender.
Avatar billede arne_v Ekspert
17. marts 2014 - 14:23 #26
Din SimpleDateFormat er en lokal variabel, saa ingen problemer p.g.a. den ikke er threadsafe.

Og desuden tester du vel kun med 1 request af gangen.  :-)
Avatar billede madseksperten Nybegynder
17. marts 2014 - 14:31 #27
fx dette her?

float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                    System.out.println(sql_startDate);
                    System.out.println(sql_endDate);
                   
                }
Avatar billede arne_v Ekspert
17. marts 2014 - 18:49 #28
nej

System.out.println(request.getParameterMap());

som noget af det foerste.
Avatar billede madseksperten Nybegynder
17. marts 2014 - 19:03 #29
ah ja selvfølgelig, før hele molivitten kører igennem.

Når jeg sætter det op får jeg null i begge dato. Der hvor der er null får jeg normalt:
2014-03-02
2014-03-25
når jeg kører min servlet. Det betyder at der ikke kommer nogle værdier fra mit javascript så, eller?

null
null
java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at getHoursSQL.doPost(getHoursSQL.java:38)
    at getHoursSQL.doGet(getHoursSQL.java:15)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
Avatar billede arne_v Ekspert
18. marts 2014 - 00:05 #30
Hvad udskriver

System.out.println(request.getParameterMap());

?
Avatar billede madseksperten Nybegynder
18. marts 2014 - 00:31 #31
Hvis jeg kører:
System.out.println(req.getParameterMap());
System.out.println(req.getParameter("startDate"));                           
System.out.println(req.getParameter("endDate"));


får jeg dette? :-/ ser besynderligt ud?

{}
null
null
java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at getHoursSQL.doPost(getHoursSQL.java:39)
    at getHoursSQL.doGet(getHoursSQL.java:15)
Avatar billede madseksperten Nybegynder
18. marts 2014 - 00:34 #32
iøvrigt også hvis jeg kører i doGet får jeg også det samme:

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println(request.getParameterMap());
        doPost(request, response);
    }

fejl:

{}
java.lang.NullPointerException
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1234)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at getHoursSQL.doPost(getHoursSQL.java:40)
    at getHoursSQL.doGet(getHoursSQL.java:16)
Avatar billede arne_v Ekspert
18. marts 2014 - 00:38 #33
{}

betyde en top map d.v.s. ingen parametre overhovedet

=> fejl i JavaScript
Avatar billede madseksperten Nybegynder
18. marts 2014 - 00:41 #34
ok, så ved jeg hvor jeg skal begynde at kigge nu så :-) Jeg må se om jeg kan finde ud af noget. Mange tak for det Arne. Jeg satser på at servletten fungerer nogenlunde med det jeg har indtil videre så
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester