JSP

JSP小結

HTTP協議是一種無狀態協議。一個用戶想服務器發出請求(reuqest),然後服務器返回響應(response)

處理request中文亂碼

  1. 對信息重新編碼

    //先將獲取的信息重新編碼,將編碼的值存到字節數組中,然後將數組轉化爲字符串
    /**
         * String str=request.getParameter("key");
         * byte[] b=str.getBytes("ISO-8859-1");
         * str=new String(b);
         */
    String str=new String(request.getParameter("sideA").getBytes("ISO-8859-1"));
    
  2. request設置編碼

    request.setCharacterEncoding("UTF-8");
    

response對象

  1. contentType屬性(page指令設置的contentType)

    當一個用戶請求訪問jsp頁面時,該頁面用page指令設置頁面的contentType屬性的值來響應堆頁面的請求

  2. 動態響應contentType

    可以用response.setContentType()動態改變contentType屬性

  3. response添加頭響應

    如response.setHeader(“Refresh”,“5”);定時刷新

  4. response重定向

    response.sendRedirect("");

  5. response狀態行

    服務器對用戶請求的相應,如505,404等

    狀態代碼 代碼說明
    101 服務器正在升級協議
    102 用戶可以繼續
    201 請求成功且在服務器上創建了新的資源
    202 請求已被接受但還沒有處理完畢
    200 請求成功
    203 用戶端給出的元信息不是發自服務器的
    204 請求成功,但沒有新信息
    205 用戶必須重置文檔試圖
    206 服務器執行了部分get請求
    300 請求的資源有多種表示法
    301 資源已經被被永久移動到新位置
    302 資源已經被臨時移動到新位置
    303 應答可以在另外一個URL找到
    304 get請求不可用
    305 請求必須通過代理來訪問
    400 請求有語法錯誤
    401 請求需要HTTP認證
    403 取得了請求但拒絕服務
    404 請求的資源不可用
    405 請求所用的方法是不允許的
    406 請求的資源只能用請求不能接受的內容特性來響應
    407 用戶必須得到認證
    408 請求超時
    409 發生衝突,請求不能完成
    410 請求的資源已經不可用
    411 請求需要一個定義的內容長度才能處理
    413 請求太大,被拒絕
    414 請求的URL太大
    415 請求的個數被拒絕
    500 服務器內部錯誤,不能服務
    501 不支持請求的部分功能
    502 從代理和網管接受了不合法的字符
    503 HTTP服務暫時不可用
    504 服務器在等待代理服務器應答時發生超時
    505 不支持請求的HTTP版本

用request和response打開輸入流(讀)和輸出流(寫)

  • request.getInputStream()

    ​ request.getInputStream()可以獲得一個輸入流,可以用來讀取用戶上傳文件的全部信息,包括表單的頭信息以及上傳文件的內容。

    ​ 如下,前四行以及倒數五行(包括空行)都是表單域的內容,中間部分是文件a.txt的內容:這是一個測試文件。

    1536070718455

  • response.getOutputStream()

    response.getOutputStream()可以獲得一個指向用戶的輸出流,服務器將文件寫入這個流,用戶就可以通過這個進行文件下載。當提供下載功能時,應當使用response對象向用戶發送HTTP頭信息,這樣用戶的瀏覽器就會調用相應的外部程序打開下載的文件,response通過setHeader方法添加下載頭的格式如下:

    response.setHeader("Content-disposition","attachment;filename="+"下載文件名");
    

    谷歌瀏覽器會彈出如下提示:

    1536071229253

重定向和轉發的區別

  1. sendRedirect方法

    response.sendRedirect("目標url");
    

    ​ 重定向方法僅僅將用戶從當前頁面或者當前servelet定向到另一個JSP頁面或servlet,但不能將用戶對當前頁面或servlet的請求轉發給所定向的資源,重定向的目標頁面無法使用request獲取用戶提交的數據。

  2. RequestDispatcher對象

    request.getRequestDispatcher("目標url").forward(request,response);
    

    RequestDispatcher對象可以把用戶對當前頁面的請求和響應都傳遞轉發到下一個頁面

