文章目錄
- Day 3
- 解決亂碼問題
- Request
- 會話
- Cookie
- Session
Day 3
2019年7月15日。
這是我學習JavaWeb的第三天。
這一天,我學到了以下的知識。
解決亂碼問題
所有能設定編碼的地方都統一設定 : 資料庫,資料庫字段,Servlet程式,請求,響應 , 前端,浏覽器。
Request
擷取屬性:使用Request對象,可以擷取到web項目的相關屬性,代碼如下:
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//檢視request對象的方式
System.out.println(request.getContextPath()); //獲得web項目路徑
System.out.println(request.getRequestURI()); //請求的URL路徑
//Remote 遠端
System.out.println(request.getRemoteUser()); //獲得遠端的使用者名
System.out.println(request.getRequestedSessionId()); //獲得SessionId;
System.out.println(request.getServletPath()); //請求servlet的url
System.out.println(request.getLocalAddr()); //獲得本地位址 防火牆
System.out.println(request.getLocalName()); //獲得本地名字
System.out.println(request.getLocalPort()); //獲得通路的端口号
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
接收前端使用者送出的參數:通過Request對象,可以擷取到使用者從前端送出的資料,步驟如下:
- 編寫前端注冊jsp頁面
- 表單送出的方式:get/post(推薦)
- 表單送出的位置action:服務項目的路徑/servlet對應的請求url
- JSP中,擷取項目路徑的文法為:
${pageContext.request.contextPath}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注冊</title>
</head>
<body>
<%--
JSP的注釋
--%>
<%--
Form表單
action:代表要送出的路徑,表單要送出到哪裡 ,可以送出到一個Servlet
//送出到Servlet需要,擷取到Web項目的路徑下的Servlet
method: 送出表單的方式
--%>
<h1>注冊</h1>
<form action="${pageContext.request.contextPath}/r2" method="post">
<p>使用者名:<input type="text" name="username"></p>
<p>密碼:<input type="password" name="password"></p>
<p>
<input type="submit">
<input type="reset">
</p>
</form>
</body>
</html>
-
寫處理前端送出資訊的Servlet
接收前端傳遞的控件資訊,利用
來實作request.getParameter("控件的name")
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//處理前端送出過來的資料
public class RequestDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通過HttpServletRequest擷取前端使用者送出的資訊
//req.getParameterValues(); 獲得前端傳遞的控件資訊,通過控件的name;但是可以接受多個參數的控件,比如(多選框....)
//req.getParameter(); 獲得前端傳遞的控件資訊,通過控件的name;
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
//連接配接資料庫,比較資料庫中的資訊是否比對
if (username.equals("admin")&&password.equals("1234567")){
System.out.println("登入成功!"); //跳轉到成功頁面
}else {
System.out.println("登入失敗!"); //提示重新注冊
}
System.out.println(username);
System.out.println(password);
}
}
- 配置web.xml
<servlet>
<servlet-name>RequsetDemo02</servlet-name>
<servlet-class>servlet.RequestDemo02</servlet-class>
</servlet>
<!--=====================================================-->
<servlet-mapping>
<servlet-name>RequsetDemo02</servlet-name>
<url-pattern>/r2</url-pattern>
</servlet-mapping>
- 送出測試
- 檢查英文送出情況,伺服器是否能接受成功
- 送出中文,檢視亂碼情況
- 設定編碼統一,解決亂碼問題
Request實作請求轉發:通過Request對象,可以實作請求轉發,代碼如下:
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FormServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//處理亂碼
req.setCharacterEncoding("UTF-8");
//處理前端的請求
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("接收到的使用者名:"+username+"\n密碼:"+password+"\n愛好:");
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//重定向:伺服器告訴用戶端你應該請求另外一個位址; (位址欄會變)
//resp.sendRedirect("url");
//轉發:伺服器把這個請求轉向另外一個Servlet去處理; (位址欄不會變)
//RequestDispatcher ,需要使用RequestDispatcher來進行處理,我們需要獲得這個類
//參數就是他要轉發到的頁面
/*
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/success.jsp");
requestDispatcher.forward(req,resp);
*/
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
}
既然提到了轉發,就不得不提到轉發和重定向的差別,它們的差別如下:
- 重定向:伺服器告訴用戶端,去請求另外一個位址(用戶端行為)
- 位址欄會變
- 不能攜帶參數
- 轉發:伺服器自己轉發到伺服器上的另一個請求(伺服器行為)
- 位址欄不會變
- 可以攜帶參數
會話
會話字面意思:一次交流或交談
在Web中,會話表示從浏覽器打開某個網站,在這個網站中無論操作了什麼,知道關閉浏覽器,這一個過程,稱之為一個會話。
怎麼樣算會話結束:
- 用戶端關閉了
- 服務端銷毀了
為什麼要處理會話:
長期保持會話,無論使用者關閉少次浏覽器,這個會話都會存在。
比喻:
你昨天來了教室,我今天需要知道你昨天來了教室;
- 你留下一個标記,讓我知道你來過
- 你告訴我你來這邊,我需要記錄你來了;
你:用戶端
我 :伺服器
Javaweb中針對這兩個不同的端,誕生了兩個小機制
- cookie :在用戶端留下一點東西,用戶端下次帶過來,我就知道你來過了。
- 問:我的店鋪非常大,怎麼證明你來過?
- 答:你開一個會員吧 , 我給你一張V國際電話預付卡,你下次帶卡來,我就知道你來過了
- Session:在伺服器端登記你來過。
- 問:你去理發店。怎麼證明你來過?
- 答:理發店收會員,在他的筆記本上記錄了你的消息,下次你來直接報上大名就可以了。
Cookie
構造器:
Cookie cookie = new Cookie(String name,String value);
Cookie cookie = new Cookie(String name,String value);
Cookie cookie = new Cookie(String name,String value);
伺服器響應cookie給用戶端:
Response.addCookie(Cookie);
Response.addCookie(Cookie);
Response.addCookie(Cookie);
服務檢視使用者帶來的請求是否有cookie:
Cookie[] cookies = Request.getCookie();
//可以使用cookie來驗證使用者是否來過
//判斷cookies是否為空,然後周遊即可
Cookie.getName();
Cookie.getValue();
cookie測試使用者是否來過
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieTest extends HttpServlet {
boolean flag = false;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解決亂碼問題:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//檢查請求的人是否帶了Cookie
//通過使用者的請求,檢查它是否有cookie
Cookie[] cookies = request.getCookies();
System.out.println("cookie:"+cookies);
if (flag){//如果flag是真,來過
if (cookies!=null){//你有cookie
for (int i = 0; i < cookies.length ; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastLoginTime")){
response.getWriter().println("你上一次來的時間為:"+cookie.getValue());
System.out.println("重新整理了cookie");
}
}
}
}else { //如果flag是真,沒來過
response.getWriter().println("你是第一次來,還想要會員套餐");
System.out.println("給該使用者一個cookie");
}
//建立一個cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//設定cookie儲存的時間 //cookie.setMaxAge();
//把這個cookie發給用戶端
response.addCookie(cookie);
//response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
flag = true;
}
}
Session
隻要用戶端一旦連接配接上伺服器,伺服器就會自動産生Session;
一個連接配接對應一個session,session可以在一個會話中傳遞資訊;
通過
setAttribute
設定值。
通過
getAttribute
獲得值。
由伺服器端控制,伺服器如果重新開機了,資訊就會丢失!
- 第一個Servlet(将值存入session)
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解決亂碼問題:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//Session由伺服器自動建立,如何獲得session
//HttpSession 得到的sessioin對象
HttpSession session = req.getSession();
//得到sessionID,一次會話,一個seesionID;
String id = session.getId();
resp.getWriter().println("獲得的sessionId:\n"+id);
String name = "qinjiang";
//向session中存入一個值;
session.setAttribute("name",name);
resp.getWriter().println("存入資訊成功:"+name);
}
}
- 第二個Servlet(從session取出值)
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
//獲得session存入的值
public class SessionTest2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解決亂碼問題:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//獲得
HttpSession session = req.getSession();
System.out.println("得到的SessionID:"+session.getId());
String name = (String) session.getAttribute("name");
resp.getWriter().println("得到的session存入的資訊"+name);
//Servlet < Seesion < WebContext
}
}
- 會話登出方法一
session.invalidate();//通過代碼登出會話
- 會話登出方法二
<!--session-config可以設定會話自動過期,時間分鐘為機關-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>