JSP学习入门2

172 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

response、请求转发和重定向、cookie

1.response:响应对象

提供的方法:

void addCookie(Cookie cookie);服务端向客户端增加cookie对象

void sendRedirect(String location) throw IOException;:页面跳转的一种方式(重定向)

void setContentType(String type):设置服务端响应时的编码(设置服务端的contentType类型)

示例:登陆

login.jsp(登陆页面)->check.jsp(判断是否合法)->success.jsp

login.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <form action="check.jsp" method="post">
     用户名:<input type="text" name="uname"></input><br/>
     密码:<input type="password" name="upwd"></input><br/>
     <input type="submit" value="登陆"></input><br/>
     </form>
 </body>
 </html>

check.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <%
         request.setCharacterEncoding("utf-8");
         String name = request.getParameter("uname");
         String pwd = request.getParameter("upwd");
         if(name.equals("张三")&&pwd.equals("abcd")){
             //response.sendRedirect("success.jsp");页面跳转:重定向,导致数据丢失
             //页面跳转:请求转发,可以获取到数据,并且地址栏没有改变(仍然保留转发时的页面check.jsp)
             request.getRequestDispatcher("success.jsp").forward(request, response);
         }else{
             //登陆失败
             out.print("用户名或密码有误");
         }
     %>
 ​
 </body>
 </html>

success.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <h1>
         登陆成功! 欢迎您😊:
         <%
         String name=request.getParameter("uname");
         out.print(name);
     %>
     </h1>
 ​
 </body>
 </html>
请求转发重定向
地址栏是否改变不变(check.jsp)改变(success.jsp)
是否保留第一次请求时的数据保留不保留
请求的次数12
跳转发生的位置服务端客户端发出的第二次跳转

保留与否----四种范围对象

转发、重定向

转发:

张三(客户端)—>【服务窗口A(服务端)—>服务窗口B】

<—返回值

重定向:

张三(客户端)—>服务窗口A

<—去找B

—>服务窗口B

—>返回值

2.session(服务端)

Cookie(客户端,不是内置对象,需要new):Cookie是由服务端生成的,再发送给客户端保存。

相当于本地缓存的作用:客户端(hello.mp4;zc/abc)—>服务端(hello.mp4;zc/abc) 作用:提高访问服务端的效率,但安全性较差。

Cookie:name=value(kv对,name就是key)

由javax.servlet.http.Cookie类产生的对象

构造方法:public Cookie(String name,String value)

String getName():获取name

String getValue():获取value

void setMaxAge(int exipry);最大有效期(秒)

服务端准备Cookie:

response.addCookie(Cookie cookie)

页面跳转(转发,重定向)

客户端获取Cookie:request.getCookies();

a.服务端增加Cookie:response对象;客户端获取对象:request对象

b.不能直接获取某一个单独对象,只能一次性将全部的Cookie拿到

response_addCookie.jsp:

 <%@page import="com.sun.corba.se.spi.orbutil.fsm.Guard.Result"%>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <%
         //服务端
         Cookie cookie1=new Cookie("name","zs");
         Cookie cookie2=new Cookie("pwd","abcd");
         response.addCookie(cookie1);
         response.addCookie(cookie2);
         
         //页面跳转到客户端
         response.sendRedirect("result.jsp");
     %>
 </body>
 </html>

result.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <%
         //客户端
         Cookie[] cookies=request.getCookies();
         for(Cookie cookie:cookies){
             out.print(cookie.getName()+"--"+cookie.getValue()+"<br/>");
         }
     %>
 </body>
 </html>

通过F12可以发现,除了自己设置的Cookie对象,还有一个name为JSESSIONID的cookie

建议Cookie只保存英文和数字,否则需进行编码、解码

3.使用Cookie实现 记住用户名 功能

