刚刚学习JSP的时候对pagcontext、reuqest、session、application的区别经常很迷惑,现在感觉基本上对其用法有所领悟。

     1、首次讲讲四种属性的保存范围:          

          pagcontext的有效范围是在一个页面之内;

          request是在一次服务器的请求范围之内;

          session在一次会话的范围内

          application是在一个应用服务器的范围之内;

    2、 这四个属性的设置都是使用他们的public void setAttribute(String name,Object)方法,

          要获得他的属性的方式是调用public Object getAttribute(String name)方法

           他们的用途:         

          pageContext:属性范围是JSP最重要的属性之一,如果纯粹的JSP代码开发,

                            这个方法显示不出用处,但是在Struts、WebWork开发中这个属性非常常用。

          request:将属性保存在一次请求范围之内,但是前提是使用<jsp:forward/>

                        方法跳转,应用点主要是MVC设计模式、Struts、Webwork开发当中。

          session:只要设置上去了,随便怎么跳转都没有关系,也就是说他的属性将保存

                        在一次会话当中。主要应用是验证用户是否登录,以及登录信息。

          application:只要设置上去在这个服务器的所有的对象都可以取得这个属性,

                              这个的主要应用是在线人数统计、在线人员列表等;

     通过上面的粗略的讲解大家应该会发现,过多的使用application和session会使系统

     的性能降低,所以这四个属性的使用原则是:如果能使用request就不使用session,

     如果能使用session就不使用application;

     3、下面再来详细讲一下给个对象的使用和注意点:          

     request:实际上是服务器端接收客户端请求信息的一个对象,接收之后再做处理

                 主要方法有:getParameter("parametername");接收一个参数

                 public String[] getParameterValues(String name)                    

                    将返回一个数组,像在表单提交时,有时一个参数就是一个多选框的接收参数,这时就会返回一个数组

               public Enumeration getParameterNames()                    

                    返回一个枚举类型的参数,这个函数的返回值其实就是返回客户端的所有的参数名字的,这个函数使得我们

               的开发方式变得非常的灵活,下面看如下一段代码:

               <body>
                    <%
                     // 接收内容
                          request.setCharacterEncoding("GBK") ;
                         Enumeration enu = request.getParameterNames() ;
                    %>
                    <%
                     while(enu.hasMoreElements())
                     {
                           String name = (String)enu.nextElement() ;

                        %>

                    <%、、、、、%>

               <%
                      }
               %>
               </h1>
               </body>

               在这段代码中我们可以不知道客户端到底要发送几个参数过来,但是我们可以用一个while 循环

               读出他所有的参数。

               3   String getCharacterEncoding() 返回字符编码方式 
               4   int getContentLength() 返回请求体的长度(以字节数) 
               5   String getContentType() 得到请求体的MIME类型 
               6   ServletInputStream getInputStream() 得到请求体中一行的二进制流 
               7   String getParameter(String name) 返回name指定参数的参数值 
               8   Enumeration getParameterNames() 返回可用参数名的枚举 
               9   String[] getParameterValues(String name) 返回包含参数name的所有值的数组 
               10   String getProtocol() 返回请求用的协议类型及版本号 
               11   String getScheme() 返回请求用的计划名,如:http.https及ftp等 
               12   String getServerName() 返回接受请求的服务器主机名 
               13   int getServerPort() 返回服务器接受此请求所用的端口号 
               14   BufferedReader getReader() 返回解码过了的请求体 
               15   String getRemoteAddr() 返回发送此请求的客户端IP地址 
               16   String getRemoteHost() 返回发送此请求的客户端主机名 
               17   void setAttribute(String key,Object obj) 设置属性的属性值 
               18   String getRealPath(String path) 返回一虚拟路径的真实路径

          下面是一个例子供学习参考

          <%@ page contentType="text/html;charset=gb2312"%>
<%request.setCharacterEncoding("gb2312");%>
<html>
<head>
<title>request对象_例1</title>
</head>
<body bgcolor="#FFFFF0">
<form action="" method="post">
   <input type="text" name="qwe">
   <input type="submit" value="提交">
</form>
请求方式:<%=request.getMethod()%><br>
请求的资源:<%=request.getRequestURI()%><br>
请求用的协议:<%=request.getProtocol()%><br>
请求的文件名:<%=request.getServletPath()%><br>
请求的服务器的IP:<%=request.getServerName()%><br>
请求服务器的端口:<%=request.getServerPort()%><br>
客户端IP地址:<%=request.getRemoteAddr()%><br>
客户端主机名:<%=request.getRemoteHost()%><br>
表单提交来的值:<%=request.getParameter("qwe")%><br>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%request.setCharacterEncoding("gb2312");%>
<%@ page import="java.util.Enumeration"%>
<html>
<head>
   <title>request对象_例2</title>
</head>
<body bgcolor="#FFFFF0">
<form action="" method="post">
    用户名:<input type="text" name="username">&nbsp;&nbsp;
    密 码:<input type="text" name="userpass">&nbsp;&nbsp;
    <input type="submit" value="进入" >
</form>
<%
String str="";
if(request.getParameter("username")!=null && request.getParameter("userpass")!=null){
    Enumeration enumt = request.getParameterNames();
    while(enumt.hasMoreElements()){
       str=enumt.nextElement().toString();
       out.println(str+":"+request.getParameter(str)+"<br>");
    }
}
%>
</body>
</html>
<%@ page contentType="text/html;charset=gb2312"%>
<%request.setCharacterEncoding("gb2312");%>
<html>
<head>
    <title>request对象_例3</title>
</head>
<body bgcolor="#FFFFF0">
<form action="" method="post">
   擅长:<input type="checkbox" name="cb" value="ON1">VC++&nbsp;
        <input type="checkbox" name="cb" value="ON2">JAVA&nbsp;
        <input type="checkbox" name="cb" value="ON3">DELPHI&nbsp;
        <input type="checkbox" name="cb" value="ON4">VB&nbsp;
        <br>
        <input type="submit" value="进入" name="qwe">
</form>
<%
if(request.getParameter("qwe")!=null ){
    for(int i=0;i<request.getParameterValues("cb").length;i++){
       out.println("cb"+i+":"+request.getParameterValues("cb")[i]+"<br>");
    }
    out.println(request.getParameter("qwe"));
}
%>
</body>
</html>

          篇幅的考虑,先鞋request对象,后面的在后面介绍。

posted on 2008-07-31 20:28  wocean  阅读(627)  评论(0编辑  收藏  举报