JavaEE(五) Servlet高級應用

目錄

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);
	}
}

啓動服務器:

點擊登錄後查看控制檯:

出現了中文亂碼的情況

修改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);
	}
}

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,來統一處理亂碼問題:

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中將處理亂碼的代碼註釋掉,然後啓動服務器:

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章