為了賬號安全,請及時綁定郵箱和手機立即綁定

貓哥帶你去戰斗—Java Web開發—Servlet篇[5]—犀利的內置對象

2017.01.20 09:24 2599瀏覽

前面幾篇寫的內容挺多挺亂,稍微理順下:
1,網站無非是前后臺交互
2,目前我們的后臺可以認為是Servlet
3,前臺可以認為是JSP和HTML
4,Servlet因為可以寫out.println("<br/>");等輸出到前臺的html內容,所以一定程度上它的輸出可以認為是前臺。
5,JSP因為可以在<%%>中間寫Java代碼后臺邏輯,所以可以當后臺使用
6,不管是html還是jsp,其實都是在服務器端的,區別是:客戶端訪問時,html直接傳給客戶端,jsp需要先轉換為Serlvet,然后Servlet運行結果返回給客戶端。當然其實我們都不用管,會用就行

好,貓哥整理邏輯之后,果然更亂了。其實不是貓哥整理的亂,而是因為JSP和Servlet能力太強,所以有時候啊,得有個領導給他們分分工,設定下各自的職責和目標,激發他們最大的能力。所謂的領導,當然是程序設計世界的上帝——程序猿和美麗的程序媛啦——哎哎,那誰誰,看到程序媛,眼都直了。

OK,按照業內比較流行的做法,就是JSP負責顯示的外觀和顯示的具體內容,Servlet負責根據需求提供獲取的內容冰處理業務邏輯。在這個過程中,涉及從前臺網頁提交數據到Servlet,這個問題已做了詳細說明,此處不表。還涉及一個從Servlet將數據返回給網頁顯示的問題,這個問題有以下處理方案:

方案1,Servlet處理后,跳轉到HTML頁面,因為HTML頁面是靜態的,所以無法實現輸出動態結果的功能。比如就無法輸出不同班級不同的學生列表。
方案2,Servlet處理后,使用out.print()輸出處理結果。這個方法可行,但是輸出的內容混雜著許多html標簽,導致前端后端完全無法分離。
方案3,Servlet處理后,跳轉到JSP頁面,方法可行。但是需要將數據(比如學生列表)從Servlet傳遞到JSP頁面。

綜合方案1-3,方案3如果實現的好,可以在最大程度上實現前后端分離,邏輯清晰,所以方案3得到了大家的喜愛。同時大家完全不必擔心方案3中的數據傳輸問題,Servlet/JSP提供了內置對象 這樣的逆天神器——其實就是封裝好的對象,非常棒的解決了這個問題。

OK,本篇我們只講最最常用的四個內置對象response、out、request、session

先來看個例子

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {//response封裝了客戶端響應模型
            //request封裝了客戶端請求的信息
        PrintWriter out = response.getWriter();//out用于輸出

我們知道,網頁提交請求到服務器,然后服務器響應請求輸出結果。這個過程從根本上講是數據包的傳遞,再根本上講是電壓等物理信號的傳遞。然而我們不管,在Servlet和JSP世界,這些信號被封裝到了request和response對象中。也就是說,request對象中包含著客戶端請求的信息,而response代表著服務端對客戶端響應的信息,通過它哥倆,程序員就能非常方便獲取、操作輸入輸出(請求響應)。

然后out對象呢,其實就是response的一個小弟,response對象封裝的是對客戶端的各種響應,最常見的就是輸出(當然不止輸出,還有網頁跳轉什么的也算響應)。所以out也成了一個內置對象。

上面的例子是在Servlet中使用response、out、request,在JSP中更加簡單,看例子

 <body>
    該班的學生有:<br/>
    <%
        response.setContentType("text/html");//設置輸入格式
        response.setContentType("text/html");
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        String classId=request.getParameter("class");//獲取要查詢的班級id
        StudentOperation stuOper=new StudentOperation();
        List students=stuOper.selectByClassId(classId);
        for(Object obj:students){
            StudentInfo stu=(StudentInfo)obj;
            out.print("姓名:"+stu.getStudentName()+" ");
            out.print("班級:"+stu.getStudentClass().getClassName());
            %>
            <br/>
            <%
        }
     %>
  </body>

可見,這三個對象是可以在JSP中直接不打招呼拿來用的,那叫一個方便,所以才叫內置對象嗎。內置的意思,不用在置辦了,咱JSP天生就有!

OK,所以從Servlet向JSP傳值,變得如此簡單:

Servlet端:   request.setAttribute("name", "張三");
JSP獲取:      request.getAttribute("name");

attributte的意思是“屬性”,request.setAttribute("name", "張三");的意思是在request這個內置對象添加一個叫name的屬性,屬性值是張三。request.getAttribute("name");的意思是從request這個內置對象中獲取名字是name的屬性的值。

OK,還有一個session,這個才是難點。
session也有setAttribute和getAttribute方法,同樣可以從Servlet向JSP傳值。

那有request就夠了,還要session干嘛?session具備非常重要的意義,request代表一次請求,而session代表一次會話,所謂回話的意思就是一個客戶在使用一個瀏覽器客戶端訪問服務器期間,session在此期間生存在唯一。簡單點,session有點像為每個用戶分配的靜態對象,開始訪問時生成,關閉瀏覽器時銷毀。這個可能不好理解,暫時先會用request傳值就行了,session在具體實踐中再講。

OVER!

點擊查看更多內容

本文原創發布于慕課網 ,轉載請注明出處,謝謝合作

4人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
lpl竞猜