会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。
一个网站,怎么证明你来过?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
2.服务器登记你来过了,下次你来的时候我来匹配你;session
cookie
session
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
@WebServlet("/c1") //保存用户上次访问的时间 public class CookieDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //服务器告诉你,你来的时间,把这个时间封装成一个信件,你下次来我就知道你来了 //解决中文乱码 resp.setContentType("text/html"); req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); PrintWriter out = resp.getWriter(); //cookie,服务器从客户端获取 Cookie[] cookies = req.getCookies();//获得cookie //判断cookie是否存在 if(cookies!=null){ //如果存在怎么办 out.write("您上次访问的时间是:"); for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; //获取cookie的名字 if (cookie.getName().equals("LastLoginTime")){ //获取cookie里的值 long LastLoginTime = Long.parseLong(cookie.getValue()); Date date = new Date(LastLoginTime); out.write(date.toLocaleString()); } } }else { out.write("这是您第一次访问本站"); } //服务器给客户端响应一个cookie Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+""); //cookie有效时间 cookie.setMaxAge(24*60*60); resp.addCookie(cookie);//响应给客户端一个cookie }
cookie:一般会保存在本地的用户目录下appdata;
一个网站cookie是否存在上限
删除cookie
什么是Session:
Session和Cookie的区别:
使用场景:
使用Seesion:
@WebServlet("/s1") public class SessionDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); //得到Session HttpSession session = req.getSession(); //给Session中存东西 session.setAttribute("name","张三"); //获取Session的id String id = session.getId(); //判断Session是否已经存在 if (session.isNew()){ resp.getWriter().write("Session创建成功,ID:"+id); }else{ resp.getWriter().write("Session已经存在,ID:"+id); } //session创建的时候做了什么事情 //Cookie cookie = new Cookie("JSESSIONID", "sessionId"); //resp.addCookie(cookie); }
@WebServlet("/s2") public class SessionDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //解决乱码问题 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html"); //得到Session HttpSession session = req.getSession(); String name = (String) session.getAttribute("name"); System.out.println(name); }
@WebServlet("/s3") public class SessionDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.removeAttribute("name"); //手动注销Session session.invalidate(); }
会话自动过期:web.xml配置
<!-- 设置Session的默认失效时间--> <session-config> <!--15分钟后Session自动失效,以分钟为单位--> <session-timeout>15</session-timeout> </session-config>
java Server Pages : java服务器端页面,也和Servlet一样,用于动态web技术
最大的特点:
写JSP就像在写HTML
区别:
思路:jsp到底怎么执行的
发现页面转变成了java程序
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
JSP最终也会被转换成为java类
jsp本质上就是一个Servlet
//初始化 public void _jspInit() { } //销毁 public void _jspDestroy() { } //jspService public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
1、判断请求
2、内置一些对象
final javax.servlet.jsp.PageContext pageContext; //页面上下文 final javax.servlet.ServletContext application; //applicationContext final javax.servlet.ServletConfig config; //config javax.servlet.jsp.JspWriter out = null; //out final java.lang.Object page = this; //page:当前页面 HttpServletRequest request //请求 http.HttpServletResponse response //响应
3、输出页面前增加的代码
response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, false, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); out = pageContext.getOut(); _jspx_out = out;
4、以上这些对象我们可以在JSP中直接使用
在jsp页面中:
只要是java代码就会原封不动的输出;
如果是HTML代码,就会被转换成为
out.write("\r\n");
这样的格式输出到前端
任何语言都有自己的语法,java中有。jsp作为java技术的一种应用,它拥有一些自己的扩充语法(了解、知道即可),java所有语法都支持。
jsp表达式
<%--jsp表达式 作用:用来将程序的输出,输出到客户端 <%= 变量或者表达式%> --%> <%= new java.util.Date() %>
jsp脚本片段
<%-- jsp脚本片段 --%> <% int sum = 0; for (int i = 1; i <= 100; i++) { sum+=i; } out.println("<h1>sum="+sum+"</h1>"); %>
脚本片段的再实现
<% int x = 10; out.println(x); %> <p>这是一个jsp文档</p> <% int y = 20; out.println(y); %> <hr> <%--在代码嵌入HTML元素--%> <% for (int i = 0; i < 5; i++) { %> <h1>hello,world</h1> <% } %>
jsp声明
<%! static { System.out.println("loading servlet"); } private int globalVar = 0; public void zhang(){ System.out.println("进入了方法zhang"); } %>
jsp声明:会被编译到jsp生成的java类中,其他的,就会被生成到jspService方法中
在jsp中嵌入java代码即可
jsp的注释,不会在客户端显示,HTML就会
<%@include file=""%> <%--<%@page errorPage="error/500.jsp" %>--%> <%-- @include会将两个页面合二为一 --%> <%@include file="commom/header.jsp"%> <h1>网页主体</h1> <%@include file="commom/footer.jsp"%> <hr> <%--jsp标签 jsp:include:拼接页面,本质还是三个 --%> <jsp:include page="commom/header.jsp"></jsp:include> <h1>网页主体</h1> <jsp:include page="commom/footer.jsp"></jsp:include>
<% pageContext.setAttribute("name1","张三"); //保存的数据只在一个页面中有效 request.setAttribute("name2","李四"); //保存的数据在只在一次请求中有效,请求转发会携带这个数据 session.setAttribute("name3","王五"); //保存的数据在只在一次会话中有效,从打开浏览器到关闭浏览器 application.setAttribute("name4","法外狂徒"); //保存的数据在只在服务器中有效,从打开服务器到关闭服务器 %>
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻;
session:客户端向服务器发送请求,产生的数据,用户看完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;
<!-- jstl 表达式的依赖 --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <!-- standard 标签库 --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
EL表达式:${ }
JSP标签
<jsp:forward page="jsptag01.jsp"> <jsp:param name="name" value="张三"/> <jsp:param name="age" value="18"/> </jsp:forward>
JSTL标签
JSTL标签库的使用就是为了弥补HTML标签的不足;他自定义许多标签,可以供我们使用,标签的功能和java代码一样。
核心标签(掌握部分)
JSTL标签库使用步骤
引入对应的taglib,JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)
使用其中的方法
在tomcat也需要引入jstl的包,否则就会报错,JSTL解析错误
<body> <h3>if测试</h3> <hr> <form action="coreif.jsp" method="get"> <%--EL表达式获取表单中的数据 ¥{param.参数名} --%> <input type="text" name="username" value="${param.username}"> <input type="submit" value="登录"> </form> <%--判断如果是admin,则登录成功--%> <c:if test="${param.username=='admin'}" var="isadmin"> <c:out value="您好,管理员!"></c:out> </c:if> <%--自闭合标签--%> <c:out value="${isadmin}"></c:out> </body>