初始化聲明研究
init方法
有參的init方法
public void init(ServletConfig config) throws ServletException
無參的init方法
public void init() throws ServletException
執行特點
servlet中既有有參的又有無參的init方法,默認執行有參的,無參的就無效了;
若要執行無參的init方法,就把有參的方法刪掉;
不處理任何請求
只複寫init方法不復寫doPost、doGet方法,也不配置<servlet-mapping>,servlet就不接受用戶的請求;
但必須要配置<load-on-startup>,如果不配置,servlet只能在用戶第一次訪問組件時才能創建,但servlet又不接收用戶的請求,所以不能創建出servlet對象;
初始化參數的獲取
創建兩個config對象:
一個Config是實現了ServletConfig接口的類的對象,用來收集web.xml中servlet組件配置信息的初始化參數;
一個Config是實現FilterConfig接口的類的對象,用來收集web.xml中filter組件配置信息的初始化參數;
tomcat讀取web.xml文件,通過讀取servlet組件的<init-param>標籤中的初始化參數,把初始化參數封裝到config裏面:
key=username,value=scott
key=password,value=tiger
key=DBDRIVER,value=oracle.jdbc.driver.OracleDriver
通過<servlet-class>找到字節碼文件創建出servlet對象;
創建完servlet對象就執行有參的init方法,並把(實現了ServletConfig接口的類的)config對象注入給init方法;
在init方法裏獲取servlet初始化參數 config.getInitParameter("username");
傳遞初始化參數,把值賦給實例全局變量就可以傳遞給該類的其他方法;
直接使用實例全局變量就可以獲取config裏的初始化參數,並傳遞給業務層及持久層;
瀏覽器發送get請求,調用doget()方法並通過該方法獲取到config對象,然後對請求進行分發處理;
注:初始化參數的讀取不會線程不安全,因爲沒有對config的數據做任何敏感操作,一直是可重複讀,因此是線程安全的(但final類型的不行,因爲要顯示的初始化,且不能再更改);
初始化參數的方法可以通過修改配置信息使持久層訪問相應的數據庫,體現擁抱需求的思想;
由於web.xml的配置一旦出錯,就可能造成整個項目啓動失敗,所以推薦使用properties文件,直接通過讀取文件修改持久層訪問相應的數據庫;
映射名
映射名的命名
tomcat會把請求中項目名後的所有內容作爲映射名;所以在命名映射名的時候要把servlet組件的路徑也加進去;
如:請求127.0.0.1:8080/test/servlet/formServlet
配置<url-pattern>/servlet/formServlet</url-pattern>
tomcat還會把訪問servlet的映射名的路徑作爲訪問視圖組件的默認路徑;
從哪個路徑發送的請求,轉向哪個路徑的組件;
<servlet>
<servlet-name>form</servlet-name>
<servlet-class>cn.cx.servlet.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>/a/formServlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>/b/formServlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>/c/formServlet1</url-pattern>
</servlet-mapping>
代碼的優化
實例
<form action="formServlet1.do" method="post">
用戶名:<input type="text" name="uname">
<input type="submit" value="提交">
</form>
<servlet>
<servlet-name>form</servlet-name>
<servlet-class>cn.cx.servlet.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>form</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
*.do作用
匹配所有用戶在所有路徑下的請求,大量節省配置文件;
tomcat依舊會找到發請求的起始路徑,非常智能;
依賴查找
Session:依賴request才能取得session
HttpSession session = req.getSession();
Application:依賴request
推薦方法:
ServletContext app = req.getSession().getServletContext() ; // 代碼之間沒有耦合性
Out 不常用;
El(Expression Language)表達式
概念
屬於視圖層技術,只能在jsp頁面中使用,作用:取得內置對象的數據,並進行處理,自動的把處理結果通過response發回瀏覽器顯示;
配置
Tomcat4以上都有效,如不能顯示就加一條語句:<%@ page isELIgnored="false"%>
語法
${表達式}
不可以加引號,也不可以加分號
使用
基本使用:健壯性特別好,會把null變成空串輸出;
查找順序:page--->request--->session--->application
若不想按查找順序來,可以用隱式對象:${requestScope.name}
調用request中對象相應的方法,取得屬性名所指的屬性值,由於對象被隱藏,無法看見,我們並不知道調用的是那個對象;
處理
可以進行相應的運算:自動把字符串轉換成整型,空串轉換成0輸出;
可以從集合和數組中獲取數據,還能對集合和數組是否爲空進行判斷;
在MVC模式中對結果數據渲染;
實例
<%
pageContext.setAttribute("a","30") ;
request.setAttribute("b",5);
%>
<h1><%=request.getAttribute("c")%></h1><br>
<h1>---c=${c}---</h1><br>
<h1>---a*b+c+6=${a*b+c+6}---</h1><br>
<h1>---a>b=${a>b}---</h1><br>
<h1>---3+5*2=${3+5*2}---</h1><br>
==================================eldemo04.jsp================================
<%@page import="cn.mldn.lxh.servlet.el.*"%>
<%
if(request.getAttribute("sim")!=null)
{
Simple s = (Simple)request.getAttribute("sim") ;
%>
<h1><%=s.getName()%></h1>
<%
}
%>
<h1>${sim.name}</h1>
如果el表達式從scope裏取出的屬性名爲"sim1"的屬性值爲null,就不再管後面的數據,直接輸出空串