Dostep do hash mapy

0

Cześć,
Pewnie zadaję jakies trywialne pytanie, ale nie moge sobie z tym poradzic.
Jak z funkcji check dostać się do hash mapy - wyswietlic ja, czy też sprawdzić czy dana osoba sie w niej znajduje? Nie robiac tego funkcjami wiem jak to ogarnać, na funkcjach niestety nie :(
Z góry dzięki za pomoc.

public class Person {

    public static void init(String[] args) {

        HashMap<String, String> userBase = new HashMap<String, String>();

        userBase.put("adam", "nowak");
        userBase.put("tomek", "kowalski");
        System.out.println(userBase);
  }

    
   public static void check(){
    
   }

}
2

a userBase to nie chcesz, aby było polem w klasie? Zobacz DOBRY przykład co to jest klasa, jak się to gryzie.

po drugie: w Javie NIE MA funkcji

po trzecie: dopiero teraz widzę static'i. Wyrzuć tę ohydę

po czwarte: jest skrajnie mało prawdopodobne, żeby klasa Person (czyli człowiek, sztuk jeden) potzrebowąła kontener Person. Uzupełnię: klasa to nie jest zlepek "wszystkiego co wiem", tylko ma wyrazisty charakter, co się zaczyna od dobrze wymyślonej nazwy: Person to jedna osoba, ewentualnie Persons to jakiś zbiór osób, a na pewno Jabłko nie jest zbiorem ani Jabłek, ani Gruszek.

po piąte: sposób jak używasz Map świadczy że raczej nie rozumiesz, co robisz. To rozwiązanie nie przyjmie drugiego tonka czy adama. Używasz tego źle

jaka jest prawdziwa treśc zadania?

1

Nie można w Javie (w żaden cywilizowany sposób) z metody dobrać się do zmiennych zadeklarowanych lokalnie w innej metodzie. Można za to odwoływać się do pola w klasie :)

1

Prawdziwa treść zadania: w servlecie UserLoginServlet należy stworzyć metodę init(), wewnątrz której stworzona zostanie HashMap, zawierająca loginy i hasła użytkowników mających dostęp do systemu. Sprawdzenie poprawności wprowadzonych danych logowania odbywać się będzie za pomocą funkcji checkUser(), sprawdzającą czy dany user znajduje się w utworzonej mapie. fajny_bolek 11 minut temu

Co to za ostatnio wysyp servletowców / springowców z podstawowymi brakami w elementarzu.
Ktoś wam krzywdę robi

0

Idealne zadanie na ThreadLocal !

0

Mnie tam drugi semestr katują servletami i JSP :/

Wracając do tematu nie miałeś wcześniej przedmiotu Podstawy programowania albo Programowanie obiektowe ?
brakuje ci podstawowej wiedzy czym są zmienne oraz czym są pola klasy

1

Brzydko ale na temat
Wersja z parametrem:

public class Person {

    public static void init(String[] args) {
        HashMap<String, String> userBase = new HashMap<String, String>();

        userBase.put("adam", "nowak");
        userBase.put("tomek", "kowalski");
        check(userBase);
  }

   public static void check(HashMap<String, String> userBase){
        System.out.println(userBase);
   }
}

Wersja z polem statycznym:

public class Person {
    static HashMap<String, String> userBase ;

    public static void init(String[] args) {

        userBase = new HashMap<String, String>();

        userBase.put("adam", "nowak");
        userBase.put("tomek", "kowalski");
  }

   public static void check(){
        System.out.println(userBase);
   }

}
0

Ale skąd pomysł żeby to było statyczne w ogóle? Moim zdaniem ten init to miała być zwykła metoda wołana z konstruktora.

0
Shalom napisał(a):

Ale skąd pomysł żeby to było statyczne w ogóle? Moim zdaniem ten init to miała być zwykła metoda wołana z konstruktora.

init() jest częścią oficjalnego API klasy Servlet, a o tym mówi DOKŁADNIE przywołane zadanie (a nie pokrętny kod)

Oczywiście nikt rozsądny nie myśli/myślałby o staticach ... tylko kolega jest słabiutki w OOP (z tendencją w granicy do zera) i jedyne co umie, to na staticach

0

Stworzyłem coś takiego, ale wiesza mi się w 54 lini na wywołaniu metody init(), pomoże ktoś dlaczego? Z góry dzięki ;)


package com.mycompany.mavenproject3;

import java.io.IOException;
import java.io.PrintWriter;
import static java.lang.System.out;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "UserLoginServlet", urlPatterns = {"/UserLoginServlet"})
public class UserLoginServlet extends HttpServlet {
    
