HttpServletRequest
HttpServletRequest 繼承自 ServletRequest。客戶端瀏覽器發出的請求被封裝成為一個 HttpServletRequest對象。
對象包含了客戶端請求信息包括請求的地址,請求的參數,提交的數據,上傳的文件客戶端的ip甚至客戶端操作系統都包含在其內。
獲得客戶機信息
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String requestUrl = request.getRequestURL().toString();// 得到請求的URL地址String requestUri = request.getRequestURI();// 得到請求的資源String queryString = request.getQueryString();// 得到請求的URL地址中附帶的參數String remoteAddr = request.getRemoteAddr();// 得到來訪者的IP地址int remotePort = request.getRemotePort(); // 得到來訪者的端口String method = request.getMethod();// 得到請求URL地址時使用的http方式String localAddr = request.getLocalAddr();// 獲取WEB服務器的IP地址String localName = request.getLocalName();// 獲取WEB服務器的主機名response.setCharacterEncoding("UTF-8");// 設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器// 通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那么瀏覽器顯示的將是亂碼response.setHeader("content-type", "text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.write("獲取到的客戶機信息如下:");out.write("<hr/>");out.write("請求的URL地址:" + requestUrl + "<br/>");out.write("請求的資源:" + requestUri + "<br/>");out.write("請求的URL地址中附帶的參數:" + queryString + "<br/>");out.write("來訪者的IP地址:" + remoteAddr + "<br/>");out.write("使用的端口號:" + remotePort + "<br/>");out.write("使用的http方式:" + method + "<br/>");out.write("localAddr:" + localAddr + "<br/>");out.write("localName:" + localName + "<br/>");out.close();}
獲得客戶機請求頭
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("UTF-8");// 設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器// 通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據response.setHeader("content-type", "text/html;charset=UTF-8");PrintWriter out = response.getWriter();Enumeration<String> reqHeadInfos = request.getHeaderNames();// 獲取所有的請求頭out.write("獲取到的客戶端所有的請求頭信息如下:");out.write("<hr/>");while (reqHeadInfos.hasMoreElements()) {String headName = (String) reqHeadInfos.nextElement();// 根據請求頭的名字獲取對應的請求頭的值String headValue = request.getHeader(headName);out.write(headName + ":" + headValue);out.write("<br/>");}out.write("<br/>");out.write("獲取到的客戶端Accept-Encoding請求頭的值:");out.write("<hr/>");String value = request.getHeader("Accept-Encoding");// 獲取Accept-Encoding請求頭對應的值out.write(value);Enumeration<String> e = request.getHeaders("Accept-Encoding");while (e.hasMoreElements()) {String string = (String) e.nextElement();System.out.println(string);}}
使用 getParameter() 和 getParameterValues() 接收表單參數
@WebServlet(name = "save", urlPatterns = "/save")
public class FormServlet extends HttpServlet {@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 客戶端是以UTF-8編碼提交表單數據的,所以需要設置服務器端以UTF-8的編碼進行接收,否則對于中文數據就會產生亂碼request.setCharacterEncoding("UTF-8");String username = request.getParameter("username");String password = request.getParameter("password");String[] insts = request.getParameterValues("inst");String instStr = Arrays.toString(insts);String htmlStr = "<p>用戶名:" + username + "</p>"+ "<p>密碼:" + password + "</p>"+ "<p>愛好:" + instStr + "</p>";// 設置服務器端以UTF-8編碼輸出數據到客戶端response.setCharacterEncoding("UTF-8");// 設置客戶端瀏覽器以UTF-8編碼解析數據response.setContentType("text/html;charset=UTF-8");// 輸出htmlStr里面的內容到客戶端瀏覽器顯示response.getWriter().write(htmlStr);}
}
request中文參數亂碼
以POST方式提交表單中文參數的亂碼問題
客戶端是以UTF-8編碼傳輸數據到服務器端的,所以需要設置服務器端以UTF-8的編碼進行接收,否則對于中文數據就會產生亂碼。具體如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{request.setCharacterEncoding(“UTF-8”); //解決post提交服務端亂碼String userName = request.getParameter("userName");}
以GET方式提交表單中文參數的亂碼問題
對于以get方式傳輸的數據,request即使設置了以指定的編碼接收數據也是無效的,默認的還是使用ISO8859-1這個字符編碼來接收數據
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{String name = request.getParameter("name");//接收數據name =new String(name.getBytes(), "UTF-8") ;
}
HttpServletResponse
HttpServletResponse 接口繼承自 ServletResponse 接口,主要用于封裝 HTTP 響應消息。由于 HTTP 響應消息分為狀態行、響應消息頭、消息體三部分。因此,在 HttpServletResponse 接口中定義了向客戶端發送響應狀態碼、響應消息頭、響應消息體的方法。
Response主要的作用有以下幾點:
負責向客戶端(瀏覽器)發送數據
負責向客戶端(瀏覽器)發送響應頭
負責向客戶端(瀏覽器)發送響應狀態碼
封裝響應狀態碼的常量
使用OutputStream流向客戶端瀏覽器輸出"中國"這兩個漢字
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String data = "中國";// 獲取OutputStream輸出流OutputStream outputStream = response.getOutputStream();// 通過設置響應頭控制瀏覽器以UTF-8的編碼顯示數據,如果不加這句話,那么瀏覽器顯示的將是亂碼response.setHeader("content-type", "text/html;charset=UTF-8");// 將字符轉換成字節數組,指定以UTF-8編碼進行轉換byte[] array = data.getBytes("UTF-8");// 使用OutputStream流向客戶端輸出字節數組outputStream.write(array);}
使用PrintWriter流向客戶端瀏覽器輸出"中國"這兩個漢字
@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String data = "中國";response.setCharacterEncoding("UTF-8");// 設置將字符以"UTF-8"編碼輸出到客戶端瀏覽器PrintWriter out = response.getWriter();// 獲取PrintWriter輸出流out.write(data);// 使用PrintWriter流向客戶端輸出字符out.close();}
ServletContext對象
ServletContext 又叫做 Servlet 上下文。
當Web服務器啟動時,容器會為每一個Web應用程序創建一塊共享的存儲區域。ServletContext也叫做“公共區域”,也就是同一個WEB應用程序中,所有的Servlet和JSP都可以共享同一個區域。
ServletContext在WEB服務器啟動時創建,服務器關閉時銷毀。
Servlet對象中維護了 ServletContext 對象的引用,開發人員在編寫servlet時,可以通過this.getServletContext() 方法獲得 ServletContext 對象。
由于一個 Web 應用中的所有 Servlet 共享同一個 ServletContext 對象,因此 Servlet 對象之間可以通過ServletContext 對象來實現通訊。ServletContext 對象通常也被稱之為 context 域對象。
ServletContext 數據共享
創建兩個servlet類Servlet1.java和Servlet2.java。Servlet1將數據存儲到ServletContext對象中,Servlet2從ServletContext對象中取出數據,從而實現數據共享。
@WebServlet(name = "servlet1", urlPatterns = "/servlet1")
public class Servlet1 extends HttpServlet {@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {String company = "isoftstone";ServletContext context = this.getServletConfig().getServletContext();// 獲得ServletContext對象context.setAttribute("company", company); // 將data存儲到ServletContext對象中}
}
@WebServlet(name = "servlet2", urlPatterns = "/servlet2")
public class Servlet2 extends HttpServlet {@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {ServletContext context = this.getServletContext();String company = (String) context.getAttribute("company");// 從ServletContext對象中取出數據response.getWriter().print("company = " + company);}
}
ServletContext 初始化參數
1、在web.xml中加入初始化參數:
<context-param><param-name>url</param-name><param-value>jdbc:mysql://localhost:3306/test</param-value>
</context-param>
2、在Servlet類中調用該參數:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {ServletContext context = this.getServletContext();// 獲取整個web站點的初始化參數String contextInitParam = context.getInitParameter("url");response.getWriter().print(contextInitParam);
}