Avatar billede decrypto Nybegynder
29. november 2005 - 21:02 Der er 55 kommentarer og
1 løsning

Hvordan putter jeg et objekt i en session variable?

Jeg sidder er her og gerne vil sætte mit objekt i en session variable. Dette vil jeg gøre i min servlet.

Jeg har fundet et eksempel på nettet...

HttpSession session;
session.setAttribute(validatedPerson);

For det første genkender min servlet ikke HttpSession, hvad skal jeg importere i toppen?

Det andet spørgsmål er om session.setAttribute(validatedPerson);
skal bruges til at smide mit person objekt ind i session variablen.

Send endelig forslag, hvis jeg er helt ved siden af.
Avatar billede decrypto Nybegynder
29. november 2005 - 21:04 #1
Min næsten komplette kode ser således ud:
----------------------------------------------------

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);

        String viewUrl = null;
        String pathInfo = request.getPathInfo();
        String action = request.getParameter("action");
       
        /* --------- Login validation ------------ */
        if(loginPath.equals(pathInfo)){
            if(action.equalsIgnoreCase("validate")){
                HipDAO a = new HipDAO();     
                PersonEntity validatePerson = new PersonEntity();           
               
                validatePerson.setEmail((String)request.getParameter("userName"));
                validatePerson.setUserPasword((String)request.getParameter("password"));
                validatePerson.setRoleID(Integer.parseInt(request.getParameter("roleID")));
               
                PersonEntity validatedPerson = new PersonEntity();
                validatedPerson = a.doValidatePerson(validatePerson);
               
                if(!(validatedPerson==null)){
                    //Set session variables etc
                    HttpSession session = new HttpSession();
                    session.setAttribute(validatedPerson);
                    viewUrl = inspectionLstView;
                }
                else{
                    viewUrl = loginView;
                }
            }
        }
......
Avatar billede arne_v Ekspert
29. november 2005 - 21:38 #2
request.getSession().setAttribute(key, value);

evt.

request.getSession(false).setAttribute(key, value);
Avatar billede decrypto Nybegynder
29. november 2005 - 21:55 #3
Kan jeg smide et helt objekt ind?
Avatar billede decrypto Nybegynder
29. november 2005 - 21:55 #4
Jeg prøver lige....
Avatar billede decrypto Nybegynder
29. november 2005 - 22:16 #5
Det ser ud som om det virker. Jeg har problemer med datoer kan du hjælpe?
Avatar billede decrypto Nybegynder
29. november 2005 - 23:06 #6
Fx. vil jeg i første omgang gerne kunne hardcode en dato (timestamp) variabel fx: '2005-11-25 01:00:00', da dette format (YYYY-MM-DD xx:xx:xx), er den måde min MySQL db vil have datoen i. Problemet er bare at jeg ikke kan få hardcodet sådan en variable.
Hvordan gør jeg dette?
Avatar billede arne_v Ekspert
29. november 2005 - 23:13 #7
Du bør bruge PreparedStatement til alle dato/tid typer i SQL !
Avatar billede decrypto Nybegynder
29. november 2005 - 23:25 #8
Det gør jeg også, men hvordan hardcoder jeg en Dato i det format jeg ønsker?
Avatar billede decrypto Nybegynder
29. november 2005 - 23:29 #9
PreparedStatement preparedStatement = connection.prepareStatement("SELECT ID AS INSPECTIONID, PROPERTYID, CUSTOMERID, DEALERID, STARTTIME, ENDTIME FROM INSPECTION WHERE PROPERTYID = ? AND STARTTIME LIKE '?%'");
            preparedStatement.setInt(1, this.propertyID);
            preparedStatement.setDate(2, this.startDate);
Avatar billede decrypto Nybegynder
29. november 2005 - 23:31 #10
this.startDate vil jeg gerne i første omgang harcode for at teste...
Avatar billede decrypto Nybegynder
29. november 2005 - 23:31 #11
Jeg har fx. også en metode som her -> hvor jeg vil hardcode en dato.

