天天看點

JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器

目錄

1. Servlet請求處理

2. Servlet中文亂碼問題

3. request/response對象的使用

4. Cookie的應用

5. 過濾器

1. Servlet請求處理

表單送出中get和post方式的差別有幾點

  1. get是從伺服器上擷取資料,post是向伺服器傳送資料。
  2. get是把參數資料隊列加到送出表單的ACTION屬性所指的URL中,值和表單内各個字段一一對應,在URL中可以看到。post是通過HTTPpost機制,将表單内各個字段與其内容放置在HTML HEADER内一起傳送到ACTION屬性所指的URL位址。使用者看不到這個過程。
  3. get傳送的資料量較小,不能大于2KB。post傳送的資料量較大,一般被預設為不受限制。
  4. get安全性非常低,post安全性較高。

那麼在servlet中,是如何處理這些請求的呢?

表單以POST方式送出, servlet調用doPost()處理,

doPost()方法有兩個參數:HttpServletRequest對象封裝請求中資料(HTTP頭部)及用戶端資訊,HttpServletResponse 用戶端響應

表單以GET方式送出,即GET請求;處理方式方法和doPost完全相同,一個servlet可同時處理POST,GET請求。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	System.out.println("處理GET方法");
}

	
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	doGet(request, response);
}
           

2. Servlet中文亂碼問題

亂碼情況:

  1. 用戶端送出資料到servlet中文出現亂碼
  2. 響應至用戶端包含中文出現亂碼

解決方法:

Get送出:

       軟編碼轉換 new String(suser.getBytes("ISO-8859-1"),"GBK|UTF-8")

       批量解決:Tomcat/conf/server.xml設定URIEncoding="GBK|UTF-8"

Post送出

       對擷取到的資料轉編碼:new String (suser.getBytes("ISO-8859-1"),"GBK");

       擷取資料前設定request編碼: request.setCharacterEncoding("GBK|UTF-8");

下面舉個列子:在WebContent中建立一個html頁面,寫一個表單用于傳送表單資料。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
	<form action="./IndexServlet" method="post">
		<input type="text" placeholder="請輸入賬号...." name="username">
		<input type="text" placeholder="請輸入性别" name="gender">
		<input type="password" placeholder="請輸入密碼...." name="password">
		<input type="submit" value="登入">
	</form>
</body>
</html>
           

Servlet中修改上一節的代碼:

