一、HttpServletRequest应用、解决请求参数的中文乱码问题、实现网页定时刷新并跳转
1.请求和响应的概述: 什么请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。 什么响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。
2.HttpServletResponse对象 HttpServletResponse是一个接口,它的父接口是ServletResponse,在开发中通常使用HttpServletResponse 响应信息分为三部分:响应行、响应头、响应正文(响应体) 1.1 发送状态码的相关方法: 1.设置状态码 setStatus(int sc) :参数就是状态码。 setStatus(int sc, String sm) :第一个参数表示状态码,第二个参数 就状态码的描述。 常见的状态码:200 响应成功 302 重定向 404 请求资源找不到 500 服务器代码出异常。 2.错误信息方法: sendError(int sc) :参数状态码 sendError(int sc, String sm) :第一个参数表示状态码,第二个参数 就状态码的描述。 1.2 发送响应消息头相关的方法: 响应消息头的数据格式:key-value的形式,有的是一个key,一个value,有的是一个key,多个value 1.设置响应消息头: 一个key ,一个value setHeader(String key,String value); 一个key,对应多个value addHeader(String key,String value); 1.3 发送响应体相关的方法: 第一个方法:getOutputStream(),通过response向浏览器返回图片、视频等二进制数据的文件,当然也可以向浏览器、 返回文本数据。 第二个方法:getWriter(),通常response向浏览器返回文本数据,不能向浏览器返回图片、视频等二进制文件。 1.4 解决中文输出的乱码问题 第一种方式:字节流向浏览器输出中文,会不会乱码:可能会出现乱码。 出现乱码的原因:服务器端的编码格式和浏览器的编码格式不一致引起的。 处理字节流的中文乱码问题两种方式: 第一种:response.setHeader(“Content-Type”, “text/html;charset=utf-8”); response.setContentType(“text/html;charset=utf-8”); 第二种方式:字符流向浏览器输出中文,会不会乱码:肯定乱码。 乱码的形式:?? ,这个问号就表示中文的编码格式是采用iso-8859-1编码的,这种编码格式不支持中文。 处理原则:让浏览器和服务器的编码保持一致: 处理字符流的中文乱码问题: 第一种方式:response.setCharacterEncoding(“utf-8”); response.setHeader(“Content-Type”, “text/html;charset=utf-8”); 第二种方式:response.setContentType(“text/html;charset=utf-8”); 结论:在处理字符流和字节流输出中文乱码时,都采用response.setContentType(“text/html;charset=utf-8”); UTF-8 :万能码表格式,支持所有的字符。 1.5 实现网页的定时跳转并刷新: 定时跳转:从一个注册页面跳转到登录页面,输入之前注册的用户名和密码。 定时刷新: 在当前页面的地址不发生变化,但是当前页面自己定时刷新,页面数据会发生变化。 1.6 实现请求重定向 实现重定向相关的方法: 第一种方式:302和Location配合使用,实现重定向。 第二种方式: 重定向通过登录案例来完成: 需求分析:在登录页面输入用户名和密码,在LoginServlet里面,判断用户名和密码是否正确。 如果输入错误,会重新定向到登录界面,如果正确,跳转到欢迎页面。 获取登录页面提交的用户名和密码:request.getParameter()方法。 重定向的特点:1.浏览器地址栏发生变化 2.发送了两次请求。都是由浏览器发送的请求 重定向的路径:由于是浏览器发送得到请求,所以路径必须要带项目名称 3.HttpServletRequest请求对象 HttpServletRequest它是一个接口,它的父接口ServletRequest,在开发中,常用的是带协议的请求对象。 请求消息:请求行,请求头,请求参数。 1.1 HttpServletRequest请求对象 1.获取请求行消息的相关方法: 常用的请求行方法: 1.获取请求提交的方式: getMethod(); 2.获取请求的协议: getProtocol(); 3.获取项目名称:getContextPath(); 4.获取servlet路径:getServletPath(); 5.获取请求路径: getRequsetURI(),getRequestURL(); uri对应的值:/项目名称/servlet路径 url对应的值:http://localhost:8080/uri 2.获取请求消息头相关的方法 1. 根据消息头,获取值: String value = getHeader(消息头的名称); 2. 获取所有的消息头: Enumeration er = getHeaderNames(); 根据Referer请求消息头,做一个防盗链的案例: 3.获取请求参数相关的方法: 1.根据name属性值,获取用户输入的值:String value = getParameter(name属性对应的值); 2.根据name属性值,获取用户选择的值:String[] vaules = getParameterValues(name属性对应的值); 3.没有参数,获取所有值:Map<String ,String[]> map = getParameterMap(); 4.解决请求参数的中文乱码问题: 中文乱码处理分两种情况: 第一种情况:处理get方式提交的中文乱码 使用的String的构造方法解决中文乱码:new String(字节数组,编码格式); 代码:String newvalue = new String(value.getBytes(“ISO8859-1”),“utf-8”); 第二种情况:处理post请求的中文乱码问题: post提交,会把参数首先提交到request对象的缓冲区中,缓冲区默认编码是ISO8859-1,不支持中文 处理方法:把request缓冲区的编码给设置成支持中文的码表格式。 代码:request.setCharacterEncoding(“utf-8”); 5.通过Requset对象传递数据 什么域对象:在一定的范围内,可以存值和取值。 request域对象:在一次请求中,可以存值和取值。 存值: setAttribute(String key,Object obj); 取值:Object obj = getAttribute(String key); 移除: removeAttribute(String key); 1.2 RequestDispatcher接口 在开发中访问到一个web资源后,需要服务器跳转到另一个资源去处理请求,可以通过sendRedirect重定向 方法来实现,也可以RequestDispatcher转发对象的forward方法来实现。 得到转发对象:RequestDispatcher forwardObj = request.getRequestDispatcher(“另一个资源的路径”); 常用方法: 1.实现请求转发:forwardObj.forward(request,response); 2.实现请求包含:forwardObj.include(request,response); 1. 请求转发: 特点:发送了一次请求,响应一次,和request域对象配合使用,可以实现值的传递。 转发路径:转发动作是在服务器内部实现的,所以转发路径不要携带项目名称。 请求重定向: 特点:发送了两次请求,响应了两次,不能和request域对象配合使用。 重定向路径:重定向动作在浏览器端执行的,所以路径需要携带项目名称。 2.请求包含: 请求包含:在服务器内部完成的,路径不需要携带项目名称。
|