------------- Kode ----------------

    public void doSendInspectionRequest(int propertyID, int customerID, int dealerID, Date startDate, Date endDate){
        this.propertyID = propertyID;
        this.customerID = customerID;
        this.dealerID = dealerID;
        this.startDate = startDate;
        this.endDate = endDate;
       
        try{
            DbConnector dbConnect = new DbConnector();
            Connection connection = dbConnect.openConnection();
            PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO INSPECTION(propertyid, customerid, dealerid, starttime, endtime) VALUES(?, ?, ?, ?)");

            preparedStatement.setInt(1, this.propertyID);
            preparedStatement.setInt(2, this.customerID);
            preparedStatement.setInt(3, this.dealerID);
            preparedStatement.setDate(4, this.startDate);
            preparedStatement.setDate(5, this.endDate);

            dbConnect.executeUpdate(preparedStatement, connection);
            dbConnect.closeConnection();
        }
        catch(SQLException sqle){
            //System.out.println("Error getting data");
        }
    }
Avatar billede decrypto Nybegynder
29. november 2005 - 23:33 #12
Har du nogle forslag, jeg sidder nemlig i klemme her...:-(
Avatar billede arne_v Ekspert
29. november 2005 - 23:34 #13
når du bruger PreparedStatement så er formatet jo ligegyldigt

der er ikke tid konstanter i Java så du må gemme en String konstant
og så konvertere til tid typisk med SimepleDateFormat parse
Avatar billede decrypto Nybegynder
30. november 2005 - 10:38 #14
Ok, det prøver jeg iaften. SimpleDateFormat.parse("2005-11-28 14:00:00") vil kunne give mig det jeg ønsker?
Avatar billede arne_v Ekspert
30. november 2005 - 15:59 #15
Ja. Hvis formatet du angiver i constructor matcher det du angiver.
Avatar billede decrypto Nybegynder
30. november 2005 - 19:07 #16
Date date;
date = SimpleDateFormat.parse("2005-11-28 14:00:00");

Fejler...
Cannot find symbol
symbol  : variable SimpleDateFormat
location: class ControllerServlet
            date = SimpleDateFormat.parse("2005-11-28 14:00:00");
1 error
Avatar billede decrypto Nybegynder
30. november 2005 - 19:36 #17
Tror du ikke, at det DateFormat.parse(string) jeg skal bruge.
Avatar billede decrypto Nybegynder
30. november 2005 - 19:43 #18
Jeg har fundet dette eksempel

import java.util.*;
import java.text.*;
public class Junk {
 
public static void main(String[] args)
      throws java.text.ParseException {
       
  String vGrantdate = "2002-01-07 00:00:00.0";
  DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:ss:mm.SSS");
  Date date = dateFormat.parse(vGrantdate); Date thisDate = new Date();
  long millisDifference = thisDate.getTime() - date.getTime();
  long daysDifference = millisDifference / (1000 * 60 * 60 * 24);
  System.out.println(daysDifference);
       
}
}
Avatar billede decrypto Nybegynder
30. november 2005 - 19:45 #19
Men denne linje giver problemer:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:ss:mm.SSS");

Da den ikke kan finde DateFormat, selvom jeg har husket at importerejava.util.*;
og java.text.*;
Avatar billede decrypto Nybegynder
30. november 2005 - 19:49 #20
Hovsa, nu giver det ikke fejl....
Avatar billede decrypto Nybegynder
30. november 2005 - 19:56 #21
\ControllerServlet.java:116: doReturnReservedInspections(java.sql.Date,int) in classes.HipDAO cannot be applied to (java.util.Date,int)
inspections = a.doReturnReservedInspections(date, propertyID);

Ved du hvordan jeg kan fixe dette?
Avatar billede arne_v Ekspert
30. november 2005 - 20:31 #22
java.sql.Date og java.util.Date er 2 forskellige klasser

Du kan:

java.sql.Date d1;
java.util.Date d2;
d2 = d1;
d1 = new java.sql.date(d2.getTime());
Avatar billede arne_v Ekspert
30. november 2005 - 20:31 #23
date -> Date
Avatar billede decrypto Nybegynder
30. november 2005 - 20:37 #24
Men er det lige meget hvilken jeg definere mine dates i, når mine prepared statements skal bruge dem?

            preparedStatement.setDate(4, this.startDate);
            preparedStatement.setDate(5, this.endDate);
Avatar billede decrypto Nybegynder
30. november 2005 - 20:39 #25
Hvis jeg definerer mine dates som:

private java.util.Date startDate;
private java.util.Date endDate;

Kommer der røde bølgelinjer ;-), under mine to
preparedStatement.setDate(4, this.startDate);
preparedStatement.setDate(5, this.endDate);
Avatar billede arne_v Ekspert
30. november 2005 - 20:45 #26
PreparedStatement forventer en java.sql.Date
Avatar billede decrypto Nybegynder
30. november 2005 - 20:52 #27
Skal jeg så caste den til det, inden de kommer ned i mine prepared statements?
Avatar billede decrypto Nybegynder
30. november 2005 - 20:54 #28
Det ser ud som om den har 'slugt' disse to linjer:

            preparedStatement.setDate(4,(java.sql.Date) this.startDate);
            preparedStatement.setDate(5,(java.sql.Date) this.endDate);