package com.chtw.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * index
 * @author CHTW
 *
 */
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    int i = 0;
    
    public IndexServlet() {
        super();
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		String gender = request.getParameter("gender");
		String passsword = request.getParameter("passsword");
		System.out.println(username);
        System.out.println("gender:"+gender);
		System.out.println("password:"+password);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
           

啟動伺服器:

JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器

點選登入後檢視控制台:

JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器

出現了中文亂碼的情況

修改IndexServlet:

package com.chtw.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * index
 * @author CHTW
 *
 */
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    int i = 0;
    
    public IndexServlet() {
        super();
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		String gender = request.getParameter("gender");
		String password = request.getParameter("password");
		username  = new String(username.getBytes("ISO-8859-1"),"UTF-8");
		gender  = new String(gender.getBytes("ISO-8859-1"),"UTF-8");
		System.out.println("username:"+username);
		System.out.println("gender:"+gender);
		System.out.println("password:"+password);
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
           
JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器

get方法處理方式和這種方法相似,上面也已經說過了。

響應至用戶端包含中文時亂碼: 

  1. response.setCharacterEncoding("GBK");  
  2. response.setContentType("text/html; charset=GBK");

3. request/response對象的使用

request 根據單詞意思也可以猜到,用于接收用戶端浏覽器送出的資料 。常用方法如下:

getScheme()	//擷取協定名
getServerName()	//擷取ip或機器名或域名
getServerPort()	//擷取端口号
getContextPath()	//擷取上文路徑名[工程名]
getSession()		//擷取通信會話HttpSession對象
getQueryString()		//擷取請求字元串
request.getRequestURI()//獲得工程名/servlet路徑
getRemoteHost()		//擷取用戶端主機
getRemoteAddr()		//擷取用戶端IP
getRequestDispatcher()	//擷取請求轉發對象
getCookies()		//擷取用戶端發送來的Cookie對象數組
getServletPath() 		//擷取Servlet對應的路徑
setCharacterEncoding(arg0) //設定request對象的資料字元集
           

response 對象的功能則是将伺服器端的資料發送到用戶端浏覽器。常用方法如下:

setContentType(arg0) //設定JSP頁面的顯示方式,如'text/html','text/html; charset=gb2312’'等
setCharacterEncoding(arg0) //設定頁面的編碼方式:比如gb2312, gbk, big5, 還有UTF-8等 
addCookie(Cookie)   //往用戶端添加一個Cookie
sendRedirect(String) //重定向請求
response.setHeader(name,contect); //設定html頭head
           

4. Cookie的應用

Cookie是伺服器端或javascript用于維護用戶端的一種方式;Cookie是駐留在用戶端的一個文本檔案;

作用:在用戶端儲存使用者相關的簡單資訊,通路某些網站時登入界面設定儲存使用者名複選框,下次通路登入頁面自動把之前輸入使用者名顯示在界面,自動儲存使用者名,如果浏覽器清除了緩存,則cookie檔案就删除了。

Cookie類相關方法:

  1. set/getName()
  2. set/getValue()
  3. set/getMaxAge()  失效時間   機關秒
  4. set/getPath()  适用的路徑
  5. set/getDomain()  适用的域名

5. 過濾器

過濾器是一個程式,它先于與之相關的servlet或JSP頁面運作在伺服器上。過濾器可附加到一個或多個servlet或JSP頁面上,并且可以檢查進入這些資源的請求資訊。在這之後,過濾器可以作如下的選擇:

①以正常的方式調用資源。

②利用修改過的請求資訊調用資源。

③調用資源,但在發送響應到客戶機前對其進行修改。

④阻止該資源調用,代之以轉到其他的資源,傳回一個特定的狀态代碼或生成替換輸出。

所有的Servlet過濾器類都必須實作javax.servlet.Filter接口。這個接口含有3個過濾器類必須實作的方法: 

init(): 初始化方法,性質等同與servlet的init方法。

doFilter():完成實際的過濾操作,當請求通路過濾器關聯的URL時,Servlet容器将先調用過濾器的doFilter方法。FilterChain參數用于通路後續過濾器

destroy():Servlet容器在銷毀過濾器執行個體前調用該方法,這個方法中可以釋放Servlet過濾器占用的資源。性質等同與servlet的destory()方法。

建立一個filter,來統一處理亂碼問題:

JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器
package com.chtw.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter("/IndexFilter")
public class IndexFilter implements Filter {

    
    public IndexFilter() {
       
    }

	
	public void destroy() {
		
	}

	
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)resp;
		
		//該過濾器主要防止亂碼
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		
		response.setContentType("textml;charset=utf-8");
		
		//過濾鍊過濾下一條
		chain.doFilter(request, response);
	}

	
	public void init(FilterConfig fConfig) throws ServletException {
		
	}

}
           

web.xml中添加配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>java_servlet_test</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>IndexServlet</servlet-name>
    <servlet-class>com.chtw.servlet.IndexServlet</servlet-class>
    <init-param>
      <param-name>name</param-name>
      <param-value>張山</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>IndexServlet</servlet-name>
    <url-pattern>/servlet01</url-pattern>
  </servlet-mapping>
  
  
  <filter>
  	<filter-name>IndexFilter</filter-name>
  	<filter-class>com.chtw.filter.IndexFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>IndexFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
           

IndexServlet中将處理亂碼的代碼注釋掉,然後啟動伺服器:

JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器
JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器

本人聯系方式2329095893,歡迎各位進行學習讨論

歡迎關注熊熊出沒ING公衆号,不定時跟新Java、python、資訊安全等相關知識哦。

JavaEE(五) Servlet進階應用1. Servlet請求處理2. Servlet中文亂碼問題3. request/response對象的使用4. Cookie的應用5. 過濾器