JSP简介:
java server page 运行在服务器端的页面. ==> 本质就是servlet.
1.运行流程:
jsp =(第一次访问时)=> .java ==> .class ==> 运行
2.JSP中的脚本:
<% java内容 %> 该脚本包裹的代码会出现在 service方法中
<%=表达式 %> 该脚本用于输出内容.out.print();方法包裹输出内容.
<%! 内容 %>(了解): 该脚本包裹的内容会出现在类定义中.
3.JSP中的脚本注释:
<%-- 注释内容 --%>
cookie
1.基本概念
浏览器端记录信息的技术
会话技术:从打卡一个浏览器访问某个站点 到关闭这个浏览器的整个过程 成为一次会话
为什么需要会话技术?
http协议是无状态 用户在一个站点中没有存储自己数据的区域
Cookie和session的区别?
Cookie:数据存储在客户端本地 减少服务器端的存储的压力 安全性不好 客户端可以清除cookie
Session:将数据存储到服务器端 安全性好 增加服务器的压力 客户端可以清除cookie
cookie和session 都属于会话技术.
2.基本操作
创建cookid
Cookie cookie = new Cookie(String key,String value);
发送cookie
response.addCookie(cookie);
获得cookie
Cookie cookie = null;
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length>0){
for(Cookie c : cookies ){
if(c.getName().equals("remember")){
cookie = c;
}
}
}
3.cookie的细节
1>关于浏览器记住多久.
(默认情况) 当浏览器关闭时(会话结束时)
//cookie.setMaxAge(60*60*24*7*2);//两周
//cookie.setMaxAge(-1);//(默认情况)浏览器关闭时删除cookie
//cookie.setMaxAge(0);// 用于删除cookie
2>浏览器在什么情况下发送cookie(cookie的路径问题)
cookie的默认路径就是 发送cookie的动态资源所在的上一级路径.
如果 cookie路径是"/cookie", 那么浏览器在访问cookie路径的所有子路径时会携带cookie.
http:/localhost:8080/cookie/BServlet 会发送
http:/localhost:8080/cookie/ABC/BCD/CServlet 会发送
http:/localhost:8080/AServlet 不会发送
http:/www.baidu.com/cookie/BServlet 不会发送
cookie的默认路径就是发送cookie的资源(AServlet)所在路径
使用代码手动控制cookie路径以及主机:
cookie.setPath("/cookie");
3> cookie中主机问题
cookie的默认主机就是发送cookie资源所在的主机
主机用处: 如果cookie需要发送,那么主机也必须符合.
主机的手动控制:
理论上可以手动控制. 主机的设置不允许设置发送cookie资源所在主机以外的其他主机.
//cookie.setDomain("www.baidu.com"); //不允许
//cookie.setDomain("localhost"); // localhost => 特殊的主机 =>不能设置
cookie.setDomain(".baidu.com");//如果我们当前主机是www.baidu.com.
4> cookie删除的问题
原理: 使用一个寿命为0的cookie覆盖要删除的cookie.
如何覆盖: 保证3点一致,即可覆盖=> 主机,路径,cookie的键
5> 跨域(主机)共享cookie.
需求: cookie可以跨越多个主机 例如: www.baidu.com music.baidu.com 等等
操作:
1. 将cookie的主机设置为".baidu.com" => *.baidu.com主机都满足
2. 将cookie的路径设置为"/"=> 什么路径都满足
6> 使用cookie记录中文键值对问题.
原则: 响应头和请求头中不允许使用中文编码. 只能使用ISO-8859-1编码.
解决: 使用URLEncode编码,即可.
操作:
工具类(JDK提供):使用 URLEncoder.encode()方法编码
使用 URLDecoder.decode()方法解码
例子:
1.记住用户名
1>.用户名密码 获得
2>.验证用户名密码(填了就算)
3>.判断 用户是否勾选记住用户名checkbox
4>.勾选=> 新建cookie
没勾选=>新建cookie 设置maxage为0
5>.将cookie添加到response
6>.重定向到成功页面
(1)cookie02.java
import java.io.IOException; import java.io.PrintWriter; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class cookie02 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获得用户的用户名信息 String username = request.getParameter("username"); //获得勾选框的勾选状态 String status = request.getParameter("check"); System.out.println(status); //新建cookie Cookie cookie = new Cookie("remember", URLEncoder.encode(username, "UTF-8")); System.out.println(cookie.getName()+":"+cookie.getValue()); //根据勾选框的状态判断是否需要设置cookie的保持时间或者销毁cookie if("yes".equals(status)){ //将cookie保持一天 cookie.setMaxAge(60*60*24); System.out.println("已执行1"); } else{ //销毁cookie,即设置寿命为0 cookie.setMaxAge(0); System.out.println("已执行2"); } //添加cookie到response响应中去 response.addCookie(cookie); //重定向到登录成功页面 response.sendRedirect("/cookie_session/success.jsp"); } }
(2)login.jsp
<html> <head> <base href="<%=basePath%>"> <title>My JSP 'login.jsp' starting page</title> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <% Cookie[] cookies = request.getCookies(); Cookie cookie = null; if(cookies!=null&&cookies.length>0){ for(Cookie c:cookies){ if(c.getName().equals("remember")){ cookie = c;%> <%=cookie%> <% } } } %> </head> <body> <form action="/cookie_session/cookie02" method="post" name="myform"> <table align="center"> <tr> <td>用户名:</td> <td><input type="text" name = "username" value="<%=cookie!=null?URLDecoder.decode(cookie.getValue(), "UTF-8"):""%>"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="userpass"></td> </tr> <tr> <td><input type="submit" value="提交"/></td> <td><input type="checkbox" name="check" value="yes" <%=cookie!=null?"checked='checked'":""%> />记住用户名</td> </tr> </table> </form> </body> </html>
session
1.session的细节
1>操作session
session就是域对象.
session.setAttribute("name", "tom");
String name = (String) session.getAttribute("name");
session.removeAttribute("name");
Enumeration<String> attributeNames = session.getAttributeNames();
2>session域的范围
一次会话期间共享数据的.
开始:第一访问服务器,服务器创建session对象,范围的开始
结束:1.关闭浏览器,会话结束.
2.Session的过期时间到了,Session销毁
3.调用invalidate方法,Session立刻销毁
//-------------------------------------------
为什么说关闭浏览器会话就算结束?
因为保存sessionId的cookie的有效时间是,浏览器关闭cookie删除.
cookie中的sessionID丢失.sessionID一旦丢失,那么就再也找不到Session对象了.
如果永远不关闭浏览器,SessionID就不会丢失.服务器中的Session也会一直存在吗?
Session的空闲时间如果超过30(默认值)分钟,仍然会被删除.
配置:tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
自己项目的web.xml中也可以配置=>只影响当前项目
3>session中的其他api(了解)
long ctime = session.getCreationTime();//获得创建时间
String id = session.getId();//获得Session的Id
long atime = session.getLastAccessedTime();// 获得最后一次操作Session的时间
int sec = session.getMaxInactiveInterval();//获取Session的有效时间的
session.setMaxInactiveInterval(interval)//设置Session的有效时间的
session.getServletContext();// 获得servletContext对象
boolean is = session.isNew();// 判断该Session是不是新的
session.invalidate();//(记住)让Session失效. 让Session对象销毁
例子:
1.验证码实例
(1)session01.java(验证码生成是使用验证码工具类生成的,大家可以自行去网络上下载)
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.dsna.util.images.ValidateCode; public class sessionTest01 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //生成验证码 (长,宽,位数,干扰线) ValidateCode vc = new ValidateCode(140,70,4,2); //发送给浏览器 vc.write(response.getOutputStream()); //放入session中 request.getSession().setAttribute("code", vc.getCode()); } }
(2)cookieTest02.java
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class sessionTest02 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决request乱码问题 request.setCharacterEncoding("UTF-8"); //获得用户提交的验证码 String code1 = request.getParameter("code"); System.out.println(code1); //获得验证码的正确信息 String code2 = (String)request.getSession().getAttribute("code"); System.out.println(code2); //进行比对 if(code1!=null&&code1.equalsIgnoreCase(code2)){ //验证码比对正确 System.out.println("验证码正确"); response.getWriter().write("sucess!"); } else{ //如果验证不成功 request.setAttribute("error", "验证码错误"); request.getRequestDispatcher("/vclogin.jsp").forward(request, response); } } }
(3)vclogin.java
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'vclogin.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script type="text/javascript"> function func1(){//切换验证图片 var one = document.getElementById("one"); one.src="/cookie_session/sessionTest01?haha="+new Date(); } </script> </head> <body> <form action="/cookie_session/sessionTest02" method="post" name="myform"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="userpass"/></td> </tr> <tr> <td>验证码:</td> <td><input type="text" name="code" size="4"/><img src="/cookie_session/sessionTest01" id="one"/><a href="javascript:void(0)" onclick="func1();">看不清,换一张</a><td> </tr> <tr> <td><input type="submit" value="登录" /></td> <td><font color="red"><%=request.getAttribute("error")!=null?request.getAttribute("error"):"" %></font></td> </tr> </table> </form> </body> </html>