|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。js|servlet|数据4.1表双数据概述
假如你已经利用过Web搜刮引擎,大概扫瞄过在线书店、股票代价、机票信息,也许会寄望到一些乖僻的URL,好比“http://host/path?user=Marty+Hall&origin=bwi&dest=lax”。这个URL中位于问号前面的部分,即“user=Marty+Hall&origin=bwi&dest=lax”,就是表双数据,这是将Web页面数据发送给服务器程序的最经常使用办法。关于GET哀求,表双数据附加到URL的问号前面(如上例所示);关于POST哀求,表双数据用一个独自的行发送给服务器。
之前,从这类情势的数据提掏出所必要的表单变量是CGI编程中最贫苦的事变之一。起首,GET哀求和POST哀求的数据提取办法分歧:关于GET哀求,一般要经由过程QUERY_STRING情况变量提取数据;关于POST哀求,则一样平常经由过程尺度输出提取数据。第二,程序员必需卖力在“&”标记处截断变量名字-变量值对,再分别出变量名字(等号右边)和变量值(等号右侧)。第三,必需对变量值举行URL反编码操纵。由于发送数据的时分,字母和数字以本来的情势发送,但空格被转换成加号,其他字符被转换成“%XX”情势,个中XX是十六进制暗示的字符ASCII(大概ISOLatin-1)编码值。比方,假如HTML表单中名为“users”的域值为“~hall,~gates,and~mcnealy”,则实践向服务器发送的数据为“users=%7Ehall%2C+%7Egates%2C+and+%7Emcnealy”。最初,即第四个招致剖析表双数据十分坚苦的缘故原由在于,变量值既大概被省略(如“param1=val1&param2=&param3=val3”),也有大概一个变量具有一个以上的值,即统一个变量大概呈现一次以上(如“param1=val1&param2=val2&param1=val3”)。
JavaServlet的优点之一就在于一切上述剖析操纵都可以主动完成。只必要复杂地挪用一下HttpServletRequest的getParameter办法、在挪用参数中供应表单变量的名字(巨细写敏感)便可,并且GET哀求和POST哀求的处置办法完整不异。
getParameter办法的前往值是一个字符串,它是参数中指定的变量名字第一次呈现所对应的值经反编码失掉得字符串(能够间接利用)。假如指定的表单变量存在,但没有值,getParameter前往空字符串;假如指定的表单变量不存在,则前往null。假如表单变量大概对应多个值,能够用getParameterValues来代替getParameter。getParameterValues可以前往一个字符串数组。
最初,固然在实践使用中Servlet极可能只会用到那些已出名字的表单变量,但在调试情况中,取得完全的表单变量名字列表常常是很有效的,使用getParamerterNames办法能够便利地完成这一点。getParamerterNames前往的是一个Enumeration,个中的每项都能够转换为挪用getParameter的字符串。
4.2实例:读取三个表单变量
上面是一个复杂的例子,它读取三个表单变量param1、param2和param3,并以HTML列表的情势列出它们的值。请注重,固然在发送应对内容之前必需指定应对范例(包含内容范例、形态和其他HTTP头信息),但Servlet对什么时候读取哀求内容却没有甚么请求。
别的,我们也能够很简单地把Servlet做成既能处置GET哀求,也可以处置POST哀求,这只必要在doPost办法中挪用doGet办法,大概掩盖service办法(service办法挪用doGet、doPost、doHead等办法)。在实践编程中这是一种尺度的办法,由于它只必要很少的分外事情,却可以增添客户端编码的天真性。
假如你习气用传统的CGI办法,经由过程尺度输出读取POST数据,那末在Servlet中也有相似的办法,即在HttpServletRequest上挪用getReader大概getInputStream,但这类办法对一般的表单变量来讲太贫苦。但是,假如是要上载文件,大概POST数据是经由过程专门的客户程序而不是HTML表单发送,那末就要用到这类办法。
注重用第二种办法读取POST数据时,不克不及再用getParameter来读取这些数据。
ThreeParams.java
packagehall;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.util.*;
publicclassThreeParamsextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html");
PrintWriterout=response.getWriter();
Stringtitle="读取三个哀求参数";
out.println(ServletUtilities.headWithTitle(title)+
"<BODY>\n"+
"<H1ALIGN=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>");
}
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
4.3实例:输入一切的表双数据
上面这个例子寻觅表单所发送的一切变量名字,并把它们放进表格中,没有值大概有多个值的变量都凸起显现。
起首,程序经由过程HttpServletRequest的getParameterNames办法失掉一切的变量名字,getParameterNames前往的是一个Enumeration。接上去,程序用轮回遍历这个Enumeration,经由过程hasMoreElements断定什么时候停止轮回,使用nextElement失掉Enumeration中的各个项。因为nextElement前往的是一个Object,程序把它转换成字符串后再用这个字符串来挪用getParameterValues。
getParameterValues前往一个字符串数组,假如这个数组只要一个元素且即是空字符串,申明这个表单变量没有值,Servlet以斜体情势输入“NoValue”;假如数组元素个数年夜于1,申明这个表单变量有多个值,Servlet以HTML列表情势输入这些值;其他情形下Servlet间接把变量值放进表格。
ShowParameters.java
注重,ShowParameters.java用到了后面先容过的ServletUtilities.java。
packagehall;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.util.*;
publicclassShowParametersextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html");
PrintWriterout=response.getWriter();
Stringtitle="读取一切哀求参数";
out.println(ServletUtilities.headWithTitle(title)+
"<BODYBGCOLOR=\"#FDF5E6\">\n"+
"<H1ALIGN=CENTER>"+title+"</H1>\n"+
"<TABLEBORDER=1ALIGN=CENTER>\n"+
"<TRBGCOLOR=\"#FFAD00\">\n"+
"<TH>参数名字<TH>参数值");
EnumerationparamNames=request.getParameterNames();
while(paramNames.hasMoreElements()){
StringparamName=(String)paramNames.nextElement();
out.println("<TR><TD>"+paramName+"\n<TD>");
String[]paramValues=request.getParameterValues(paramName);
if(paramValues.length==1){
StringparamValue=paramValues[0];
if(paramValue.length()==0)
out.print("<I>NoValue</I>");
else
out.print(paramValue);
}else{
out.println("<UL>");
for(inti=0;i<paramValues.length;i++){
out.println("<LI>"+paramValues);
}
out.println("</UL>");
}
}
out.println("</TABLE>\n</BODY></HTML>");
}
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
测试表单
上面是向上述Servlet发送数据的表单PostForm.html。就像一切包括暗码输出域的表单一样,该表单用POST办法发送数据。我们能够看到,在Servlet中同时完成doGet和doPost这两种办法为表单制造带来了便利。
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
<HTML>
<HEAD>
<TITLE>示例表单</TITLE>
</HEAD>
<BODYBGCOLOR="#FDF5E6">
<H1ALIGN="CENTER">用POST办法发送数据的表单</H1>
<FORMACTION="/servlet/hall.ShowParameters"
METHOD="POST">
ItemNumber:
<INPUTTYPE="TEXT"NAME="itemNum"><BR>
Quantity:
<INPUTTYPE="TEXT"NAME="quantity"><BR>
PriceEach:
<INPUTTYPE="TEXT"NAME="price"VALUE="[GV_contentText]quot;><BR>
<HR>
FirstName:
<INPUTTYPE="TEXT"NAME="firstName"><BR>
LastName:
<INPUTTYPE="TEXT"NAME="lastName"><BR>
MiddleInitial:
<INPUTTYPE="TEXT"NAME="initial"><BR>
ShippingAddress:
<TEXTAREANAME="address"ROWS=3COLS=40></TEXTAREA><BR>
CreditCard:<BR>
<INPUTTYPE="RADIO"NAME="cardType"
VALUE="Visa">Visa<BR>
<INPUTTYPE="RADIO"NAME="cardType"
VALUE="MasterCard">MasterCard<BR>
<INPUTTYPE="RADIO"NAME="cardType"
VALUE="Amex">AmericanExpress<BR>
<INPUTTYPE="RADIO"NAME="cardType"
VALUE="Discover">Discover<BR>
<INPUTTYPE="RADIO"NAME="cardType"
VALUE="JavaSmartCard">JavaSmartCard<BR>
CreditCardNumber:
<INPUTTYPE="PASSWORD"NAME="cardNum"><BR>
RepeatCreditCardNumber:
<INPUTTYPE="PASSWORD"NAME="cardNum"><BR><BR>
<CENTER>
<INPUTTYPE="SUBMIT"VALUE="SubmitOrder">
</CENTER>
</FORM>
</BODY>
</HTML>
还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。 |
|