Web開發模式(MVC設計模式)

1.MVC:(Model-View-Controller)操作流程

顯示層View:主要負責接收Servlet傳遞的內容,并調用JavaBean把內容顯示給用戶。

控制層Controller:負責所有的用戶請求參數,判斷請求參數是否合法,根據請求方式調用JavaBean進行處理,把結果返給顯示層進行顯示。

模型層Model:完成一個獨立的業務操作組件。一般以JavaBean或者EJB(分布式組件技術)來定義的。

? 最關鍵的是RequestDispatcher接口:因為內容是通過該接口保存到JSP頁面技能型顯示的。

                  page、request、session、application

? ?在MCV設計模式中,所有的屬性傳遞以request方式(因為:保存范圍越大占用的內存越多)進行傳遞,可以提升代碼的操作性能。

?簡潔、清晰的JSP頁面應包含的內容:? 在JSP頁面中唯一允許導入的包是java.util。

1.接收屬性:接收來至Servlet傳遞過來的屬性。

2.判斷語句:判斷傳遞到JSP中的屬性是否存在。

3.輸出語句:使用迭代輸出或者JavaBean輸出。

?

2.過濾器Filter

?

實現過濾器功能:實現javax.servlet.Filter接口

應用一:編碼過濾

? ?在每個JSP頁面或者Servlet中,設置字符編碼格式request.setCharacterEncoding("UTF-8");可使用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;public class EncodingFilter implements Filter {private String charSet;//字符編碼
@Overridepublic void destroy() {System.out.println("過濾器已銷毀...");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,ServletException {// 執行過濾System.out.println("執行過濾之前:doFilter()");req.setCharacterEncoding(this.charSet); //統一設置編碼
chain.doFilter(req, resp);//請求繼續傳遞System.out.println("執行過濾之后:doFilter()");}/*** 在容器啟動的時候自動加載,通過getInitParameter()獲取配置的初始化參數,只初始化一次。*/@Overridepublic void init(FilterConfig config) throws ServletException {String initParam = config.getInitParameter("encoding");//獲取初始化參數this.sharSet = initParam ;System.out.println("過濾器初始化,初始化參數是:" + initParam);}
}

?

web.xml中的配置

<filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/jsp/*</url-pattern>
</filter-mapping>

  

<url-pattern>:表示一個過濾器的過濾位置:/*表示對于根目錄下的一切操作都進行過濾;若只過濾某一個或者某個目錄,則必須明確寫出對應的目錄.

?

應用二:登錄驗證

?

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.http.HttpServletRequest;
import javax.servlet.http.HttpSession;public class LoginFilter implements Filter {@Overridepublic void destroy() {}/*** session本身屬于HTTP協議的范疇,doFilter()定義的是ServletRequest,* 要想獲取session,必須進行向下轉型:ServletRequest改成HttpServletRequest,才能使用getSession()獲取session對象。*/@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,ServletException {HttpServletRequest hsp = (HttpServletRequest)req;//向下轉型HttpSession ss = hsp.getSession();if(ss.getAttribute("userId") != null){ //判斷用戶是否登錄
      chain.doFilter(req, resp);}else{req.getRequestDispatcher("login.jsp").forward(req, resp); //跳轉到登錄頁面
    }}@Overridepublic void init(FilterConfig arg0) throws ServletException {}
}

?

3.監聽器Filter

應用1:對application的監聽

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;//對上下文狀態的監聽public class ServletContextListenner implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent event) {//上下文銷毀觸發System.out.println("容器銷毀" + event.getServletContext().getContextPath());}@Overridepublic void contextInitialized(ServletContextEvent event) {//上下文初始化觸發System.out.println("容器初始化"+ event.getServletContext().getContextPath());}
}

?

web.xml配置

<listener><listener-class>com.mxzer.common.listener.ServletContextListenner</listener-class>
</listener>

?

? ? ? 所有Servlet程序必須在web.xml進行配置,配飾順序如下:

1.先配置過濾器:<filter>、<filter-mapping>

2.再配置監聽器:<listener>

3.最后配置Servlet:<servlet>?、<servlet-mapping>

?

應用2:對Servlet上下文屬性的監聽,要實現ServletContextAttributeListener接口

應用3:對session的監聽

? ?3.1實現HttpSessionListener接口

? ?session銷毀的方式:

? (1)調用HttpSession中的invalidate()方法

? (2)在web.xml中配置session的超時時間

    <!-- session 失效時間 單位30分鐘 --><session-config><session-timeout>30</session-timeout></session-config>

?

? 3.2對session屬性的監聽,要實現HttpSessionAttributeListener接口,需要在web.xml配置

