关于request对象的方法有很多,在jsp内置对象【03】request详解【01】中,我们一起学习了request对象中的参数接受问题,那么现在再来看一下request的其他方法:
乱码可是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>
运行一下如下:
看一下图片旁边的地址可以发现,图片是从根目录中找到的图片,对于以后定义根目录有着非常重要的帮助。这种路径方式在高端开发中会学到。
关于request,我和大家就学到这个地方,对于上述的讲解,不要只看着运行结果很好,一定要找到代码中的有关方法,体会request中的各种方法的名称和作用。其中参数的接受和乱码处理是一个重点内容。
注意:
这儿说一个同学们可能会产生的问题:
到底什么时候该使用getAttribute()什么时候该使用getParameter()
如果要使用getAttribute()则之前一定会存在setAttribute()的设置操作,否则无法取得。
如果是使用getParameter()则表示接受参数,那么参数的来源有以下几种:
表单提交
地址重写
通过<jsp:include>、<jsp:forward>传递而来的参数。
getParameter()是无法接受setAttribute()设置的内容的