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());
?