Java之Request域物件及cookie詳解
阿新 • • 發佈:2018-12-22
獲取表單中提交的資料
使用getParameter()獲取打印表單資料
private void fun1(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
// 獲得複選框的傳遞的值
String[] hobby = request.getParameterValues("hobby" );
if (hobby!= null) {
for (String h : hobby) {
System.out.println(h);
}
}
String city = request.getParameter("city");
System.out.println(username + " " + password + " " + sex + " " + city);
}
使用getParameterNames()獲取打印表單資料
private void fun2(HttpServletRequest request) {
// 利用getParameterNames()打印表單資料
Enumeration<String> enumeration = request.getParameterNames();
while (enumeration.hasMoreElements()) {
String nextElement = enumeration.nextElement();
// 根據nextElement取出對應的值
String[] strings = request.getParameterValues(nextElement);
for (String string : strings) {
System.out.println(string);
}
}
}
把表單資料封裝到物件中(getParameterMap())
把表單資料封裝到物件中(使用BeanUtils工具類)
jar包:commons-beanutils-1.9.3.jar
commons-logging-1.2.jar
注意:該物件要符合JavaBean規範
private void fun3(HttpServletRequest request) {
User user = new User();
Map<String, String[]> map = request.getParameterMap();
try {
// 引數1 要封裝的物件 引數2 map集合
BeanUtils.populate(user, map);
System.out.println(user);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
請求轉發、請求重定向、請求包含(Request)
Request也是一個域物件
域物件的內部就是維護一個map集合(新增/刪除/獲取的方法)
request域的作用範圍:一次請求當中可以獲取到域中儲存的資料
請求轉發
請求轉發只是伺服器內部的訪問,不管你怎麼寫路徑始終都在專案路徑下
private void fun1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 請求轉發 獲取轉發器
RequestDispatcher dispatcher = request.getRequestDispatcher("/demo03");
dispatcher.forward(request, response);
}
請求重定向
1.重定向是兩次請求,不能獲取到request域中的值
2.重定向既可以訪問本地伺服器也可以訪問非本地伺服器
private void fun2(HttpServletResponse response) throws IOException {
// 寫法1
// response.setHeader("location", "/sh-web-servlet03/demo03");
// response.setStatus(302);
// 寫法2
response.sendRedirect("/sh-web-servlet03/demo03");
}
請求包含
public class Demo02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 獲取字元流
PrintWriter out = response.getWriter();
// 給request域中新增值
request.setAttribute("name", "wl");
// 請求包含
request.getRequestDispatcher("/demo03").include(request, response);;
// 請求轉發 瀏覽器只能響應一次資料
// request.getRequestDispatcher("/demo03").forward(request, response);;
// 響應
out.write("123");
System.out.println("我是demo02的結尾");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class Demo03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("456");
// 獲取request域中儲存的值
Object name = (String)request.getAttribute("name");
System.out.println("我是demo03" + name);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
輸出:我是demo03wl
我是demo02的結尾
響應回網頁:456123
請求包含相當於把兩個頁面的響應合成一個響應 返回給瀏覽器
會話技術
客戶端(瀏覽器)和服務端進行互動(會話)
當瀏覽器關閉的時候這次互動結束 例如:打電話
會話中的兩個技術:
1.cookie(客戶端技術) cookie是儲存在瀏覽器的快取資料
2.HttpSession(服務端技術) HttpSession儲存在服務端
什麼是cookie?
當瀏覽器發起一個請求,請求一個servlet進行邏輯處理(例如新增一個商品進購物車)
處理完成後,給客戶端(瀏覽器)一個響應
響應攜帶著記錄了購買了什麼商品的cookie
讓瀏覽器儲存起來
1.可以儲存在記憶體當中(結束會話 cookie被清除)
2.也可以儲存在硬碟中(結束會話 依然存在 就是個檔案)
當用瀏覽器再一次請求購物車的時候會攜帶著之前儲存的cookie去訪問
第一次訪問伺服器時,由於cookie還沒有產生,是不會攜帶cookie去訪問的
只有當第一次請求後的響應中可以把cookie寫回到瀏覽器中
顯示上次登入的時間
思路:第一次訪問的時候利用cookie響應到瀏覽器中,下次在訪問的時候從cookie中把時間取出來
public class Demo04 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 讀取cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
// 遍歷陣列
for (Cookie cookie : cookies) {
if (cookie.getName().equals("lastTime")) {
// 取出cookie的值
String value = cookie.getValue();
// 字串轉long
long time = Long.parseLong(value);
// 轉成日期
Date date = new Date(time);
// 建立一個顯示的日期格式
// 引數就是你想要顯示的日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化時間
String lastTime = sdf.format(date);
// 響應回瀏覽器
response.getWriter().write("上次的訪問時間:" + lastTime);
}
}
}
// 建立cookie 記錄當前的時間
Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
/*
* 設定一下cookie的儲存路徑 工程名+配置網址路徑
* 讀取cookie是按 請求的地址尋找cookie
* 如果配置請求路徑沒有一級目錄 這樣全網站所有的網址請求都能找到這個cookie
* cookie.setPath("/");
*/
cookie.setPath("/sh-web-servlet03/servlet");
/*
* 設定cookie存活時間
* 負值表示瀏覽器關閉cookie消失
* 正值表示存活時間
* 0表示刪除cookie
*/
cookie.setMaxAge(60 * 5);
// 把cookie新增進響應當中
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
web.xml配置
<servlet>
<servlet-name>demo04</servlet-name>
<servlet-class>com.lanou3g.Demo04</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo04</servlet-name>
<url-pattern>/servlet/demo04</url-pattern>
</servlet-mapping>
記錄使用者名稱
public class Demo06 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
String username = "";
String check = "";
// 讀取cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")) {
username = cookie.getValue();
check = "checked";
}
}
}
System.out.println(username);
response.getWriter().write("<form action='/sh-web-servlet03/servlet/demo07' method='post'>");
response.getWriter().write("使用者名稱:<input type='text' name='username' value="+username+"><br>");
response.getWriter().write("密   碼:<input type='password' name='password'><br>");
response.getWriter().write("記住:<input type='checkbox' name='remember' checked="+check+"><br>");
response.getWriter().write("<input type='submit' value='登入'>");
response.getWriter().write("</form>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
public class Demo07 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
// 獲取請求的引數
String username = request.getParameter("username");
String password = request.getParameter("password");
String remember = request.getParameter("remember");
// 建立cookie
Cookie cookie = new Cookie("username", username);
//設定cookie路徑
cookie.setPath("/sh-web-servlet03/servlet");
// 處理業務邏輯
if (username.equals("sc") && password.equals("123")) {
// 判斷一下是否 記住
if (remember != null) {
// 需要記住(設定存活時間)
cookie.setMaxAge(Integer.MAX_VALUE);
} else {
// 刪除原來的cookie
cookie.setMaxAge(0);
}
// 新增到響應中
response.addCookie(cookie);
response.getWriter().write("登入成功");
} else {
response.getWriter().write("登入失敗");
// 3秒後 回登入頁面
response.setHeader("refresh", "3;url=/sh-web-servlet03/servlet/demo06");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}