session對象

  1. session對象由Tomcat服務器創建,實現了HttpSession接口。

  2. session對象的生命週期取決於

    1. 是否到達最長"發呆"時間(用戶對某個Web目錄下的JSP頁面發出請求並得到響應,如果用戶不再對該Web服務目錄發出請求,那麼進入"發呆"狀態)
    2. 服務器是否關閉
    3. session是否調用了invalidate()方法
  3. 如何保證session對象的唯一性(URL重寫)

    ​ session對象是否能和用戶建立起一一對應的關係依賴於用戶端是否支持Cookie。如果瀏覽器的Cookie被禁用後,用戶在不同網頁之間的session對象可能是互不相同的,因爲服務器無法將id(session的id)存到客戶端,就無法建立session對象和用戶的一一對應關係。那麼如何保證用戶在網站各個頁面的session對象是完全相同的呢,可以通過一個方法——URL重寫

    //如果從first.jsp頁面連接到second.jsp頁面,可以通過下面方式
    //-------------------jsp中可以這樣寫-------------------------------------------------
    <%
    // 它會查看cookie是否存在,如果不存在,在指定的url後添加jsessionid參數
    // 如果cookie存在,它就不會再url後添加任何東西
    	response.encodeURL("請求地址");
    %>
        
    //--------------------servlet中可以這樣寫--------------------------------------------
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
     
    @WebServlet(urlPatterns = "/hello")
    public class MyServlet extends HttpServlet
    {
        
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
        {
        
            HttpSession session  = req.getSession();
            //下面請求重定向的路徑。
            String path = resp.encodeRedirectURL( "/world" );      
            System.out.println( "jsessionId是:" + req.getSession().getId() );   
            String sessionId = req.getSession().getId();
            req.setAttribute( "sessionId",sessionId );
            resp.sendRedirect( path );
            
        }
        
    }
    
  4. 同一個用戶在某個Web服務中的session是相同的(cookie開啓),同一個用戶在不同的Web服務中的session是不同的

application對象

application可以被同一web項目下的任何位置訪問,所以可以存放全局變量

例子:用application實現留言功能

<%--
  Created by IntelliJ IDEA.
  User: HengTian
  Date: 2018/9/1
  Time: 19:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>留言</title>
</head>
<body>

    <form action="/example3_pane.jsp" method="post" name="form">
        輸入名字:<input type="text" name="peopleName">
        <br>留言標題:<input type="text" name="title">
        <br>留言:<br><textarea name="message" rows="10" cols="36"></textarea>
        <br><input value="提交" type="submit" name="submit">
    </form>
    <br><a href="/example3_show.jsp">查看留言板</a>
</body>
</html>

<%@ page import="java.util.Vector" %><%--
  Created by IntelliJ IDEA.
  User: HengTian
  Date: 2018/9/1
  Time: 20:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%!
        Vector v=new Vector();
        int i=0;
        ServletContext application;
        synchronized void leaveWord(String s){
            application=getServletConfig().getServletContext();
            i++;
            v.add("No"+i+","+s);
            application.setAttribute("Mess",v);
        }
    %>
    <%
        request.setCharacterEncoding("UTF-8");
        String name=request.getParameter("peopleName");
        String title=request.getParameter("title");
        String message=request.getParameter("message");
        if(name==null||name=="")
            name="guest"+(int)(Math.random()*10000);
        if(title==null||title=="")
            title="無標題";
        if(message==null||message=="")
            message="無信息";
        String s=name+"#"+title+"#"+message;
        out.println(s);
        leaveWord(s);
        %>
        <script type="text/javascript">
            alert("信息提交成功!");
        </script>
    <%
        //response.sendRedirect("example3_input.jsp");
    %>
    <a href="example3_input.jsp">返回</a>
</body>
</html>
<%@ page import="java.util.Vector" %><%--
  Created by IntelliJ IDEA.
  User: HengTian
  Date: 2018/9/1
  Time: 20:00
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        Vector v= (Vector) application.getAttribute("Mess");
        for(int i=0;i<v.size();i++){
            String s=(String)v.elementAt(i);
            //s=new String(s.getBytes("UTF-8"));
            String[] a=s.split("#");
            out.println("留言人:"+a[0]);
            out.println("標題:"+a[1]+"<br>");
            out.println("信息:"+a[2]+"<br>");
            out.println("--------------------------"+"<br>");
        }
    %>
</body>
</html>

結果:

/example3_input.jsp

1535806831003

/example3_pane.jsp

1535806919227

/example3_show.jsp

1535807007870

JavaBean

  1. bean的有效範圍

    • page

      scope取值爲page的bean只在當前頁面有效,直到頁面執行完畢

    • session

      scope取值爲session的bean在一個用戶所訪問的所有頁面都是相同的一個,在此期間,對bean的修改會影響其他界面的bean值,但是不同用戶不會這樣

    • request

      scope取值爲request的bean的存活時間略長於page,request範圍的bean在響應結束後才無效

    • application

      scope取值爲application的bean對於所有用戶都是相同的一個,修改時會相互影響,直到服務器關閉,application範圍的bean纔會無效

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