你的位置:首页 > Java教程

[Java教程]java学习笔记—HttpServletResponse(21)


public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 获取字节流对象    ServletOutputStream out = response.getOutputStream();    // 获取字符流对象    PrintWriter writer = response.getWriter();    out.write("image".getBytes());    writer.write("<br/>text");    }

运行结果出现异常,异常信息如下:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

总结:

由于服务器的输出可以使用字节流或字符流,因此在实际的开发中只需要获取其中一个流即可。

  1. 如果在另一个流打获取之前将第一个流数据直接进行显示的刷新,那么数据被推送给浏览器,但是继续抛出以上的异常。
  2. 如果在另一个流打获取之前将第一个流直接关闭,那么数据被推送给浏览器,但是继续抛出以上的异常。
  3. 一定要注意在请求转发的时候request和response对象是共享的,那么如果转发前已经获取了response对象上得字节流,那么在转发后就一定不能再获取字符流。
  4. 一定不要在请求转发前手工关闭response的任何输出流对象,如果关闭默认响应结束。

HttpServletRequest接口

该接口继承自ServletRequest接口。该接口的对象主要用于获取用户提交请求中的数据。

该接口的对象是由Web容器(Tomcat)创建直接传递给service()方法。

ServletRequest接口常用方法

获取用户请求参数

String getParameter(String name)        获取单个请求参数String[] getParameterValues(String name)    获取多个请求值Enumeration getParameterNames()      获取所有参数名Map getParameterMap()          获取所有参数的Map集合对象

在对象中存储和获取数据

void setAttribute(String name, Object o)    设置属性Object getAttribute(String name)       获取属性

指定获取用户请求参数数据时候的编码方式

String getCharacterEncoding()       设置获取请求参数值时候编码方式

HttpServletRequest接口常用方法

Cookie[] getCookies()            获取Cookie数组HttpSession getSession()          获取回话对象String getContextPath()           获取网站的映射路径

获取请求参数

在实际的开发中request对象主要的任务是获取用户传递过来的各种类型的参数。以下我们就以不同的方式获取各种请求参数。

1 获取单一的请求参数

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 获取单一的请求参数    String value = request.getParameter("uname");    // 获取字节流对象    ServletOutputStream out = response.getOutputStream();    String data = "value="+value;    // 输出    out.write(data.getBytes());  }

2 获取多个值

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 获取单一的请求参数    String value[] = request.getParameterValues("likes");    // 获取字节流对象    ServletOutputStream out = response.getOutputStream();    String data = "value="+Arrays.toString(value).toString();    // 输出    out.write(data.getBytes());  }

3 获取所有请求数据

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 获取所有的请求参数名字的迭代器    Enumeration<String> nas = request.getParameterNames();    // 获取字节流对象    ServletOutputStream out = response.getOutputStream();    // 迭代    while(nas.hasMoreElements()){      String name = nas.nextElement();      if("uname".equals(name)){        String value = request.getParameter(name);        out.write((name+"="+value).getBytes());      }      out.write("<br/>".getBytes());      if("likes".equals(name)){        String[] value = request.getParameterValues(name);       out.write((name+"="+Arrays.toString(value)).getBytes());      }    }  }

 4 封装请求参数

一般的注册页面中用户的请求数据比较多,如果servlet直接获取了这些数据,但是servlet本身不能处理这些数据需要传递给底层的业务层代码进行处理。如果一个一个传递那么太繁琐。因此获取到用户的请求参数后需要适当进行数据的封转以便传递给下一层处理数据。

JavaBeanàBeanUtils

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 获取所有请求的参数的Map对象    Map<String,Object> map = request.getParameterMap();    // 获取set集合    Set<Map.Entry<String, Object>> set = map.entrySet();    // 获取迭代器对象    Iterator<Map.Entry<String, Object>> it = set.iterator();    // 创建一个javabean对象    User user = new User();    // 循环    while(it.hasNext()){      Map.Entry<String, Object> entry = it.next();      String name = entry.getKey();      Object value = entry.getValue();      try {        BeanUtils.setProperty(user, name, value);      } catch (Exception e){        System.out.println("封装失败!");        e.printStackTrace();      }    }    // 输出user对象的数据    System.out.println(user);  }