servlet中Request與response使用


服務器根據請求自動創建傳入HttpServletRequest對象和HttpServletResponse對象

@Override

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

         ……處理代碼

}

HttpServletRequest(請求)

處理請求行(http:\localhost:8080\pro\haha?name=zs&age=18)

    getRequestURL()   獲取?前的路徑  (http:\localhost:8080\pro\haha)

    getRequestURI()   獲取站點名到?前的路徑 (pro\haha)

    getQueryString() 獲取請求參數(name=zs&age=18)

    getMethod()       獲取請求類型(get post)

其他:getProtocol獲取http版本號,getContexPath獲取webapp名(項目名)

處理請求頭

    getHeader(String) 獲取單個請求頭內容 string為key值不區分大小寫

    getHeaderName() 獲取請求頭名的枚舉集合通過Enumeration<String>接收

獲取請求參數

    getParameter(“key”)      獲取客戶端上傳的參數

    getParameterValues(“key”) 若一個key對應多個值(多選框等)返回數組對象

    getParameterNames()      獲取所有請求參數的名稱, 枚舉類集合接收

       getParametermap()        獲取所有請求參數,Map<String,String[]>接收

設置請求的參數(用於對象傳遞中使用)

    setAttribute(“key”,value)    設置域對象內容

    getAttribute(“key”)          獲取域對象內容

    removeAttribute(“key”)       刪除域對象內容

 

解決請求參數亂碼問題

request接收的參數,在解析過程中使用了默認的編碼方式為 (ISO-8859-1)不支持中文

post請求在Tomcat中都存在報錯,get在Tomcat7中存在報錯

解決方式

post解決方式

    request.setCharacterEncoding("UTF-8")   直接設置解析編碼 對get無效

get解決

new String(request.getParameter(key).getBytes("ISO-8859-1"),"UTF-8")

只能一次處理一個參數值的編碼錯誤

若參數本身無編碼錯誤,反而會造成編碼錯誤

 

請求轉發

用於服務內部的資源跳轉,瀏覽器的地址不會變更

request.getRequestDispatcher(“目標資源”).forward(request,response)

指定轉發路徑,並傳遞請求對象和響應對象.實現對象共享.

目標資源使用外部訪問名

 

request 作用域只在一次請求中有效中有效,包含請求轉發

 

   

HttpServletResponse(響應)

處理響應頭

    addHeader(“key”, “value”)    增加響應頭參數

    setHeader(“key”, “value”)    設置響應頭參數

       設置自動刷新或重定向(不設url可自刷新)

       setHeader("refresh", "3;http://www.baidu.com") 3秒后刷新至百度

sendError(500, “錯誤描述”)    設置頁面報錯(響應頭)

輸出響應數據

    setContentType(“參數;參數”)      設置響應數據類型和編碼格式

參數在Tomcat 的 web.xml 文件中<mime-mapping>查找獲取

text/html類型為html類型

image/jpeg響應jpg圖片

    getOutputStream()     獲取輸出的字節流

    getWriter()           獲取輸出的字符流

    注: 兩個流不能同時使用 否者報錯(java.lang.IllegalStateException)

       流需要關閉.close()

       常用文本輸出getWriter().write("輸出文本")

sendRedirect(“url”)   重定向

       服務器指導客戶端的行為,客戶端根據重定向立即重新請求對應的數據

       http://www.baidu.com或者 端口之后的絕對路徑/相對

 

亂碼處理

    服務器響應的數據編碼與客戶端解析編碼方式存在差異

    setContentType("text/html;charset=UTF-8")  

設置響應頭中數據類型和編碼類型

 

響應圖片

    獲取當前項目路徑,獲取圖片的絕對路徑

拼接得到圖片完整路徑,生成file, io傳輸

String realPath = getServletContext().getRealPath("/")

獲取項目在服務器中的真實路徑

    String filePath = realPath + "/WEB-INF/images/jay.jpg"

       獲取圖片路徑,並完成拼接

    File file = new File(filePath)

       獲取文件

 

請求轉發和重定向區別

請求轉發

request.getRequestDispatcher(“url”).forward(request,response)

返回請求地址欄不發生改變,只執行一次請求

服務端內部跳轉, request作用域共享,

轉發對象為當前項目資源()

地址站點名后的不完全路徑,從項目名之后開始

重定向

1、地址欄發生改變  2、客戶端跳轉  3、存在兩次請求request作用域不共享

4、指定任意地址,可跨域 若是本服務內容 地址從端口號之后開始

 

路徑問題

相對路徑    相對於當前資源的路徑開頭不設/

絕對路徑(完整路徑)

1完整絕對路徑

以 http://開頭的,能夠跨域

2部分絕對路徑

"/"開頭,從當前域名|IP|主機后的端口號開始的

"/"的含義:

 請求轉發:

代表的是 http://localhost:8080/站點名/

重定向(客戶端跳轉):

代表的是   http://localhost:8080/

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM