介绍
当浏览器请求一个网页,它会向网络服务器发送一系列不能直接读取信息,这些信息是作为HTTP信息头的一部分来传送的。
request 对象是 javax.servlet.http.HttpServletRequest 接口的实例。每当客户端请求一个页面时,JSP 引擎就会产生一个新的对象来代表这个请求。
请求头的部分信息介绍
信息 | 描述 |
---|---|
Accept | 浏览器或其他客户端可以处理的MIME类型。它的值通常为 image/png 或 image/jpeg |
Accept-Charset | 浏览器要使用的字符集。比如 ISO-8859-1 |
Accept-Language | 客户端首选语言 |
Connection | 表明客户端是否可以处理HTTP持久连接。持久连接允许客户端或浏览器在一个请求中获取多个文件。Keep-Alive 表示启用持久连接 |
Content-Length | 仅适用于POST请求,表示 POST 数据的字节数 |
Cookie | 返回先前发送给浏览器的cookies至服务器 |
Host | 返回原始URL中的主机名和端口号 |
Referer | 标志着所引用页面的URL。比如,如果你在页面1,然后点了个链接至页面2,那么页面1的URL就会包含在浏览器请求页面2的信息头中 |
User-Agent | 用来区分不同浏览器或客户端发送的请求,并对不同类型的浏览器返回不同的内容 |
基础结构
javax.servlet.ServletRequest
接口javax.servlet.http.HttpServletRequest
接口- 如果 Web 服务器是 tomcat,则由 tomcat 实现该接口
org.apache.catalina.connector.RequestFacade
- 如果 Web 服务器是 tomcat,则由 tomcat 实现该接口
servletRequest
只有一个 HttpServletRequest
一个子接口。因为现在浏览器都基于 http
协议,如果由新的只需添加新的子接口。
作用
用来接收客户端发送而来的请求信息,例如:请求参数、请求头信息、Cookie、客户端IP 等等。
常用方法
-
获取请求方式
request.getMethod()
-
取得上下文资源路径(绝对路径/虚拟目录)
java.lang.String getContextPath()
-
取得Cookie
Cookie[] getCookies()
-
根据头信息名称取得头信息
java.lang.String getHeader(java.lang.String name)
-
取得所有头信息名称
java.util.Enumeration<java.lang.String> getHeaderNames()
-
取得访问路径
java.lang.String getServletPath()
-
获取当前的 session 对象
HttpSession getSession()
-
设置请求的统一编码
void setCharacterEncoding(java.lang.String env) throws java.io.UnsupportedEncodingException
-
根据参数名称获取请求的参数
java.lang.String getParameter(java.lang.String name)
-
获取所有请求的参数名称
java.util.Enumeration<java.lang.String> getParameterNames()
-
根据名称获取(多个)请求参数的值
java.lang.String[] getParameterValues(java.lang.String name)
-
取得 application 对象
ServletContext getServletContext()
-
取得客户端 IP
ava.lang.String getRemoteAddr()
部分方法功能介绍
获取请求参数
通过输入控件的参数名称来获取传递过来的参数值。例如:
HTML 结构的代码
<form action="Demo02.jsp" method="post">
内容1:<input type="text" name="content1">
<br>
内容2:<input type = "text" name="content2">
<br>
<input type = "submit" value="提交">
</form>
Demo02.jsp 代码如下:
<%
//取得请求的参数
String content1 = request.getParameter("content1");
String content2 = request.getParameter("content2");
%>
<h1>Content1:<%=content1 %></h1>
<h1>Content2:<%=content2 %></h1>
设置统一编码
我们知道,有时候表单内容如果是中文的,提交过来是乱码的。这是因为服务器的默认编码为 ISO8859-1 ,而我们页面编码格式往往是 UTF-8,这样造成了乱码。需要进行编码转换。
我们可以按照服务器的编码将表单中提交到服务的内容转换成字节数字。再按照页面显示的编码把数组转换为字符串。如下:
//取得请求的参数
String content1 = request.getParameter("content1");
byte b1[] = content1.getBytes("ISO8859-1");//转换成服务器的编码格式的字节数组
content1 = new String(b1,"utf-8");//将字节数组转换成页面的编码格式的字符串
但是这样很繁琐,在面对多个参数的时候。我们可以通过setCharacterEncoding
设置统一的请求编码,如下:
//设置请求统一编码
request.setCharacterEncoding("utf-8");
注意:
对于乱码问题:
- get方式: tomcat 8已经将get方式乱码问题解决了
- post方式:会乱码
提交方式
在表单的提交中,会有两种提交方式,一种是 get 方式,一种是 post 方式
区别
- get 提交
- 提交的内容会显示在地址栏
- 一些关键的信息,用户名和密码,肯定不能在地址栏显示,所以get提交是不安全的提交。
- 比如:
http://localhost:8080/JspTest/jsp/login/check.jsp?username=张三&pwd=123456
- 地址栏最多只能存放 4-5k 的内容,提交内容过多的话,会造成丢失。
- 优点是效率高。
- post 提交
- 提交的内容不会显示在地址栏
- 对比 get 就安全多了
- 是安全的提交
- 不受地址栏大小的限制,理论上来说提交的内容是任意多的,但是太大的话也会收到 http 协议的限制
- 对比 get 就效率低了。
- 提交的内容不会显示在地址栏
地址栏重写
既然 get 请求能显示在地址栏,那就以为我们可以改写参数值。
url?参数1=值1&参数2=值2&参数3=值3…..
同理,a 标签不久可以添加更多内容
<a href="Demo02.jsp?ref1=张三&content1=李四&content2=王五">
接受参数问题
如果目前未知参数名称,如何取得参数的值。
Enumeration<String> en = request.getParameterNames();//取得所有的参数名称取得
while(en.hasMoreElements()){
String paramName = en.nextElement();//取得参数的名称
%>
<h1><%=paramName %> -----><%=request.getParameter(paramName) %></h1>
<%
}
相同的参数名称,获取多个值。
<input type = "checkbox" name="inst" value="跑步">跑步
<input type = "checkbox" name="inst" value="研究代码">研究代码
<input type = "checkbox" name="inst" value="看书">看书
<input type = "checkbox" name="inst" value="偷窥">偷窥
<%
String inst[] = request.getParameterValues("inst");//通过参数名称取得多个值
for(String in:inst){
%>
<%=in %>、
<%
}
%>
获取客户端 IP
很多网站会显示你当前所在地区的田天气、位置等信息,都是因为获取了你的电脑、手机等所在地的IP地址,计算出了你大概的位置。我们只要通过一个方法就能获取
<h1>客户端IP<%= request.getRemoteAddr()%></h1>
获取访问路径
在页面跳转的,我们要提供路径,这个时候要使用绝对路径往往不会错。
<%
String path = request.getContextPath();//取得项目访问的根路径
%>
<form action="<%=path %>/jsp/requestDemo/Demo04.jsp" method="get">
用户名:<input type="text" name="name">
<br>
密码:<input type = "password" name="pwd">
<br>
<input type = "submit" name="登录">
</form>
这里如果对于服务器内部的转发,可以使用相对路径,而如果给客户端浏览器使用,需要加虚拟目录,也就是绝对路径。