login.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <%!
         String myname;
     %>
     
     <%
         boolean flag=false;
         Cookie[] cookies=request.getCookies();
         for(Cookie cookie:cookies){
             if(cookie.getName().equals("uname")){
                 myname=cookie.getValue();
                 flag=true;
             }
         }
         
         if(flag){
             out.print("cookie:"+myname);
         }else{
             out.print("cookie已失效");
         }
     %>
 ​
     <form action="check.jsp" method="post">
     用户名:<input type="text" name="uname" value="<%=(myname==null?"":myname)%>"></input><br/>
     密码:<input type="password" name="upwd"></input><br/>
     <input type="submit" value="登陆"></input><br/>
     </form>
 </body>
 </html>

check.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <%
         request.setCharacterEncoding("utf-8");
         String name = request.getParameter("uname");
         String pwd = request.getParameter("upwd");
         
         //将用户名加入到Cookie中
         Cookie cookie=new Cookie("uname",name);
         
         cookie.setMaxAge(20);
         
         response.addCookie(cookie);
         response.sendRedirect("A.jsp");
 ​
     %>
 ​
 </body>
 </html>

A.jsp:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
 ​
 </body>
 </html>

4.session:会话

a.浏览网站:开始—>关闭

b.购物:浏览—>付款—>退出

c.电子邮件:浏览—>写邮件—>退出

开始—结束

session机制

客户端第一次请求服务端时(尝试JSESSIONID与sessionId的匹配,JSESSIONID不存在),服务端会产生一个session对象(用于保存该客户的信息);

并且每个session对象都会有一个唯一的sessionId(用于区分其他session);

服务端又会产生一个Cookie,并且该Cookie的name=JSESSIONID,value=服务端sessionId的值;

然后,服务端会在响应客户端的同时,将该cookie发送给客户端,至此客户端就有了一个cookie(JSESSIONID);

因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID--sessionId)

客户端第二/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID去服务端的session中匹配sessionid,如果匹配成功(cookie jessionid和session sessionid),说明此用户不是第一次访问,无需登录;

例子:

客户端: 顾客(客户端)

服务端:存包处 - 商场(服务端)

顾客第一次存凶包:商场判断此人是否之前存过包(通过手里是否有钥匙)

如果是新顾客(没钥匙),分配一把钥匙给顾客;钥匙和柜子一一对应;

第二/n次存包:商场判断此人是否之前存过包(通过手里是否有钥匙)

如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙会和柜子一一对应

session:

a.session:存储在服务端

b.session是在同一个用户(客户)请求时共享

c.实现机制:第一次客户请求时产生一个sessionid并复制给cookie的jsessionid然后发给客户端。最终通过session的sessionid一一对应

session方法

String getId():获取sessionId

boolean isNew():判断是否是新用户(第一次访问)

void invalidate():使session失效

void setAttribute()

 <%session.setAttribute("uname", name);%>

将name的值放到seesion的属性uname里

Object getAttribute();

void setMaxInactiveInterval(秒):设置最大有效非活动时间

int getMaxInactiveInterval():获取最大有效非活动时间

示例:

登录

login.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <form action="check.jsp" method="post">
     用户名:<input type="text" name="uname"></input><br/>
     密码:<input type="password" name="upwd"></input><br/>
     <input type="submit" value="登录"></input><br/>
     </form>
 </body>
 </html>

check.jsp

 <%@page import="javafx.scene.control.Alert"%>
 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <%
         request.setCharacterEncoding("utf-8");
         String name=request.getParameter("uname");
         String pwd=request.getParameter("upwd");
         if(name.equals("张三")&&pwd.equals("abc")){
             //只有登录成功,session中才会有myname和mypwd
             session.setAttribute("myname", name);
             session.setAttribute("mypwd", pwd);
             session.setMaxInactiveInterval(10);
             
             request.getRequestDispatcher("welcome.jsp").forward(request,response);
         }else{
 ​
             //out.print("<script type='text/javascript'>alert('登录失败');</script>");//登录失败
             request.getRequestDispatcher("login.jsp").forward(request,response);
         }
     %>
 ​
 </body>
 </html>

welcom.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>Insert title here</title>
 </head>
 <body>
     <%
         String name=(String)session.getAttribute("myname");
         if(name==null){
             response.sendRedirect("login.jsp");
         }else{
             out.print(name+"欢迎您");
         }
     %>
     欢迎你
 </body>
 </html>