您的位置:首页 > 产品设计 > UI/UE

jsp内置对象【03】request详解【02】

2013-02-05 14:25 525 查看
关于request对象的方法有很多,在jsp内置对象【03】request详解【01】中,我们一起学习了request对象中的参数接受问题,那么现在再来看一下request的其他方法:

乱码解决( setCharacterEncoding())

乱码可是WEB开发中的问题老大哥了,我相信有不少接触过这个东西的人都对其相当的头疼。

什么是乱码?

在运行程序的时候,本来应该显示的中文竟然变成了莫名其妙的其他看不懂的字符,那我们说就碰到乱码了。我们以下面的程序为例:

Request_01.jsp
<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>

<html>

<head>

<title>web开发</title>

</head>

<body>

<form action="request_02.jsp" method="post">

请输入信息:<input type="text" name="info">

<input type="submit" value="提交">

</form>

</body>

</html>

Request_02.jsp

<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>

<html>

<head>

<title>web开发</title>

</head>

<body>

<%

String content=request.getParameter("info");

%>

<h2><%=content%></h2>

</body>

</html>

不用我多说,大家运行一下就可以发现,输入英文和数字都能够正常显示,但是输入中文却显示一串看不懂的字符。这就是乱码了。由于现在的request属于接受客户端的参数,所以必然有其默认的语言编码,之所以会出现上述的乱码,主要是由于浏览器的默认编码是UTF-8,而中文编码是GBK,这两种编码是不一样的,所以就造成了乱码。

要解决乱码就用到了request中的一种方法:

void setCharacterEncoding(String env)

throws UnsupportedEncodingException

将上述的request_02.jsp改成如下:

<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>

<html>

<head>
<title>web开发</title>
</head>
<body>
<%

request.setCharacterEncoding("gbk");   //设置编码方式

String content=request.getParameter("info");

%>

<h2><%=content%></h2>

</body>
</html>

运行一下,就能显示中文了。

处理乱码的方式有很多种,如果上述方法不行的话,还有一种方法:

将request_02.jsp页面改成如下:

<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>

<html>
<head>
<title>web开发</title>
</head>
<body>
<%

String content=new String(request.getParameter("info").getBytes("ISO-8859-1"));
%>
<h2><%=content%></h2>
</body>
</html>

这种方式也是可以的,但是我不推荐大家使用这种方法,首先应该使用第一种,如果第一种不行的话,再使用这一种,关于乱码的问题,大家了解这些就够了,造成乱码的原因哟很多,解决的途径也有很多,之后我们还会学到监听器和过滤器,不过那属于我们后续的学习了。

显示头信息(简单了解)

关于头信息

java的WEB开发使用的是HTTP协议,主要的操作就是基于请求和回应,但是在请求和回应的同时也会包含一些其他的信息(例如:客户端的IP、Cookie、语言等),那么这些信息就成为头信息。

取得头信息

要想取得头信息的名称可以直接通过request内置对象的getHeaderNames(),而要想取出每一个头信息的内容,则需要使用getHeader()方法。

下面看一个取头信息的例子,看看结果取出来的是什么东西。

<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<%
Enumeration enu=request.getHeaderNames();//取得全部的头信息
while(enu.hasMoreElements()){
String headerName=(String)enu.nextElement();
String headerValue=request.getHeader(headerName);
%>
<h5><%=headerName%> -->  <%=headerValue%></h5>
<%
}
%>
</table>
</body>
</html>

运行一下结果如下;

accept --> */*

accept-language --> zh-CN

accept-encoding --> gzip, deflate

user-agent --> Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E; MALN; Media Center PC 6.0)

host --> localhost:8080

connection --> Keep-Alive

cookie --> JSESSIONID=78635401F07163F4B4BEB36A9D5EEB60

关于头信息的操作就不多说了,大家知道有这么回事就可以了。

其他操作

通过request的方法还可以取得客户端的IP地址、请求方式、访问路径和上下文的名称等

一个程序实例:

<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<%
String method=request.getMethod();
String ip=request.getRemoteAddr();
String path=request.getServletPath();
String contextPath=request.getContextPath();
%>
<h1>请求方式: <%=method %></h1>
<h1>IP地址: <%=ip %></h1>
<h1>访问路径: <%=path %></h1>
<h1>上下文名称: <%=contextPath %></h1>
</table>
</body>
</html>

运行一下结果如下:

请求方式: GET

IP地址: 0:0:0:0:0:0:0:1

访问路径: /jsp/request_06.jsp

上下文名称: /test51cto

从结果可以看出,这些方法能够取得请求方式、IP地址等。

其中getContextPath()方法是一个非常重要的方法,这个方法可以解决路径的跳转问题。

如下程序是一个访问图片的程序。按照我们以前学习过的HTML来做的话如下:

(假设我的图片文件夹名称是images,图片的名字为4.jpg)

<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>
<%@ page import="java.util.*" %>

<html>
<head>
<title>web开发</title>
</head>
<body>
<img src="../images/4.jpg">
</table>
</body>
</html>

但是通过我们getContextPath()方法如下:

<%@ page language="java" contentType="text/html" pageEncoding="gbk" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<%=request.getContextPath()%>/images/4.jpg    //这是为了让大家能够看清楚路径的来源
<img src="<%=request.getContextPath()%>/images/4.jpg">
</table>
</body>
</html>

[/code]
运行一下如下:





看一下图片旁边的地址可以发现,图片是从根目录中找到的图片,对于以后定义根目录有着非常重要的帮助。这种路径方式在高端开发中会学到。

关于request,我和大家就学到这个地方,对于上述的讲解,不要只看着运行结果很好,一定要找到代码中的有关方法,体会request中的各种方法的名称和作用。其中参数的接受和乱码处理是一个重点内容。

注意:

这儿说一个同学们可能会产生的问题:

到底什么时候该使用getAttribute()什么时候该使用getParameter()

如果要使用getAttribute()则之前一定会存在setAttribute()的设置操作,否则无法取得。

如果是使用getParameter()则表示接受参数,那么参数的来源有以下几种:

表单提交

地址重写

通过<jsp:include>、<jsp:forward>传递而来的参数。

getParameter()是无法接受setAttribute()设置的内容的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  request   乱码处理