-
JSP内置对象
添加时间:2013-7-12 点击量:一个JSP页面不仅可以有HTML标识表记标帜和JSP标识表记标帜,并且可以有成员变量声明,JSP页面可以在Java法度片和Java表达式中应用JSP页面声明的成员变量。有些成员变量不消声明就可以在JSP页面的脚本(Java法度片和Java表达式)中应用,这就是所谓的内置对象。
内置对象有request、response、session、application、out。
一 request对象
为了更好地懂得request对象,须要懂得HTTP。HTTP是客户与办事器之间一种恳求信息与响应信息的通信和谈。我们应用浏览器从网站获取HTML页面或JSP页面时,遵守的就是HTTP。HTTP规定了信息在Internet上的传输办法,特备规定了浏览器与办事器的交互办法。
从网站获取页面时,浏览器在网站上打开了一个对收集办事器的连接,并发出恳求。办事器收到恳求并作出响应,响应停止后,客户浏览器和办事器之间的连接封闭。所以,HTTP被称为“恳乞降响应”和谈。
用户经由过程在浏览器的地址栏中输入一个HTML或JSP页面地点的办事器的地址和页面的名字来恳求该页面。当用户经由过程浏览器恳求一个页面时,浏览器将恳求发送给办事器。遵守HTTP,浏览器发送的恳求具有必然的布局,恳求包含一个恳求行、头域和表单提交的信息体等。办事器会按照浏览器发送来的恳求作出响应,并将响应成果返回给用户的浏览器。最简单的恳求是对页面的一个简单恳求,例如:
GET/hello.html HTTP/1.1
Host:www.sina.com.cn
上方的第一行称为恳求行,含有恳求应用的办法、恳求的资料和恳求应用的和谈;第二行称为头,给出恳求的主机地址,此中恳求的办法是get办法,恳求的资料是hello.html,应用HTTP 1.1版本,恳求的主机是www.sina.com.cn。
一个典范恳求凡是包含很多头,称为恳求的HTTP头,供给了关于信息体的附加信息及恳求的起原。此中有些头是标准的,有些头与特定的浏览器有关。
一个恳求还可能包含信息体,如信息体可包含HTML表单的内容。在HTML表单上单击【submit】按钮时,若是表单应用ACTION=”POST”或ACTION=”GET”特点,恳求将应用post办法或get办法将表单中输入的信息发送给办事器。
1. 获取客户提交的信息
当用户恳求一个JSP页面时,JSP页面地点的Tomcat办事器将用户的恳求封装在内置对象request中。那么,该对象调用响应的办法可以获取封装的信息,也就是说,应用该对象可以获取用户浏览器提交的恳求信息,以便做出响应的响应。尽管request对象有很多可调用的办法,然则request对象常用的办法是getParameter(String s),该办法获取表单提交的信息。
内置对象request对象是实现了ServletRequest接口类的一个实例,可以在Tomcat办事器的webapps\tomcat-docs\servletapi目次中查找ServletRequest接口的办法。
【例 1】用户可以应用example4_1.jsp供给的表单再次恳求example4_1.jsp页面,可以在表单供给的文本框中输入一个数字,并提交给example4_1.jsp页面,该页面经由过程内置对象获取用户提交的数字,然后让一个Tag文件负责策画该数字的,并将策画成果返回给用户。
Example4_1.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ taglib tagdir=/WEB-INF/tags prefix=com%>
<HTML><BODY bgcolor=cyan><FONT size=3>
<FORM action= method=post name=form>
<Input type=text name=number>
<Input type=submit value=提交 name=submit>
</FORM>
<% String textContent=request.getParameter(number);
if(textContent==null){
out.println(请在文本框中输入数字,按提交按钮);
}
else{
%> <p>调用Computer.tag文件负责策画根
<com:Computer number=<%=textContent %> />
<% }
%>
</FONT></BODY></HTML>
Computer.tag
<%@ attribute name=number %>
<% try{
double n=Double.parseDouble(number);
if(n>=0){
double r=Math.sqrt(n);
out.print(<BR>+n+的根:);
out.print(<BR>+r);
}
else
out.print(<BR>+请输入一个正数);
}
catch(NumberFormatException e){out.print(<BR>+请输入数字字符);}
%>
结果如图所示:
在运行例4-1时,用户先在浏览器的地址栏中输入example4_1.jsp页面地址“http://127.0.0.1:8080/chapter4/example4_1.jsp”,办事器做出响应,将表单发送给用户的浏览器,办事器的内置对象request调用getPeremeter()办法获取用户经由过程表单的文本框提交的信息。然则因为用户初次恳求example4_1.jsp页面,还没有在表单中输入信息,没有单击表单中的【提交】按钮,所以request调用getPeremeter()办法获取信息为null。当用户看到表单之后,就可以在表单的文本框中输入信息,单击【提交】按钮,再次恳求example4_1.jsp,那么办事器再次作出响应。这时,request调用getPeremeter()办法,就可以获取用户在表单的文本框中输入的信息。
2. 处理惩罚汉字信息
当用request对象获取恳求中的汉字字符信息时,可能呈现乱码题目,所以对含有汉字字符的信息必须进行特别的处理惩罚体式格式,即将
<%@ page contentType=”text/html;charset=GB2312” %>
中呈现的“charset”中的首写字母小写,内置对象将获取信息从头编码,即用ISO-8859-1进行编码,并把编码存到一个字节数组中去,如下所示:
String str=request.getParameter(“gile);
Byte b[]=str.getBytes(“ISO-8859-1”);
Str=new String(b);
【例 2】页面文件example4_2.jsp经由过程一个表单向页面showMessage2.jsp提交信息,避免汉字呈现乱码。
Example4_2.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan>
<FORM action=showMessage1.jsp method=post name=form>
<Input type=text name=boy>
<Input type=submit value=提交给showMessage1.jsp name=submit>
</FORM>
<FORM action=showMessage2.jsp method=post name=form>
<Input type=text name=boy>
<Input type=submit value=提交给showMessage2.jsp name=submit>
</FORM>
</BODY></HTML>
showMessage2.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML><BODY>
<P>获取文本框提交的信息:
<% String textContent=request.getParameter(boy);
byte b[]=textContent.getBytes(ISO-8859-1);
textContent=new String(b);
%>
<BR> <%=textContent%>
<P>获取按钮的名字:
<% String buttonName=request.getParameter(submit);
byte c[]=buttonName.getBytes(ISO-8859-1);
buttonName=new String(c);
%>
<BR> <%=buttonName%>
</BODY></HTML>
3. Request对象的常用办法
我们已经知道,当用户接见一个JSP页面时,会提交一个HTTP恳求给Tomcat办事器,这个恳求包含一个恳求行、HTTP头和信息体。例如:
POST/E.jsp/HTTP.1.1
Host:localhost:8080
Accept-encoding:gzip,deflate
此中,首行叫做恳求行,规定了向接见的页面恳求提交信息的体式格式,如post、get等办法,以及恳求的页面的文件名字和应用的通信和谈。
第2、3行分别是两个头,host、accept-encoding称为头名字,localhost:8080和gzip、deflate分别是它们的值。这里,host的值是E.jsp的地址。上方的恳求有两个头:host和accept-encoding。一个典范的恳求凡是包含很多头,有些头是标准的,有些头与特定的浏览器有关。
尽管办事器很是关怀用户提交的HTTP恳求中表单的信息,如例4-1和例4-2中应用request的getParameter()办法获取表单提交的有关信息,但实际上,应用request对象调用相干办法可以获取恳求的很多细节信息。内置对象request常用办法如下。
getProtocol():获取恳求应用的通信和谈,如http/1.1等。
getServletPath():获取恳求的JSP页面地点的目次。
getContentLength():获取HTTP恳求的长度。
getMethod():获取表单提交信息的体式格式,如post或get。
getHeader(String s):获取恳求中头的值。一般,s参数可取的头名有accept、referrer、accept-language、content-type、accept-encoding、user-agent、host、content-length、connection、cookie等。比如,s取值user-agent将获取客户的浏览器的版本号等信息。
getHeaderNames():获取头名字的一个列举。
getHeaders(String s):获取头的全部值的一个列举。
getRemoteAddr():获取客户的IP地址。
getRemoteHost():获取客户机的名称。
getServerName():获取办事器的名称。
getServerPort():获取办事器的端标语。
getParameterNames():获取表单提交的信息体项目组中name参数值的一个列举。
【例 3】应用request的一些常用办法。
<%@ page contentType=text/html;Charset=GB2312 %>
<%@ page import=java.util. %>
<HTML><BODY bgcolor=cyan><Font size=3>
<FORM action= method=post name=form>
<Input type=text name=boy>
<Input TYPE=submit value=enter name=submit>
<TABLE border=1>
<% String protocol=request.getProtocol();
String path=request.getServletPath();
String method=request.getMethod();
String header=request.getHeader(accept);
%>
<TR>
<TD>客户应用的和谈是:</TD>
<TD><%=protocol %></TD>
</TR>
<TR>
<TD>用户恳求的页面地点地位:</TD>
<TD><%=path %></TD>
</TR>
<TR>
<TD>用户提交信息的体式格式:</TD>
<TD><%= method %></TD>
</TR>
<TR>
<TD>获取HTTP头文件中accept的值:</TD>
<TD><%= header %></TD>
</TR>
</TABLE>
<BR>获取客户端提交的所有参数的名字:
<% Enumeration enumName=request.getParameterNames();
while(enumName.hasMoreElements()){
String s=(String)enumName.nextElement();
out.println(s);
}
%>
<BR>获取头名字的一个列举:
<% Enumeration enumHeaded=request.getHeaderNames();
while(enumHeaded.hasMoreElements()){
String s=(String)enumHeaded.nextElement();
out.println(s);
}
%>
<BR>获取头文件中指定头名字的全部值的一个列举:
<% Enumeration enumHeadedValues=request.getHeaders(cookie);
while(enumHeadedValues.hasMoreElements()){
String s=(String)enumHeadedValues.nextElement();
out.println(s);
}
%>
<P>文本框text提交的信息:
<% String textContent=request.getParameter(boy);
byte b[]=textContent.getBytes(ISO-8859-1);
textContent=new String(b);
if(textContent==null){
textContent=;
}
int length=textContent.length();
out.println(textContent);
out.println(文本框中字符的个数:+length);
%>
</FONT></BODY></HTML>
二 response对象
当客户接见一个办事器的页面时,会提交一个HTTP恳求,办事器收到恳求后,返回HTTP响应。响应与恳求类似,也有某种布局,每个响应都由状况行开端,可以包含几个头和可能的信息体。
Resquest对象获取客户恳求提交的信息,与request对象相对应的对象是response内置对象。Response对象对客户的恳求作出响应,向客户端发送数据。
1. 改变contentType属性的值
当一个客户恳求接见一个JSP页面时,若是该页面用page指令设置页面的contentType属性的值为text/html,那么response对象遵守这种属性值做出响应,将页面的静态项目组返回给客户。因为page指令只能为contentType指定一个值,来决意响应的MIME类型,若是想动态地改变这个属性的值来响应客户,就须要让response对象调用setContentType(String s)办法来改变contentType的属性值:
Public void setContentType(String s)
该办法设置响应的MIME类型,参数s可取值text/html、text/plain、image/gif、image/jpeg、image/x-xbitmap、image/pjpeg、application/x-shockwave-flash、application/vnd.ms-powerpoint、application/vnd.ms-excel、application/msword等。
当办事器用setContentType办法动态改变了contentType的属性值,即响应的MIME类型,并将JSP页面的输出成果遵守新的MIME类型返回给客户时,客户端要包管支撑这种新的MIME类型。
【例4】客户单击不合的按钮,可以改变页面响应的MIME类型。被选择将当前页面用“MS-Word显示”时,JSP页面动态地改变contentType的属性值为application/msword,客户浏览器会调用本地的Word软件来显示当前页面;选择将当前页面用“MS-Powerpoint显示”时,JSP页面动态地改变contentType的属性值为application/vnd.ms-powerpoint,客户浏览器会调用本地的PowerPoint软件来显示当前页面。
Example4_4.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY bgcolor=cyan><FONT size=2>
<P>在进修response对象的setContentType办法
<FORM action= method=post name=form>
<P>将当前页面用MS-Word显示吗?
<Input type=submit value=MS-Word显示 name=submit>
<P>将当前页面用MS-Powerpoint显示吗?
<Input type=submit value=MS-Powerpoint显示 name=submit>
</FORM>
<% String str=request.getParameter(submit);
if(str==null){
str=;
}
if(str.equals(MS-Word显示)){
response.setContentType(application/msword);
}
else if(str.equals(MS-Powerpoint显示)){
response.setContentType(application/vnd.ms-powerpoint);
}
%>
</FONT></BODY></HTML>
2. 设置响应的HTTP头
我们已经知道,当客户接见一个页面时,会提交一个HTTP头给办事器。同样,响应也包含一些头。Response对象可以应用如下办法:
addHeader(String head,String value);
setHeader(String head,String value);
动态添加新的响应头和头的值,将这些头发送给客户机的浏览器。若是添加的头已经存在,则先前的头被覆盖。
【例 5】为response对象添加一个响应头“refresh”,其值是“5”。那么,客户机收到这个头之后,5秒后将再次刷新页面example4_5.jsp,导致该页面每5秒刷新一次。
Example4_5.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<%@ page import=java.util. %>
<HTML><BODY bgcolor=cyan><FONT size=4>
<P>如今的时候是:<BR>
<% out.println(+new Date());
response.setHeader(Refresh,5);
%>
</FONT></BODY></HTML>
3. 重定向
在某些景象下,当响应客户机时,须要将客户机从头勾引至另一个页面。例如,若是用户输入的表单信息不完全,就会再被勾引到该表单的输入页面。
可以应用response的sendRedirect(URL url)办法实现客户的重定向。
【例 6】客户机在页面example4_6.jsp中填写表单提交给页面form.jsp,若是填写的表单不完全,就会从头定向到页面example4_6.jsp。
Example4_6.jsp
<%@ page contentType=text/html;charset=GB2312 %>
<HTML><BODY>
<P>填写姓名:<BR>
<FORM action=form.jsp method=post name=form>
<Input type=text name=boy>
<Input type=submit value=Enter>
</FORM>
</BODY></HTML>
Form.jsp
<%@ page contentType=text/html;Charset=GB2312 %>
<HTML><BODY>
<% String str=null;
str=request.getParameter(boy);
byte b[]=str.getBytes(ISO-8859-1);
str=new String(b);
if(str.length()==0){
response.sendRedirect(example4_6.jsp);
}
else{
out.print(迎接您来到本网页!);
out.print(str);
}
%>
</BODY></HTML>
4. 状况行
当办事器对客户恳求进行响应时,起首要发送的是状况行,然后发送HTTP头和信息体。也就是说,状况行是响应的首行。
状况行包含3位数字的状况码和对状况代码的描述。下面列出了5种状况码的可能描述。
1yy:主如果实验性质的。
2yy:注解恳求成功,如状况码200可以注解已成功取得了恳求的页面。
3yy:注解在恳求满足之前应采取进一步的步履。
4yy:当浏览器无法满足恳求时,返回该状况码,如404默示恳求的页面不存在。
5yy:默示办事器呈现题目,如500申明办事器内部产生错误。
一般不须要批改状况行,在呈现题目时,response对象会主动响应,发送响应的状况代码。我么也可以应用response对象的setStatus(int n)办法来设置状况行,若是设置的状况行已经存在,则先前的状况行被覆盖。如下是状况码表。
状况码
读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。