} } }

    JSP内置对象

    添加时间:2013-7-12 点击量:

    一个JSP页面不仅可以有HTML标识表记标帜和JSP标识表记标帜,并且可以有成员变量声明,JSP页面可以在Java法度片和Java表达式中应用JSP页面声明的成员变量。有些成员变量不消声明就可以在JSP页面的脚本(Java法度片和Java表达式)中应用,这就是所谓的内置对象。


    内置对象有requestresponsesessionapplicationout


    一 request对象


    为了更好地懂得request对象,须要懂得HTTPHTTP是客户与办事器之间一种恳求信息与响应信息的通信和谈。我们应用浏览器从网站获取HTML页面或JSP页面时,遵守的就是HTTPHTTP规定了信息在Internet上的传输办法,特备规定了浏览器与办事器的交互办法。


    从网站获取页面时,浏览器在网站上打开了一个对收集办事器的连接,并发出恳求。办事器收到恳求并作出响应,响应停止后,客户浏览器和办事器之间的连接封闭。所以,HTTP被称为“恳乞降响应”和谈。


    用户经由过程在浏览器的地址栏中输入一个HTMLJSP页面地点的办事器的地址和页面的名字来恳求该页面。当用户经由过程浏览器恳求一个页面时,浏览器将恳求发送给办事器。遵守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对象常用的办法是getParameterString 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


    此中,首行叫做恳求行,规定了向接见的页面恳求提交信息的体式格式,如postget等办法,以及恳求的页面的文件名字和应用的通信和谈。


    23行分别是两个头,hostaccept-encoding称为头名字,localhost:8080gzipdeflate分别是它们的值。这里,host的值是E.jsp的地址。上方的恳求有两个头:hostaccept-encoding。一个典范的恳求凡是包含很多头,有些头是标准的,有些头与特定的浏览器有关。


    尽管办事器很是关怀用户提交的HTTP恳求中表单的信息,如例4-1和例4-2中应用requestgetParameter()办法获取表单提交的有关信息,但实际上,应用request对象调用相干办法可以获取恳求的很多细节信息。内置对象request常用办法如下。


    getProtocol():获取恳求应用的通信和谈,如http/1.1等。


    getServletPath():获取恳求的JSP页面地点的目次。


    getContentLength():获取HTTP恳求的长度。


    getMethod():获取表单提交信息的体式格式,如postget


    getHeaderString s):获取恳求中头的值。一般,s参数可取的头名有acceptreferreraccept-languagecontent-typeaccept-encodinguser-agenthostcontent-lengthconnectioncookie等。比如,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/htmltext/plainimage/gifimage/jpegimage/x-xbitmapimage/pjpegapplication/x-shockwave-flashapplication/vnd.ms-powerpointapplication/vnd.ms-excelapplication/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. 重定向


    在某些景象下,当响应客户机时,须要将客户机从头勾引至另一个页面。例如,若是用户输入的表单信息不完全,就会再被勾引到该表单的输入页面。


    可以应用responsesendRedirect(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)办法来设置状况行,若是设置的状况行已经存在,则先前的状况行被覆盖。如下是状况码表。






    状况码


    读书,不要想着实用,更不要有功利心。读书只为了自身的修养。邂逅一本好书如同邂逅一位知己,邂逅一个完美之人。有时心生敬意,有时怦然心动。仿佛你心底埋藏多年的话,作者替你说了出来,你们在时光深处倾心相遇的一瞬间,情投意合,心旷神怡。
    分享到: