请求,响应对象:request和response 流程: 1.服务器接收请求后,先创建request和response对象,把请求数据封装到request对象中 2.服务器调用Servlet的service()方法并把这两个对象传递给service()方法 3.在service()中通过request对象获取请求数据,使用response对象向客户端完成响应 4.每次请求服务器都会创建新的request和response对象 每个请求有自己独自的request和response对象
response响应对象:HttpServletResponse ServletResponse-->与协议无关的类型 HttpServletResponse-->与http协议相关的类型 response对象的功能分为以下四种: 1.设置响应头信息 2.发送状态码 3.设置响应正文 4.重定向 --------------------------------------------------------------------------------------------------------------- 响应头Header设置:Content-Type、Refresh、Location等等 键值对 setHeader(String name, String value): 适用于单值的响应头 addHeader(String name, String value): 适用于多值的响应头 response.addHeader("aaa", "A"); response.addHeader("aaa", "AA"); setIntHeader(String name, int value): 适用于单值的int类型的响应头 addIntHeader(String name, int value): 适用于多值的int类型的响应头 setDateHeader(String name, long value):适用于单值的毫秒类型的响应头 ---------------------------------------------------------------------------------------------------------------- 状态码发送: sendError(int sc) 发送错误状态码,例如404、500 sendError(int sc, String msg) 发送错误状态码+错误信息 setStatus(int sc) 发送成功的状态码 ----------------------------------------------------------------- 响应体(正文):通常是html、也可以是图片! response的两个流: ServletOutputStream 向客户端发送字节数据 ServletOutputStream out = resopnse.getOutputStream(); PrintWriter 向客户端发送字符数据,需要设置编码。 PrintWriter writer = response.getWriter(); 两个流不能同时使用 ----------------------------------------------------------------- 重定向:设置302,设置Location sendRedirect(String location)方法 response.setHeader("Location","路径") + response.setError(302) 定时刷新:Refresh response.setHeader("Refresh","时间;URL=路径")=================================================================== request请求对象:HttpServletRequest request对象封装了客户端所有的请求数据! { 请求行,请求头,空行,请求体(GET没体)} 请求数据就是为了获取数据的! 获取常用信息 request.getRemoteAddr() 获取客户端IP request.getMethod() 获取请求方式,POST/GET 获取请求头 request.getHeader(String name) 单值头 request.getIntHeader(String name) 单值int类型 request.getDateHeader(String name) 单值毫秒类型 request.getHeaders(String name) 多值请求头 获取请求 request.getScheme(); 获取协议,http request.getServerName(); 获取服务器名,localhost request.getServerPort(); 获取服务器端口 8080 request.getContextPath(); 获取项目名 request.getServletPath(); 获取Servlet路径, request.getQueryString(); 获取参数部分,即问号后面的部分。 u se username=xxx&password=yyy request.getRequestURI(); 获取请求URI=项目名+Servlet路径。 request.getRequestURL(); 获取请求URL=不包含参数的整个请求路径。 请求参数:由客户端发送给服务器的! 可能在请求体中(POST), 也可能在URL之后(GET) 获取请求参数 String getParameter(String name): 获取指定名称的单值请求参数值 String[] getParameterValues(String name): 获取指定名称的多值请求参数 Enumeration<String> getParameterNames():获取所有请求参数名称 Map<String,String[]> getParameterMap(): 获取所有请求参数,key+value ------------------------------------------------------------------------------------------------------------------- 请求转发和请求包含 一个请求需要多个Servlet协作,一个请求跨多个Servlet共同完成 请求转发:由下一个Servlet完成响应体!当前Servlet可以设置响应头!(留头不留体) 请求包含:由两个Servlet共同未完成响应体!(都留) 无论是请求转发还是请求包含,都在一个请求范围内! ---> 使用同一个request和response
使用request获取RequestDispatcher对象,方法参数是被转发或包含Servlet的Servlet路径 RequestDispatcher rd = request.getRequestDispatcher("/MyServlet");//路径 请求转发:rd.forward(request,response); 请求包含:rd.include(request,response); 请求转发与重定向区别 请求转发是一个请求一次响应,重定向是两次请求两次响应 请求转发地址栏不变化,重定向会显示后一个请求的地址 请求转发只能转发到本项目其他Servlet,重定向还可以定向到其他项目(范围更大) 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出request URI,即包含项目名! ------------------------------------------------------------------------------------------------------- request域 Servlet中三大域对象:request、session、application,都有如下三个方法: void setAttribute(String name, Object value) Object getAttribute(String name) void removeAttribute(String name) 同一请求范围内使用request.setAttribute()、request.getAttribute()来传值 前一个Servlet调用setAttribute()保存值 后一个Servlet调用getAttribute()获取值 同一范围内只能使用请求转发和包含(一个请求),不能使用重定向(两个请求) ================================================================== 编码: 字符编码 请求编码 响应编码 URL编码 乱码原因: 1.浏览器对来自服务器的数据的编码和解码方式不一致 eg:浏览器gbk解码,发来的数据utf-8编码 2.不支持中文的编码后本来是乱码,浏览器解码乱码,更成乱码! eg:服务器iso-xx编码中文数据=乱码,浏览器用gbk==解码乱码==》!!乱码 字符编码:iso-8859-1(不支持中文)、gb2312、gbk、gb18030(系统默认编码,中国国标码)
响应编码: 第一步:response.setCharaceterEncoding()设置编码格式 或者:response.setHeader("Content-Type", "text/html;charset=编码格式") 第二步:response.getWriter()服务器再发送字符 解释:服务器设置响应头给浏览器告知编码格式,浏览器就会才行对应解码方式
请求编码:浏览器给服务器发送的参数的编码方式 客户端首先向服务器请求页面(表单或者超链接)时,服务器响应编码是啥,客户端请求编码就是啥 请求编码处理分为两种:GET和POST GET 请求参数不在请求体中 反解码成字节,再编码 POST 请求参数在请求体中 获取参数前调用request.setCharacterEncoding("utf-8")
URL编码:客户端与服务器之间传递参数用的一种方式 客户端get请求使用中文没有URL编码,可能会丢失字节 使用表单,表单提交数据直接采用URL编码,服务器自动解码 URL编码需要先指定一种字符编码,把字符串解码后,得到byte[],然后把小于0的字节+256,再转换成16进制。前面再添加一个%。最后我们需要把链接中的中文参数,使用url来编码 * POST请求默认就使用URL编码!tomcat会自动使用URL解码! * URL编码:String username = URLEncoder.encode(username, "utf-8"); * URL解码:String username = URLDecoder.decode(username, "utf-8"); ==================================================================