1. 程式人生 > >jsp中用過濾器filter攔截指定頁面,轉到servlet處理後返回目標頁面的一個小例子

jsp中用過濾器filter攔截指定頁面,轉到servlet處理後返回目標頁面的一個小例子

DataServlet.java
package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Datamanager
 */
@WebServlet("/DataServlet")
public class DataServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DataServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		//進入serlvlet
		System.out.println("-------------進入servlet----------");
		//首先接受filter傳過來的目標頁面url
		//通過引數接受目標url
		String url=(String) request.getAttribute("url");
		System.out.println("已通過request引數接受到目標url:"+url);
		
		//自定義模擬資料庫資料str
		System.out.println("進行資料處理");
		String str="模擬資料庫資料";
		//將資料儲存在引數data中
		System.out.println("已建立資料");
		request.setAttribute("data", str);
		System.out.println("已將資料放置在request的data引數中。等待跳轉-----");
		//轉向目標頁面
		System.out.println("完成向目標頁面的跳轉,servlet處理完成。");
		System.out.println("----------以上是servlet內容------------------");
		request.getRequestDispatcher(url).forward(request, response);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

FilterTest.javapackage 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;/** * Servlet Filter implementation class FilterTest */@WebFilter("/FilterTest")public class FilterTest implements Filter { /** * Default constructor. */ public FilterTest() { // TODO Auto-generated constructor stub }/** * @see Filter#destroy() */public void destroy() {// TODO Auto-generated method stub}/** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stub//需要攔截的頁面url:c.jspString str="c.jsp";//處理資料用的servletString servlet="data";//控制檯輸出提示System.out.println("------------以下是filter部分-------------------");System.out.println("我是filter,所有頁面的訪問必須先通過我!");System.out.println("已攔截頁面訪問請求:");//輸出頁面訪問來源System.out.println("訪問請求的來源是:"+((HttpServletRequest)request).getHeader("referer"));//獲取目標URLString url=((HttpServletRequest)request).getRequestURI();//servletRequest轉成HttpServletRequest.//判斷目標URL是否需要攔截if(url!=null) {//如果訪問請求目標頁面不為空//控制檯輸出提示System.out.println("訪問請求的目標頁面是:"+url);int count=url.indexOf(str);//訪問請求的URL是否包含要過濾的網頁URL。count=-1時不包含。if(count!=-1) {//確定包含需過濾URLSystem.out.println("訪問請求的頁面需要servlet資料處理,將會被轉給servlet處理。");//擷取URL只保留xx.jsp部分。url=url.substring(count, url.length());//將url作為引數寫入requestrequest.setAttribute("url", url);//轉到servlet處理資料request.getRequestDispatcher(servlet).forward(request, response);}}//count=-1時,說明訪問請求目標URL不包含需過濾url:c.jsp//控制檯輸出提示System.out.println("訪問請求不需要servlet處理,放行。");System.out.println("------------以上是filter內容----------------------");// pass the request along the filter chain//將request和response傳遞給filter鏈,供下一個filter呼叫chain.doFilter(request, response);}/** * @see Filter#init(FilterConfig) */public void init(FilterConfig fConfig) throws ServletException {// TODO Auto-generated method stub}}
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" id="WebApp_ID" version="3.1"> <display-name>TomcatTest</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> <filter> <filter-name>FilterTest</filter-name> <filter-class>filter.FilterTest</filter-class> </filter> <filter-mapping> <filter-name>FilterTest</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>DataServlet</servlet-name> <servlet-class>servlet.DataServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DataServlet</servlet-name> <url-pattern>/data</url-pattern> </servlet-mapping></web-app>
c.jsp<%@ page language="java" contentType="text/html; charset=utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><h1>這是c.jsp</h1><hr>接受servlet提供的資料:<font color="red"><%=request.getAttribute("data") %></font><br>說明:如果以上資料不為null,而是servlet設定的"模擬資料庫資料",則表明該頁面經過了filter過濾並交由servlet處理後傳回本頁面。<br><a href="a.jsp">跳轉到a.jsp</a></body></html>
b.jsp<%@ page language="java" contentType="text/html; charset=utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><h1>這個是b.jsp。由a.jsp直接跳轉過來。</h1><br><a href="a.jsp">返回a.jsp</a></body></html>
a.jsp<%@ page language="java" contentType="text/html; charset=utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><h1>這是a.jsp!</h1><br><a href="b.jsp">經過filter攔截,但不會轉到servlet處理,直接跳轉到b.jsp</a><br><a href="c.jsp">經過filter攔截並轉到servlet處理後跳轉至c.jsp</a></body></html>


學習JSP過濾器時的一個例子:

功能:對於需要進行資料庫操作的頁面,自動攔截到servlet處理,最後返回目標頁面。

說明:filter攔截所有的頁面,攔截時判斷是否需要進行資料處理,如果需要就轉向資料處理的servlet進行處理,處理完成後將資料傳入request,並自動跳轉到目標頁面。

該例子一共有3個JSP頁面:a.jsp,b.jsp,c.jsp.1個filter:FilterTest.java.1個servlet:DataServlet.java。

第一次弄這個,為啥程式碼只能放一大堆在頂部呢???

小例子,沒啥技術含量。感興趣的朋友可以看看。如果要拷貝程式碼測試,請留意控制檯輸出的提示。