jsp Servlet與Filter

         servlet說白了就是請求處理中心,一般的jsp都是通過js發出異步請求,通過servlet做具體的業務處理,像什麼查數據,讀文件之類的,是一個業務層;而jsp頁面負責顯示和呈現數據,是一個顯示層。一個完整的請求是由客戶端發起由request攜帶數據,到服務器進行處理,然後由response攜帶處理後的數據返回到客戶端,而servlet就是一個業務處理中心。但假如說我在沒有登錄的情況下想進入後臺界面這個肯定是要進行攔截的,對於這個問題我們完全可以在servlet業務層進行判斷,但這樣會顯得沒有層次,你想我一個簡單的沒有輸密碼的登錄卻要跑到我的實際業務層中去,累不累啊,中間看到你小子沒有掛牌進來直接就打回去了,還讓你進裏面去逛一圈?另一個問題是編碼集的問題,每次到servlet層進行業務處理之前都要設置一次編碼集,處理完之後帶回去又要設一個編碼集,煩不煩啊,而且又跟我的業務攪在一起,好討厭!這時候用Filter就顯得比較清爽了些,在請求和業務處理之間橫插一腳,對請求進行過濾,防止壞的東西污染我純潔的業務塊,讓後者專心幹自己的本職工作,而且一旦出了問題查找起來也比較方便,多好!

          這兩者其實看起來差不多,不論是在web.xml中配置還是通過註解方式進行註釋都差不多。先來看看servlet的使用,servlet必須要實現javax.servlet.http.HttpServlet這個接口,核心是service函數,這裏面主要進行業務的處理。簡單的例子要登錄,得把賬號密碼傳過來,ok在servlet中先通過request取出來,在數據庫裏面查詢一下,合法的就進行下一步,不合法就打回去,簡單代碼如下:

<span style="font-size:14px;">package com.yc.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/login")//登錄的校驗處理,比如賬戶密碼是否正確
public class LoginServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String uname=request.getParameter("uname");
		/*
		 * 數據庫的查詢操作
		 * */
		request.getSession().setAttribute("user",uname);
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		super.init(config);
	}
	
}
</span>

我這裏只是一個簡單的示例,一般情況是通過異步請求到這裏業務處理之後返回數據(一般是json形式的數據),如果不是異步請求的話一定記得在處理完之後頁面的跳轉。那麼問題來了,我不能什麼請求都往這裏來吧?得有一個限制吧?那樣的話我的多個servlet和一個servlet還有啥區別?所以就要給是servlet配置參數,這裏面有兩種配置方式一個是在web.xml裏面:

 <span style="font-size:14px;"><servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.yc.Hello.HelloServlet</servlet-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
 </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
    <url-pattern>/*</url-pattern>
    <url-pattern>/*h</url-pattern>
  </servlet-mapping></span>

 其中servlet主要是用來配置基本的名字和處理類之類的,servlet-mapping中就限定那些URL會觸發這個,注意兩個servlet-name要一致。還有一種是註解方式:就像我前面寫的那種,在類前面加上@WebServlt()括號裏面寫上路徑注意以/開頭,後面沒有分號。這種方式相對而言比較簡單和容易操作些。

  然後是Filter,跟servlet差不多,我就直接上代碼了:

<span style="font-size:14px;">package com.yc.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;

@WebFilter("/*")//所有的請求都要設置編碼集
public class EncodingFilter implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
			System.out.println();
			request.setCharacterEncoding("utf-8");
			response.setCharacterEncoding("utf-8");
			response.setContentType("text/html; charset=utf-8");
			System.out.println("編碼集設置過濾");
			chain.doFilter(request, response);
	}
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}</span>
這個的功能就是對所有的頁面進行設置編碼集。

       還必須意識到的一個問題是,當多個Filter和多個servlet的地址是一樣的時候怎麼搞,誰先誰後?大的原則是Filter在servlet之前,當多個Filter的地址是一樣的時候,就會形成一個所謂的Filter鏈,這個鏈的先後順序是由你web.xml裏面寫的先後順序來決定的,如果是註解方式,就是裏的類的順序(在Eclipse裏面就是安字母順序拍的好像),當一個Filter中的doFilter執行之後會交給Filter鏈中的下一個Filter進行處理操作,只有當所有的filter都執行了doFilter之後纔會進行servlet操作,這樣就意味着我可以在這個filter鏈中的任意一個地方來中斷這個請求,或者修改我的請求。當多個Filter的攔截地址一樣的時候,具體執行的順序是根據web.xml中的配置先後順序來執行(當然,你的攔截地址不一樣就不會有這個問題)。

       我在這裏只是一個簡單示例使用,這兩者放在實際的項目中用起來纔會意思,在配上EL,讓各個層更加的獨立,界面只負責顯示,業務層只處理業務,過濾層只負責自己的本職工作,再把底層封裝好,配好接口,到那時就會發現整個項目清爽多了

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