首页 > 代码库 > TC608——Servlet中的Request和response请求响应技术

TC608——Servlet中的Request和response请求响应技术

  
	

request和response

author:lxy
1.了解request和response request:请求对象 response:响应对象 请求和响应对象由服务器创建,每次请求都创建新的请求响应对象,响应结束,对象自动消失。 作用: request可以处理所有的Http请求,----获取Http请求信息 response可以处理所有的Http响应,----设置Http响应信息 补充:请求消息由 请求行、请求头、请求内容组成
2.request和response体系介绍 |-ServletRequest 接口 |-HttpServletRequest接口 |-RequestFacade (由服务器实现) |-ServletResponse接口 |-HttpServletResponse接口 |-ResponseFacade (由服务器实现) 补充:门面设计模式(服务器中有用到)-----也就是一种统一定义对外方法,内部具体对方法实现 代码片段: public RequestFacade(Request request){ this.request = request}
3.response对象 [1].response对象它是在service方法中接收到的 [2].response操作响应信息: 行---Response.setStatus(int index); //响应状态行的状态码 头---setHeader setDateHeader setIntHeader 正文-getOutputStream() -getWriter()
4.示例 4-1.通过response实现重定向,可以访问站内和站外资源 服务器端:状态码(302) 响应头(location) 代码片段: response.setStatus(302); //设置状态码为302 response.setHesder("location","/day8_4/myweb.html"); //设置响应头location的值 开发实际应用中完成的重定向: response.sendRedirect("/day8_4/myweb.html"); //这里相当于直接调用服务器中的封装方法 4-2.发送http头,控制浏览器定时跳转 response.setHeader("refresh","5;url=/day8_4/myweb.html"); //浏览器在指定时间后对向设定地址访问 实际开发中,很少在服务器端进行此操作,一般在浏览器端完成 代码片段:<meta http-equiv="refresh" content="5;url=http://www.192.168.1.25:8080/day8_4/myweb.html"> 扩展:在浏览器端显示 "--秒后跳转..."的动态展示效果 代码片段: <script type="text/javascript"> var time = 5; funcation change(){ var span = document.getElementById("s"); span.innerHTML=time; time--; setTimeout("change()",1000); } </script> <body onl oad="change();"> 页面会在<span id="s"></span>后跳转到... </body> 响应头 ----服务器解析 响应正文----浏览器解析 4-3.通过发送Http头,控制浏览器禁止缓存 有多种方式,对应于不同的浏览器器可能会采用不同的方式设定,可以同时使用,达到对所有浏览器都产生作用 response.setHeader("pragma","no-cache"); response.setHeader("cache-control","no-cache"); response.setDateHeader("expires",-1); //设置有效时间,数字为一个代表时间的long型整数
5.在Servlet中要想操作响应正文,需要通过response对象获取到输出流进行操作 response.getWriter();-----ServletOutputStream response.getOutputStreaam();----PrintWriter 打印流的两个特点:可以设置自动刷新 可将信息原样输出 如果操作自定义信息,这时使用字符流 Servlet获取输出流在使用时注意事项: 同一时候,只能选择字符流或字节流一种,互相排斥;可以不关闭,由服务器关闭 Servlet可以完成显示操作 代码片段: response.setHeaader("Content-type","text/html;charset=utf-8"); out.println("<form action="#" method=‘post‘>"); 响应信息的乱码 response.setCharacterEncoding(String code); //设置响应正文编码 response.setContentType(String mimeType); //设置响应正文编码,同时告诉浏览器怎样解析 response.setHeader("content-Type","text/html;charset=utf-8");
6.校验码 可以防止恶意注册,是一图片 补充:当浏览器缓存中存在当前页面的信息,当再次访问时将会走缓存,为了让浏览器不走缓存,获取新的页面信息,加入如下代码片段 function change(){ document.getElementById("im").src = http://www.mamicode.com/"/day8_4/imageCode?time=" + new Date().getTime();>
7.request对象 作用:用于获取Http请求信息 关于post和get 请求 1.post请求可以提交大数据 get只能提交1KB 2.post请求信息不会在浏览器上面显示(安全) get请求信息会在浏览器上显示(不安全) 3.post请求参数在请求正文中 get请求信息在资源路径上 [1]请求行操作 request.getMethod(); //获取请求方式 request.getProtocol(); //获取请求协议 如:HTTP://1.1 request.getRequestURI(); //返回URI request.getRequestURL(); //返回URL URI包含URL [2].获取客户机信息 request.getRemotAddr(); //获取客户机IP地址 request.getLocationAddress(); //获取服务器IP request.getContentPath(); //获取虚拟目录名称(工程名--不一定是工程名) 得到资源路径的一种方法: URI地址 - 虚拟目录名称 [3].获取请求头信息 String getHeader(String name); //获取一个请求头信息 Enumeration getHeaders(); //获取多个请求头信息 getDateHeader(); getIntHeader(); [4].获取请求参数[++] String getParameter(String name); String[] getParameterValues(String name); //checkbox getParameterNames(); //获取表单中所有的name值 Map<;String, String[]> getParameterMap(); //参数name作为key,输入或选定的值作为value value是一个 String[]
8.得到请求参数后的处理 [1].服务器端得到参数后通过Java代码实现校验--飞空校验、规则校验 String.trim().length()>0; [2].乱码处理 乱码原因:汉字在各个编码表中的编码值不一样 程序运行时页面中utf-8,tomcat服务器使用iso8859-1解码,Servlet获取到的就是乱码信息 页面编码服务器解码不一致, 解决方案:将得到的信息使用iso8859-1进行编码,再使用utf-8进行解码 代码片段:mag.getBytes("ios8859-1"); new String(mag.getBytes("iso8859-1"),"utf-8"); 代码示例: 页面 String s = "张三"; String code = URLEncoder.encode(s,"utf-8");//s-->utf-8 tomcat服务器 String msg = URLDecoder.decode(code,"iso8859-1"); 模拟解决--倒回去 String c = URLEncoder.encode(msg,"iso8859-1"); String m = URLDecoder.decode(c, "utf-8"); 或者在String类中直接解码 String username = request.getParameter("username"); usernamae = new String(username.getBytes("iso8859-1"),"utf-8"); 在post请求中 request。setCharacterEncoding(String charsetname);
9.request域对象 [1].生命周期:请求来时创建,响应结束时,request就销毁 [2].只要是域对象就有以下操作 setAttribute() getAttribute() removeAttrebute() [3].请求转发; 代码:RequestDispatcher rd = request.getRequestDispatcher("/second"); re.forward(request,response); 应用: 接收程序 String username = request.getParameter("username"); String passw = request.getParameter("passw"); if("tom".equals(username.trim()) && "123".equals(passw.trim())){ request.setAttribue("loginmessage", "登录成功"); }else{ request.setAttribue("loginmessage", "登录失败"); } //请求转发 RequestDispatcher rd = request.getRequestDispatcher("/second"); rd.forward(request, response); 处理程序 respons.setContentType("text/html;charset=utf-8"); String message = (String) request.getAttribute("loginmessage"); response.getWriter().write(message); 执行完forward或RendRedirect后 服务器会清空缓冲区 执行和缓冲区有关的操作无效
10.请求转发和重定向的区别 [1].请求转发在服务器内跳转,只有一次请求一次响应 重定向两次请求两次响应 [2]........内部操作,不会影响地址栏路径 重定向地址栏变化 [3]........只能在当前站点内跳转 重定向可以跳出站内 [4]........由request发起request.getRequestDispatcher("").forward(...,...); 重定向response.sendRedirect(); [5]........"/"代表当前工程,服务器端路径 重定向"/"代表服务器根目录,客户端路径 [6]........存在request域 从定向不存在request域 选择时看是否需要数据共享

TC608——Servlet中的Request和response请求响应技术