- 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[“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”%> 這種方式過濾器攔截不了,因爲它已經把錯誤信息處理了,對於處理之後的不攔截,攔截沒有處理的。