閱讀546 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Servlet、JSP和Spring MVC初學指南》——1.10 處理HTML表單

本節書摘來自異步社區《Servlet、JSP和Spring MVC初學指南》一書中的第1章,第1.10節,作者:【加】Budi Kurniawan(克尼亞萬) , 【美】Paul Deck著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

1.10 處理HTML表單

一個Web應用程序中幾乎總會包含一個或者多個HTML表單,供用戶輸入值。你可以輕鬆地將一個HTML表單從一個Servlet發送到瀏覽器。當用戶提交表單時,在表單元素中輸入的值就會被當作請求參數發送到服務器。

HTML輸入域(文本域、隱藏域或者密碼域)或者文本區的值,會被當作字符串發送到服務器。空的輸入域或者文本區會發送空的字符串。因此,有輸入域名稱的,ServletRequest.getParameter絕對不會返回null。

HTML的select元素也向header發送了一個字符串。如果select元素中沒有任何選項被選中,那麼就會發出所顯示的這個選項值。

包含多個值的select元素(允許選擇多個選項並且用<select multiple>表示的select元素)發出一個字符串數組,並且必須通過SelectRequest.getParameterValues進行處理。

複選框比較奇特。核查過的複選框會發送字符串“on”到服務器。未經核查的複選框則不向服務器發送任何內容,ServletRequest.getParameter(fieldName)返回null。

單選框將被選中按鈕的值發送到服務器。如果沒有選擇任何按鈕,將沒有任何內容被發送到服務器,並且ServletRequest.getParameter(fieldName)返回null。

如果一個表單中包含多個輸入同名的元素,那麼所有值都會被提交,並且必須利用ServletRequest.getParameterValues來獲取它們。ServletRequest.getParameter將隻返回最後一個值。

清單1.4中的FormServlet類示範了如何處理HTML表單。它的doGet方法將一個Order表單發送到瀏覽器。它的doPost方法獲取到所輸入的值,並將它們輸出。這個Servlet就是app01b應用程序的一部分。
清單1.4 FormServlet類

package app01b;
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;

@WebServlet(name = "FormServlet", urlPatterns = { "/form" })
public class FormServlet extends HttpServlet {
    private static final long serialVersionUID = 54L;
    private static final String TITLE = "Order Form";

    @Override
    public void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<head>");
        writer.println("<title>" + TITLE + "</title></head>");
        writer.println("<body><h1>" + TITLE + "</h1>");
        writer.println("<form method='post'>");
        writer.println("<table>");
        writer.println("<tr>");
        writer.println("<td>Name:</td>");
        writer.println("<td><input name='name'/></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Address:</td>");
        writer.println("<td><textarea name='address' "
                + "cols='40' rows='5'></textarea></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Country:</td>");
        writer.println("<td><select name='country'>");
        writer.println("<option>United States</option>");
        writer.println("<option>Canada</option>");
        writer.println("</select></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Delivery Method:</td>");
        writer.println("<td><input type='radio' " +
                "name='deliveryMethod'"
                + " value='First Class'/>First Class");
        writer.println("<input type='radio' " +
                "name='deliveryMethod' "
                + "value='Second Class'/>Second Class</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Shipping Instructions:</td>");
        writer.println("<td><textarea name='instruction' "
                + "cols='40' rows='5'></textarea></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>&nbsp;</td>");
        writer.println("<td><textarea name='instruction' "
                + "cols='40' rows='5'></textarea></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Please send me the latest " +
                "product catalog:</td>");
        writer.println("<td><input type='checkbox' " +
                "name='catalogRequest'/></td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>&nbsp;</td>");
        writer.println("<td><input type='reset'/>" +
                "<input type='submit'/></td>");
        writer.println("</tr>");
        writer.println("</table>");
        writer.println("</form>");
        writer.println("</body>");
        writer.println("</html>");
    }

    @Override
    public void doPost(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<head>");
        writer.println("<title>" + TITLE + "</title></head>");
        writer.println("</head>");
        writer.println("<body><h1>" + TITLE + "</h1>");
        writer.println("<table>");
        writer.println("<tr>");
        writer.println("<td>Name:</td>");
        writer.println("<td>" + request.getParameter("name")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Address:</td>");
        writer.println("<td>" + request.getParameter("address")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Country:</td>");
        writer.println("<td>" + request.getParameter("country")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Shipping Instructions:</td>");
        writer.println("<td>");
        String[] instructions = request
                .getParameterValues("instruction");
        if (instructions != null) {
            for (String instruction : instructions) {
                writer.println(instruction + "<br/>");
            }
        }
        writer.println("</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Delivery Method:</td>");
        writer.println("<td>"
                + request.getParameter("deliveryMethod")
                + "</td>");
        writer.println("</tr>");
        writer.println("<tr>");
        writer.println("<td>Catalog Request:</td>");
        writer.println("<td>");
        if (request.getParameter("catalogRequest") == null) {
            writer.println("No");
        } else {
            writer.println("Yes");
        }
        writer.println("</td>");
        writer.println("</tr>");
        writer.println("</table>");
        writer.println("<div style='border:1px solid #ddd;" +
                    "margin-top:40px;font-size:90%'>");

        writer.println("Debug Info<br/>");
        Enumeration<String> parameterNames = request
                .getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String paramName = parameterNames.nextElement();
            writer.println(paramName + ": ");
            String[] paramValues = request
                    .getParameterValues(paramName);
            for (String paramValue : paramValues) {
                writer.println(paramValue + "<br/>");
            }
        }
        writer.println("</div>");
        writer.println("</body>");
        writer.println("</html>");
    }
}

利用下麵的URL,可以調用FormServlet:
https://localhost:8080/app01b/form
被調用的doGet方法會被這個HTML表單發送給瀏覽器:

<form method='post'>
<input name='name'/>
<textarea name='address' cols='40' rows='5'></textarea>
<select name='country'>");
    <option>United States</option>
    <option>Canada</option>
</select>
<input type='radio' name='deliveryMethod' value='First Class'/>
<input type='radio' name='deliveryMethod' value='Second Class'/>
<textarea name='instruction' cols='40' rows='5'></textarea>
<textarea name='instruction' cols='40' rows='5'></textarea>
<input type='checkbox' name='catalogRequest'/>
<input type='reset'/>
<input type='submit'/>
</form>

表單的方法設為post,確保當用戶提交表單時,使用HTTP POST方法。它的action屬性默認,表示該表單會被提交給請求它時用的相同的URL。

圖1.6展示了一個空的Order表單。

screenshot

圖1.6 一個空的Order表單

現在,填寫表單,並單擊Submit按鈕。在表單中輸入的值,將利用HTTP POST方法被發送給服務器,這樣就會調用Servlet的doPost方法。因此,將會看到圖1.7所示的那些值。

screenshot

圖1.7 在Order表單中輸入的值

最後更新:2017-05-27 17:31:29

  上一篇:go  《Servlet、JSP和Spring MVC初學指南》——1.11 使用部署描述符
  下一篇:go  《Servlet、JSP和Spring MVC初學指南》——1.9 Http Servlets