English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Dati del modulo Servlet

In molti casi, è necessario trasmettere alcune informazioni, dal browser al server web e infine al programma di back-end. Il browser utilizza due metodi per trasmettere queste informazioni al server web, ovvero i metodi GET e POST.

Metodo GET

Il metodo GET invia informazioni utente codificate alla pagina richieste. La pagina e le informazioni codificate sono separate dal carattere ?, come indicato di seguito:

http://www.test.com/hello?key1=value1&key2=value2

Il metodo GET è il metodo predefinito per trasmettere informazioni dal browser al server web, generando una stringa lunga che appare nella barra dell'indirizzo del browser. Se devi trasmettere informazioni sensibili come password, non utilizzare il metodo GET. Il metodo GET ha una dimensione limitata: la stringa di richiesta può contenere al massimo 1024 caratteri.

Queste informazioni vengono trasmesse tramite l'intestazione QUERY_STRING e possono essere accedute tramite la variabile d'ambiente QUERY_STRING, i servlet utilizzano doGet() per gestire questo tipo di richiesta.

Metodo POST

Un altro metodo più affidabile per trasmettere informazioni al programma di back-end è il metodo POST. Il metodo POST impacchetta le informazioni in modo simile al metodo GET, ma non invia le informazioni come stringa testuale dopo il carattere ? nella URL, bensì come un messaggio separato. Il messaggio viene trasmesso al programma di back-end in forma di output standard, che puoi analizzare e utilizzare. I servlet utilizzano il metodo doPost() per gestire questo tipo di richiesta.

Leggi i dati del modulo utilizzando il Servlet

Il Servlet elabora i dati del modulo, che vengono automaticamente interpretati con metodi diversi a seconda delle diverse situazioni:

  • getParameter():Puoi chiamare il metodo request.getParameter() per ottenere il valore dei parametri del modulo.

  • getParameterValues():Se il parametro si presenta più volte, chiama questo metodo e restituisce più valori, ad esempio caselle di controllo.

  • getParameterNames():Se desideri ottenere una lista completa di tutti i parametri della richiesta corrente, chiama questo metodo.

Esempio di utilizzo del metodo GET dell'URL

Ecco un URL semplice che utilizzeremo per trasmettere due valori al programma HelloForm utilizzando il metodo GET.

http://localhost:8080/TomcatTest/HelloForm?name=基礎教程網&url=it.oldtoolbag.com

Ecco un esempio di come elaborare l'input del browser Web: HelloForm.java Programma Servlet. Utilizzeremo getParameter()  Metodo, puoi facilmente accedere alle informazioni trasmesse:

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class HelloForm
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Leggi i dati del modulo utilizzando il metodo GET";
        // Gestione dei caratteri cinesi
        String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
        String docType = "<!DOCTYPE html> \n“;
        out.println(docType +
            "<html>\n" +
            "<head><title>“ + title + ”</title></head>\n“ +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "<li><b>Nome del sito</b>:\
            + name + 
+
            "<li><b>Indirizzo web</b>:\
            + request.getParameter("url") + 
+
            "</ul>\n" +
            "</body></html>");
    }
    
    // Gestione del metodo di richiesta POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Poi, nel web.xml Crea le seguenti voci nel file:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>HelloForm</servlet-name>
    <servlet-class>com.w3codebox.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>

Ora inserisci questo indirizzo nel campo URL del browser: http://localhost:8080/TomcatTest/HelloForm?name=基礎教程網&url=it.oldtoolbag.com Assicurati di aver avviato il server Tomcat prima di eseguire il comando sopra. Se tutto è andato bene, otterrai il seguente risultato:

Esempio di utilizzo del metodo GET del modulo

Ecco un esempio semplice che utilizza un modulo HTML e un pulsante di invio per trasmettere due valori. Utilizzeremo lo stesso Servlet HelloForm per elaborare l'input.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Base Tutorial Web(oldtoolbag.com)</title>
</head>
<body>
<form action="HelloForm" method="GET">
Nome del sito web:<input type="text" name="name">
<br/>
Indirizzo web:<input type="text" name="url"/>
<input type="submit" value="Invia"/>
</form>
</body>
</html>

Salva questo HTML nel file hello.html, la struttura della directory è come segue:

Prova ad inserire il nome dell'indirizzo web e l'indirizzo web, quindi fai clic sul pulsante "Invia", come illustrato di seguito:

Esempio di utilizzo del metodo POST del modulo

Modifichiamo leggermente il Servlet sopra riportato in modo che possa gestire i metodi GET e POST. Di seguito è riportato: HelloForm.java Il programma Servlet utilizza i metodi GET e POST per gestire l'input fornito dal browser web.

Attenzione: se i dati inviati dal modulo contengono dati cinesi, è necessario effettuare la codifica:

String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class HelloForm
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Lettura dei dati del modulo utilizzando il metodo POST";
        // Gestione dei caratteri cinesi
        String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
        String docType = "<!DOCTYPE html> \n“;
        out.println(docType +
            "<html>\n" +
            "<head><title>“ + title + ”</title></head>\n“ +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<ul>\n" +
            "<li><b>Nome del sito</b>:\
            + name + 
+
            "<li><b>Indirizzo web</b>:\
            + request.getParameter("url") + 
+
            "</ul>\n" +
            "</body></html>");
    }
    
    // Gestione del metodo di richiesta POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Ora, compilare e distribuire il Servlet sopra riportato e testare con hello.html che utilizza il metodo POST, come illustrato di seguito:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Base Tutorial Web(oldtoolbag.com)</title>
</head>
<body>
<form action="HelloForm" method="POST">
Nome del sito web:<input type="text" name="name">
<br/>
Indirizzo web:<input type="text" name="url"/>
<input type="submit" value="Invia"/>
</form>
</body>
</html>

Di seguito è riportato l'output effettivo del modulo sopra, digitare il nome dell'indirizzo web e l'indirizzo web, quindi fare clic sul pulsante "Invia", come illustrato di seguito:


Passare i dati dei caselli di controllo al programma Servlet

Utilizzare le caselle di controllo quando è necessario selezionare una o più opzioni.

Di seguito è riportato un esempio di codice HTML checkbox.html, un modulo con due caselle di controllo.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Base Tutorial Web(oldtoolbag.com)</title>
</head>
<body>
<form action="CheckBox" method="POST" target="_blank">
<input type="checkbox" name="w3codebox" checked="checked"/> Guida di base del sito
<input type="checkbox" name="google" /> Google
<input type="checkbox" name="taobao" checked="checked" /> Taobao
<input type="submit" value="Scegli sito" />
</form>
</body>
</html>

Di seguito è riportato il programma Servlet CheckBox.java, che gestisce l'input delle caselle di controllo fornito dal browser Web.

package com.w3codebox.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 *Classe di implementazione del Servlet CheckBox
 */
@WebServlet("/CheckBox")
public class CheckBox extends HttpServlet {
    private static final long serialVersionUID = 1L;
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = "Lettura dei dati delle caselle di controllo“;
        String docType = "<!DOCTYPE html> \n“;
            out.println(docType +
                "<html>\n" +
                "<head><title>“ + title + ”</title></head>\n“ +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                "<ul>\n" +
                “	<li><b>Identificatore del manuale di Cai Niao:</b>: “
                + request.getParameter("w3codebox") + "\n" +
                “	<li><b>Identificatore di Google:</b>: “
                + request.getParameter("google") + "\n" +
                “	<li><b>Identificatore di Taobao:</b>: “
                + request.getParameter("taobao") + "\n" +
                "</ul>\n" +
                "</body></html>");
    }
    
    // Gestione del metodo di richiesta POST
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Impostare il web.xml corrispondente:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>CheckBox</servlet-name>
    <servlet-class>com.w3codebox.test.CheckBox</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>CheckBox</servlet-name>
    <url-pattern>/TomcatTest/CheckBox</url-pattern>
  </servlet-mapping>
</web-app>

上面的示例访问地址:http://localhost:8080/TomcatTest/checkbox.html ,查看输出结果。

读取所有的表单参数

以下是通用的示例,使用 HttpServletRequest 的 getParameterNames() 方法读取所有可用的表单参数。该方法返回一个枚举,其中包含未指定顺序的参数名。

一旦我们有一个枚举,我们可以以标准方式循环枚举,使用 hasMoreElements() 方法来确定何时停止,使用 nextElement() 方法来获取每个参数的名称。

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Servlet implementation class ReadParams
 */
@WebServlet("/ReadParams")
public class ReadParams extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadParams() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String title = \
        String docType = ;
            "<!doctype html public \
            "transitional//en\">\n";
            out.println(docType +
            "<html>\n" +
            "<head><meta charset=\"utf-8\"><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<table width=\"100%\" border=\"1\" align=\"center\">\n" +
            "<tr bgcolor=\"#949494\">\n" +
            "<th>参数名称</th><th>参数值</th>\n"+
            "</tr>\n");
        Enumeration paramNames = request.getParameterNames();
        while(paramNames.hasMoreElements()) {
            String paramName = (String)paramNames.nextElement();
            out.print("<tr><td>" + paramName + "</td>\n");
            String[] paramValues = ;
            request.getParameterValues(paramName);
            // Leggi i dati di un valore
            if (paramValues.length == 1) {
                String paramValue = paramValues[0];
                if (paramValue.length() == 0)
                    out.println("<td><i>nessun valore</i></td>");
                else
                    out.println("<td>" + paramValue + "</td>");
            }
                // Leggi i dati di più valori
                out.println("<td><ul>");
                for(int i=0; i < paramValues.length; i++) {
                out.println("<li>" + paramValues[i]);
            }
                out.println("</ul></td>");
            }
            out.print("</tr>");
        }
        out.println("\n</table>\n</body></html>");
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO metodo generato automaticamente
        doGet(request, response);
    }
}

Ora, prova il seguente modulo per il Servlet sopra:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Base Tutorial Web(oldtoolbag.com)</title>
</head>
<body>
<form action="ReadParams" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> Matematica
<input type="checkbox" name="physics" /> Fisica
<input type="checkbox" name="chemistry" checked="checked" /> Chimica
<input type="submit" value="Scegli la materia" />
</form>
</body>
</html>

Imposta il file web.xml corrispondente:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>ReadParams</servlet-name>
    <servlet-class>com.w3codebox.test.ReadParams</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ReadParams</servlet-name>
    <url-pattern>/TomcatTest/ReadParams</url-pattern>
  </servlet-mapping>
</web-app>

Ora chiama il Servlet tramite il seguente modulo, indirizzo: http://localhost:8080/TomcatTest/test.html per visualizzare i risultati di output.

Puoi provare a utilizzare il seguente Servlet per leggere altri dati del modulo, come caselle di testo, pulsanti radio o menu a discesa, ecc.