Apache Wicket - formularz

0

Witam, piszę prostą stronę w Apache Wicket opierając się na przykładach z
http://wicketstuff.org/ Po kilku dniach zmagań natknełem się na problem, nie moge odczytać danych wprowadzonych do formularza
kod:

 
public class Add extends BasePage {

   

    public Add() {
        add(new AdminPanelBorder("border"));
        
        final FeedbackPanel feedback = new FeedbackPanel("feedback");
        add(feedback);
        add(new AddWineForm("addForm"));
    }
    
    static public final class AddWineForm extends Form<Wine> {

        public AddWineForm(final String id) {
            super(id);

            //titlce field
            final TextField<String> name = new TextField<String>("name", new Model<String>());
            name.setRequired(true);
            name.add(StringValidator.maximumLength(30));
            final FormComponentFeedbackBorder titleFeedback = new FormComponentFeedbackBorder("nameFeedback");
            add(titleFeedback);
            titleFeedback.add(name);

            //color choice
            List<String> colorList = new ArrayList<String>();
            colorList.add("Białe");
            colorList.add("Czerwone");
            final ListChoice<String> color = new ListChoice("color", new Model<String>(), colorList);
            color.setRequired(true);
            final FormComponentFeedbackBorder colorFeedback = new FormComponentFeedbackBorder("colorFeedback");
            add(colorFeedback);
            colorFeedback.add(color);

            //taste choice
            List<String> tastee = new ArrayList<String>();
            tastee.add("Wytrawme");
            tastee.add("Półwytrawne");
            tastee.add("Słodkie");
            tastee.add("Półsłodkie");
            final ListChoice<String> taste = new ListChoice<String>("taste", new Model<String>(), tastee);
            taste.setRequired(true);
            final FormComponentFeedbackBorder tasteFeedback = new FormComponentFeedbackBorder("tasteFeedback");
            add(tasteFeedback);
            tasteFeedback.add(taste);
            
            //price field
            final TextField<String> price = new TextField<String>("price", new Model<String>());
            price.setRequired(true);
            final FormComponentFeedbackBorder priceFeedback = new FormComponentFeedbackBorder("priceFeedback");
            add(priceFeedback);
            priceFeedback.add(price);
            
            //description field
            final TextArea<String> description = new TextArea<String>("description", new Model<String>());
            description.setRequired(true);
            description.add(StringValidator.maximumLength(300));
            final FormComponentFeedbackBorder descFeedback = new FormComponentFeedbackBorder("descFeedback");
            add(descFeedback);
            descFeedback.add(description);
            

        }

        @Override
        public final void onSubmit() {
     
            final Wine wine = getModelObject();
            
                
            }
        }
    }

Wydaje mi się, że metoda getModelObject() powinna utworzyć nowy obiekt typu Wine z wartościami podanymi w formularzu, niestety do zmiennej wine przypisany jest null. Bardzo proszę o pomoc :)

0

Ja tu nie widzę żebyś tworzył obiekt typu Wine. Wicket go przecież sam nie stworzy. Jedyne model jakie widzę to luźne modele typu Model<String>.

  1. Możesz wyciągnąć pola trzymające kontrolki do klasy i potem w metodzie onSubmit wyciągć od nich modele.
  2. Zrób CompoundPropertyModel dla całego formularza, np trzymający zwykłe POJO, dodaj go jako model do całego formularza i sprawa w sumie załatwiona. Tyle, że tracisz refaktoryzację i statyczne typowanie, jako że (Compound)PropertyModel przyjmuje nazwy zmiennych jako Stringi - https://cwiki.apache.org/WICKET/working-with-wicket-models.html#WorkingwithWicketmodels-CompoundPropertyModels

PS. Dawno się Wicketem nie bawiłem, być może coś się w modelach zmieniło.

0

Wielkie dzięki za szybką odpowiedź! Mam jeszcze jedno pytanie dotyczące sesji, w pliku ApplicationSession, który dziedziczy po WebSession mam zmienną boolean isLogged, której wartość jest zmieniana na true w przypadku podania odpowiego loginu i hasla. Czy potencjalny hacker może zmienić jakoś wartość tej zmiennej(nie znając hasła) i dzięki temu dostać się do panelu administratora? Jeżeli tak to jak to inaczej rozwiązać?

0

Ta sesja to jest przechowywana, tak mi się wydaje, tylko na serwerze, a więc żaden klient nie ma do niej bezpośredniego dostępu. Musisz pilnować tylko, aby gdzieś nie zrobić furtki dla hakera. Problem może być np jak ktoś przechwyci komuś ciasteczka i ukradnie jego sesję, ale od zabezpieczenia się przed tym to jest HTTPS.

A najlepiej jak zastosujesz jakiś gotowy system do kontroli uprawnień. Google: Wicket security, np http://wicket.apache.org/learn/projects/authroles.html

W ogóle bezpieczeństwo to jest grubsza sprawa i musisz zrobić sam małe rozeznanie :)

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