JSP中Out和Request对象详解

  内置表示不需要new便可直接使用。

一、基础知识

  1.缓冲区:IO最原始是一个一个字节的读取,这就像吃米饭的时候一粒一粒的吃,很没有效率,这时候就有了碗,一碗一碗的吃,岂不痛快。

  2.Get提交不能超过2k,安全性不高,查询、搜索时做,效率高,Post提交的信息在Html header里,信息量大,在注册、修改、上传时候。

二、out内置对象

  向客户端输出信息,是JspWriter的对象,常用的有println、flush和clear和clearbuffer,后两者的区别是,潜着在flush调用后会抛出异常,前者不会....抛出异常部分后面的代码都不会被执行,还有getBufferSize(缓冲区大小,如果不设置则为0),getRemaining(缓冲区剩余大小),isAutoFlush(缓冲区满时是否自动刷新)。

三、Request对象

  是HttpServletRequest的实力,客户端请求完成之前,一直存在。

 1 <%@ page language="java" contentType="text/html; charset=utf-8"%>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 3 <html>
 4 <head>
 5 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 6 <title>Insert title here</title>
 7 </head>
 8 <body>
 9     <form name="regiserForm" action="mainPage.jsp" method="post">
10     <table>
11         <tr>
12             <td>姓名</td>
13             <td>
14                 <input type="text" name="userName">
15             </td>
16         <tr>
17         <tr>
18             <td>爱好</td>
19             <td>
20                 <input type="checkbox" name="favourite" value="羽毛球">羽毛球
21                 <input type="checkbox" name="favourite" value="篮球">篮球
22                 <input type="checkbox" name="favourite" value="网球">网球
23                 <input type="checkbox" name="favourite" value="足球">足球
24             </td>
25         </tr>
26         <tr>
27             <td colspan=2>
28                 <input type="submit" value="提交">
29             </td>
30         </tr>
31     </table>
32     </form>
33 </body>
34 </html>

  这是注册页面,第一点需要注意的是

<%@ page language="java" contentType="text/html; charset=utf-8"%>

  charset在contentType里面(看冒号),单独写的话提示找不到属性。第二点是布局问题,名字和input分别占用一个td,工两个td,所以下面的提交是colspan=2。

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
    request.setCharacterEncoding("UTF-8");
    String userName= request.getParameter("userName");
    String[] favourite = request.getParameterValues("favourite");
    out.println("姓名&nbsp&nbsp&nbsp"+userName);
    out.print("爱好");
    for (int i=1; i<favourite.length; i++) {
        out.println("&nbsp&nbsp&nbsp"+favourite[i]);
    }
%>

</body>
</html>

  由于页面编码方式都是UTF-8,但是参数传输方式默认是ISO-8859-1,所以现浏览器里的结果是乱码。在接受参数之前加入

 request.setCharacterEncoding("UTF-8");

  

  下面测试Get传递参数

1 <!-- 直接这样会出现空指针异常,因为并没有传递爱好属性,而mainPage直接去获取爱好,所以空指针,因此需要判断一下 -->
2     <a href="mainPage.jsp?userName=李四">测试Get方法(URL传参数)</a>

..........................

    request.setCharacterEncoding("UTF-8");

    String userName= request.getParameter("userName");
    out.println("姓名&nbsp&nbsp&nbsp"+userName);
    if(request.getParameterValues("favourite")!=null) {
        String[] favourite = request.getParameterValues("favourite");
        
        out.print("爱好");
        for (int i=1; i<favourite.length; i++) {
            out.println("&nbsp&nbsp&nbsp"+favourite[i]);
        }
    }

  按理说这种方式传递中文不论地址栏还是现实的结果都会是乱码,但是我这竟然没有,如果有的话

   <Connector port="9999" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

  配置Tomcat下的server.xml,第一个Connector,可以修改端口号,同事最后加入URIEncoding这个属性。或者

String str= request.getParameter("userName");
String userName = new String(str.getBytes("ISO-8859-1"),"UTF-8");

  还有一种就是为Connector 节点添加useBodyEncodingForURI="true" 属性即可。

  还可以在request对象里setAttribute('"password","123456")下面通过getAttribute("password")来获得,原来是getParameter。

  getContentType:或者MIME类型

  getProtocol:协议类型和版本号

  getServerPort:服务器端口号

  getRemoteAddr:客户端的IP地址

  真是的IP地址因为是动态IP,所以找不到真是的。

posted @ 2016-06-02 18:39  加拿大小哥哥  阅读(3863)  评论(0编辑  收藏  举报