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
总结:
由于服务器的输出可以使用字节流或字符流,因此在实际的开发中只需要获取其中一个流即可。
该接口继承自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); }