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()%>
<%=
执行过程
- 把 hello.jsp转译为hello_jsp.java
- hello_jsp.java 位于
d: omcatworkCatalinalocalhost_orgapachejsp - hello_jsp.java是一个servlet
- 把hello_jsp.java 编译为hello_jsp.class
- 执行hello_jsp,生成html
- 通过http协议把html 响应返回给浏览器
页面元素
jsp由这些页面元素组成:
- 静态内容
就是html,css,javascript等内容 - 指令
以<%@开始 %> 结尾,比如<%@page import="java.util.*"%> - 表达式 <%=%>
用于输出一段html - Scriptlet
在<%%> 之间,可以写任何java 代码 - 声明
在<%!%> 之间可以声明字段或者方法。但是不建议这么做。 - 动作
<jsp:include page="Filename" > 在jsp页面中包含另一个页面。在包含的章节有详细的讲解 - 注释 <%-- -- %>
不同于 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起来
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"/>
Cookie
1、 什么是cookie
HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。
2、 cookie机制
当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:
客户端发送一个请求到服务器 --》 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》服务器返回响应数据
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、 一个例子
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>
可以看到cookie中name的属性与上文介绍的相符合
Session
https://www.zhihu.com/question/19786827