jsp servlet hyperlink

0

Witam czy może mi ktoś powiedzieć jak zaimplementować po stronie jsp następującą funkcjonalność:
1. aplikacja się włącza ładuje pewne informacje do cookies (załóżmy nr. seryjny urządzenia jako klucz
i informacje o nim jako wartość )
2. na stronie wyświetla się spis kluczy
3. użytkownik może kliknąć na dowolny klucz i wyświetli mu się wcześniej zapisana do cookies informacja.

1,2 - wiem jak zrobić (głównie dlatego że po stronie jsp nie było praktycznie nic do napisania :p ) ale mam spory problem z wymyśleniem jak zaimplementować 3 (za wyjątkiem pobrania informacji z cookies). Myślałem żeby każdy z nr podać jako hyperlink ale nie wiem jak wywołać java-ową metodę po kliknięciu w niego. Z góry thx za pomoc.

0

Servlet API z tego co pamiętam daje dostęp do ciasteczek z poziomu serwera (tzn tylko tych wysłanych do serwera), więc w czym problem?

0

Moje pytanie to jak wywołać metodą z java przez jsp np:

 
<FORM NAME="form1" ACTION="formAction.jsp" METHOD="POST">
            <INPUT TYPE="HIDDEN" NAME="buttonName">
            <INPUT TYPE="BUTTON" VALUE="Button 1" ONCLICK="button1()">
        </FORM>

        <SCRIPT LANGUAGE="JavaScript">
               function button1()
               {
                   // czyli po kliknięciu button 1 chciałbym żeby wyświetliła się ta informacja 
	       // najlepiej poprzez wywołanie np metody Do() z org.my.app.DoItClass.java
 	        // wiem jak znaleźć zapisaną informacje w cookies ale nie wiem jak napisać to po stronie jsp 
               }
        </SCRIPT>
0

Nie bardzo rozumiem co chcesz osiągnąć a tym bardziej dlaczego w taki właśnie sposób. Jeżeli to mają być ciasteczka to masz dostęp z poziomu javascript bezpośrednio do nich. Tutaj możesz zobaczyć przykład: http://www.w3schools.com/JS/js_cookies.asp
Jak chcesz to pobierać z serwera, to nie musisz tego mieć w ciasteczkach. Da się to zrobić przy pomocy AJAX'a, wtedy przekażesz takie parametry, żeby serwlet zwracał na nie typ xml a nie html i wypiszesz sobie co chcesz.
Patrząc na twój kod: "<SCRIPT LANGUAGE="JavaScript">" muszę ci przekazać pewną informację: technika poszła na przód. Albo masz starą książkę albo stare przyzwyczajenia.

0

Niestety jestem początkującym w tej technologi więc zdaje sobie sprawę że zastosowane prze zemnie techniki mogą być nieodpowiednie. Dzięki za link był bardzo pomocny. Jeżeli istnieje możliwość wywołania kodu z Java po kliknięciu w button to był bym bardzo wdzięczny za podpowiedź jak to zrobić. Potrzebuje tego ponieważ aplikacja ma realizować taki scenariusz:
Zalogowani do serwera -> pobranie danych i zapis do cookies -> wylogowanie -> przetwarzanie danych w zależności od woli użytkownika. Samo zapisanie do cookies w JSP jest fajne ale nie wiem czy dobrym pomysłem byłoby przetwarzanie danych w JSP ??

0

Skoro jesteś początkującym, to masz starą książkę, teraz pisze się inaczej: małymi literami i type="text/javascript". To co masz napisane działa jak najbardziej, ale to jakiś stary standard.
Przetwarzanie danych na serwerze to dobry pomysł, ale w JSP zły (bo zakładam, że masz na myśli scriptlety). Przechowywanie w cookies ma sens wtedy, jeżeli chcesz dane przechować między sesjami, czyli przy ponownym połączeniu do serwera mieć dane. Ale też nie w taki sposób. Przechowuje się jakiś identyfikator użytkownika, a same dane są w bazie danych na serwerze. Nie bardzo rozumiem dlaczego przetwarzanie ma odbyć się po wylogowaniu.
Co to za aplikacja? Do szkoły? Może daj całą treść, może już na wstępie masz jakieś błędy w koncepcji projektu i pogrążasz się niepotrzebnie w coś, czego można wcale nie robić.
Wywołanie po kliknięciu w button to normalna operacja: submitujesz formularz, servlet przetwarza zapytanie, coś robi i następnie przekierowywuje na widok JSP. AJAX pozwala to robić bez przeładowania strony: pobierasz tylko potrzebne dane i Javascriptem umieszczasz je w odpowiednich miejscach na stronie.

