使用post提交的時候參數有中文時,在接收頁面接收前必須對參數進行編碼
request.setCharacterEncoding("UTF-8");
解決獲取中文亂碼問題
使用URLEncoder解決無法在Cookie當中保存中文字符串問題
request.setCharacterEncoding("utf-8");
String username = URLEncoder.encode(request.getParameter("username"),"utf-8");
String password = URLEncoder.encode(request.getParameter("password"),"utf-8");
URLEncoder就是將URL中特殊部分進行編碼。URLDecoder就是對特殊部分進行解碼
將要顯示的文字進行URLDecoder解碼
JSP全程Java Server Pages,是一種動態網頁開發技術
- 性能更加優越,因爲JSP可以直接在HTML網頁中動態嵌入元素而不需要單獨引用CGI文件
- 服務器調用的是已經編譯好的JSP文件,而不像CGI/Perl那樣必須先載入解釋器和目標腳本
- JSP基於Java Servlets API,因此,JSP擁有各種強大的企業級Java API,包括JDBC,JNDI,EJB,JAXP等等
- JSP頁面可以與處理業務邏輯的servlets一起使用,這種模式被Java servlet 模板引擎所支持
JSP是Java EE不可或缺的一部分,是一個完整的企業級應用平臺。這意味着JSP可以用最簡單的方式來實現最複雜的應用
- 與ASP相比:JSP有兩大優勢。首先,動態部分用Java編寫,而不是VB或其他MS專用語言,所以更加強大與易用。第二點就是JSP易於移植到非MS平臺上。
- 與純 Servlets相比:JSP可以很方便的編寫或者修改HTML網頁而不用去面對大量的println語句。
- 與SSI相比:SSI無法使用表單數據、無法進行數據庫鏈接。
- 與JavaScript相比:雖然JavaScript可以在客戶端動態生成HTML,但是很難與服務器交互,因此不能提供複雜的服務,比如訪問數據庫和圖像處理等等。
- 與靜態HTML相比:靜態HTML不包含動態信息
- JSP結構
JSP常用的三個page指令:language表示編程語言、import表示導入的java包、contentType表示文件格式和字符編碼
JSP三大指令元素:include、page、taglib
JSP註釋:
1、HTML的註釋: <!--html註釋--> //客戶端可見
2、JSP的註釋: <%--html註釋--%> //客戶端不可見
3、JSP腳本註釋: //單行註釋 /**/多行註釋
JSP聲明:
<%! Java代碼%>
JSP表達式:
<%=表達式%> //注意:表達式不以分號結束
以返回值的方式打印內容
<%=printMultiTable2(out) %>
以腳本的方式輸出內容
<%printMultiTable2(out); %>
JSP內置對象
1、內置對象簡介
jsp內置對象是Web容器創建的一組對象,不使用new關鍵就可以使用的內置對象
內置對象 描述
pageContext JSP的頁面容器
request 得到用戶的請求信息
response 服務器想用戶端的迴應信息
session 用來保存每一個用戶的信息
application 表示所有用戶的共享信息
config 服務器配置,可以取得初始化參數
out 頁面輸出(向瀏覽器輸出)
page 表示從頁面中顯示出來一個Servlet實例
exception 表示JSP頁面所發生的異常,在錯誤頁中才起作用
2、四種作用域範圍
page:只在一個頁面中保存屬性,跳轉之後無效
request:只在一次請求中保存屬性,服務器跳轉後依然有效
session:在一次會話範圍中保存,無論何種跳轉都可以使用,但是新開瀏覽器無法使用
application:在整個服務器上保存,所有用戶都可以使用
3、out
out對象常用方法如下:
1、void println()向客戶端打印字符串
2、void clear()清除緩衝區的內容,如果在flush之後調用會拋出異常
3、void clearBuffer();清除緩衝區的內容,如果在flush之後調用不會拋出異常
4、void flush()將緩衝區內容輸出到客戶端
5、int getBufferSize()返回緩衝區以字節數的大小,如不設緩衝區則爲0
6、int getRemaining()返回緩衝區還剩餘多少可用
7、boolean isAutoFlush()返回緩衝區滿時,是自動清空還是拋出異常
8、void close()關閉輸出流
4、request/response
獲取單個數據:<%=request.getParameter("username") %><br>
獲取多個數據:<%String [] favorites = request.getParameterValues("favorite");
for(int i=0 ; i<favorites.length;i++){
out.println(favorites[i]+" ");
}
%>
存儲請求中的屬性和返回指定屬性的屬性值:
<%request.setAttribute("password","123456");%>
密碼:<%=request.getAttribute("password") %>
請求體的MIME類型:<%=request.getContentType() %><br>
協議類型及版本號:<%=request.getProtocol() %><br>
服務器主機名:<%=request.getServerName() %><br>
服務器端口號:<%=request.getServerPort() %><br>
請求文件的長度:<%=request.getContentLength() %><br>
請求客戶端的IP地址:<%=request.getRemoteAddr() %><br>
請求的真實路徑:<%=request.getRealPath("dologin.jsp") %><br>
請求的上下文路徑:<%=request.getContextPath() %> <br>
重定向: response.sendRedirect("dologin.jsp");
請求轉發: request.getRequestDispatcher("request.jsp").forward(request,response);
5、session
當把所有和對應網站的頁面都關了,那麼,該網站分配給該用戶的session結束
getCreationTime()會返回session創建時間,但是是一個數字串,要通過SimpleDateFormat該格式
<% SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date(session.getCreationTime());
%>
session創建時間:<%=sdf.format(d) %>
session的ID編號:<%=session.getId() %><br>
定義屬性,即使頁面調轉也可以獲取
session.setAttribute("username","admin");
session中獲取用戶名:<%=session.getAttribute("username") %><br>
獲取所有定義好的session屬性的名稱:
String [] names = session.getValueNames();
for(int i = 0 ; i<names.length;i++)
{
out.println(names[i]+" ");
}
設置當前session最大生成期限 單位是秒
session.setMaxInactiveInterval(10);
1
setProperty動作會自動將表單提交的內容自動匹配到javaBean中(實例化並且賦值)
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
<h1>setProperty動作元素</h1>
<hr>
<!-- 根據表單自動匹配所有的屬性 -->
<jsp:setProperty property="*" name="myUsers"/>
2
根據自己設定固定的幾個屬性匹配
<jsp:useBean id="myUsers" class="com.po.Users" scope="page"/>
<h1>setProperty動作元素</h1>
<hr>
<!-- 根據表單自動匹配所有的屬性 -->
<jsp:setProperty property="username" name="myUsers"/>
3
和表單無關,自己設置值給javabean
<jsp:setProperty
property="username"
name="myUsers"
value="冰玉"/>
<jsp:setProperty
property="password"
name="myUsers"
value="88888"/>
4
跟request參數關聯
通過URL傳參數給屬性賦值
<jsp:setProperty
property="password"
name="myUsers"
param="mypass"/>
根據地址欄的參數名獲取參數值賦值給property
getProperty
<!-- 使用傳統的表達式獲取用戶名和密碼 -->
用戶名:<%=myUsers.getUsername()
%><br>
密碼:<%=myUsers.getPassword()
%><br>
<!-- 使用getProperty方式獲取用戶名和密碼 -->
用戶名:<jsp:getProperty
property="username"
name="myUsers"/><br>
密碼: <jsp:getProperty
property="password"
name="myUsers"/><br>
forward動作
語法:
<jsp:forward page="URL"/>
等同於: request.getRequestDispatcher("/url").forward(request,response);
<jsp:forward page="user.jsp"/> 相當於服務器內部跳轉
等價於: <% request.getRequestDispatcher("user.jsp").forward(request,response); %>
Param動作
語法: <jsp:param name="參數名" value="參數值">
常常與<jsp:forward>一起使用,作爲其的子標籤
在使用forward跳轉之前可通過Param動作傳遞一些參數
在跳轉後的頁面使用 request.getParameter("name");來獲取
實現DBHelper類型
String driver = "com.mysql.jdbc.Driver"; //數據庫驅動
//鏈接數據庫的URL地址
String url = "jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8
String username="root"; //數據庫的用戶名
String password=""; //數據庫的密碼