Request内置对象
Request内置对象是使用最多的一个对象了,其主要作用是用来接收客户端发送而来的请求信息,例如:请求的参数、发送的头信息等都属于客户端发来的信息,request是javax.servlet.http.HttpServletRequest接口的实例化对象,表示此对象主要是应用在HTTP协议上。
对应接口:public interface HttpServletRequest extends ServletRequest。
可以看出,HttpServletRequest是ServletRequest的子接口,而ServletRequest只有一个子接口—HttpServletRequest。
既然ServletRequest只有一个子接口HttpServletRequest,那么为什么不将两个接口合并成一个接口呢?
只能从长远来看,从长远上讲,现在使用的主要协议是HTTP协议,但是以后有可能出现更多的新的协议,例如:XXX,以后如果要想支持这种新的协议,则肯定直接继承ServletRequest接口即可。
在HttpServletRequest接口中定义的方法很多,但是都是围绕接收客户端参数的。
既然已经说到客户端参数,那么下面再回顾一下。
乱码解决(重点)
由于现在的request属于接收客户端的参数,所以必然有其默认的语言编码,之所以会这样,主要是由于浏览器的默认编码是UTF-8,而中文编码是GBK,这两种编码是不一样的,所以就造成了乱码。
要想解决这种乱码问题,就必须使用request提供的统一设置编码的方法。
设置请求编码:void setCharacterEncoding(String env)。 //设置的是统一编码。
【request_01.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%
request.setCharacterEncoding("GBK");
String content = request.getParameter("info");
%>
<%=content%>
【request_01.htm的内容如下:】
请输入信息:
执行request_01.htm的结果如下所示:
以后只要是进行了传递,则肯定要使用这条语句进行乱码解决的。
如果这种乱码解决不了的话,还有第二种形式。
在以上的request_01.jsp中用如下片段:
String content = new String(request.getParameter("info").getBytes("ISO8859-1"));
代替:
request.setCharacterEncoding("GBK");
String content = request.getParameter("info");
会得到相同的结果。
2.接收参数(重点)
使用getParameter()方法可以用于参数的接收,但是如果现在有这样一种情况。
现在如果表单传递的是一个复选框,则只能接收第一个选中的,如果要想都接收该怎么办? 之前说过,所谓的复选框实际上是一个数组,既然是一个数组,则肯定要同时接收一组数据。
此时就要使用如下的方法完成:String[] getParameterValues(String name)。
将原来的代码:
1):String inst = request.getParameter("inst");
替换为:
String inst[] = request.getParameterValues("inst");
2):兴趣:<%=inst%>
替换为:
兴趣:
<%
for(int x=0;x
%>
<%=inst[x]%>、
<%
}
%>
此时,虽然可以进行了参数的接收,可是一个新的问题出现了,如果现在没有选中或者是没有输入会如何? 【会出现空指针错误,所以此时要判断inst是否为空!】
【request_02.htm的内容如下:】
姓名:
兴趣:唱歌
跳舞
游泳
看书
旅游
【request_02.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%
request.setCharacterEncoding("GBK"); //设置的是统一编码
String id = request.getParameter("id");
String name = request.getParameter("uname");
String inst[] = request.getParameterValues("inst");
%>
编号:<%=id%>
姓名: <%=name%>
兴趣:
<%
if(inst != null){
for(int x=0;x
%>
<%=inst[x]%>、
<%
}
}
%>
执行request_02.htm的内容,结果如下所示:
点击“提交”后,出现的结果如下:
但是,在此处有一点也特别需要注意的是,现在的参数是通过表单传递过来的,也就是说可以传递文本、密码、单选、复选,可是在这之上还有一种参数的传递方法,称为地址重写。
URL地址重写
在WEB的开发中,所有的参数不一定非要由表单传递过来,也可以使用地址重写的方式进行传递,地址重写的格式如下:
动态页面地址?参数名称1=参数内容1&参数名称2=参数内容2&...
下面通过地址重写的方式完成参数的传递。
重新定义【request_03.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%
request.setCharacterEncoding("GBK"); //设置的是统一编码
String param1 = request.getParameter("name");
String param2 = request.getParameter("password");
%>
编号:<%=param1%>
姓名: <%=password%>
此程序运行出来的结果如下:
通过在浏览器的地址栏输入:?name=skewrain&password=123,刷新后的结果如下:
表单的两种提交方式:get和post,这两种有什么区别呢?
1):post提交:提交后的地址栏不会附加目标地址的其他内容,是只能用在表单上的一种提交方式。
2):get提交:提交后的地址栏是会改变的,而且会使用地址重写的方式完成。既然所有的内容都要显示,则传递时,肯定受到地址栏长度的限制。
在request中还有一个方法很重要:
Enumeration getParameterName();
此方法的名称上已经明确的说明了,现在返回的是所有参数的名字。本方法可以返回所有请求参数的名称,但是此方法返回值的类型是Enumeration,所以需要使用hasMoreElements()方法判断是否有内容以及使用nextElement()方法取出内容。
【request_04.htm的内容如下:】
姓名:
性别:男
女
城市:
兴趣:唱歌
跳舞
游泳
看书
旅游
自我介绍:
如果现在按照传统的方法接收参数就是所有的普通的参数使用getParameter()接收,而所有的数组内容肯定使用getParameterValues()接收。
但是现在换一种方式,使用getParameterNames()接收。
通过此方法取得参数名称之后,进一步的利用了getParameter()方法取得了每一个参数对应的内容,但是现在并不能处理复选框的内容。
【request_04.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<%
request.setCharacterEncoding("GBK"); //设置的是统一编码
Enumeration enu = request.getParameterNames();
%>
<% while(enu.hasMoreElements()){ String paramName = (String)enu.nextElement(); %> <% if(paramName.startsWith("**")){ String paramValue[] = request.getParameterValues(paramName); for(int x=0;x %> <%=paramValue[x]%>、 <% } }else{ String paramValue = request.getParameter(paramName); %> <%=paramValue%> <% } %> <% } %>
参数名称
参数内容
<%=paramName%>
执行request_04.htm的内容如下所示:
点击“提交”按钮后的结果如下:
此类的操作一般都是在表单不确定的时候使用,例如:购物车的功能实现。
显示全部的头信息
1.JAVA的WEB开发使用的是HTTP协议,主要的操作就是基于请求和回应,但是在请求和回应的同时也会包含一些其他的信息(例如:客户端的IP,Cookie,语言等),那么这些信息就称为头信息。
2.要想取得头信息的名称可以直接通过request内置对象的getHeaderNames(),而要想取出每一个头信息的内容,则需要使用getHeader()方法。
取得头信息的程序如下所示:【request_05.jsp的内容】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<%
Enumeration enu = request.getHeaderNames();//取得全部的头信息
while(enu.hasMoreElements()){
String headerName = (String) enu.nextElement();
String headerValue = request.getHeader(headerName);
%>
<%=headerName%> ---><%=headerValue%>
<%
}
%>
执行此段代码的结果如下所示:
但是对于头信息而言,本身理解即可,因为很少直接去操作头信息的。
Request的其他操作:
通过request对象可以取得客户端的IP地址,请求方式,访问的路径,上下文的名称等。
直接输入地址,属于get提交。
Request其他操作的代码式例:
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<%
String method = request.getMethod();
String ip = request.getRemoteAddr();
String path = request.getServletPath();
String contextPath = request.getContextPath();
%>
请求方式:<%=method%>
IP地址:<%=ip%>
访问路径:<%=path%>
上下文名称:<%=contextPath%>
执行此代码的输出结果如下:
对于request中的getContextPath()方法是一个非常重要的操作,以后通过它,可以解决路径的跳转问题。
例如,以下代码可以用来输出一张图片:
/images/1024.jpg”>
等学习逐步深入的时候,此方法的作用就特别的明显了。
小结:
1.Request对象的主要功能是用于接收用户发来的请求信息。
2.接收参数的方法:getParameter(),getParameterValues(),getParameterNames()。
3.取得客户端IP地址可以使用getRemoteAddr()。
4.取得上下文名称可以使用getContextPath()。
5.头信息是指附加在请求上一起发送到服务器上的内容。
6.Request的属性操作。
如果要使用getAttribute()则之前一定会存在setAttribute的设置操作,否则无法取得。
如果使用getParameter()则表示接收参数,那么参数的来源有以下几种:
1):表单提交;
2):地址重写;
3):通过
7.getParameter()是无法接收setAttribute()设置的内容的。