2016-05-22 7 views
-1

Ich benutze Java (JSP und Servlets) aber bin stecken geblieben. Von meiner Forschung glaube ich, dass ich möglicherweise ein Session-Level-Objekt benötigenEinfaches JSP/Servlet-Problem mit zugreifendem Objekt

Der Benutzer vervollständigt ein JSP-Formular, drückt Senden, und es ist POST für die Klasse NewServlet.

In NewServlet wird ein Objekt NewFileThing erstellt, in dem diese Informationen gespeichert werden.

@WebServlet(urlPatterns = {"/NewServlet"}) 
    public class NewServlet extends HttpServlet { 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    // Stuff happens here... 
String nameOfUser = request.getParameter("name"); 

    NewFileThing fi = NewFileThing(); 
    fi.addName(name); 

    response.sendRedirect("nextForm"); 
    } 
    } 

Der Benutzer wird dann redirect to nextForm.jsp. Wenn sie dieses Formular ausfüllen, werden sie an FinalServlet gesendet.

@WebServlet("/FinalServlet") 
@MultipartConfig 
public class FinalServlet extends HttpServlet { 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

// TODO how can I access object fi (NewFileThing) from here? 
fi.getName(); <--- Error, or if I make new object it's NULL... 
} 
} 

Frage: Innerhalb FinalServlet, wie kann ich das gleiche Objekt NewFileThing bekomme ich zuvor erstellt haben (gleiche Instanz)? Ich möchte kein neues erstellen!

Danke schöne Gemeinde!

Antwort

0

Ja, man kann dieses Objekt in der Sitzung speichern.

In NewServlet

NewFileThing fi = NewFileThing(); 
fi.addName(name); 

// get the session 
HttpSession session = request.getSession(); 
session.setAttribute("NewFileThing", fi); 

In FinalServlet

// get the session 
HttpSession session = request.getSession(); 

// get object from session 
NewFileThing fi = (NewFileThing) session.getAttribute("NewFileThing"); 

// Make sure it is on the session 
if (fi != null) 
{ 
    String name = fi.getName(); 
} 
+0

Gibt es eine Grenze für die Größe dessen, was in HttpSession eingefügt werden kann? – user5623335

+0

Dies hängt wirklich von den Speicherressourcen des Servers ab. Sie können definitiv eine gute Menge darin speichern, aber ich würde nicht zu verrückt werden. Sie müssen auch überlegen, wie viele gleichzeitige Benutzer es gibt. Versuchen Sie, die Sitzung so minimal wie möglich zu halten. Wenn Sie größere Objekte speichern müssen, sehen Sie sich andere Formen von persistentem Speicher an (z. B. Dateien, Datenbanktabellen usw.) –

+0

java.lang.IllegalArgumentException: setAttribute: Nicht serialisierbares Attribut mit dem Namen fi. Ich habe eine Lösung gegooglet, verstehe sie aber nicht: Sie können das Objekt serialisieren, indem Sie eine serialisierbare List-Implementierung verwenden und sicherstellen, dass die Objekte in der Liste auch serialisierbar sind. – user5623335

0

Wenn dies eine einfache Webanwendung ist, dann "ja", speichern Sie Ihr Objekt in der HttpSession.

Wenn dies eine komplexere Webapp ist, dann können Sie das Objekt in der HttpSession speichern, aber Sie müssen "schlauer" sein, wie Sie es tun. Oder erwägen Sie, einen dauerhaften Speicher irgendeiner Art zu verwenden.

+0

Welche Art von persistenten Speicher, wie eine Datenbank? Ich denke in meinem Fall wird HttpSession in Ordnung sein, da es nur Name, Adresse usw. ist. – user5623335

+0

Ein gewöhnlicher persistenter Speicher ist eine Datenbank. Denken Sie an etwas wie einen Einkaufswagen. – hooknc

0

response.sendRedirect() werden Ihre Anfrage Daten nicht behalten. Sie müssen die RequestDispatcher-Klasse verwenden. Es gibt mehrere Möglichkeiten, Daten in mehreren Klassen zu übertragen. Sie können es nach Bedarf in den Seitenbereich, den Geltungsbereich, den Sitzungsumfang oder den Anwendungsbereich der Anwendung aufnehmen. Im Seitenbereich werden Ihre Objektdaten nur auf derselben Seite gespeichert. Im Geltungsbereich der Anfrage wird Ihr Objekt bis zur nächsten nächsten Seite beibehalten. Im Sitzungsumfang behält Ihr Objekt die gleiche Sitzungszeit auf mehreren Seiten derselben Anwendung. Im Anwendungsbereich kann Ihr Objekt auch in mehrere Anwendungen reisen.

Die am häufigsten verwendeten Bereiche sind Anfrage und Sitzung.

Die Sitzung muss mit besonderer Vorsicht verwendet werden, wenn sie nicht ordnungsgemäß verwendet wird.

In Ihrem Fall scheint es mehrere JSP und Servlets zu geben, in denen das Objekt reisen muss, bevor es benutzt wird. Also besser in Sitzung setzen. Und nach der Verwendung entfernen Sie es aus der Sitzung. Die Messchancen sind also geringer.

Im ersten Servlet-Put-Objekt in der Sitzung

NewFileThing fi = NewFileThing(); 
fi.addName(name); 

// get the session 
HttpSession session = request.getSession(); 
session.setAttribute("NewFileThing", fi); 

es verwenden, wo Sie wollen // die Sitzung erhalten Http session = Anfrage.getSession(); // Objekt von Sitzung abrufen NewFileThing fi = (NewFileThing) session.getAttribute ("NewFileThing");

// Make sure it is on the session 
if (fi != null) 
{ 
    String name = fi.getName(); 
} 
Verwandte Themen