 String login;
 String haslo;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet UserLoginServlet</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet UserLoginServlet at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      
        response.setContentType("text/html");
	PrintWriter out = response.getWriter();
	     
        this.login = request.getParameter("userName");
        this.haslo = request.getParameter("userPass");
        out.println("Czesc " + this.login);
        out.println(this.haslo);

       init();

       if(this.haslo.equals(userBase)){
            RequestDispatcher adminDispatcher = request.getRequestDispatcher("/Dashboard");
        adminDispatcher.forward(request, response);
 
    }
        else{
            RequestDispatcher adminDispatcher=request.getRequestDispatcher("/loginFailed.html");
            adminDispatcher.include(request, response);
       
            }
    }
     
   
     public static void init(String[] args) {
          
        HashMap<String, String> userBase = new HashMap<>();
       
        userBase.put("marcin", "marcin");
        userBase.put("user", "user");
       
        checkUser(userBase);
  }

    
   public static void checkUser(HashMap<String, String> userBase){
            
        for (String key : userBase.keySet()){
            if(key.equals(haslo)){
                   System.out.println("User jest w bazie! ");
            }
            else{
            System.out.println("Usera nie ma w bazie ");
            }
        }
    }
}


4

Ale przecież ten kod nie ma absolutnie żadnego sensu o_O To sie nawet nie skompiluje edit: skompiluje się bo przypadkiem wołasz metodę init zupełnie inną niż chciałeś xD. static login i hasło? xD A jak dwóch userów wejdzie na stronę jednocześnie to co wtedy? Nic w tym kodzie nie jest napisane dobrze i widać ze zupełnie nie rozumiesz co robisz. Przykro mi ale jak ktoś nie umie napisać hello world to ciężko będzie napisać servlet.

tak na szybko:

@WebServlet(name = "UserLoginServlet", urlPatterns = {"/UserLoginServlet"})
public class UserLoginServlet extends HttpServlet {

    private final Map<String, String> userBase = new HashMap<>();

    @Override
    public void init() throws ServletException {
        super.init();
        userBase.put("marcin", "marcin");
        userBase.put("user", "user");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String login = request.getParameter("userName");
        String password = request.getParameter("userPass");
        out.println("Czesc " + login);
        out.println(password);
        if (checkUser(login, password)) {
            RequestDispatcher adminDispatcher = request.getRequestDispatcher("/Dashboard");
            adminDispatcher.forward(request, response);
        } else {
            RequestDispatcher adminDispatcher = request.getRequestDispatcher("/loginFailed.html");
            adminDispatcher.include(request, response);
        }
    }

    private boolean checkUser(String login, String password) {
        return Optional.ofNullable(userBase.get(login))
                .map(pass -> pass.equals(password))
                .orElse(false);
    }
}
0

Zrobiłem tak funkcje CheckUser, ale niestety działa tylko dla pierwszego wiersza mapy :(

 private boolean checkUser(String login, String password) {
    for (Map.Entry<String, String> i : userBase.entrySet()) {
          if(i.getValue().equals(password)){
            System.out.println("User jest w bazie ");
            System.out.println(i.getValue());
            return true;
      }
          else{
              System.out.println("Usera nie ma w bazie ");
              System.out.println(i.getValue());
              return false;
          }
      }
 return true;
}

0

Czekaj, czy Ty sprawdzasz po haśle zamiast po usernam'e? :D

EDIT:
Boże, bo jak od razu wychodzisz z pętli. I mapa nie jest do iterowania :D
Tak powiniene zrobić

 private boolean checkUser(String login, String password) {
        String storedPassword = userBase.get(login);
        return (storedPassword != null && storedPassword.equals(password));
    }

Jak masz 5 pudełek i chcesz sprawdzić czy któryś z nich zawiera 10 zł to rezygnujesz jak pierwsze nie będzie miało?

0

Ale co to znaczy ze działa tylko dla 1 wiersza mapy? — scibi92

mam taką mape:

userBase.put("aa", "bb");
userBase.put("cc", "dd");

Jak wpisze haslo bb to działa, jak wpisze dd to już nie

0

Czy ty jesteś normalny? Chcesz iterować po mapie? xD Rozumiem ze javy mozesz nie znać, ale przecież ty w ogóle nie umiesz programować. Jak zdałeś jakieś ASD bez rozumienia do czego służy mapa? Przecież cały sens tworzenia mapy klucz->wartość jest taki, ze możesz wyciągnać wartość dla danego klucza bez iterowania! Od tego masz get. Robisz mapa.get(klucz) i dostajesz wartość. U ciebie kluczem jest login a wartością jest hasło.
return password.equals(userBase.get(login)); i voila (o ile user podał jakieś hasło, inaczej trzeba null-check zrobić). Bez pętli i jakichś cyrków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1