Φόρτωση σελίδας JSP από Servlet


Ο τρόπος που κάνουμε render ένα περιεχόμενο σε Servlet δεν είναι βολικός. Ειδικά για Desighners ποιο βολικό είναι να δίνει στεγνή HTML και ο Developer να βάζει 2-3 προσθήκες κώδικα για functionality. Ειδικά σε One (Single)-page applications αυτό δεν είναι καθόλου βολικό. Γι αυτό δύνεται η δυνατότητα να φορτώνεις μια σελίδα JSP εντός ενός servlet.

Είδαμε εδώ και εδώ το πως να στήσουμε έναν tomcat και να τρέξουμε ένα servlet, ενώ είδαμε εδώ το πως να λαμβάνουμε παραμέτρους get και post.

Για το σκοπό μας θα χρησιμοποιήσουμε το servlet αυτού του άρθρου που θα το τροποποιήσουμε κατάλληλα για λόγους πληρότητας σας παραθέτω τον κώδικα του servlet (Θα αποθηκευτεί στο αρχείο Params.java):

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;

public class Params extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doPost(request,response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        String var=request.getParameter("message");
        PrintWriter out=response.getWriter();

        out.println("<!DOCTYPE HTML><html><body>");
        out.println("The message is"+var);
        out.println("</body></html>");
    }
}

Στο index.jsp (φάκελος webapp) βάζουμε τα εξής:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<body>
<h1>Entry via POST:</h1>
    <form method="POST" action="./params">
        <input type="text" name="message"/>
        <input type="submit"  value="Submit"/>
    </form>
<h1>Entry via GET:</h1>
    <form method="GET" action="./params">
        <input type="text" name="message"/>
        <input type="submit"  value="Submit"/>
    </form>
</body>
</html>

Με αυτό το περιεχόμενο στο web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>For article servlet</display-name>
    <servlet>
        <servlet-name> Params</servlet-name>
        <servlet-class> Params</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Params</servlet-name>
        <url-pattern>/params</url-pattern>
    </servlet-mapping>
</web-app>

Ενώ η δομή των αρχείων του project είναι η εξής:

.
├── pom.xml
└── src
    └── main
        ├── java
        │   └── Params.java
        ├── resources
        └── webapp
            ├── index.jsp
            └── WEB-INF
                └── web.xml

Για χάριν ευκολίας θα το δούμε σε 2 μέρη:

  1. Φόρτωση σελίδας .jsp από το servlet
  2. Φόρτωση και έλεγχος παραμέτρων των δεδομένων που στέλνει ένα servlet σε μια σελίδα .jsp

Φόρτωση σελίδας .jsp από το servlet.

Σε αυτό το σημείο θέλουμε την html σε περίπτωση επιτυχίας να φορτώνεται από το αρχείο success.jsp. Για να το πετύχουμε αυτό θελουμε τις εξής functions:

request.setAttribute(^String^,^Object^);

Με αυτή την function μπορείς να ορίσεις στο String ^String^ ένα στιγμιότυπο(instance) του αντικειμένου ^Οbject^. Σημειώνουμε ότι πρακτικά στο Object μπορεί να είναι ένα οποιοδήποτε αντικείμενο έτσι αν αυτό που θέλετε να βάλετε είναι προτεύων τύπος (int, char, byte, float, double, boolean) θα πρέπει πρώτα να το μετατρέψετε στο κατάλληλο αντικείμενο.

request.getRequestDispatcher(^path_selidas_jsp^);

Η παράμετρος ^path_selidas_jsp^ είναι η διαδρομή του αρχείου .jsp που θέλουμε. Επιστρέφει ένα στιγμιότυπο (instance) του interface RequestDispatcher.

^Request_Dispatcher_instance^.forward(request,response);

