輕量級JavaEE企業應用實戰(五)

雖然常把基於WEB應用稱爲B/S架構的應用,但其實WEB應用一樣是C/S結構的應用。只是這種應用的服務器是WEB服務器,而客戶端是瀏覽器
application對象

對於大部分瀏覽器而言,通常負責三種事情:

(1)向遠程服務器發送請求
(2)讀取遠程服務器返回的字符串數據
(3)負責根據字符串數據渲染出一個豐富多彩的頁面

web服務器大致需要完成幾個步驟:
1.啓動單獨的線程
2.使用I/O流讀取用戶的請求數據
3.從請求數據中解析參數
4.處理用戶請求
5.生成相應數據
6.使用IO流向客戶端發送請求數據
上述步驟1、2、6通用,3、4、5根據用戶請求方式不同和請求參數不同相應方式不同;
當頁面的靜態內容、JSP腳本轉換爲_jspService方法時,這些執行代碼完成解析參數、處理請求,生成響應等業務功能,而
WEB服務器負責完成多線程、網絡通信等底層功能

幾乎所有的服務器都會提供4個Map結構,分別是application、session、request、page,並且4個的區別範圍是不同的
application:對整個web應用有效,一旦JSP、Servlet將參數放入application中,可以被其下所有的JSP、Servlet訪問
session:僅對一次會話有效,放入的數據可以被本次會話的所有JSP、servlet訪問
request:僅對本次請求有效
page:僅對當前頁面有效
JSP中的application、session、request、pagecontext分別來操作對應的幾個結構範圍中的數據
在servlet中並沒有application的內置對象,所以使用:
ServletContext sc = getServletConfig().getServletContext();方法來獲取該WEB應用的ServletContext實例,並且在web應用中這個實例是唯一的
在JSP使用application.getInitParameter(String paramName);方法獲取web應用的配置參數;這些配置元素必須在web.xml中使用context-param配置
例如:

 <context-param>
     <param-name>driver</param-name>
     <param-value>com.mysql.jdbc.Driver</param-value>
 </context-param>

config對象

config對象代表當前JSP的配置信息,由於JSP無須配置,所以在JSP中使用很少;在servlet中使用較多
例如:
JSP使用實例:

<%=config.getServletName()%>
<%=config.getInitParameter("age")%>
<servlet>
    <servlet-name>config</servlet-name> //servlet名稱
    <jsp-file>/config.jsp</jsp-file> //指定哪個JSP頁面配置成servlet
    <init-param>
        <param-name>age</param-name>
        <param-value>23</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>config</servlet-name>
    <url-pattern>/config</url-pattern>
</servlet-mapping>

exception對象

JSP異常處理的一部分,實際上所有可能出現的異常都可以交給錯誤處理界面處理

實例:

public void _jspService(HttpServletRequest requet, HttpServletResponse response) throws java.io.IOException, ServletException {
    try{
        //所有JSP腳本,靜態HTML部分都會轉換成這部分代碼
    } catch(Throwable e) {
        if(_jspx_page_context != null)
            _jspx_page_context.handlePageException(t);
        }
    }finally{
        //釋放資源
        _jspFactory.releasePageContext(_jspx_page_context);
    }

out對象

out對象代表一個頁面輸出流,通常用於在頁面上輸出變量及常量。一般使用輸出表達式的地方都可以使用out對象
例如:
<%=%> 就是out.write();

pageContext對象

代表頁面上下文,用於訪問JSP之間的共享數據。使用pageContext可以訪問page、request、session、application範圍的變量
方法:

getAttribute(String name); //獲取page範圍內的name屬性getAttribute(String name, int scope);//獲取指定範圍的name,scope範圍
PageContext.PAGE_SCOPE; //對應於page範圍 
PageContext.REQUEST_SCOPE; //對應於request範圍
PageContext.SESSION_SCOPE; //對應於session範圍
PageContext.APPLICATION_SCOPE; //對應於application範圍