? ? ? 方式二:使用HttpSessionBindingListener接口

/**
* 使用HttpSessionBindingListener
* session屬性監聽:不需要在web.xml中配置
*
*/
public class ServletContextListenner implements HttpSessionBindingListener {private String loginName; //登錄名public ServletContextListenner(String loginName) {this.loginName = loginName;}public String getLoginName() {return loginName;}public void setLoginName(String loginName) {this.loginName = loginName;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("在session中保存登錄對象" + this.getLoginName()+"session ID:"+event.getSession().getId());}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("在session中移除登錄對象" + this.getLoginName()+"session ID:"+event.getSession().getId());}}

?

?3.4對request監聽

? ?請求狀態的監聽:實現ServletRequestListenner接口

    System.out.println("request請求初始化" +"http://"+ event.getServletRequest().getRomoteAddr());System.out.println("request請求初始化" +"http://"+ event.getServletContext().getContextPath());

?

? 屬性的監聽:實現ServletRequestAttributeListener

? ? ? ??

System.out.println(event.getNmae() + event.getValue());

?

轉載于:https://www.cnblogs.com/mxzer/p/6437338.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255299.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255299.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255299.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Arduino IDE 配置文件

最近學習Arduino。 Arduino開源硬件和Arduino IDE是一個很容易上手的系統。 目前arduino已經支持很多種板類型&#xff0c;甚至已經支持了部分arm芯片。比如arduino ng、arduino uno、arduino mini、pro mini等。但是大多數情況&#xff0c;都是使用的atmega8/at…

HALCON示例程序bottle.hdev、bottlet.hdev瓶體字符OCR的訓練和檢測

HALCON示例程序bottle.hdev、bottlet.hdev瓶體字符OCR的訓練和檢測 示例程序源碼&#xff08;加注釋&#xff09; 1、先介紹bottlet.hdev&#xff08;訓練OCR識別文件&#xff09; *定義一個字符串變量FontName &#xff0c;內容是bottle FontName : ‘bottle’ *第一步分割…

【機器學習】神經網絡BP理論與python實例系列

理論部分 《機器學習——人工神經網絡之發展歷史&#xff08;神經元數學模型、感知器算法&#xff09;》 《機器學習——人工神經網絡之多層神經網絡&#xff08;多層與三層&#xff09;》 《機器學習——人工神經網絡之后向傳播算法&#xff08;BP算法&#xff09;》 《機…

bzoj1597: [Usaco2008 Mar]土地購買

斜率優化dp。 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn 50000 10;struct Field {long long x,y; } t[maxn]; long long f[maxn],x[maxn],y[maxn]; int q[maxn],l,r; int n,cnt;bool cmp(F…

vue封裝axios接口

一、安裝axios axios安裝命令&#xff1a;cnpm install axios 二、在文件中引用axios 一開始我是放在src下的main.js這個文件里面&#xff0c;后來發現mounted鉤子讀取接口方法為undefined&#xff0c;百度了才發現是vue生命周期的原因&#xff0c;最好的解決辦法是把axios單獨…

編寫Arduino支持的C++類庫

以下為摘抄的例子&#xff0c;已經親自驗證過&#xff0c;例子是正確的 我們在上一講中實現了一個TN901紅外溫度傳感器51程序到Arduino程序的轉換&#xff0c;如果代碼越來越多這樣程序的可維護性會隨之降低&#xff0c;也不適合團度開發。我們應該把常用的文件封裝成C庫&#…

函數,游標與存儲過程的綜合應用

--在TOY數據庫中完成以下操作use toygo--1、編寫一個存儲過程&#xff0c;接收任意一個訂單號&#xff0c;打印訂單的表頭數據。格式如下&#xff1a;--(其中訂單編號由訂單日期訂單號的字符串組成)--訂單編號:20010520000001 訂貨日期:2001-05-20 訂貨人:拉爾森create pro…

HALCON示例程序check_blister.hdev藥品膠囊檢測

HALCON check_blister.hdev藥品膠囊檢測 示例程序源碼&#xff08;加注釋&#xff09; 顯示、讀入圖片、設置顯示字體等&#xff0c;之前的帖子已經介紹過了 dev_close_window () dev_update_off () read_image (ImageOrig, ‘blister/blister_reference’) dev_open_window_f…

【機器學習實戰】——常見函數積累

目錄 第二章 k近鄰算法 1、array.sum(axies 1) : 2、array.argsort(axies0/1) 3、array.tile(mat,(m,n)) 4、dict.get(key,value) 5、sorted函數 6、string.strip()函數 7、string.split() 8、scatter&#xff08;&#xff09;函數 9、min()&max() 10、enumera…

安裝oracle 11g 客戶端,檢查過程中報物理內存不足的解決

今早接到同事電話&#xff0c;說安裝oracle 11g客戶端的時候&#xff0c;在檢查先決條件的時候&#xff0c;報錯&#xff0c;說內存不足&#xff0c;但是本機的內存是2G&#xff0c;肯定夠用&#xff1a;如圖&#xff1a; 找了一圈&#xff0c;原來Oracle執行先決條件檢查是依賴…

智能時代 軟件賦能——2017中國軟件技術大會

由中國科學院軟件研究所、中科軟科技股份有限公司聯合主辦&#xff0c;北京中科凱亞科技有限公司協辦的第15屆中國軟件技術大會將于2017年12月在北京 國家會議中心隆重舉行。 毋庸置疑&#xff0c;我們正在邁入智能時代&#xff0c;伴隨著物聯網、云計算、大數據、人工智能等智…

Arduino 代碼機制

新建一個Arduino程序。可是建完就郁悶了&#xff0c;因為只看到了setup和loop函數&#xff0c;卻沒有基本的c函數。 void setup() {// put your setup code here, to run once: }void loop() {// put your main code here, to run repeatedly: }于是好奇心就來了&#xff0c;當…

Codeforces Round #401 (Div. 2) D. Cloud of Hashtags

題目鏈接&#xff1a;D. Cloud of Hashtags 題意&#xff1a; 給你n個字符串&#xff0c;讓你刪后綴&#xff0c;使得這些字符串按字典序排列&#xff0c;要求是刪除的后綴最少 題解&#xff1a; 由于n比較大&#xff0c;我們可以將全部的字符串存在一個數組里面&#xff0c;然…

HALCON示例程序check_blister_mixed.hedv藥品膠囊缺陷檢測

HALCON示例程序check_blister_mixed.hedv藥品膠囊缺陷檢測 示例程序源碼&#xff08;加注釋&#xff09; 讀入圖片與顯示相關設置 dev_close_window () read_image (Image, ‘blister/blister_mixed_reference’) dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHan…

php類與對象

1.類與對象 對象&#xff1a;實際存在該類事物中每個實物的個體。$a new User(); 實例化后的$a 引用&#xff1a;php的別名&#xff0c;兩個不同的變量名字指向相同的內容 封裝: 把對象的屬性和方法組織在一個類&#xff08;邏輯單元&#xff09;里 繼承&#xff1a;以原有的類…

【深度學習系列】基礎知識、模型學習

基礎知識 原創 【深度學習】——訓練過程 原創 【深度學習】——BN層&#xff08;batch normalization&#xff09; 原創 【深度學習】——激活函數&#xff08;sigmoid、tanh、relu、softmax&#xff09; 原創 【深度學習】——損失函數 原創 【深度學習】——梯度下…

史陶比爾機器人的 LLI (Low Level Interface)

史陶比爾機器人的 LLI &#xff08;Low Level Interface&#xff09; 史陶比爾機器人擁有 Low Level Interface (LLI)接口選項. 在CS8C控制器的時代&#xff0c;LLI 接口仍然可用。這是一個選項接口。.這是除了VAL3編程語言之外的替代操作系統。通過C程序替代你的程序。 這里的…

陽獅集團與阿里巴巴全域營銷伙伴關系再升級:數據和業務合作將更緊密

3月6日&#xff0c;阿里巴巴集團與全球領先的廣告傳播集團陽獅集團在上海開啟了主題為“新局面新高度”新階段的合作溝通&#xff0c;未來雙方將進行更緊密的數據和業務層面的合作。阿里巴巴集團CMO、阿里媽媽總裁董本洪及陽獅媒體大中華區首席執行官張敬鸞就開放共贏達成共識&…

HALCON示例程序check_bottle_crate.hdev啤酒箱內酒瓶數檢測

HALCON示例程序check_bottle_crate.hdev啤酒箱內酒瓶數檢測 示例程序源碼&#xff08;加注釋&#xff09; 獲取系統關于“空白區域儲存的設置” get_system (‘store_empty_region’, StoreEmptyRegion)系統“空白區域儲存”設置為 ‘false’ set_system (‘store_empty_regi…

#undef 標識符

#undef 是在后面取消以前定義的宏定義 該指令的形式為 #undef 標識符 其中&#xff0c;標識符是一個宏名稱。如果標識符當前沒有被定義成一個宏名稱&#xff0c;那么就會忽略該指令。一旦定義預處理器標識符&#xff0c;它將保持已定義狀態且在作用域內&#xff0c;直到程序結束…