servlet002:MVC設計模式,el表達式,過濾器的應用

  • MVC是一種設計模式
    MVC是觀察者模式(Observer), 策略模式(Strategy)和組合模式(Composite)三個設計模式的演變,MVC是模式的組合,是一種編程架構
  • 其中M表示 model 模型, com.z.User 就是一個model ,模型專門用來傳送數據。可以跨越多層。
  • 其中V表示 view 視圖, /WEB-INF/jsp/所有jsp頁面,都是視圖,視圖有2個作用,1收集用戶數據(form),2 顯示數據。(table div)
  • 其中C表示controller 控制器,com.xaeduask.web.servlet中的所有類,都是控制器,負責處理用戶數據,並根據處理結構,跳轉到不同的view(視圖)
    在這裏插入圖片描述
  • el表達式
    EL(Expression Language) 是爲了使JSP寫起來更加簡單。表達式語言的靈感來自於 ECMAScript 和 XPath 表達式語言,它提供了在 JSP 中簡化表達式的方法,讓Jsp的代碼更加簡化。

2、[ ]與.運算符
EL 提供“.“和“[ ]“兩種運算符來存取數據。
當要存取的屬性名稱中包含一些特殊字符,如 . 或 - 等並非字母或數字的符號,就一定要使用“[ ]“。例如:
user.MyName{ user. My-Name}應當改爲{user[“My-Name”]}
如果要動態取值時,就可以用“[ ]“來做,而“.“無法做到動態取值。例如:
${sessionScope.user[data]}中data 是一個變量

	<%
   				Dog d1=new Dog("哈巴狗","黑色",19);
   				Dog d2=new Dog("拉布拉多","黃色",3);
   				Dog d3=new Dog("金毛","金色",6);
   				Dog d4=new Dog("藏獒","白色",8);
   				Map map=new HashMap();
   				map.put("a", d1);
   				map.put("b", d2);
   				map.put(2, d3);
   				map.put("1", d4);
   				pageContext.setAttribute("a",map);
   				
   			 %>		
   			 ${1<2?'a':'b'}

Jsp三大利器:servlet 過濾器 監聽器

  • 過濾器
    過濾器也是一個java類,只不過他實現了Filter接口。它在服務器開啓的時候就開始執行,沒訪問一次調用一次,項目從服務器上卸載之後就執行關閉
    在這裏插入圖片描述
  • 過濾器配置
    在這裏插入圖片描述
    這裏的*表示只要訪問filter下的所有項目,都會執行過濾器,都會被過濾器攔截下來。
    在這裏插入圖片描述
  • chain.doFilter後面的代碼,會在目標資源執行完畢之後才執行!
    在這裏插入圖片描述
    現在過濾器沒有任何條件就放行了,可以訪問到也面了。過濾器不攔截了。其實過濾器攔截下來之後先進行中文亂碼處理,屏蔽敏感字,管理員與遊客登錄權限設置等操作之後再放行,這樣才能發揮過濾器的作用。
  • 解決中文亂碼:
    在這裏插入圖片描述
  • 設置表單提交方式
    在這裏插入圖片描述
  • 我們可以學過濾器連,可以有多個過濾器攔截請求,按filter-mapping配置順序來攔截!(順序就是在配置文件中,誰的位置在前,哪個過濾器就先執行,這樣可以讓一個過濾器只執行一個攔截要求,多個過濾器搭配使用,實現程序運行。它可以在過濾器放行之前來處理請求信息,攔截部分請求,也可以在過濾器放行之後來處理服務器響應的數據,給客戶端部分響應)
    在這裏插入圖片描述

過濾器應用
1:可以在filter中根據條件決定是否放行(設置用戶黑名單)
2:在目標資源執行之前對request,response做預處理,再放行!(解決中文亂碼,替換敏感字符)
3:在目標資源執行之後,可以捕獲目標資源的執行結果!(關閉數據庫鏈接)

  • 過濾器生命週期:
    1.在服務器啓動時,自動創建過濾器的對象,創建時,直接調用init方法。
    2.每當過濾器攔截到請求,則自動調用doFilter方法!
    3.在卸載web應用時,會自動銷燬過濾器對象,在銷燬時,自動調用destory方法。
  • 在web.xml中配置全局屬性和局部屬性
    設置的屬性可以在過濾器中使用,在過濾器開啓也就是服務器開啓後,開始加載web.xml的屬性值,然後當客戶端訪問服務器經過過濾器時,把參數傳進去,然後讓客戶端帶着參數去訪問服務器。
    1,設置屬性:(這裏解決中文亂碼)
    在這裏插入圖片描述
    2,過濾器的操作
    在這裏插入圖片描述

用戶在配置filter時,可以使用< init-param>爲filter配置一些初始化參數,當web容器實例化Filter對象,調用init方法時,會把封裝了filter初始化參數的filterConfig對象傳遞進來。因此開發人員在編寫filter時,通過filterConfig對象的方法,就可以獲得:
1,String getFilterName():得到filter的名稱
2,String getInitParameter(String name):返回部署描述中指定名稱的初始化參數的值。如果不存在返回null
3,Enumeration getInitParameterName(): 返回過濾器的所有初始化參數的名字的枚舉集合
4,public ServletContext getServletContext():返回Servlet上下文對象的引用

案例:
在這裏插入圖片描述

package com.z.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.persistence.Enumerated;
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.http.HttpServletResponse;


public class MyFilter implements Filter{
	private String defaultCharset;
	private FilterConfig config;
	@Override
	public void destroy() {
		System.out.println("關閉");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("執行");
		//表單提交方式必須爲pose
		String charset=config.getInitParameter("charset");
		System.out.println(charset);
		String name=config.getFilterName();
		System.out.println(name);
		Enumeration e=config.getInitParameterNames();
		while(e.hasMoreElements()){
			Object obj=e.nextElement();
			String value=config.getInitParameter(obj.toString());
			System.out.println(obj+":"+value);
		}
		chain.doFilter(request, response);
		System.out.println("執行結束");
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("啓動");
		this.config=config;
	}
}

執行結果:
在這裏插入圖片描述

  • 過濾器的權限控制
    在這裏插入圖片描述
    只要用戶訪問了admin中的任何資源,都會經過過濾器!
    在這裏插入圖片描述
  • 過濾器配置中的dispatcher元素的使用:
    在這裏插入圖片描述
    Dispatcher就是用於告訴過濾器,去攔截哪一種訪問方式的!
    在這裏插入圖片描述
 <filter-mapping>
      <filter-name>MyFilter</filter-name>
      <url-pattern>/admin/*</url-pattern>
      <dispatcher>ERROR</dispatcher>
  </filter-mapping>

<%@ page errorpage=“error.jsp”%> 這種方式過濾器攔截不了,因爲它已經把錯誤信息處理了,對於處理之後的不攔截,攔截沒有處理的。

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