Technorati 標簽:?servlet;java

一、概述

??? Servlet 有一個比較好的功能就是可以自動處理表單提交的數據。我們只需要調用HttpServletRequest#getParameter(String name),就可以獲得指定參數的值(String),注意此方法是大小寫敏感的。其返回值(String)與其對應的URL編碼一致。當參數name存在可沒有值的時候,會返回一個空串(“”),當參數name 不存在時,會返回 null。當某一個參數有多個值時,可以調用方法getParameterValues(String name),返回字符串數組。當指定參數不存在時,getParameterValues(String name)返回null;當指定參數只有一個值時,返回一個只有一個元素的數組(String)。

??? 接著談一下的是,盡管大部分時候,servlet 都只需要獲取指定參數的值。不過在調試時,獲取整個參數列表也是一個不錯的選擇。調用方法 getParameterNames()可以獲取表單參數名的枚舉列表,每一條目都會強制轉換為 String,可以用于getParameter(String name)和getParameterNames()。需要注意的是,所返回的枚舉列表在任何情況下都不能保證各個元素的排列數序。

二、Demo

??? Demo1,讀取三個指定參數的值。如下,我們設計的一個簡單的form,

image

??? register.jsp代碼如下:

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>collecting three parameters</title>
</head>
<body><center>
<h1>collecting three parameters</h1>
<form id="form" name="form" method="get" action="ThreeParams"><label>name:</label><input type="text" name="username"/>
<label>password:</label><input name="password" type="password" />
<label>email:</label><input name="email" type="text" />
<input name="submit" type="submit"/> </form></center> </body> </html>

??? 對應的,看一下Servlet ThreeParams.java 代碼如下:

   1: @WebServlet("/ThreeParams")
   2: public class ThreeParams extends HttpServlet {
   3:     private static final long serialVersionUID = 1L;
   4:     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   5:         PrintWriter out = response.getWriter();
   6:         response.setCharacterEncoding("text/html;chaset=gbk");
   7:         String title = "collecting three parameters";
   8:         out.print("<html><body><h1>"
   9:                 + title +"</h1><li><b>name:</b>"
  10:                 + request.getParameter("username") +"</li>"
  11:                 +"<li><b>password:</b>"
  12:                 + request.getParameter("password") +"</li>"
  13:                 +"<li><b>email:</b>"
  14:                 + request.getParameter("email") +"</li>");
  15:         out.print("</body></html>");
  16:     }
  17: }

???? 其輸出效果如圖:

image????

??? 以上Demo演示了,如何獲取一個指定參數的值,不過都一個個來獲取的。有時候我們也許需要一次性獲取所有參數的值,那怎么做呢???

?? Demo2:一次性獲取所有參數。form 表單設計如下:

image

??? info.jsp代碼如下:

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>a sample form using post</title>
</head>
<body>
<form id="form" name="form" method="post" action="ShowParameters">
    <li>用戶名:<input type="text" name="account"  /></li>
    <li>性別:<input type="radio" name="sex" value="male" checked="checked" />帥哥
            <input type="radio" name="sex" value="female" />美女</li>
    <li>愛好:<input name="hobby" type="checkbox" value="bastketball" checked="checked" />籃球
        <input name="hobby" type="checkbox" value="football" />足球</li>
    <li>密碼: <input type="password" name="password"  /></li>
    <li>確認密碼:<input type="password" name="repassword"  />
    <li>email:<input type="email" name="email" /></li>
    <li>自我描述:</li>
    <li><textarea name="description" cols="20" rows="5" ></textarea></li>
    <li><input name="submit" type="submit" value="submit"/></li>
</form>
</body>
</html>

??? 現在來看一下Servlet ShowParemeter.java 的代碼設計:

@WebServlet("/ShowParameters")
public class ShowParameters extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String title = "get all parameters of a form";
        out.println("<html><body><h1>" + title + "</h1>"
                + "<table border=1 align=center><tr><th>Parameter name</th><th>Parameter values</th></tr>");
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String name = (String) parameterNames.nextElement();
            out.println("<tr><td>" + name + "</td>");
            String[] parameterValues = request.getParameterValues(name);
            if (parameterValues.length == 1) {
                String parameterValue = parameterValues[0];
                if (parameterValue.length() == 0) {
                    out.println("<td><b>No value</b></td>");
                } else {
                    out.println("<td>" + parameterValue + "</td>");
                }
            } else {
                out.println("<td><ul>");
                for (int i = 0; i < parameterValues.length; i++) {
                    out.println("<li>" + parameterValues[i] + "</li>");
                }
                out.println("</ul></td>");
            }
        }
        out.println("</table></body></html>");
?
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

??? 其對應的輸出如下:

image

????注意的是:getParameterNames()從不保證獲取參數的順序。