首页 > 代码库 > request
request
HttpServletRequest对象代表客户端的请求。当客户端通过HTTP协议访问服务器时,HTTP头中的所有信息都会封装在这个对象中。开发人员通过这个对象的方法,可以获得客户这些信息。
Request是一个域对象
一般请求包含
- 请求方式 通过getMethod()方法
- 请求协议 一般都是http
- 请求资源 getRequestURL() 和getRequestURI()
http://www.sina.com/news/1.html
整体是URL 标识互联网上的资源
/news/1.html 是URI ,标识任意资源
Request常用方法:
1. getRequestURI,获取请求资源
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(request.getRequestURI()); System.out.println(request.getRequestURL()); /* 输出: /day1121/servlet/RequestDemo1 http://localhost:8080/day1121/servlet/RequestDemo1}
getRequestURI是获取请求资源,一般作用:
通过得到用户请求资源之后,可以:
- 1.权限管理
开发过程中,写一个过滤器,拦截用户所有请求,然后用这个方法得到用户请求的资源, 再看看这个资源访问需要什么权限,再看看该请求用户有没有这个权限
- 2.统计页面访问次数
2. 获取请求头和请求数据
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取指定头
String head = request.getHeader("Accept-Encoding"); //获取指定头的所有数据 Enumeration heads = request.getHeaders("Accept-Encoding"); //获取客户机带过来的所有的头名称 heads = request.getHeaderNames(); //获取请求数据值
//获取特定的值 String value = http://www.mamicode.com/request.getParameter("username"); System.out.print(value); //获取特定的值的所有数据 String[] es = request.getParameterValues("username"); //获取所有的值 Enumeration e = request.getParameterNames(); }
客户端向服务器传送数据有两种方式:
- 1.通过超链接
- 2.通过表单
<!DOCTYPE html><html> <head> <title>带数据给服务器</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css">--> </head> <body> <!-- 两种方式: 1.通过超链接--> <a href="/day1121/servlet/RequestDemo2?username=QQQ">点击</a>
<-- 2.通过表单 -->
<form action="/day1121/servlet/RequestDemo2" method="post">
用户名 <input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
3. 中文乱码
request处理中文乱码,对于get和post请求是不一致的。
<!DOCTYPE html><html> <head> <title>中文乱码</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="http://www.mamicode.com/styles.css">--> </head> <body> 提交数据方式 1.表单提交
post提交 <form action="/day1121/servlet/RequestDemo3" method="post"> 用户名 <input type="text" name="username"> <input type="submit" value="提交"> </form> </body> get提交 get请求的数据其实也是显示在地址栏中的 <body> <form action="/day1121/servlet/RequestDemo3" method="get"> 用户名 <input type="text" name="username"> <input type="submit" value="提交"> </form> 超链接提交的中文 超链接是get请求 <a href="/day1121/servlet/RequestDemo2?username=中国">点击</a> </body></html>
在servlet里的处理
客户端上的汉字以何种方式编码传到服务器,不是固定的,就看当前页面以何种编码方式打开
public class RequestDemo3 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //get需要手工处理
//得到的username字符串实际上已经是servlet经过iso8859编码而成的 String username = request.getParameter("username"); //先把字符串还原到编码之前,再通过UTF-8编码 username = new String(username.getBytes("iso8859-1"),"UTF-8"); System.out.println(username); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username"); System.out.println(username); }}
4.实现转发
不仅可以通过response实现转发,也可以通过request实现转发
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = "aaa"; request.setAttribute("data", data); //request也可以实现转化 request.getRequestDispatcher("/message.jsp").forward(request, response);}
转发(forward)几个细节问题:
- forward实现转发地址栏不会变化
- 转发过程中不会创建新的request和response对象
- 客户端只发送一次请求,服务器需要多个资源响应
1. forward方法用于将请求转发到RequestDispatch对象封装的资源
2. 如果在调用forward方法之前,servlet程序中写入的内容已经被真正地传送到客户端了,forward将会抛出IllegalStateException异常
3. 如果在调用forward方法之前向servlet引擎的缓存的缓冲区(response)中写入内容,只要写入的内容还没有真正地输入到客户端,forward方法被执行的时候都会清空缓冲区里的内容,但是,已写入到HttpServletResponse对象中的响应头字段保持有效
request