现在的位置: 首页 > 综合 > 正文

Servlet 学习笔记2:表单

2013年01月06日 ⁄ 综合 ⁄ 共 5286字 ⁄ 字号 评论关闭

HTMLGetPost区别

 

1. get是从服务器上获取数据,post是向服务器传送数据。


2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。


3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。


4. get传送的数据量较小,不能大于2KBpost传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KBIIS5中为100KB


5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:

   


1get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;


2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

表单数据概述 

   如果你曾经使用过Web搜索引擎,或者浏览过在线书店、股票价格、机票信息,或许会留意到一些古怪的URL,比如“http://host/path?user=Marty+Hall&origin=bwi&dest=lax”。这个URL中位于问号后面的部分,即“user=Marty+Hall&origin=bwi&dest=lax”,就是表单数据,这是将Web页面数据发送给服务器程序的最常用方法。对于GET请求,表单数据附加到URL的问号后面(如上例所示);对于POST请求,表单数据用一个单独的行发送给服务器。
  调用HttpServletRequestgetParameter方法、在调用参数中提供表单变量的名字(大小写敏感)即可提取出所需要的表单变量,而且GET请求和POST请求的处理方法完全相同。 
   getParameter方法的返回值是一个字符串,它是参数中指定的变量名字第一次出现所对应的值经反编码得到得字符串(可以直接使用)。如果指定的表单变量存在,但没有值,getParameter返回空字符串;如果指定的表单变量不存在,则返回null。如果表单变量可能对应多个值,可以用getParameterValues来取代getParametergetParameterValues能够返回一个字符串数组。 
   最后,虽然在实际应用中Servlet很可能只会用到那些已知名字的表单变量,但在调试环境中,获得完整的表单变量名字列表往往是很有用的,利用getParamerterNames方法可以方便地实现这一点。getParamerterNames返回的是一个Enumeration,其中的每一项都可以转换为调用getParameter的字符串。 

 

实例:读取三个表单变量 

 

   下面是一个简单的例子,它读取三个表单变量param1param2param3,并以HTML列表的形式列出它们的值。请注意,虽然在发送应答内容之前必须指定应答类型(包括内容类型、状态以及其他HTTP头信息),但Servlet对何时读取请求内容却没有什么要求。 
   另外,我们也可以很容易地把Servlet做成既能处理GET请求,也能够处理POST请求,这只需要在doPost方法中调用doGet方法,或者覆盖service方法(service方法调用doGetdoPostdoHead等方法)。在实际编程中这是一种标准的方法,因为它只需要很少的额外工作,却能够增加客户端编码的灵活性。 
   如果你习惯用传统的CGI方法,通过标准输入读取POST数据,那么在Servlet中也有类似的方法,即在HttpServletRequest上调用getReader或者getInputStream,但这种方法对普通的表单变量来说太麻烦。然而,如果是要上载文件,或者POST数据是通过专门的客户程序而不是HTML表单发送,那么就要用到这种方法。
   注意用第二种方法读取POST数据时,不能再用getParameter来读取这些数据。

实例:读取三个表单变量
package com.test.servlet;

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

public class ThreeParams extends HttpServlet {
    
public void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        response.setContentType(
"text/html");
        PrintWriter out 
= response.getWriter();
        String title 
= "读取三个请求参数";
        out.println(ServletUtilities.headWithTitle(title) 
+ "<BODY>\n"
                
+ "<H1 ALIGN=CENTER>" + title + "</H1>\n" + "<UL>\n"
                
+ " <LI>param1: " + request.getParameter("param1"+ "\n"
                
+ " <LI>param2: " + request.getParameter("param2"+ "\n"
                
+ " <LI>param3: " + request.getParameter("param3"+ "\n"
                
+ "</UL>\n" + "</BODY></HTML>");
    }

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

 

 

实例:输出所有的表单数据 

  下面这个例子寻找表单所发送的所有变量名字,并把它们放入表格中,没有值或者有多个值的变量都突出显示。 
  首先,程序通过HttpServletRequestgetParameterNames方法得到所有的变量名字,getParameterNames返回的是一个Enumeration。接下来,程序用循环遍历这个Enumeration,通过hasMoreElements确定何时结束循环,利用nextElement得到Enumeration中的各个项。由于nextElement返回的是一个Object,程序把它转换成字符串后再用这个字符串来调用getParameterValues 
  getParameterValues返回一个字符串数组,如果这个数组只有一个元素且等于空字符串,说明这个表单变量没有值,Servlet以斜体形式输出“No Value”;如果数组元素个数大于1,说明这个表单变量有多个值,ServletHTML列表形式输出这些值;其他情况下Servlet直接把变量值放入表格。 

实例:输出所有的表单数据
package com.test.servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class ShowParameters extends HttpServlet {
    
public void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        response.setContentType(
"text/html");
        PrintWriter out 
= response.getWriter();
        String title 
= "读取所有请求参数";
        out.println(ServletUtilities.headWithTitle(title)
                
+ "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=CENTER>" + title
                
+ "</H1>\n" + "<TABLE BORDER=1 ALIGN=CENTER>\n"
                
+ "<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>参数名字<TH>参数值");
        Enumeration paramNames 
= request.getParameterNames();
        
while (paramNames.hasMoreElements()) {
            String paramName 
= (String) paramNames.nextElement();
            out.println(
"<TR><TD>" + paramName + "\n<TD>");
            String[] paramValues 
= request.getParameterValues(paramName);
            
if (paramValues.length == 1) {
                String paramValue 
= paramValues[0];
                
if (paramValue.length() == 0)
                    out.print(
"<I>No Value</I>");
                
else
                    out.print(paramValue);
            } 
else {
                out.println(
"<UL>");
                
for (int i = 0; i < paramValues.length; i++) {
                    out.println(
"<LI>" + paramValues[i]);
                }
                out.println(
"</UL>");
            }
        }
        out.println(
"</TABLE>\n</BODY></HTML>");
    }

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

 

测试表单 

  下面是向上述Servlet发送数据的表单PostForm.html。我们可以看到,在Servlet中同时实现doGetdoPost这两种方法为表单制作带来了方便。

测试表单

抱歉!评论已关闭.