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); }
新聞熱點
疑難解答