0

Witam w nowym roku ;).
Zadanie które implementowałem to: "połącz się z serwisem internetowym, pobierz dane, zapisz do cookies, rozłącz się, wyświetl klucze do informacji tak aby użytkownik po kliknięciu w klucz zobaczył dodatkowe informacje". Ponieważ jestem przyzwyczajony do pracy z JSF (ICEfaces) gdzie każdy button wywołuje metodę z kodu java a sam ICEfaces służy tylko i wyłącznie do wyświetlania informacji i podpinania get/set do swoich komponentów i szukałem podobnego rozwiązania w JSP. Z tego co piszesz widzę że jest to dalekie od przyjętej konwencji. Swój problem rozwiązałem poprzez <% out.print(metoda()) ;%> gdzie metoda zwraca dynamicznie wygenerowany kod JSP z button-ami do każdego klucza (gdzie poszczególne button-y różnią się wyłącznie parametrami). Wielkie dzięki za stronę z przykładem dotyczącym cookies (znacznie uprościła moje rozwiązanie). Jeżeli wiesz jak dostać się do "HttpServletRequest, HttpServletResponse" z JSF to bardzo bym był wdzięczny za jakąkolwiek podpowiedź bo dzięki temu mógłbym przejść na implementowanie rozwiązań do JSF które znacznie bardziej mi odpowiada.

0

Twoje rozwiązanie opiera się o scriptlety, a scriptlety to ZŁO!
Jest koncepcja beanów, która pozwala mieć dostęp do pól klasy (beana) na poziomie JSP poprzez ExpressionLanguage i to jest zdecydowanie lepsze rozwiązanie.
Co do kwestii dostępu do obiektów HttpServletCośTam, to da się tak:
FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.getExternalContext().getCośTam();

0

Ogromne dzięki za odpowiedź dzięki temu szybko przepisałem aplikacje z JSP na JSF i zdecydowanie lepiej to wygląda.
Jeśli jeszcze nie wyczerpałem twojej cierpliwości to zapytam czy kiedykolwiek spotkałeś się z czymś takim (bo po kilku godzinnej walki nie moge znaleźć sposobu na usunięcie problemu):
Tworze klasę dziedziczącą po "HttpServlet" i chce dostać się do zdeklarowanych zmiennych przez getInitParameterNames() i w tedy dostaje wyjątek iż ServletConfig nie został zainicjalizowany. Jeśli w konstruktorze dodam linie super.init(); nic się nie zmienia natomiast jeśli do konstruktora dołożę super.init(this); ServletConfig inicjalizuje się ale wywołanie getInitParameterNames() rzuca błędami

javax.el.ELException: /welcomeICEfaces.xhtml @30,58 value="#{master.init1}": java.lang.StackOverflowError
        at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:107)
        at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
        at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
        at javax.faces.component.UIOutput.getValue(UIOutput.java:168)
        at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
        at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:338)
        at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
        at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
        at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
        at org.icefaces.impl.renderkit.RendererWrapper.encodeChildren(RendererWrapper.java:54)
        at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
        at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
        at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
        at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
        at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
        at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
        ....(+ 600-700 linii błędów)

 

package MasterM;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author orim
 */
public class MasterMind extends HttpServlet {
    
    private HttpServletRequest request;
    private HttpServletResponse response;

    public String getInit() {
        try {
            super.init(this);
        } catch (ServletException ex) {
            Logger.getLogger(MasterMind.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.print("   getServletConfig()" + getServletConfig()); // jeśli nie ma super.init(this); lub zamienie to na super.init();
                                                                                            //getServletConfig() = null
        System.out.print(getInitParameterNames());

        return null;
    }
}



0

Nie powinieneś pisać ani własnego konstruktora ani nadpisywać żadnej metody init. Zakładam, że parametry servletu masz zdefiniowane w pliku konfiguracyjnym. I wtedy powinno zadziałać, a jak nie zadziała, to pewnie jakiś inny dziwny powód jest.

0

Niestety jest dokładnie tak jak napisałeś moja klasa wygląda jw. a bez wywołania super.init servletConfig jest null-em. Co gorsze zdefiniowałem zmienne (gdzie według dokumentacji metoda getInitParameterNames zwyczajnie zwrócić powinna null) a powyższy kod działa dla JSP (gdzie zwyczajnie w pliku *.jsp można odwołać się do do servletConfig). Jeszcze raz dzięki za wcześniejszą pomoc

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