文章目錄
JSP小結
HTTP協議是一種無狀態協議。一個用戶想服務器發出請求(reuqest),然後服務器返回響應(response)
處理request中文亂碼
-
對信息重新編碼
//先將獲取的信息重新編碼,將編碼的值存到字節數組中,然後將數組轉化爲字符串 /** * 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"));
-
request設置編碼
request.setCharacterEncoding("UTF-8");
response對象
-
contentType屬性(page指令設置的contentType)
當一個用戶請求訪問jsp頁面時,該頁面用page指令設置頁面的contentType屬性的值來響應堆頁面的請求
-
動態響應contentType
可以用response.setContentType()動態改變contentType屬性
-
response添加頭響應
如response.setHeader(“Refresh”,“5”);定時刷新
-
response重定向
response.sendRedirect("");
-
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的內容:這是一個測試文件。
-
response.getOutputStream()
response.getOutputStream()可以獲得一個指向用戶的輸出流,服務器將文件寫入這個流,用戶就可以通過這個進行文件下載。當提供下載功能時,應當使用response對象向用戶發送HTTP頭信息,這樣用戶的瀏覽器就會調用相應的外部程序打開下載的文件,response通過setHeader方法添加下載頭的格式如下:
response.setHeader("Content-disposition","attachment;filename="+"下載文件名");
谷歌瀏覽器會彈出如下提示:
重定向和轉發的區別
-
sendRedirect方法
response.sendRedirect("目標url");
重定向方法僅僅將用戶從當前頁面或者當前servelet定向到另一個JSP頁面或servlet,但不能將用戶對當前頁面或servlet的請求轉發給所定向的資源,重定向的目標頁面無法使用request獲取用戶提交的數據。
-
RequestDispatcher對象
request.getRequestDispatcher("目標url").forward(request,response);
RequestDispatcher對象可以把用戶對當前頁面的請求和響應都傳遞轉發到下一個頁面
session對象
-
session對象由Tomcat服務器創建,實現了HttpSession接口。
-
session對象的生命週期取決於
- 是否到達最長"發呆"時間(用戶對某個Web目錄下的JSP頁面發出請求並得到響應,如果用戶不再對該Web服務目錄發出請求,那麼進入"發呆"狀態)
- 服務器是否關閉
- session是否調用了invalidate()方法
-
如何保證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 ); } }
-
同一個用戶在某個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
/example3_pane.jsp
/example3_show.jsp
JavaBean
-
bean的有效範圍
-
page
scope取值爲page的bean只在當前頁面有效,直到頁面執行完畢
-
session
scope取值爲session的bean在一個用戶所訪問的所有頁面都是相同的一個,在此期間,對bean的修改會影響其他界面的bean值,但是不同用戶不會這樣
-
request
scope取值爲request的bean的存活時間略長於page,request範圍的bean在響應結束後才無效
-
application
scope取值爲application的bean對於所有用戶都是相同的一個,修改時會相互影響,直到服務器關閉,application範圍的bean纔會無效
-