Wicket: Füllen von Textarea via AJAX irgendwo auf der PAGE

Dieses Thema Wicket: Füllen von Textarea via AJAX irgendwo auf der PAGE im Forum "Web Tier" wurde erstellt von JunkerMartin, 4. Apr. 2015.

Thema: Wicket: Füllen von Textarea via AJAX irgendwo auf der PAGE Beim Lernen von Wicket versuche ich eine simple Seite, dich bisher mit JSP und JavaScript erzeugt habe auf Wicket...

  1. Beim Lernen von Wicket versuche ich eine simple Seite, dich bisher mit JSP und JavaScript erzeugt habe auf Wicket umzustellen. Auf der Seite habe ich beliebig viele Links die ein und dieselbe TextArea auf der Seite füllen. Bei der Benutzung von Wicket gelingt mit das aber nur mit der Klasse "Link" und nicht mit "AjaxFallbackLink".

    Die zugrunde gelegte HTML ist (hier vereinfacht auf einen Link):
    HTML:

    <html>
    <body>
        <a href="#" wicket:id="link">Fill Textarea</a>
        <div id="logarea">
            <textarea style="color: red; background-color: lightgray"
                wicket:id="textarea" name="text" cols="120" rows="25"></textarea>
        </div>
    </body>
    </html>
     
    Der Code für die Auflösung mit LINK ist:
    Code (Text):

    public class LINKpage extends WebPage {
        private TextArea textarea;
        private LINKpage homePage;
        private String log="Hallo";
        private int count=0;
        public LINKpage() {
            homePage=this;
           
            textarea = new TextArea("textarea", Model.of(String.format("%s\n%s",count, log)));
            add(textarea);
           
            add(new Link("link") {

                public void onClick() {
                    File logFile = new File("filename");
                    StringBuffer lineBuffer = new StringBuffer();
                    count++;
                    try {
                        BufferedReader br = new BufferedReader(new FileReader(logFile));
                        String line;
                        while ((line=br.readLine()) !=null ) {
                            lineBuffer.append(line+"\n");
                        }
                        log=lineBuffer.toString();
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    textarea = new TextArea("textarea", Model.of(String.format("%s\n%s",count, log)));
                    homePage.replace(textarea);
                }
            });
        }
    }
     
    Meinen AJAX-Ansatz habe ich mal so geschrieben.
    Code (Text):

    public class SAXpage extends WebPage {
        private static final Logger LOGGER = LoggerFactory.getLogger(Tools.getClassName());
        private TextArea textarea;
        private SAXpage homePage;
        private String log="Hallo";
        private int count=0;
        public SAXpage() {
            homePage=this;
           
            add(new AjaxFallbackLink("link") {

                public void onClick(AjaxRequestTarget target) {
                    File logFile = new File("<filename>");
                    StringBuffer lineBuffer = new StringBuffer();
                    count++;
                    try {
                        BufferedReader br = new BufferedReader(new FileReader(logFile));
                        String line;
                        while ((line=br.readLine()) !=null ) {
                            lineBuffer.append(line+"\n");
                        }
                        log=lineBuffer.toString();
                        LOGGER.info("LOG={}", log);
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (target != null) {
                        target.addComponent(textarea);
                    }
                }

            });
            textarea = new TextArea("textarea", new Model(String.format("%s\n%s",count, log)));
            textarea.setOutputMarkupId(true);
            add(textarea);

        }
    }
     
    Der Ajax-Ansatz ist dem Beispiel aus "Wicket in Action" (Seite 20) nachempfunden. Da das Beispiel dort für Wicket 1.3.7 gemacht wurde (unter 6.19.0 gibt es die Methode "addComponent()" für "AjaxRequestTarget" nicht mehr) - habe ich mein Programm mit beiden Wickets ausprobiert. Es funktioniert mit beiden Umgebungen nicht.

    Ich habe hier ein prinzipielles Verständnisproblem und wäre dankbar für erhellende Kommentare.
     
    Zuletzt bearbeitet: 4. Apr. 2015
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Habe nun eine Lösung gefunden:
    Code (Text):

    public class SAXpage extends WebPage {
        private TextArea textarea;
        private SAXpage homePage;
        private String log="Hello";
        private int count=0;
        public SAXpage() {
            homePage=this;
           
            add(new AjaxFallbackLink("link") {

                public void onClick(AjaxRequestTarget target) {
                    File logFile = new File("<filename>");
                    StringBuffer lineBuffer = new StringBuffer();
                    count++;
                    try {
                        BufferedReader br = new BufferedReader(new FileReader(logFile));
                        String line;
                        while ((line=br.readLine()) !=null ) {
                            lineBuffer.append(line+"\n");
                        }
                        log=lineBuffer.toString();
                        LOGGER.info("LOG=\n{}", log);
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (target != null) {
                        target.addComponent(textarea);
                    }
                }

            });
            textarea = new TextArea("textarea", new Model() {
                  @Override
                  public Object getObject() {
                    return String.format("%s\n%s",count, log);
                  }
            });
            textarea.setOutputMarkupId(true);
            add(textarea);
        }
     
    So richtig im Klaren bin ich mir dabei noch nicht wie das funktioniert: Anscheinend wird bei jedem Request das Model neu gerendert.