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"%>
<html>
<head><title>request</title></head>
<body>
<%
request.setCharacterEncoding("GBK");
String content = request.getParameter("info");
%>
<h2><%=content%></h2>
</body>
</html>
【request_01.htm的内容如下:】
<html>
<head><title>Request</title></head>
<body>
<form action="request_01.jsp" method="post">
请输入信息:<input type="text" name="info">
<input type="submit" value="提交">
</form>
</body>
</html>
执行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):<h3>兴趣:<%=inst%></h3>
替换为:
<h3>兴趣:
<%
for(int x=0;x<inst.length;x++){
%>
<%=inst[x]%>、
<%
}
%>
此时,虽然可以进行了参数的接收,可是一个新的问题出现了,如果现在没有选中或者是没有输入会如何? 【会出现空指针错误,所以此时要判断inst是否为空!】
【request_02.htm的内容如下:】
<html>
<head><title>Request</title></head>
<body>
<form action="request_02.jsp" method="post">
姓名:<input type="text" name="uname"></br>
兴趣:<input type="checkbox" name="inst" value="唱歌">唱歌
<input type="checkbox" name="inst" value="跳舞">跳舞
<input type="checkbox" name="inst" value="游泳">游泳
<input type="checkbox" name="inst" value="看书">看书
<input type="checkbox" name="inst" value="旅游">旅游
<br><input type="hidden" name="id" value="3">
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
【request_02.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>request</title></head>
<body>
<%
request.setCharacterEncoding("GBK"); //设置的是统一编码
String id = request.getParameter("id");
String name = request.getParameter("uname");
String inst[] = request.getParameterValues("inst");
%>
<h3>编号:<%=id%></h3>
<h3>姓名: <%=name%></h3>
<h3>兴趣:
<%
if(inst != null){
for(int x=0;x<inst.length;x++){
%>
<%=inst[x]%>、
<%
}
}
%>
</body>
</html>
执行request_02.htm的内容,结果如下所示:
点击“提交”后,出现的结果如下:
但是,在此处有一点也特别需要注意的是,现在的参数是通过表单传递过来的,也就是说可以传递文本、密码、单选、复选,可是在这之上还有一种参数的传递方法,称为地址重写。
URL地址重写
在WEB的开发中,所有的参数不一定非要由表单传递过来,也可以使用地址重写的方式进行传递,地址重写的格式如下:
动态页面地址?参数名称1=参数内容1&参数名称2=参数内容2&...
下面通过地址重写的方式完成参数的传递。
重新定义【request_03.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<html>
<head><title>request</title></head>
<body>
<%
request.setCharacterEncoding("GBK"); //设置的是统一编码
String param1 = request.getParameter("name");
String param2 = request.getParameter("password");
%>
<h3>编号:<%=param1%></h3>
<h3>姓名: <%=password%></h3>
</body>
</html>
此程序运行出来的结果如下:
通过在浏览器的地址栏输入:?name=skewrain&password=123,刷新后的结果如下:
表单的两种提交方式:get和post,这两种有什么区别呢?
1):post提交:提交后的地址栏不会附加目标地址的其他内容,是只能用在表单上的一种提交方式。
2):get提交:提交后的地址栏是会改变的,而且会使用地址重写的方式完成。既然所有的内容都要显示,则传递时,肯定受到地址栏长度的限制。
在request中还有一个方法很重要:
Enumeration getParameterName();
此方法的名称上已经明确的说明了,现在返回的是所有参数的名字。本方法可以返回所有请求参数的名称,但是此方法返回值的类型是Enumeration,所以需要使用hasMoreElements()方法判断是否有内容以及使用nextElement()方法取出内容。
【request_04.htm的内容如下:】
<html>
<head><title>Request</title></head>
<body>
<form action="request_04.jsp" method="post">
姓名:<input type="text" name="uname"><br>
性别:<input type="radio" name="sex" value="男" CHECKED>男
<input type="radio" name="sex" value="女">女<br>
城市:<select name="city">
<option value="北京">北京</option>
<option value="天津">天津</option>
<option value="深圳">深圳</option>
</select><br>
兴趣:<input type="checkbox" name="**inst" value="唱歌">唱歌
<input type="checkbox" name="**inst" value="跳舞">跳舞
<input type="checkbox" name="**inst" value="游泳">游泳
<input type="checkbox" name="**inst" value="看书">看书
<input type="checkbox" name="**inst" value="旅游">旅游<br>
自我介绍:<br><textarea cols="30" rows="3" name="note"></textarea><br>
<input type="hidden" name="uid" value="1">
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>如果现在按照传统的方法接收参数就是所有的普通的参数使用getParameter()接收,而所有的数组内容肯定使用getParameterValues()接收。
但是现在换一种方式,使用getParameterNames()接收。
通过此方法取得参数名称之后,进一步的利用了getParameter()方法取得了每一个参数对应的内容,但是现在并不能处理复选框的内容。
【request_04.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>Request</title></head>
<body>
<%
request.setCharacterEncoding("GBK"); //设置的是统一编码
Enumeration enu = request.getParameterNames();
%>
<table border="1">
<tr>
<td>参数名称</td>
<td>参数内容</td>
</tr>
<%
while(enu.hasMoreElements()){
String paramName = (String)enu.nextElement();
%>
<tr>
<td><%=paramName%></td>
<td>
<%
if(paramName.startsWith("**")){
String paramValue[] = request.getParameterValues(paramName);
for(int x=0;x<paramValue.length;x++){
%>
<%=paramValue[x]%>、
<%
}
}else{
String paramValue = request.getParameter(paramName);
%>
<%=paramValue%>
<%
}
%>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
执行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.*"%>
<html>
<head><title>Request</title></head>
<body>
<%
Enumeration enu = request.getHeaderNames();//取得全部的头信息
while(enu.hasMoreElements()){
String headerName = (String) enu.nextElement();
String headerValue = request.getHeader(headerName);
%>
<h3><%=headerName%> ---><%=headerValue%></h3>
<%
}
%>
</table>
</body>
</html>
执行此段代码的结果如下所示:
但是对于头信息而言,本身理解即可,因为很少直接去操作头信息的。
Request的其他操作:
通过request对象可以取得客户端的IP地址,请求方式,访问的路径,上下文的名称等。
直接输入地址,属于get提交。
Request其他操作的代码式例:
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<html>
<head><title>Request对象的一些操作</title></head>
<body>
<%
String method = request.getMethod();
String ip = request.getRemoteAddr();
String path = request.getServletPath();
String contextPath = request.getContextPath();
%>
<h3>请求方式:<%=method%></h3>
<h3>IP地址:<%=ip%></h3>
<h3>访问路径:<%=path%></h3>
<h3>上下文名称:<%=contextPath%></h3>
</body>
</html>
执行此代码的输出结果如下:
对于request中的getContextPath()方法是一个非常重要的操作,以后通过它,可以解决路径的跳转问题。
例如,以下代码可以用来输出一张图片:
<img src=”<%=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):通过<jsp:include>、<jsp:forward>传递而来的参数。
7.getParameter()是无法接收setAttribute()设置的内容的。