1.服務器(Server)響應,瀏覽器(Brower)請求:html
對於B/S的軟件,數據的傳遞體如今,用戶利用瀏覽器請求,以得到服務器響應。在JavaWeb項目中,大體包含.java文件的數據處理模塊,和在瀏覽器展現的.jsp,.html信息展現模塊。這裏還要區分前臺和後臺兩個概念,前臺並不表明瀏覽器端,後臺並不表明服務器端。java
按上圖的流程中,咱們能夠看到咱們完成編碼工做後,tomcat將會把咱們工程中的WebRoot加載到tomcat的webapps下。瀏覽器請求後,服務器根據.java編碼的數據處理方式進行數據處理,經過jsp將信息展現到瀏覽器。這裏咱們要注意,jsp是從服務器被傳到瀏覽器的,那麼在這個過程當中,就涉及到jsp文件的服務器編碼、傳遞、瀏覽器解碼。同理,瀏覽器的請求也會包含,數據發送的瀏覽器編碼、傳遞、服務器解碼的過程。web
瀏覽器請求和服務器響應過程,都會涉及編碼與解碼的過程,這也是JavaWeb項目開發中,出現大量亂碼的問題所在。只要出現一個流程的編碼、解碼錯誤,均可能出現亂碼。瀏覽器
這裏引伸另一個問題:當咱們在action中,經過request.setAttribute("name",name)時,按道理映射以後的jsp應該是不能經過request.getAttribute("name")訪問到name的,由於action中,request請求結束後,應該要被銷燬的,不該該被傳到jsp頁面中的。這是爲何呢?tomcat
經試驗代表,該過程是透過請求轉發(forward)實現的, 而不是重定向(redirect)實現的,由於請求轉發會把(request,response)都轉發到jsp,因此在jsp中能訪問到,在action中經過request.setAttribute("name",name)設的值!服務器
2.如何避免出現亂碼?(參照上圖)app
(1)對於同一個應用,最好統一編碼,推薦爲 UTF-8 ,固然 GBK 也能夠。webapp
(2)正確設置 JSP 的三個重要編碼:jsp
response.setCharacterEncoding("UTF-8")編碼
contentType="text/html;charset=UTF-8"
pageEncoding=「UTF-8」
(3)對於請求,可使用過濾器或者在每一個 JSP/Servlet 中設置request.setCharacterEncoding ("UTF-8") 。同時,要修改 Tomcat 的默認配置,推薦將 useBodyEncodingForURI 參數設置爲 true ,也能夠將 URIEncoding 參數設置爲 UTF-8 (有可能影響其餘應用,因此不推薦.)