日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3))

發(fā)布時間:2024/4/24 223 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3)) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1.cookie:再次時請求頭攜帶cookie到服務(wù)端
  • 2.登陸案例_記住我:js訪問瀏覽器數(shù)據(jù)用document
  • 3.session:根據(jù)sessionid,服務(wù)器才能找到session(session對象在服務(wù)器內(nèi)存中增加壓力)
  • 4.登錄案例_驗證碼:request.getSession().setAttribute("code",sb.toString())
  • 5.web中的k-v存儲們:同一域名下可以互相調(diào)用
    • 5.1 localStorage/sessionStorage:關(guān)閉網(wǎng)頁后,sessionStorage被自動刪除,且不支持跨標(biāo)簽頁,跨瀏覽器更不支持。
    • 5.2 session:同一個瀏覽器下打開不同標(biāo)簽共享cookie,因而共享了session。新瀏覽器會清除所有cookie,獲取不到session內(nèi)容了
  • 6.登錄案例_jsp引入:(String) request.getAttribute(" ")
  • 7.EL:${ } = get
  • 8.JSTL:全用標(biāo)簽
  • 9.登錄案例_直接訪問success邏輯問題:request.getSession().get/setAttribute


1.cookie:再次時請求頭攜帶cookie到服務(wù)端







如下localhost是域名,不包含協(xié)議和端口。


瀏覽器的設(shè)置中搜索cookies - 網(wǎng)站設(shè)置 - localhost。

如下方式只能查看當(dāng)前域名的cookies,如上方式可以查所有域名cookies。

Map是很多個鍵值對,Entry同Map但就一個鍵值對。Cookies(類)在瀏覽器和服務(wù)器之間發(fā)來發(fā)去,所以不能超過4K,太大會卡。 cookie的域名過濾第一遍,訪問資源位置即cookie的路徑過濾第二遍。

只有l(wèi)ocalhost(域名)默認(rèn)cookie存活時間是瀏覽器打開到關(guān)閉(不是窗口),如下改為30天(游客訪問京東購物車一般也為30天)。在瀏覽器的設(shè)置里搜索清除瀏覽數(shù)據(jù)。

如下name雖相同,但是路徑不同,不會覆蓋。name相當(dāng)于文件名,value相當(dāng)于文件內(nèi)容,同路徑同name就會覆蓋。

如上瀏覽器現(xiàn)在有兩個cookies:一個是 / product galaxyNote7,另一個是 /abc product huawei。這兩個cookies都會被攜帶進(jìn)如下/abc…服務(wù)器。

2.登陸案例_記住我:js訪問瀏覽器數(shù)據(jù)用document

如下瀏覽器自帶在設(shè)置中搜索:密碼。如下兩個cookies,一個保存用戶名,另一個保存密碼。

//改進(jìn)【Java34】中 login.html <!DOCTYPE html> <html lang="en"> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>登錄頁面</title><link href="css/bootstrap.min.css" rel="stylesheet"><link href="css/login.css" rel="stylesheet"><script src="js/jquery.js"></script><script src="js/bootstrap.js"></script><script>// object = {n1:v1, n2:v2} //js中的對象/* var cookie = { //cookie對象定義了一個getCookie方法getCookie: function (key) {return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;}};*/ //你傳入key=name,getCookie函數(shù)返回value=adminvar getCookie = function (key) { //匿名函數(shù),脫離對象,不需要用cookie對象調(diào)用,直接調(diào)函數(shù)名return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;}//document.cookie 可以訪問到當(dāng)前頁面域名下的所有cookie信息//console.log(document.cookie) -> name=admin; pwd=123 需要上面.replace按分號等切割 </script><!--1111111111111111111111111111111111111111111111111111111111111111111111--><script> $(function () { //頁面加載后執(zhí)行的事件var name = getCookie("name"); //上面script定義的getCookievar pwd = getCookie("pwd");/* if(name != null && name != ""){}*/if(name && pwd){ //判空同上 ,js中空字符串也就是false$("#name").val(name) //id選擇器,往body網(wǎng)頁文本框填入$("#pwd").val(pwd)$("#remember").prop("checked",true) //name和pwd都不為空,勾起}})</script><!--11111111111111111111111111111111111111111111111111111111111111111111111--><script>function changeImg(img) { //瀏覽器檢測到網(wǎng)頁的元素或?qū)傩愿淖?會自動刷新網(wǎng)頁(點擊驗證碼刷新)var time = new Date().getTime(); //時間撮img.src = "/codeServlet?time="+time //讓它變,不能不加參數(shù)或故意寫錯即/codeServlet2,會報404,time=..這個參數(shù)一并發(fā)給服務(wù)器,雖服務(wù)器用不到,但整個屬性值變了。}</script> </head><!--1111111111111111111111111111111111111111111111111111111111111111111111111111111111111--> <body><div class="container"><form class="form-signin" action="/LoginServlet"><h2 class="form-signin-heading text-center">登錄頁面</h2><input type="text" id="name" name="username" class="form-control" placeholder="用戶名" required autofocus><input type="password" id="pwd" name="password" class="form-control" placeholder="密碼" required><input type="text" placeholder="驗證碼" name="code" class="form-control"><img src="/codeServlet" alt="" onclick="changeImg(this)"> <br><input type="checkbox" id="remember" name="remember" value="yes"> 記住我<button class="btn btn-lg btn-primary btn-block" type="submit">登錄</button></form></div> </body> </html>

package com.itheima.login.web; import com.itheima.login.service.LoginService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException;@WebServlet(urlPatterns = "/LoginServlet") public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/** TODO: session : code* */String code = request.getParameter("code"); //獲取前端用戶寫的發(fā)送的code參數(shù)即輸入驗證碼框 // HttpSession session = request.getSession(); //request.getSession()掛號,response只有.addCookie()String rightCode = (String) request.getSession().getAttribute("code"); //服務(wù)器通過codeServlet.java生成的if(!rightCode.equalsIgnoreCase(code)){ //驗證碼錯誤其實不應(yīng)該跳到error.html ,應(yīng)該停留在當(dāng)前頁面顯示錯誤提示,這整段應(yīng)該寫在其他邏輯前面 request.getRequestDispatcher("/error.html").forward(request,response); //跳轉(zhuǎn)到失敗頁面}//111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 String username = request.getParameter("username"); //拿到前端的參數(shù)String password = request.getParameter("password");//逆向編程 : 沒有的先當(dāng)它有LoginService service = new LoginService();boolean result = service.login(username,password); if(result){/** TODO: cookie : username ,password * */String remember = request.getParameter("remember"); //前端 記住我 傳來的參數(shù)if("yes".equals(remember)){Cookie nameCookie = new Cookie("name", username); //沒有做數(shù)據(jù)庫校驗Cookie pwdCookie = new Cookie("pwd", password);nameCookie.setMaxAge(60*60*24*30); //存活30天pwdCookie.setMaxAge(60*60*24*30);response.addCookie(nameCookie);response.addCookie(pwdCookie);}response.sendRedirect("/success.html"); //重定向的簡易api}else{ request.getRequestDispatcher("/error.html").forward(request,response); //登錄失敗,請求轉(zhuǎn)發(fā)}} }


如下在控制臺輸出,在html中一樣,用于數(shù)據(jù)回顯。

3.session:根據(jù)sessionid,服務(wù)器才能找到session(session對象在服務(wù)器內(nèi)存中增加壓力)

病歷本session,session記錄大量信息,直接進(jìn)行傳遞會卡,所以用cookie傳sessionid(Cookie將sessionid傳來傳去,4k不宜過大,Cookie用sessionid標(biāo)記用戶)。cookie默認(rèn)生命周期是會話即關(guān)閉瀏覽器同理session也是。

如下掛號這一行代碼都一樣,小域?qū)ο髍equest獲取大域?qū)ο髎ession。< session - config > 是在tomcat軟件解壓后的conf文件夾里的web.xml(如訂單30分鐘不付款就會自動取消了)。

解決關(guān)閉瀏覽器cookie就沒了?用Session持久化方案覆蓋了tomcat默認(rèn)生成的cookie即上面灰字(因為session默認(rèn)保留30分鐘,所以sessionid即cookie設(shè)為30分鐘)。



如下刪除后每次訪問,生成的sessionid都是不一樣的。

4.登錄案例_驗證碼:request.getSession().setAttribute(“code”,sb.toString())

如下紅字:一個存,一個取,該用什么載體實現(xiàn)存取?如最右邊。如下是兩次請求,不是一次請求鏈,所以request不行。存在session里好處:30分鐘后自動沒了。

