J2EE学习笔记:JSP

JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户[HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。

J2EE学习笔记:JSP

<%@page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" import="java.util.*"%>

是JSP的<%@page指令

import="java.util.* 

导入其他类,如果导入多个类,彼此用,逗号隔开,像这样 import="java.util.,java.sql."

<%=new Date().toLocaleString()%>

<%=

执行过程

  1. 把 hello.jsp转译为hello_jsp.java
  2. hello_jsp.java 位于
    d: omcatworkCatalinalocalhost_orgapachejsp
  3. hello_jsp.java是一个servlet
  4. 把hello_jsp.java 编译为hello_jsp.class
  5. 执行hello_jsp,生成html
  6. 通过http协议把html 响应返回给浏览器

1580716846128

页面元素

jsp由这些页面元素组成:

  1. 静态内容
    就是html,css,javascript等内容
  2. 指令
    以<%@开始 %> 结尾,比如<%@page import="java.util.*"%>
  3. 表达式 <%=%>
    用于输出一段html
  4. Scriptlet
    在<%%> 之间,可以写任何java 代码
  5. 声明
    在<%!%> 之间可以声明字段或者方法。但是不建议这么做。
  6. 动作
    <jsp:include page="Filename" > 在jsp页面中包含另一个页面。在包含的章节有详细的讲解
  7. 注释 <%-- -- %>
    不同于 html的注释 通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了

两种包含

1、 指令include

<%@include file="footer.jsp" %>

footer.jsp的内容会被插入到 hello.jsp 转译 成的hello_jsp.java中,最后只会生成一个hello_jsp.java文件

参数方式

因为指令<%@include 会导致两个jsp合并成为同一个java文件,所以就不存在传参的问题,在发出hello.jsp 里定义的变量,直接可以在footer.jsp中访问。

在footer.jsp中

<hr>
<p style="text-align:center">copyright@<%=year%></p>

在hello.jsp中

<% int year = 2020; %>
<%@include file="footer.jsp"%>

run起来

1580719748590

2、 动作include

<jsp:include page="footer.jsp" />

footer.jsp的内容不会被插入到 hello.jsp 转译 成的hello_jsp.java中,还会有一个footer_jsp.java独立在。 hello_jsp.java 会在服务端访问footer_jsp.java,然后把返回的结果,嵌入到响应中。

参数方式

动作<jsp:include />其实是对footer.jsp进行了一次独立的访问,那么就有传参的需要。

在footer.jsp中

<hr>
<p style="text-align:center">copyright@<%=request.getParameter("year")%>></p>

在hello.jsp中

<jsp:include page="footer.jsp">
    <jsp:param name="year" value="2020"></jsp:param>
</jsp:include>

run起来效果一样

跳转

和servlet跳转一样

客户端跳转

<%
    response.sendRedirect("hello.jsp");
%>

服务端跳转

<% 
	request.getRequestDispatcher("hello.jsp").forward(request, response);
%>

或者

<jsp:forward page="hello.jsp"/>

1、 什么是cookie

HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。

2、 cookie机制

当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:

客户端发送一个请求到服务器 --》 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》服务器返回响应数据

1580721088268

3、 cookie属性

属性项 属性项介绍
NAME=VALUE 键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样
Expires 过期时间,在设置的某个时间点后该 Cookie 就会失效
Domain 生成该 Cookie 的域名,如 domain="www.baidu.com"
Path 该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/
Secure 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie

Expires

该属性用来设置Cookie的有效期。Cookie中的maxAge用来表示该属性,单位为秒。Cookie中通过getMaxAge()和setMaxAge(int maxAge)来读写该属性。maxAge有3种值,分别为正数,负数和0。

  • 如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中(每个浏览器存储的位置不一致)。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。
  • maxAge属性为负数,则表示该Cookie只是一个临时Cookie,不会被持久化,仅在本浏览器窗口或者本窗口打开的子窗口中有效,关闭浏览器后该Cookie立即失效。
  • 当maxAge为0时,表示立即删除Cookie

那么maxAge设置为负值和0到底有什么区别呢?

maxAge设置为0表示立即删除该Cookie,如果在debug的模式下,执行上述方法,可以看见cookie立即被删除了。

maxAge设置为负数,能看到Expires属性改变了,但Cookie仍然会存在一段时间直到关闭浏览器或者重新打开浏览器。

Path

c.setPath("/");

如果其值是 /a, 那么就表示仅仅访问 /a 路径的时候才会提交 cookie

3、 一个例子

1580721399022

setCookie.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    Cookie c = new Cookie("name", "Gareen");
    c.setMaxAge(60 * 24 * 60);
    c.setPath("/");
    response.addCookie(c);
%>

<a href="getCookie.jsp">跳转到获取cookie的页面</a>
</body>
</html>

getCookie.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    Cookie[] cookies = request.getCookies();
    if (null != cookies)
        for (int d = 0; d <= cookies.length - 1; d++) {
            out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>");
        }
%>
</body>
</html>

1580721463255

可以看到cookie中name的属性与上文介绍的相符合

1580721522528

Session

https://www.zhihu.com/question/19786827

https://www.cnblogs.com/xdp-gacl/p/3855702.html

https://how2j.cn/k/jsp/jsp-session/583.html

原文地址:https://www.cnblogs.com/cpaulyz/p/12401616.html