Avatar billede arne_v Ekspert
30. november 2005 - 20:57 #29
det får du runtime fejl på

se 20:31:06 for konvertering den vej
Avatar billede decrypto Nybegynder
30. november 2005 - 21:12 #30
String selectedDate = "2005-11-28 14:00:00";
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:ss:mm.SSS");
Date date = dateFormat.parse(selectedDate);
date->Date????

Du føler sikkert at du skal skære det ud i pap for mig....
Avatar billede decrypto Nybegynder
30. november 2005 - 21:26 #31
Fandt dette eksempel på nettet, det må vel virke, vi prøver?

Assume sDate is of type java.sql.Date. Then
java.util.Date jDate = new java.util.Date(sDate.getTime());
Avatar billede decrypto Nybegynder
30. november 2005 - 21:29 #32
Ajjj!! det var det forkerte vej rundt.
Prøver lige omvendt....

Den åd denne:
java.sql.Date nDate = new java.sql.Date(date.getTime());
Avatar billede decrypto Nybegynder
30. november 2005 - 21:44 #33
Lort!

java.sql.Date nDate = new java.sql.Date(date.getTime()); <- kaster en exception, så denne linje virker ikke.
Avatar billede decrypto Nybegynder
30. november 2005 - 22:12 #34
Faktisk er det denne linje der ikke virker:

Date date = dateFormat.parse(selectedDate);
Avatar billede arne_v Ekspert
30. november 2005 - 23:23 #35
det her compiler (men kører selvfølgelig ikke):

        Connection con = DriverManager.getConnection("bla", "bla", "bla");
        PreparedStatement pstmt = con.prepareStatement("bla bla");
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        java.util.Date d1 = df.parse("2005-12-24");
        java.sql.Date d2 = new java.sql.Date(d1.getTime());
        pstmt.setDate(1, d2);
        pstmt.close();
        con.close();
Avatar billede decrypto Nybegynder
01. december 2005 - 21:49 #36
Oh, jeg er kommet en del videre, men nu har jeg et andet problem.

Det drejer sig om at lave sql LIKE %?% i mine queries, hvordan skriver man dem, når man gør brug af prepared statements.

fx har jeg en sql query:
SELECT ID AS INSPECTIONID, PROPERTYID, CUSTOMERID, DEALERID, STARTTIME, ENDTIME FROM INSPECTION WHERE PROPERTYID = 1 AND STARTTIME LIKE '2005-11-06%'

Som jeg ikke kan skrive om til ->
SELECT ID AS INSPECTIONID, PROPERTYID, CUSTOMERID, DEALERID, STARTTIME, ENDTIME FROM INSPECTION WHERE PROPERTYID = ? AND STARTTIME LIKE ?%

For det virker ikke med mine prepared statements.
preparedStatement.setInt(1, this.propertyID);
preparedStatement.setDate(2, this.startDate);

Ved du hvordan man løser dette problem?
Avatar billede arne_v Ekspert
02. december 2005 - 00:06 #37
mig bekendt kan man ikke bruge LIKE på tid kun på tekst

med tid bruger man normalt BETWEEN
Avatar billede decrypto Nybegynder
02. december 2005 - 14:12 #38
Det virker ellers.

Men hvis jeg bruger WHERE STARTTIME = '2005-11-06' så får jeg ingen ud, da det er timestamps, jeg skal nemlig have alle poster med '2005-11-06' datoen.

Og i det hele taget, hvordan virker prepared statements med like?
Avatar billede decrypto Nybegynder
02. december 2005 - 16:34 #39
SELECT ID AS INSPECTIONID, PROPERTYID, CUSTOMERID, DEALERID, STARTTIME, ENDTIME FROM INSPECTION WHERE PROPERTYID = 1 AND STARTTIME BETWEEN '2005-11-06 00:00:00' AND DATEADD(d, 1, '2005-11-06 00:00:00')