login.html和LoginServlet.java見前面第二章節(jié)中。

//如下gui不需要掌握,被JavaME嵌入式代替 , codeServlet.java package com.itheima.login.web; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;@WebServlet("/codeServlet") public class CodeServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// gui 生成圖片// 1 高和寬int height = 50;int width = 70;String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";Random random = new Random();// 2 創(chuàng)建一個圖片BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 3 獲得畫板Graphics g = image.getGraphics();// 4 填充一個矩形// * 設(shè)置顏色g.setColor(Color.BLACK);g.fillRect(0, 0, width, height);g.setColor(Color.WHITE);g.fillRect(1, 1, width - 2, height - 2);// * 設(shè)置字體g.setFont(new Font("宋體", Font.BOLD | Font.ITALIC, 25));StringBuffer sb = new StringBuffer();// 5 寫隨機(jī)字for (int i = 0; i < 4; i++) {// 設(shè)置顏色--隨機(jī)數(shù)g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));// 獲得隨機(jī)字int index = random.nextInt(data.length());String str = data.substring(index, index + 1);// 寫入g.drawString(str, width / 6 * (i + 1), 20);sb.append(str);// 獲取驗證碼數(shù)據(jù)}//TODO: 驗證碼保存到session中,完成上面的第一步:服務(wù)器生成驗證碼并進(jìn)行保存request.getSession().setAttribute("code",sb.toString()); //這行最重要System.out.println("作弊:" + sb.toString());// 6 干擾線for (int i = 0; i < 3; i++) {// 設(shè)置顏色--隨機(jī)數(shù)g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));// 隨機(jī)繪制先g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));// 隨機(jī)點g.drawOval(random.nextInt(width), random.nextInt(height), 2, 2);}// end 將圖片響應(yīng)給瀏覽器ImageIO.write(image, "jpg", response.getOutputStream());} }


5.web中的k-v存儲們:同一域名下可以互相調(diào)用

F12 - Application - 左側(cè)如下一條cookies。在console中輸入document.cookie查看數(shù)據(jù)信息:document.cookie="kkk=vvv"設(shè)置cookie,點擊如下http://www.baidu…可查看到kkk vvv信息。

同域名可用:打開另一個標(biāo)簽,同樣百度頁面甚至可以搜索一些內(nèi)容,F12 - Application - 左側(cè)Cookies中同樣可看到"kkk=vvv",注意不能跨瀏覽器。Cookies既然有k v的作用了,那客戶端里為什么還要有l(wèi)ocal storage和session storage呢?

因為每次進(jìn)行請求時,如下請求百度首頁,可以看到request header中會攜帶cookies信息,每次請求時都會將全量的cookies信息作為請求的一部分進(jìn)行上傳如下圖所示,這樣cookies存儲的數(shù)據(jù)不能太大,太大的話每次進(jìn)行提交浪費(fèi)帶寬。

5.1 localStorage/sessionStorage:關(guān)閉網(wǎng)頁后,sessionStorage被自動刪除,且不支持跨標(biāo)簽頁,跨瀏覽器更不支持。

所以在Html5中提出新的概念用localstorage進(jìn)行存儲,localstorage和cookies用法一致:1.console中輸入localStorage.setItem("kk","vv"),同理在Application中點開如上Local Storage中http://www.baidu…查看到kk vv信息。2.console中輸入sessionStorage.setItem("k","v"),同理在Application中點開Session Storage中http://www.baidu…查看到k v信息,sessionStorage.getItem(“k”)。

5.2 session:同一個瀏覽器下打開不同標(biāo)簽共享cookie,因而共享了session。新瀏覽器會清除所有cookie,獲取不到session內(nèi)容了

打開XAMPP的Apache服務(wù)。

1.如下設(shè)置session。


2.如下在另一個頁面讀取session,說明session設(shè)置在服務(wù)端。


session存在服務(wù)端能唯一辨識客戶端,如下打開新的無痕(inprivate)窗口(相當(dāng)于新的瀏覽器),無法讀到。新瀏覽器必須先訪問localhost。

php版本的session運(yùn)行的原理是什么?通過cookie記錄sessionid如下,php服務(wù)端為每個客戶端起一個phpsessid,這個id在服務(wù)端對應(yīng)數(shù)據(jù)存儲區(qū)域,再次訪問cookie中有phpsessid,服務(wù)端解析到這個瀏覽器對應(yīng)的一片區(qū)域的存儲內(nèi)容。服務(wù)端存儲結(jié)構(gòu):phpsessid-[k-v],每個瀏覽器分到一個不同id,因而各個數(shù)據(jù)是獨(dú)立存儲的。

存儲在服務(wù)端的session有什么好處呢?最大好處是這個數(shù)據(jù)在客戶端沒有任何信息,只有它自己的標(biāo)識id,這個id是沒有任何用的,也是隨時變化的。客戶端不能通過腳本修改服務(wù)端的session,前面的localstorage這些都可以通過setItem的js腳本修改增加,session無法修改,安全性更高,適合用戶敏感型數(shù)據(jù)的記錄,存在客戶端的這三種適合頁面端的常用數(shù)據(jù)的記錄。

6.登錄案例_jsp引入:(String) request.getAttribute(" ")

A和B對瀏覽器來說,不是同一個網(wǎng)頁,B會覆蓋A。錯誤提示信息是在LoginServlet里,傳遞到B,所以有數(shù)據(jù)傳遞用請求轉(zhuǎn)發(fā)。login.html對應(yīng)紅色橫線,但.html寫不了java的request.getA…

如下右邊瀏覽器沒有解析。

點擊烏龜默認(rèn)訪問index.jsp,因為index.jsp被刪了,所以自動跳出瀏覽器顯示404。

如上路徑就是如下,原來ROOT路徑下為空(發(fā)布項目需要發(fā)在ROOT路徑下),如下訪問下服務(wù)器中的hello.jsp生成org/…

tomcat將hello.jsp翻譯成hello_jsp.java再編譯運(yùn)行,只要證明hello_jsp這個類是servlet,則hello.jsp就是servlet。hello_jsp extend org…包名.類名:把tomcat中l(wèi)ib目錄下jasper.jar解壓,證明HttpJspBase.class是servlet就行,拖到idea中自動反編譯成.java文件。


如下HttpJspBase.class反編譯繼承了HttpServlet,所以是Servlet。

如下是在上面的類中,子類必須重寫_jspService,等價于service方法。

//syntax.jsp <%@ page import="java.io.PrintWriter" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%-- 如上一行文檔聲明: 響應(yīng)體的格式和編碼, 語言默認(rèn)翻譯成java --%> <%-- JSP的主體代碼 是 html 。 如何在html混入java : 三種注釋語法: --%> <%--1. 腳本片段 !!!最常用1. 核心: 會被翻譯到Servlet的service方法中2. 語法: <% 代碼 %>2. 腳本表達(dá)式1. 核心: 簡化 out.print2. 語法: <%="要輸出的內(nèi)容"%>3. 腳本聲明1. 核心: 會被翻譯到Servlet的成員位置(聲明方法,成員屬性)2. 語法: <%! 代碼 %> --%> <html> <head><title>Title</title> </head>//111111111111111111111111111111111111111111111111111111111111111111111111111111 <body><div><hr><%/** JSP中兩種響應(yīng)體輸出流(字符), 如下兩者不一樣, 效果相同。* 1. PrintWriter (優(yōu)先級高于out,也高于< hr > ,所以不用)* 2. out !!! 推薦用 * */out.print("out");System.out.println("xx");PrintWriter writer = response.getWriter(); //在service方法中有response參數(shù) // writer.print("writer"); System.out.println("out:" + out);System.out.println("writer:" + writer);%>//111111111111111111111111111111111111111111111111111111111111111111111111111111 <hr><%out.print("xx");%><%="yy"%>//1111111111111111111111111111111111111111111111111111111111111111111111111111 <hr> <%!public void method01(){ //service方法中又定義了method01方法,注意上行有個 !號}%><%method01(); //service方法里調(diào)用%></div> </body> </html>


如下解決問題:請求轉(zhuǎn)發(fā),將【Java31】中驗證碼輸錯改進(jìn)(再次掛號得到之前本子設(shè)的code信息,與前端輸入的比較)。

如下也在LoginServlet.java中請求轉(zhuǎn)發(fā),將【Java31】中用戶名和密碼輸錯改進(jìn)。

//login.html改為login.jsp(新建jsp文件的第一行保留),前面不變 <body> <div class="container"><form class="form-signin" action="/LoginServlet"><h2 class="form-signin-heading text-center">登錄頁面</h2><%--TODO: JSP --%><span style="color: red"><%String errorMsg = (String) request.getAttribute("errorMsg"); //errorMsg由LoginServlet.java中請求轉(zhuǎn)發(fā)而來if(errorMsg != null){ //剛進(jìn)來A頁面,沒錯誤,為nullout.print(errorMsg);}%></span><%-- todo: EL--%><input type="text" id="name" name="username" class="form-control" placeholder="用戶名" required autofocus value="${cookie.name.value}"><input type="password" id="pwd" name="password" class="form-control" placeholder="密碼" required value="${cookie.pwd.value}"><input type="text" placeholder="驗證碼" name="code" class="form-control"><img src="/codeServlet" alt="" onclick="changeImg(this)"> <br><%-- 用戶名+密碼 cookie 不為null,checked --%><input type="checkbox" id="remember" name="remember" value="yes" ${cookie.name.value !=null && cookie.pwd.value !=null ? "checked" : ""}> 記住我<button class="btn btn-lg btn-primary btn-block" type="submit">登錄</button></form> </div> </body> </html>

LoginServlet.java相當(dāng)于A模塊(Servlet),login.jsp相當(dāng)于B模塊(Servlet),兩者都在服務(wù)器里,通過request請求轉(zhuǎn)發(fā)。

7.EL:${ } = get

//el.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><!--小域?qū)ο罂色@取大域?qū)ο?#xff0c;pageContext是最小的域?qū)ο蟆ervletContext也叫application,因為servletContext生命周期和應(yīng)用是等長的。.jsp文件中四大域?qū)ο蠖荚?#xff0c;所以之前【Java36】中將index.jsp刪除,避免影響。剛運(yùn)行服務(wù)器默認(rèn)會打開index.jsp,這樣session會被獲取到,以后不是第一次掛號。pageContext < request < session < servletContext只在jsp里起作用 一次請求鏈(請求轉(zhuǎn)發(fā):橫跨多個模塊) servletContext:可獲取項目相對路徑pageContext:out=pageContext.getOut(),session=pageContext.getSession()1. 生命周期:命名為Context即上下文,要和一個東西綁定pageContext 隨著當(dāng)前 JSP頁面 的創(chuàng)建而創(chuàng)建(打開),銷毀(跳到其他頁面)而銷毀2. Map容器--> <!--EL : expression language 表達(dá)式語言。表達(dá)式: 用簡單的符號或表達(dá)式來替代復(fù)雜的內(nèi)容(簡化代碼)1. 簡化從域?qū)ο笾腥≈?#xff1a;登陸案例從jsp里取值再顯示在網(wǎng)頁上。${表達(dá)式}1. 標(biāo)準(zhǔn)${pageScope.name1} -> String name1 = (String) pageContext.getAttribute("name1");${requestScope.name2}${sessionScope.name3}${applicationScope.name4}2. 簡略${name} 取值順序: 四個域?qū)ο髲男〉酱?-><div><%//四大域?qū)ο髉ageContext.setAttribute("name1","value1");request.setAttribute("name2","value2");session.setAttribute("name3","value3");application.setAttribute("name4","value4");//下行沒必要,因為request在service方法里是形參,默認(rèn)由tomcat創(chuàng)建好了pageContext.getRequest() %><%String name1 = (String) pageContext.getAttribute("name1");out.print(name1); //在這個頁面點瀏覽器小圖標(biāo)即localhost:8080/el.jsp,網(wǎng)頁顯示value1%>${name1} //同上兩行<hr><%-- 標(biāo)準(zhǔn),Scope范圍意思 --%>${pageScope.name1}${requestScope.name2}${sessionScope.name3}${applicationScope.name4}<hr>${name1}${name2}${name3}${name4}<hr><% // pageContext.setAttribute("name","value1"); //一般不會用相同的name // request.setAttribute("name","value2"); // session.setAttribute("name","value3"); //這行注釋了,只要瀏覽器沒關(guān),一直存在session里。application.setAttribute("name","value4");%>${name} //只能顯示一個,從小域?qū)ο蟮酱蟆?span id="ozvdkddzhkzd" class="token tag"></div> </body> </html> //el02.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><div><%/** el 簡化從cookie中的取值操作* 1. ${cookie.xx} -> 獲得name=xx的cookie對象* 2. ${cookie.xx.name} -> cookie.getName()* 3. ${cookie.xx.value} -> cookie.getValue() (常用)* */Cookie nameCookie = new Cookie("key", "admin");response.addCookie(nameCookie);%> <hr><%Cookie[] cookies = request.getCookies(); // 以前這樣取cookies for (Cookie cookie : cookies) {String name = cookie.getName();if("key".equals(name)){String value = cookie.getValue();System.out.println(cookie); // 打印對象System.out.println(name+"-"+value);}}%><hr>${cookie.key}${cookie.key.name} ${cookie.key.value}</div> </body> </html>

如下第一行是cookie對象,如下是上面?zhèn)鹘y(tǒng)打印結(jié)果。

如下是上面el打印結(jié)果,沒換行。

如下把key


如下是回顯用戶名和密碼改進(jìn),最后添加value表示初始值。

同理如下滿足條件的話,初始時就鉤住記住我。

//el_03.jsp<%@ page import="java.util.ArrayList" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><div><%request.setAttribute("n1",10);request.setAttribute("n2",4);%>${n1} , ${n2} <br> ${n1/n2} , ${n1 >= n2} ${n1 ge n2} <br> //greater than or equals 同上行 ${n1>n2?"大" : "小"} <hr> <%/** empty 表達(dá)式 (EL表達(dá)式最主要簡化從域?qū)ο笾腥≈挡僮?* 1. 容器,沒有元素, true* 2. 對象,沒有地址 true* */String str = "";ArrayList<String> list = new ArrayList<>();Object obj = null;request.setAttribute("str",str);request.setAttribute("list",list);request.setAttribute("obj",obj);%>${empty str} ${empty list}${not empty obj}</div> </body> </html>

8.JSTL:全用標(biāo)簽

如下放入lib文件夾并右擊add as library。

//jstl.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--<%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>--%> <%--前綴: c , uri= core (四大定制標(biāo)簽庫: java核心, xml,sql...)uri引用的哪個標(biāo)簽庫, 前綴是用來區(qū)分關(guān)鍵字出自哪個標(biāo)簽庫的,如下 c --%> <html> <head><title>Title</title><c:if test=""></c:if> </head><!--111111111111111111111111111111111111111111111111111111111111111111111111--> <body><!--jsp : html + java 最終翻譯成 java程序員在編寫jsp的時候,閱讀性太差, 兩種語言混雜不清, 不利于長期維護(hù)做法: 希望需要書寫jsp中的java代碼的時候,用html標(biāo)簽來代替(書寫風(fēng) 格統(tǒng)一,提高代碼閱讀性)JSTL: jsp standard tag library JSP標(biāo)準(zhǔn)標(biāo)簽庫(java代碼 和 html標(biāo)簽之間的轉(zhuǎn)換規(guī)則)使用: 1. 導(dǎo)入jar包2. 聲明--><div><span style="color: red"><%for (int i = 0; i < 5; i++) {out.print(i); //在網(wǎng)頁上打印}%></span><span style="color: green"><%for (int i = 0; i < 5; i++) {out.print(i);}%></span></div><!--111111111111111111111111111111111111111111111111如下全用標(biāo)簽111111111111--><div><span style="color: blue"><c:forEach var="i" begin="0" end="4">${i}</c:forEach></span></div> </body> </html>

//jstl02.jsp <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.Collections" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head><title>Title</title> </head> <body><!-- jstl兩個標(biāo)簽1. c:if -> if語句1. 必要屬性: test = el表達(dá)式2. 滿足條件, 標(biāo)簽 內(nèi)的內(nèi)容才會執(zhí)行2. c:forEach1. 普通for循環(huán)1. var : 循環(huán)的變量(被存進(jìn)域?qū)ο笾?2. begin : 初始值3. end : 結(jié)束值4. step : 步進(jìn)值(默認(rèn)為1)5. varStatus : 循環(huán)的變量狀態(tài)2. 增強(qiáng)for循環(huán)1. var : 循環(huán)的變量2. items : 被遍歷的集合--><div><%int n = 10; request.setAttribute("n",n); //n存域?qū)ο骾f(n > 5){out.print(true);}%><hr><c:if test="${n > 5}"> //test后面是el表達(dá)式,el就是簡化從域?qū)ο笾腥≈挡僮?#xff0c;所以上面存入域?qū)ο蟆rue</c:if><hr><!--111111111111111111111111111111111111111111111111111111111111111111111111111111--><% for (int i = 1; i <= 9; i+=2) { //步進(jìn)表達(dá)式out.println(i);}%><br><c:forEach var="i" begin="1" end="9" step="3" varStatus="status">${i} - ${status.count} <%-- 循環(huán)次數(shù) --%><br></c:forEach><hr><!--11111111111111111111111111111111111111111111111111111111111111111111111111111--><%ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"zs","ls","ww");request.setAttribute("list",list);for (String s : list) {out.println(s);}%><br><c:forEach var="s" items="${list}">${s}</c:forEach></div> </body> </html>

