Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

έχω δημιουργήσει 1 project σε java (webapp) για server και ένα για client.

Ακολουθώ Restful τεχνική.

Θέλω να κάνει ο client μια εγγραφή μέσω μιας html φόρμας και τις τιμές που συμπληρώνει ο χρήστης να της τραβάει ο server και να τις περνάει σε μία βάση(sqlite) τοπικά.

αντιμετωπίζω πρόβλημα αφού πατήσω το σχετικό κουμπί sign up.(error 404).

υπάρχει κάποιος που να γνωρίζει από rest?

 

HTML:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
         <form  action="/register/adduser" method="POST">




            <p> <input type="text" placeholder="Enter name" name="name" required></p>
            <p> <input type="text" placeholder="Enter username" name="username" required></p>
            <p> <input type="password" placeholder="Enter Password" name="password" required></p>
            <p> <input type="text" placeholder="Enter email" name="email" required></p>
            <p> <input type="text" placeholder="Enter sex" name="sex" required></p>
            <p> <input type="date" placeholder="Enter Date of Birth" name="birth" required></p>
            <p> <input type="country" placeholder="Enter country" name="country" required></p>
            <p> <input type="city" placeholder="Enter city" name="city" required></p>


            <button type="button" onclick="document.getElementById('id01').style.display = 'none'" class="cancelbtn">Cancel</button>
            <button type="submit" >Sign Up</button>




        </form>
    </body>
</html>

 

Register.java


//import static javax.ws.rs.HttpMethod.POST;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.jdbc.JdbcConnectionSource;
import com.j256.ormlite.support.ConnectionSource;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.ws.rs.FormParam;


import javax.ws.rs.POST;

import javax.ws.rs.Path;


import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;



@Path("/register")
public class Register {

    Connection conn;
    Statement stm;
    PreparedStatement preparedStatement = null;