Την καλούμε αυτούσια όπως την βλέπετε παραπάνω αντικαθιστώνστας το ^Request_Dispatcher_instance^  με την μεταβλητή που κρατά το στιγμιότυπο του  RequestDispatcher. (βλ. παράδειγμα). Ουσιαστικά με αυτόν τον τρόπο ανακατευθυνόμαστε στην σελίδα .jsp

Ακόμη καλό είναι πριν την ανακατεύθυνση να ορίζεται το τι θα είναι αυτό που σερβίρει και ποια η κωδικοποίηση των χαρακτήρων (για κάποιο λόγο τα servlets δεν τα πάνε καλά με το UTF-8) με την εξής κλήση μεθόδων:

response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");

H response.setContentType ορίζει τον τύπο αρχείου που θα σερβίρει ενώ η response.setCharacterEncoding ορίζει την κωδικοποίηση χαρακτήρων.

Σημειώνουμε ότι αντί για «text/html;charset=UTF-8» στην response.setContentType μπορούμε να ορίσουμε διαφορετικό string ανάλογα με το τι είναι αυτό που θέλουμε να σερβίρουμε, το string που δίνουμε σαν παράμετρο περιέχει το MIME τύπο των δεδομένων που θέλουμε να σερβίρουμε.

Η προτεινόμενη σειρά η οποία που θα καλείτε τις μεθόδους είναι:

  1. Για κάθε μια παράμετρο πυο χρειάζεστε να εμφανίσετε καλείτε την request.setAttribute. (Αν δεν έχουμε τίποτε να δώσουμε στην σελίδα .jsp τότε προχωράμε στο παρακάτω βήμα)
  2. Δημιουργούμε τον Dispatcher με την μέθοδο request.getRequestDispatcher.
  3. Ορίσουμε το τι είδους είναι αυτό που σερβίρουμε με την μέθοδο response.setContentType.
  4. Ορίζουμε το Encoding με την μέθοδο response.setCharacterEncoding.
  5. Καλούμε την μέθοδο forward (Μέθοδος αντικειμένου RequestDispatcher)

Έτσι στο παράδειγμα το servlet γίνεται:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;

public class Params extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doPost(request,response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        String var=request.getParameter("message");
        request.setAttribute("message",var);

        RequestDispatcher dispatcher =request.getRequestDispatcher("success.jsp");

        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        dispatcher.forward(request,response);
    }
}

Και δημιουργούμε ένα αρχείο sucess.jsp στον φάκελο webapp του project με το εξής περιεχόμενο:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload Status</title>
</head>
<body>
<h1>Upload Status</h1>
</body>
</html>

Έτσι το project μας θα έχει την εξής δομή:

.
├── pom.xml
└── src
    └── main
        ├── java
        │   └── Params.java
        ├── resources
        └── webapp
            ├── index.jsp
            ├── success.jsp
            └── WEB-INF
                └── web.xml

Φόρτωση και έλεγχος παραμέτρων των δεδομένων που στέλνει ένα servlet σε μια σελίδα .jsp

Εφόσον καταφέραμε να φορτώσουμε μια σελίδα .jsp από το servlet θέλουμε, αν έχουμε παραμέτρους, να τις πάρουμε. Γι αυτό θα χρειαστούμε την εξής μεθόδο:

request.getAttribute(^όνομα_attribute^);

Επιστρέφει ένα αντικείμενο Object (που πρέπει να το κάνετε typecast) μιας παραμέτρου ^όνομα_attribute^ που ορίσαμε με την request.setAttribute παραπάνω στο servlet. Αν δεν υπάρχει η παράμετρος επιστρέφει null

Στο sucess.jsp θα εμφανίζουμε την παράμετρο ‘message’ που ορίσαμε στο Servlet. Έτσι το success.jsp γίνεται:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload Status</title>
</head>
<body>
<h1>Upload Status</h1>
<%
String message = (String) request.getAttribute("message");
if(message != null && !message.equals(""))
{
%>
    Το μύνημα είναι <%=message%>
<%
}
%>
</body>
</html>
Advertisements

Σχολιάστε

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s