9.登錄案例_直接訪問success邏輯問題:request.getSession().get/setAttribute

如下login.jsp是門。success頁面需要從session域?qū)ο罄锶≈?#xff0c;要寫java代碼,所以用success.jsp(有,正常訪問)。

將第一節(jié)改進(jìn)的LoginServlet .java再改進(jìn)如下:進(jìn)門先做標(biāo)記:如一些銀行類APP長時間沒用,再點擊賬戶查詢等會提示會話已超時/過期(默認(rèn)30分鐘)。若30分鐘內(nèi)成功通過登陸頁面進(jìn)到success.jsp,服務(wù)器和瀏覽器都沒關(guān),只是網(wǎng)頁窗口關(guān)了,再次訪問success.jsp,能成功進(jìn)去。

//success.jsp,不是login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html lang="en"> <head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --><meta name="description" content=""><meta name="author" content=""><link rel="icon" href="../../favicon.ico"><title>Dashboard Template for Bootstrap</title><!-- Bootstrap core CSS --><link href="css/bootstrap.min.css" rel="stylesheet"><link href="css/dashboard.css" rel="stylesheet"> </head><!--111111111111111111111111111111111111111111111111111111111111111111111111111111111--> <body> <nav class="navbar navbar-inverse navbar-fixed-top"><div class="container-fluid"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#">Project name</a></div><div id="navbar" class="navbar-collapse collapse"><ul class="nav navbar-nav navbar-right"><li><a href="#">Dashboard</a></li><li><a href="#">Settings</a></li><li><a href="#">Profile</a></li><li><a href="#">Help</a></li></ul><form class="navbar-form navbar-right"><input type="text" class="form-control" placeholder="Search..."></form></div></div> </nav><div class="container-fluid"><div class="row"><div class="col-sm-3 col-md-2 sidebar"><ul class="nav nav-sidebar"><li class="active"><a href="#">Overview <span class="sr-only">(current)</span></a></li><li><a href="#">Reports</a></li><li><a href="#">Analytics</a></li><li><a href="#">Export</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item</a></li><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li><li><a href="">More navigation</a></li></ul><ul class="nav nav-sidebar"><li><a href="">Nav item again</a></li><li><a href="">One more nav</a></li><li><a href="">Another nav item</a></li></ul></div><div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"><h1 class="page-header">主頁</h1><%--TODO: jstl 屋內(nèi)判斷:沒有標(biāo)記的趕出去--%><%-- <%String name = (String) request.getSession().getAttribute("name");if(name == null){request.setAttribute("errorMsg","請先登錄");request.getRequestDispatcher("/login.jsp").forward(request,response);}out.print("歡迎你," + name);%>--%>// 如下用 jstl標(biāo)簽和el表達(dá)式 改進(jìn)上面<c:if test="${empty name}"><%request.setAttribute("errorMsg","請先登錄");request.getRequestDispatcher("/login.jsp").forward(request,response);%></c:if> 歡迎尊貴的VIP: ${name} <div class="row placeholders"><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4></h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4></h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4></h4><span class="text-muted">Something else</span></div><div class="col-xs-6 col-sm-3 placeholder"><img src="img/demo.jpg" width="200" height="200" class="img-responsive" alt="Generic placeholder thumbnail"><h4></h4><span class="text-muted">Something else</span></div></div><h2 class="sub-header">Section title</h2></div></div> </div> </div> <script src="js/jquery.js"></script> <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script> <script src="js/bootstrap.js"></script> </body> </html>

如下第一次直接訪問success.jsp,進(jìn)不去。


總結(jié)

以上是生活随笔為你收集整理的【Java13】cookiesession(登陆案例(2)),jsp(登录案例(3))的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。