【前言】朋友的妈妈突然去世了,我刚刚得到消息。希望她别太伤心。
【参考】
http://tianke66.javaeye.com/blog/340107
http://blog.csdn.net/lyjustdoit/archive/2010/05/25/5619767.aspx
http://developer.51cto.com/art/200906/132743.htm
http://hibernater.javaeye.com/blog/220465
http://blog.sina.com.cn/s/blog_4cc1f43901000a5z.html
request对象
HTTP 通信协议是客户与服务器之间一种提交(请求) 信息与响应信息(request/respone)的通信协议。在JSP 中,内置对象request 封装了用户提交的信息,那么该对象调用相应的方法可以获取封装的信息,了解到客户的需求,即使用该对象可以获取用户提交的信,然后做出响应。它是HttpServletRequest类的实例。
【简单介绍】
客户通常使用HTML 表单向服务器的某个JSP 页面提交信息,表单的一般格式是:
<FORM method= get | post action= “提交信息的目的地页面”>
提交手段
</FORM>…..
其中<Form>是表单标签,method 取值get 或post。get 方法和post 方法的主要区别是:使用get 方法提交的信息会在提交的过程中显示在浏览器的地址栏中,而post 方法提交的信息不会显示在地址栏中。提交手段包括:通过文本框、列表、文本区等,例如:
<FORM action="tom.jsp" method= “post” >
<INPUT type="text" name="boy" value= “ok” >
<INPUT TYPE="submit" value=" 送出" name= “submit”>
</FORM>
该表单使用post方法向页面tom.jsp 提交信息,提交信息的手段是:在文本框输入信
息,其中默认信息是“ok”;然后点击“送出”按钮向服务器的JSP 页面tom.jsp 提交信
息。
request 对象可以使用getParameter(String s) 方法获取该表单通过text 提交的信息,
比如:
request.getParameter(“boy”);
【request对象的主要方法】
1) object getAttribute(String name) 返回指定属性的属性值
2) Enumeration getAttributeNames() 返回所有可用属性名的枚举
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) 返回一虚拟路径的真实路径
【示例】
例1:重点讲解getParameter(得到name为qwe的参数 对应的参数值,这个是从客户端传过来的)
<%@ 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>
例2:讲解getParameterNames(得到所有参数名,类型为枚举,本例中所有参数名为username和userpass)
<%@ 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"> 密 码:<input type="text" name="userpass"> <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>
例3:讲解getParameterValues(得到包含参数name的所有值的数组,本例中为参数为cb)
<%@ 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++ <input type="checkbox" name="cb" value="ON2">JAVA <input type="checkbox" name="cb" value="ON3">DELPHI <input type="checkbox" name="cb" value="ON4">VB <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>
【理解getAttribute方法和setAttribute方法】
getAttribute和setAttribute搭配使用,用setAttribute将参数值(value)赋给参数(name),然后用getAttribute通过参数名称(name)取出参数值(value)。request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段(?没有明白什么是请求处理阶段)。request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部。还有一点就是,HttpServletRequest类有setAttribute()方法,而没有setParameter()方法。
request.getAttribute("name")可得到JSP页面一表单中控件的Value。其实表单控件中的Object的name与value是存放在一个哈希表中的,所以在这里依据Object的name会到哈希表中找出对应它的value。
而不同页面间传值使用request.setAttribute(position, nameOfObj)时,只会从a.JSP到b.JSP一次传递,之后这个request就会失去它的作用范围,再传就要再设一个 request.setAttribute()。而使用session.setAttribute()会在一个过程中始终保有这个值(注解,session的范围比request大)。
P.S.:JavaScript与JSP中不能相互传值,因为JavaScript运行在客户端,而JSP运行在服务器端。若想使它们之间可以相互传递参数,可以在JSP中设置一个hidden控件,用它的value结合上面所说的用法来传递所需的数值。
Request的范围是指在一JSP网页发出请求到另一个JSP 网页之间,随后这个属性就失效。设定Request 的范围时可利用request 对象中的setAttribute( )和getAttribute( )。
<%
request.setAttribute("Name","mike");
request.setAttribute("Password","browser");
%><%
String Name = (String) request.getAttribute("Name");
String Password = (String) request.getAttribute("Password");
%>除了利用转向(forward)的方法可以存取request 对象的数据之外,还能使用包含(include)的方法。
【区分getParameter和getAttribute】
HttpServletRequest类既有getAttribute()方法,也由getParameter()方法,这两个方法有以下区别:
(1)request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据(from客户端),request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。
(2)request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据。
(2)HttpServletRequest类有setAttribute()方法,而没有setParameter()方法
(2)当两个Web组件之间为链接关系时,被链接的组件通过getParameter()方法来获得请求参数,例如假定welcome.jsp和authenticate.jsp之间为链接关系,welcome.jsp中有以下代码:
<a href="authenticate.jsp?username=weiqin">authenticate.jsp </a>
或者:
<form name="form1" method="post" action="authenticate.jsp"> (注解,用action的方式,也是属于链接方式)
请输入用户姓名:<input type="text" name="username">
<input type="submit" name="Submit" value="提交">
</form>
在authenticate.jsp中通过request.getParameter("username")方法来获得请求参数username:
<% String username=request.getParameter("username"); %>
(3)当两个Web组件之间为转发关系时,转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据。假定 authenticate.jsp和hello.jsp之间为转发关系。authenticate.jsp希望向hello.jsp传递当前的用户名字, 如何传递这一数据呢?先在authenticate.jsp中调用setAttribute()方法:
<%
String username=request.getParameter("username");
request.setAttribute("username",username); (注解,将usename这个参数名称和值,用setAttribute设置到request中)
%>
<jsp:forward page="hello.jsp" />
在hello.jsp中通过getAttribute()方法获得用户名字:
<% String username=(String)request.getAttribute("username"); %>
Hello: <%=username %>
从更深的层次考虑,request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据。
request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部,在具有转发关系的Web组件之间共享。这两个方法能够设置Object类型的共享数据。