使用getAttribute("str", X); 獲取的數值分別是1、2、3、4

不僅如此,pageContext還可以獲取其他對象

ServletRequest getRequest(); //獲取request對象
ServletResponse getResponse(); //獲取response對象
ServletConfig getServletConfig(); //獲取config對象
ServletContext getServletContext(); //獲取application對象
HttpSession getSession(); //獲取session對象

request對象

request代表本次請求範圍,web應用是請求/響應架構,除去請求還會發送一些請求頭,服務器解析頭/請求參數的就是JSP或servlet,而
JSP和servlet獲取的途徑就是request

方法:
String getParameter(String name); //獲取name請求參數的值
Map getParameterMap(); //獲取所有請參數名和參數值組成的Map對象
Enumeration getParameterNames(); //獲取所有請求參數名所組成的Enumration對象
String[] getParameterValues(String name); //獲取name請求參數的值,當有多個值時,返回多個值組成的數組
HttpServletRequest提供了訪問請求頭的方法:
String getHeader(String name); //根據指定請求頭的值
java.util.Enumeration getHeaderNames(); //獲取所有請求頭的值
java.util.Enumeration getHeaders(String name); //獲取指定請求頭的多個值
int getIntHeader(String name); //獲取指定請求頭的值,並將其轉換成整數
get和post請求

get請求方式:
將請求參數的名和值轉換成字符串,並附加在原URL後,因此可以在地址欄中看到參數名和值
傳送的數據量較小,一般不能大於2KB
如果form元素沒有設置method方法,默認使用get方式
post請求方式:
發送的數據量較大,通常認爲不受限制,往往取決於服務器的限制
發送的請求參數以及對應的值,放在HTML HEADER中傳輸,用戶不能在地址欄看到請求的參數,安全度較高
forward和direct

從地址欄上:
forward是服務器請求資源,訪問目標的URL,並將響應數據返回給瀏覽器,瀏覽器不知道從哪裏來的,所以地址欄不變
direct是服務區根據邏輯,發送一個狀態碼,告訴瀏覽器去哪裏請求,所以URL是新的
從數據共享上:
forward轉發頁面和目標頁面可以共享request數據
direct不可以共享數據
從運用上:
forward一般用於登錄,根據角色訪問其他模塊
direct一般用於註銷時返回登錄界面或其他頁面
從效率上:
forward效率高
direct效率高

response對象

response代表服務器對客戶端的響應,大部分情況下無須使用。但是,如果在JSP頁面動態生成一幅位圖或者輸出一個PDF文檔,此時必須使用response

對於生成非字符響應的情況,就應該使用response來響應客戶端請求,HttpServletResponse接口提供了getOutputStream方法

增加cookie對象

增加cookie對象也是用response對象完成的,cookie通常用來記錄客戶的某些信息,比如用戶名或者喜好。
cookie和session的不同之處在於:session會隨着瀏覽器關閉而失效,而cookie會一直存放在客戶端機器上,除非超出cookie的生命期限

response對象提供了 void addCookie(Cookie cookie)方法來增加Cookie
步驟:
創建Cookie實例,Cookie的構造器爲Cookie(String name, String value)
設置Cookie的生命期限,即該Cookie在多長時間失效
向客戶端寫Cookie
例如:

Cookie cookie = new Cookie("username", name); //創建Cookie對象
cookie.setMaxAge(24*3600); //設置生存期限
response.addCookie(cookie); //向客戶端增加Cookie
順帶:
Cookie[] cookies = request.getCookies(); //使用request獲取cookie
for(Cookie c : cookies) {
    if(c.getName().equals("username")){ //獲取需要的cookie
        out.println(c.getValue());
    }
}

session對象

session也是非常常用的對象,代表用戶的一次會話(從客戶端瀏覽器連接服務端開始,到客戶端瀏覽器斷開爲止)
經常用於:判斷用戶是否登錄、跟蹤用戶購買的商品等等

session的屬性值可以是任何可序列化的JAVA對象

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