三.request隐含对象
客户端通过HTTP请求提交的信息会被servlet容器封装在request对象中,jsp页面程序通过request对象可操作客户端请求参数(parameter),属性(attribute)和客户端输入流等数据;
parameter参数一般是由客户端通过HTTP POST或GET方法提交过来的参数,一般来客来自客户端或有上一个程序转发;
attribute属性主要是服务器程序产生的数据产生的参数,一般不是来自客户端;
(1)客户端传递给服务器的参数最常见的是表单数据或附在URL中的参数,其中URL中的参数是指URL“?”后面的参数,称之为查询串(query string)参数,例如http://localhost/exam.jsp?name=tomcat中的“name=tomcat”。
(2)用request读取单值参数
所谓单值参数是指:一个变量最多有一个值。用request对象的getParameter()方法读取这些参数。getParameter()用于读取指定变量名的参数值,
方法的定义为:public java.lang.String getParameter(java.lang.String name)
方法的形参是参数的变量名,以String形式返回变量的值。如果request对象中没有指定的变量,则返回null。
(3) request作用范围变量
服务器端的两个JSP/Servlet程序间要交换数据时,可通过request作用范围变量来实现。request作用范围变量也叫request属性(attributes),
是类似于“name=value”的属性对,由属性名和属性值构成,属性值一般是一个Java对象,不是Java基本数据类型数据。Servlet程序A要把数据
对象传递给Servlet程序B时,程序A通过调用request.setAttribute()把数据对象写入request作用范围,并通过request转发跳转到程序B,程序A的
request对象被转发给程序B,在程序B中通过request.getAttribute()从request作用范围读取数据对象。
通过request.setAttribute()方法将一个属性值对象写入request对象中,或者说把一个属性值对象定义为request作用范围变量,实际上是把属性值对象与
request隐含对象绑定,使属性值对象本身的生命周期和request对象的生命周期直接相关,在当前request隐含对象有效的范围内,与之绑定的属性值对象也是有效的,可通过reuqest.getAttribute()方法读取这些有效的属性值对象,当request对象生命期结束时,与之绑定的request属性变量会变成垃圾对象而被回收。
request作用范围变量的变量名可以采用Java包的命名方式,例如:com.abc.mis.login.name、com.abc.mis.login.pw等,变量名尽可能唯一,并且
不要与Java/J2EE的包名/类名相同
在JSP中,除了request作用范围变量外,还有page、session和application作用范围变量,它们的基本含义都是把属性值对象与某个有生命周期的JSP隐含对象相绑定,使属性值对象有一定的生命周期,或者说使属性值对象在一定的作用范围内有效。定义作用范围变量一般是调用JSP隐含对象中的setAttribute()方法,读取作用范围变量一般是调用getAttribute()方法。
1、setAttribute()/getAttribute()方法
request.setAttribute()用于把一个属性对象按指定的名字写入request作用范围,它的语法为:
public void setAttribute(java.lang.String name, java.lang.Object o)
第一个形参是作用范围变量名,名字要唯一,第二个形参是属性值对象。
request.getAttribute()从request作用范围读出指定名字的属性对象,它的语法为:
public java.lang.Object getAttribute(java.lang.String name)
形参是属性值对象的变量名,方法返回的对象是Object类型,一般要进行强制类型转换,还原属性值对象的原本数据类型。
2.getRequestDispatcher()
两个Servlet程序间要利用request作用范围变量来传递数据时,要用转发跳转操作实现从第一个Servlet程序A跳转到第二个Servlet程序B,
跳转时,程序A中的request和response隐含对象会被自动转发给程序B。
request转发器(RequestDispatcher)的作用是获得目标资源的转发器,通过转发器将当前Servlet程序的request和response对象转发给目标资源,
并跳转至目标资源上运行程序,这样,目标资源就可通过request对象读取上一资源传递给它的request属性。
equest. getRequestDispatcher()的作用是返回目标资源的RequestDispatcher对象,
形参是当前Web应用目标资源的URI,可以使用相对路径或绝对路径。
RequestDispatcher中主要的方法有:
public void forward(ServletRequest request, ServletResponse response)
throws ServletException,java.io.IOException
该方法能够把当前Servlet程序的request和response隐含对象转发给目标资源,并跳转至目标资源运行代码。形参是当前Servlet程序的request和response隐含对象。
forward()方法在response信息提交前调用。如果在调用forward()之前已经刷新了response输出缓冲区,那么转发会引发异常。在执行跳转动作前,当前response对象输出缓冲区中的信息将被清空。
3、removeAttribute()
此方法的作用是从request作用范围中删除指定名字的属性,它的语法为:
public void removeAttribute(String name)
形参是属性名。例如:request.removeAttribute(“name”);
4、setCharacterEncoding()
定义request对象中的parameter参数的字符编码标准。例如,parameter参数如果有中文,在读取参数前调用此方法,设置参数的编码标准为GB2312,可以解决以POST方式提交参数的中文乱码问题。