Burde vel virke...jeg prøver denne, når jeg kommer hjem. Håber at DATEADD også virker på MySQL 4.0.
Avatar billede decrypto Nybegynder
02. december 2005 - 18:26 #40
Nu får jeg 'fejl' i disse linjer(Faktisk hopper den over linjen når jeg debugger)

String selectedDate = "2005-11-06 00:00:00:00";
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:ss:mm.SSS");

java.util.Date dte = df.parse(selectedDate);<---- Denne linje få min debugger til at hoppe ned i noget andet, og det er ikke en gang i min catch.
java.sql.Date date = new java.sql.Date(dte.getTime());
Avatar billede decrypto Nybegynder
02. december 2005 - 19:29 #41
Lort! præcis det jeg frygtede DATEADD findes ikke mySql. Hvad gør man så????
Jeg leder efter det på nettet.
Avatar billede arne_v Ekspert
03. december 2005 - 04:57 #42
LIKE bør virke fint i pstmt

"SELECT ... WHERE felt LIKE ?"

pstmt.setString(1, "%" + noget + "%");
Avatar billede arne_v Ekspert
03. december 2005 - 04:58 #43
Avatar billede decrypto Nybegynder
03. december 2005 - 15:23 #44
Det virker men jeg har stadigvæk problemer med at parse en streng om til et timestamp.

String selectedDate = "2005-11-06";

selectedDate skal laves om til en java.sql.Timestamp, hvordan kan jeg det. Hvis du kan svare på det, giver jeg dig 100 point + disse points :o).

Jeg skal nemlig aflevere en opgave på mandag, og jeg mangler bare denne usecase, da den driller en del.
Avatar billede arne_v Ekspert
03. december 2005 - 15:58 #45
java.util.date d = df.parse(selectedDate);
java.sql.TimeStamp ts = new java.sql.TimeStamp(d.getTime());
Avatar billede decrypto Nybegynder
03. december 2005 - 16:07 #46
Prøver lige...
Avatar billede decrypto Nybegynder
03. december 2005 - 16:20 #47
Jeg ved ikke hvad der er galt, seovom jeg debugger og har sat breakpoint udfor disse to linjer:
java.util.date d = df.parse(selectedDate);
java.sql.TimeStamp ts = new java.sql.TimeStamp(d.getTime());

Så lige nøjagtigt når den når første linje (java.util.date d = df.parse(selectedDate);)

Så hopper helt ud af min metode. Jeg ved ikke hvad, det er der driller.
Avatar billede decrypto Nybegynder
03. december 2005 - 16:47 #48
Ahh, jeg får en parse execption. Hmmmm, hvad det mon være????
Avatar billede arne_v Ekspert
03. december 2005 - 16:54 #49
formatet i din SimpleDateFormat og din String matcher ikke
Avatar billede decrypto Nybegynder
03. december 2005 - 17:08 #50
Ja, jeg fandt ud af at formatet jeg skal matche er ("yyyy-MM-dd");
Det virker nu.
Avatar billede arne_v Ekspert
03. december 2005 - 18:04 #51
"2005-11-06"

og

"yyyy-MM-dd"

ser meget matchende ud

:-)
Avatar billede decrypto Nybegynder
03. december 2005 - 18:06 #52
Jeg er simpelthen en mongol med dato formater:

Hvordan får jeg dags dato som streng i formatet ("yyyy-MM-dd")?
Har prøvet følgende, men det virker ikke....

if(selectedDate==null){
    //Today date
    java.sql.Timestamp date = new java.sql.Timestamp(new java.util.Date().getTime());
    java.text.DateFormat df;
    selectedDate =  df.parse(date);
}
Avatar billede arne_v Ekspert
03. december 2005 - 18:14 #53
DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // format
java.util.Date d = new java.util.Date(); // nu som binær tid
String s = df.format(d); // nu som tekst streng
Avatar billede decrypto Nybegynder
03. december 2005 - 21:25 #54
Hvis du vil have point så send bare et svar ind.

Er du også ekspert på jstl ?? :-)

Så åbner jeg nemlig et spørgsmål på 200 point omkring noget jstl. Det drejer sig om en speciel løkke i jstl hvori der skal være noget tekstbehandling og tjeks på tider.

Hvad siger du arne_v ????? ;-)
Avatar billede arne_v Ekspert
03. december 2005 - 21:27 #55
svar

jeg er absolut ikke ekspert i JSTL

men jeg kender da lidt til det
Avatar billede decrypto Nybegynder
03. december 2005 - 21:29 #56
Ok, jeg åbner et nyt spørgsmål til 200 dask.
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