每日记录(request)
post请求方式
l 有主体(正文)
l 有Content-Type,表示主体的类型,默认值为application/x-www-form-urlencoded;
2 request功能:
l 可以获取请求方式:String getMethod()
l 可以获取请求头:String getHeader(String name)
l 可以获取请求参数(包含主体或路径后面的参数):String getParameter(String name)
3 请求编码
l 地址栏的参数是GBK的;
l 在页面中点击链接或提交表单,参数都由当前页面的编码来决定,而页面的编码由当初服务器响应的编码来决定。
l 服务器请求form.html,服务器响应utf-8的页面给浏览器,然后在form.html页面上点击链接和提交表单发送的参数都是utf-8。
l 如果服务器的所有页面都是utf-8的,那么只要不在浏览器的地址栏中给出中文,那么其他的参数都是utf-8的。
服务器:
l 服务器默认使用ISO-8859-1来解读请求数据。(tomcat7以前是这个编码)
l 可以使用request.setCharacterEncoding(“utf-8”)设置编码来解读请求参数。这个方法只对请求主体有效,而GET请求没有主体。说白了就是只对POST请求有效!
l 设置Tomcat 其中GET请求的默认编码:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/> |
l 因为编码的设置不能依赖tomcat的配置,所以还是需要我们自己手动转码
Ø String name = request.getParamter(“username”);//使用默认的iso来解码
Ø byte[] bytes = name.getBytes(“iso-8859-1”);//使用iso回退到字节数组
Ø name = new String(bytes, “utf-8”);//重新使用utf-8来解码
4 获取参数(详细)
l *String getParameter(String name) :通过参数名称获取参数值!
l String[] getParameterValues(String name):通过参数名称获取多个参数值!一般复选框会出现一个名称多个值的情况。
l *Map<String,String[]> getParameterMap():获取所有参数,封装到Map中,基参数名为key,参数值为value。
l Enumeration getParameterNames():获取所有参数的名称
5 request是Servlet三大域对象之
域功能:
l void setAttribute(String name,Object value)
l Object getAttribute(String name)
l void removeAttribute(String name)
request 的存储范围:整个请求链!如果一个请求经过了多个Servlet,那么这些Servlet可以共享request域!
6 request获取头信息
l String getHeader(String name):通过头名称,获取头信息;
l Enumeration getHeaderNames() :获取所有头的名称;
l Enumeration getHeaders(String name):通过头名称,获取多个头信息;
l int getIntHeader(String name):通过头名称,获取头信息,本方法再把String的头信息转换成int类型。
7 reuqest的请求转发
如何请求转发
l 一个请求内经过多个资源(Servlet,还有jsp,而且经常是jsp)
l 请求转发需要使用RequestDispatcher的forward(HttpServletRequest,HttpServletResponse)
l RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);//参数是要转发的目标
l rd.forward(request,response);//转发到BServlet
其实你可以理解成在一个Servlet中,调用另一个Servlet的service()方法。
请求转发的注意事项
l 在第一个Servlet中可以使用request域保存数据,在第二个Servlet中可以使用request域获取数据。因为这两个Servlet共享同一个request对象。
l
l 在转发语句之后,其他语句是否会执行?答案是“可以”!
l 不能在一个Servlet中即重定向,又转发。
请求转发与重定向比较
l 请求转发后,地址栏中的地址不变!重定向变
l 请求转发是一个请求,重定向是两个请求;
l 请求转发可以共享request域,而重定向因为是两个请求,所以不能共享request。
l 一个请求,只有一个请求方式!所以转发后还是原来的请求方式,如果一开始发出的是GET,那么整个请求都是GET!重定向不同,因为是多个请求,第一个无论是什么方式,第二个请求都是GET。
l 请转转发只能是本项目中的资源,而重定向可以其他项目。
如果要转发,就不要输出
l 如果输出到缓冲区的数据,没有提交,那么在转发时,缓冲区会被清空,如果已经提交,那么在转发时抛出异常。这一点与重定向相同!
l 留头不留体:在第一个Servlet中设置头没问题,会保留到下一个Servlet。如果在第一个Servlet中输出数据,即设置响应体,那么如果没有提交,就被清空,如果已提交,就出异常。
8 请求包含
请求包含:
l RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);
l rd.include(request,response);
留头又留体!
路径
客户端路径:
1. 超链接:href=”/项目名/…”
2. 表单:action=”/项目名/…”
3. response.sendRedirect(“/项目名/…”);
如果客户端路径,没有已“/项目名”开头,那么相对的是当前页面所在路径。
例如:http://localhost:8080/day10_3/a.html,当前页面所在路径是http://localhost:8080/day10_3/
以“/”开头的客户端路径相对“http://localhost:8080”,<a href=”/hello/AServlet”>
服务器端路径:
转发:必须使用“/”开头,它相对当前项目,即http://localhost:8080/day10_3
包含:同上;
<url-pattern>:同上
ServletContext.getRealPath(“/a.jpg”):它是真对真实路径,相对当前WebRoot
ServletContext.getResourceAsStream():同上
Class.getResourceAsStream():如果使用“/”开头,相对classes,如果不使用“/”,相对当前.class文件所在目录。
ClassLoader. getResourceAsStream():无论使用不使用“/”开头,都相对classes
编码:
URL编码
作用:为了在客户端与服务器之间传递中文!
把中文转换成URL编码:
Ø 首先你需要选择一种字符编码,然后把中文转换成byte[]。
Ø 把每个字节转换成16进制,前面添加上一个“%”。它不能显负号,把得到的byte先加上128,这样-128就是0了。正的127就是255了,它的范围是%00~%FF