JAVA开发(3)- 读取表单参数Get&Post

一、  HttpServlet读取htmlform的参数

1、htmlform参数提交的两种方式

htmlform提交参数一般通过postget这两种方法,其中get提交参数的方法对应于HttpServletdoGet方法,而post提交参数的方法对应于HttpServletdoPost方法。

get方法提交参数的话会在url上显示,假如我们有的数据不想让别人看到(如密码等)则我们不应该让form通过get方法提交(如果我们的htmlformmethod属性不显示制定的话,默认值为get)

post方法提交的参数不会在url上显示。

2、            HttpServlet中如何读取form中的参数

对于HttpServlet中读取html form中传递过来的参数是一件很简单的事情,可以不必关心,form的提交方式为get或者post(有的情况下还是稍微有一点不同的,比如servletjsp中常见的一个问题:中文乱码的问题,有的form使用post提交到servlet后,中文的参数值可以正常显示,但是如果换成get提交的话,中文可能出现乱码)。我们都可以通过HttpServletRequest接口的String getParameter(String name)String[] getParameterValues(String name)这两个方法来读取参数的值。

String getParameter(String name)

name为参数名,返回的结果是参数的值。如果一个参数有很多个值得话,这里只返回一个。如果参数名存在,但是对应的值没有的话,返回值为””(也就是一个空字符串)。假如参数名本身不存在的话,返回值为null。需要注意的是这里对参数名的大小写是敏感的,也就是说htmlform中参数名如果为Name的话,使用getParameter(“name”)是取不到对应的值的。

String[] getParameterValues(String name)

当使用这个方法时,一般是name这个参数名可能存在多个参数值,它将返回一个由参数值组成的数组。举一个简单的例子,注册一个网站的时候,当需要客户的兴趣爱好资料的时候,一般会给出一个多选框(假设参数名为habit),让用户自己选择。当然每个人的爱好不同,每个人爱好的个数可能是0-N(让我们先假设一个人可以没有任何爱好),那么我们的HttpServlet读取formhabit的时候,显然应该使用String[] getParameterValues(String name)而不是String getParameter(String name),如果客户有一个到多个爱好时,我们会得到一个表示他爱好的String[]。但是假如我们的客户没有任何爱好的话。。。这个时候的返回值可能是null。所以我们在处理的时候需要先判断返回值是否为null(这个真是一个不友好的做法,友好的做法是返回一个0个元素的String[],很遗憾目前ServletAPI没有这么规定),加入我们不对返回值进行判断而直接开始对String[]做迭代的话,我们会得到一个java.lang.NullPointerException。当然当name的参数名不存在的时候,返回值显然为null。同样String[] getParameterValues(String name)name的值得大小写也一样是敏感的。

读取form表单参数还可以使用Map getParameterMap()方法,这里不多做介绍。

加入对form表单可能提交上来的参数名不是很明确的话,可以考虑使用Enumeration getParameterNames()方法来获取form表单的参数名。form提交的所有参数名将存放于一个java.util.Enumeration对象中(Enumeration对象的迭代方法不做介绍)

 

最后还是以一个例子来结束HttpServlet读取htmlform的参数的介绍。

在这之前为了避免万恶的汉字乱码的问题,让我们先修改tomcat的一个配置文件

添加<tomcat install dir>/conf/server.xml中的Connector结构的属性

<!--  Define a non-SSL HTTP/1.1 Connector on port 8080  -->
< Connector  port ="8080"  maxHttpHeaderSize ="8192"
               maxThreads
="150"  minSpareThreads ="25"  maxSpareThreads ="75"
               enableLookups
="false"  redirectPort ="8443"  acceptCount ="100"
               connectionTimeout
="20000"  disableUploadTimeout ="true"   />

/>之前添加属性useBodyEncodingForURI="true",修改后如下:

<!--  Define a non-SSL HTTP/1.1 Connector on port 8080  -->
    
< Connector  port ="8080"  maxHttpHeaderSize ="8192"
               maxThreads
="150"  minSpareThreads ="25"  maxSpareThreads ="75"
               enableLookups
="false"  redirectPort ="8443"  acceptCount ="100"
               connectionTimeout
="20000"  disableUploadTimeout ="true"  useBodyEncodingForURI ="true"   />

 

提交form用的html页面,param.html

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< META  http-equiv ="Content-Type"  content ="text/html; charset=GBK"   />  
< script  type ="text/javascript" > ...
       
       
function changemethod()
...{
       
var a = document.getElementsByName("methodtype");
       
for(i = 0; i < a.length; i++)
       
...{
              
if(a[i].checked==true)
              
...{
                     fm.method
=a[i].value;
                     
break;
              }

       }

}

</ script >
 
        
< title > parameter.html </ title >
</ head >
 
 
 
< body  bgcolor ="#FDF5E6" >
 
< h2 > 参数传递示范 </ h2 >
 
< form  name  ="fm"  method ="get"  action ="ShowParameter" >
  
  
< p > 姓名: < input  type ="text"  name ="username"  size ="15"   />   </ p >
  
< p > 密码: < input  type ="password"  name ="password"  size ="15"   />   </ p >
  
< p > 性别: < input  type ="radio"  name ="sex"  value ="Male"  checked  />  男
                  
< input  type ="radio"  name ="sex"  value ="Female"   />  女  </ p >
  
  
< p > 年龄:
      
< select  name ="old" >
             
< option  value ="10" > 10 - 20 </ option >
             
< option  value ="20"  selected > 20 - 30 </ option >
             
< option  value ="30" > 30 - 40 </ option >
             
< option  value ="40" > 40 - 50 </ option >
      
</ select >
  
</ p >
  
  
< p > 兴趣:
      
< input  type ="checkbox"  name ="habit"  value ="Reading"   /> 看书
      
< input  type ="checkbox"  name ="habit"  value ="Game"   /> 玩游戏
      
< input  type ="checkbox"  name ="habit"  value ="Travel"   /> 旅游
      
< input  type ="checkbox"  name ="habit"  value ="Music"   /> 听音乐
      
< input  type ="checkbox"  name ="habit"  value ="Tv"   /> 看电视  
  
</ p >
  
  
< p > 提交方式:
  
< input  name ="methodtype"  value ="get"  type ="radio"  onclick ="changemethod()"  checked  />
       Get
  
< input  name ="methodtype"  value ="post"  type ="radio"  onclick ="changemethod()"   />
       Post
  
</ p >
  
< p >
  
< input  value ="确认"  type ="submit"   />
  
< input  value ="清除"  type ="reset"   />
  
</ p >
</ form >
 
 
</ body >
</ html >

在这个html页面中写了一个写了一个简单的javascript函数,其实现的功能是当用户选择提交方式为get时,采用get方式提交;当选择为post时,采用post方式提交。请注意采用不同方式提交时URL的变化

 我们的HttpServlet来了:

package  squall.servlet.basic;

 

import  java.io.IOException;

import  java.io.PrintWriter;

 

import  javax.servlet.ServletException;

import  javax.servlet.http.HttpServlet;

import  javax.servlet.http.HttpServletRequest;

import  javax.servlet.http.HttpServletResponse;

 

public   class  ShowParameter  extends  HttpServlet

... {

       
protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              System.out.println(
"doGet invoke!");

              

              showParam( req,  resp);

       }


 

       
protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     
throws ServletException, IOException

       
...{

              System.out.println(
"doPost invoke!");

              showParam( req,  resp);

       }


       

       
private void showParam(HttpServletRequest req, HttpServletResponse resp) throws IOException

       
...{

              req.setCharacterEncoding(
"GBK");

              resp.setContentType(
"text/html; charset=GBK");

              PrintWriter out 
= resp.getWriter();

              String docType 
= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

 

              String name 
= req.getParameter("username");

              String password 
= req.getParameter("password");

              String sex 
= req.getParameter("sex");

              String old 
= req.getParameter("old");

              String habit[] 
= req.getParameterValues("habit");

              String unknow 
= req.getParameter("unknow");

              out.println(docType 
+ "<HTML> " + "<HEAD><TITLE> showparam" 

                            
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            
+"     姓名:" + name + "   </br>"

                            
+"     密码:" + password + "   </br>"

                            
+"     性别:" + sex + "   </br>"

                            
+"     年龄:" + old + "   </br>"

                            
+"     兴趣:"

                            );

              
if(habit == null)

                     out.println(habit);

              
if(habit != null)

              
for(int i = 0; i < habit.length; ++i)

                     out.println(habit[i] 
+ " ");

              out.println(
"</br>");

              out.println(
"     未知:" + unknow + "   </br>");

              out.println(
"     提交方式:" + req.getParameter("methodtype"+ " </br>");

              out.println(
"</body></html>");

       }


       

}


部署:将param.html存放于<tomcat install dir>/webapps/train目录下。

ShowParameter部署后,mapping/ShowParameter

ShowParameter这个Servlet除了在显示html页面外,还会在tomcat的控制台打印调用了doGet还是doPost方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值