    public Register() {

    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/adduser")
    public void createUser(@FormParam("name") String name, @FormParam("username") String username, @FormParam("password") String password, @FormParam("email") String email,
            @FormParam("birth") String birth, @FormParam("sex") String sex, @FormParam("country") String country, @FormParam("city") String city) throws SQLException {

        String res = "user created: " + username;
        Date bdate = Date.valueOf(birth);
        conn = DriverManager.getConnection("jdbc:sqlite:myDB.db");

        //stm=conn.createStatement();
//        String insq = "insert into users(name, username, email,password,birth,sex,country,city) values(?,?,?,?,?,?,?,?);";
//        preparedStatement = conn.prepareStatement(insq);
//        preparedStatement.setString(1, name);
//        preparedStatement.setString(2, username);
//        preparedStatement.setString(3, password);
//        preparedStatement.setString(4, email);
//        preparedStatement.setDate(5, bdate);
//        preparedStatement.setString(6, sex);
//        preparedStatement.setString(7, country);
//        preparedStatement.setString(8, city);
//        preparedStatement.executeUpdate();
        //stm.executeUpdate(insq);
           Users u=new Users(username,name,email,password,bdate,sex,country,city);
            ConnectionSource c=new JdbcConnectionSource("jdbc:sqlite:myDB.db");
           Dao<Users,Integer>userdao=DaoManager.createDao(c, Users.class);
           
           userdao.create(u);
        //return Response.status(201).entity(res).build();

    }

    public void selectAll() {
        try {
            ResultSet s = stm.executeQuery("select * from users");
            while (s.next()) {
                System.out.println("id: " + s.getInt("id"));
                System.out.println("id: " + s.getString("username"));
                System.out.println("id: " + s.getString("name"));
                System.out.println("id: " + s.getString("email"));
                System.out.println("--------------------------------");
            }
        } catch (SQLException ex) {
            Logger.getLogger(InstaFaceApp.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

Αυτοί οι 2 κώδικες είναι στην πλευρά του server.

Ευχαριστώ

Δημοσ. (επεξεργασμένο)

Το path στην action της φόρμας μάλλον φταίει. Χρησιμοποιείς netbeans? Αν ναι, δοκίμασε να χρησιμοποιήσεις "webresources/" και το path του service σου. Επίσης, όταν δημιουργείς μια web application με μία βάση δεδομένων, πατάς δεξί κλικ πανω στο project και επιλέγεις να σου φτιάξει entity classes για τους πίνακες της βάσης και έτσι γλιτώνεις αρκετό γράψιμο.

Επεξ/σία από TheDarkKnight
Δημοσ.

Χρησιμοποιώ netbeans. Είναι μια εργασία για την σχολή μου. Για τους πίνακες της βάσης σε κάθε πεδίο σε μια κλάση User έχω βάλει το σχετικό annotation που τα καθορίζει σαν στοιχεία του πίνακα της βάσης(πλειάδες). Οπότε δεν χρειάζεται το entity classes νομίζω,αλλά θα το δοκιμάσω σε ευχαριστώ πολύ. Το θέμα μου είναι οτι δεν μπορω να πάρω αυτα που συμπληρώνει ο client στην φορμα και να τα περάσω στη βάση.

Δημοσ. (επεξεργασμένο)

Καλησπέρα,

 

Δε μπορώ να σε βοηθήσω στο debugging που ουσιαστικά έχεις να κάνεις, ένα μικρό σχόλιο μόνο: αυτό που κάνεις δεν έχει απολύτως καμία σχέση με rest (δεν είναι rest οτιδήποτε μεταφέρει json payload), οπότε μην το βάζεις μέσα στην περιγραφή γιατί μόνο να μπερδέψει μπορεί.

Επεξ/σία από defacer
Δημοσ. (επεξεργασμένο)

Το path που του δίνεις φταίει....σιγουρα η εφαρμογή σου θα πρέπει να έχει ένα web.xml και ένα view-servlet.xml που θα γίνεται το configuration για να μπορούν οι κλήσεις που κάνεις να βρίσκουν τους controllers σου...

εαν χρησιμοποιήσεις καρφωτό ολόκληρο το url http://localhost:port/{το ονομα του webapp πιθανον}/register/addUser μπορεί να παίξει ... δεν χρειάζεται να δίνεις ολόκληρο το url  βεβαια απο την στιγμή που τα html αρχεία σου δεν αποτελούν μία ξεχωριστή εφαρμογή.

Ανέβασε το web.xml και το view-servlet.xml μηπως βγει κάποια άκρη :)

 

Επεξ/σία από makisvisual
Δημοσ. (επεξεργασμένο)

Αυτή η καημένη χρήση ορολογίας που αφορά στο REST ..  αιωνίως παραποιημένη, κάτι σαν το ΕΣΠΑ για τους νεαρούς wannabe startuppers ή σαν τα Promises για τους Javascripters.

Επειδή μοιάζει με άσκηση θα υποθέσω ότι έχεις  καθηγήτη ο οποίος σας το αναφέρει ως τεχνική. Ενημέρωσέ τον ότι πρόκειται για αρχιτεκτονική και όχι για τεχνική.

Κάνε του share τα στοιχειώδη για να μη σας θέτει λάθος θεμέλια, αν αύριο μεθαύριο πας για interview και το αναφέρεις ως τεχνική θα γελάνε και δε θα φταις εσύ.

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
https://www.amazon.com/RESTful-Web-APIs-Leonard-Richardson/dp/1449358063/

.

Κατα τ'άλλα το 404 ένα πράγμα σημαίνει πάντα, ότι δεν υπάρχει το path που δίνεις για χρήση στο POST. Περιόρισε τον εντοπισμό του σφαλματός σου εκεί αρχικά.

Αν και δε γνωρίζω σε τι βάθος βρίσκεσαι όταν στέλνεις POST στο /register/adduser, δοκίμασε να αφαιρέσεις την 1η κάθετο πριν το register καθώς η πρώτη κάθετος θα σε πετάει πίσω στο localhost/ πηγαίνοντας σε πιο πίσω από εκεί που υπάρχεις webικά δηλ δε θα μένει στο  localhost/myworkingpath/  εάν και εφόσον είσαι έτσι =>

<form action="register/adduser" method="POST">

Δοκίμασε και αυτό που σου ανέφερε ο @makisvisual  και γενικότερα βρες τη σωστή διαδρομή.

.

Παρατήρηση

Δεν υπάρχει country & city στα input types (μόνο το 1ο ως attribute σε autocomplete υπό συνθήκες)... τουλάχιστον όχι ακόμα, ωραία θα ήταν να γίνει κάποια στιγμή. Οπότε αλλαξέ τα σε

<input type="text" placeholder="Enter country" name="country" required>
<input type="text" placeholder="Enter city" name="city" required>

όχι φυσικά ότι φταίει αυτό στο πρόβλημα σου, αλλά να είμαστε σωστοί και στα υπόλοιπα

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input
https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fe-autocomplete

Επεξ/σία από The King

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...