用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求). 如同打电话.
我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术来保存用户各自的数据
保存一次通话过程中的数据!
会话技术中数据的保存方式:
浏览器存储会话数据:COOKIE
服务器存储会话数据:session
COOKIE是客户端(浏览器)的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把COOKIE带到服务端,服务端就可以做响应的处理。
session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到COOKIE中,再次访问的时候,浏览器会把COOKIE(sessionId)带过来,找到对应的session对象。
COOKIE:客户端的会话技术,保存数据在浏览器!
COOKIE:一个名称和一个值 一些可选属性 COOKIE存储的数据大小和个数都有限
COOKIE写入:response.addCOOKIE() 将COOKIE从服务器 写入到浏览器
COOKIE获取:request.getCOOKIEs()
1.记住用户名
当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.
2.自动登录(记住用户名和密码)
当用户在淘宝网站登录成功后,浏览器会记录登录成功的用户名和密码,下次再访问该网站时,自动完成登录功能.
以上这些场景都是使用会话COOKIE实现的,将上次的信息保存到了COOKIE中,下次直接从COOKIE中获取数据信息
3.保存网站的上次访问时间
我们访问网站的时候,通常会看到网站上显示上次访问时间,这些信息就是在用户访问网站的时候保存在COOKIE中的
4.保存电影的播放进度
在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到COOKIE中
COOKIE:客户端会话技术,将数据保存在浏览器。使用COOKIE保存用户各自的数据
COOKIE特点:
1. COOKIE保存会话数据在客户端浏览器
2. COOKIE保存数据大小以及个数有限
COOKIE使用场景:
new COOKIE(String name,String value);
response.addCOOKIE(COOKIE);
request.getCOOKIEs() ; //得到所有的COOKIE对象。是一个数组,开发中根据key得到目标COOKIE
COOKIE.getName() ; //返回COOKIE中设置的name
COOKIE.getValue(); //返回COOKIE中设置的value
@WebServlet("/COOKIE01")
public class COOKIEServlet01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("COOKIEServlet01...");
//设置COOKIE 响应给客户端浏览器
//1.创建COOKIE对象
COOKIE COOKIE = new COOKIE("name", "shuaige");
//2.使用response将COOKIE输出到客户端浏览器
response.addCOOKIE(COOKIE);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/COOKIE02")
public class COOKIEServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("COOKIEServlet02...");
//3.获取客户端请求携带的COOKIE数据
COOKIE[] COOKIEs = request.getCOOKIEs();
for (COOKIE COOKIE : COOKIEs) {
System.out.println(COOKIE.getName()+" "+COOKIE.getValue());
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
package com.itheima.utils;
import javax.servlet.http.COOKIE;
public class COOKIEUtils {
//根据COOKIE的name获取COOKIE的value
public static String getCOOKIEValue(COOKIE[] COOKIEs,String name){
//如果COOKIEs数组 为null 或者 COOKIE的name为null或空串 直接返回null
if (COOKIEs==null || name==null || name.equals("")){
return null;
}
for (COOKIE COOKIE : COOKIEs) {
if(COOKIE.getName().equals(name)){
return COOKIE.getValue();
}
}
return null;
}
}
在默认的情况下,当浏览器进程结束(浏览器关闭,会话结束)的时候,COOKIE就会消失。
持久性COOKIE
给COOKIE设置有效期.COOKIE.setMaxAge(int expiry)
:时间是秒
-1:默认 会话级别。代表COOKIE数据存到浏览器关闭(保存在浏览器文件中)。
正整数:以秒为单位保存数据有有效时间(把缓存数据保存到磁盘中)
0:代表删除COOKIE.如果要删除COOKIE要确保路径一致。
@WebServlet("/COOKIE03")
public class COOKIEServlet03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("COOKIEServlet03...");
//设置COOKIE 响应给客户端浏览器
//1.创建COOKIE对象
COOKIE COOKIE = new COOKIE("name", "shuaige");
//设置COOKIE的有效时间 -1:默认会话级别,浏览器一关闭COOKIE消失 0:删除COOKIE
//COOKIE.setMaxAge(60*2);
COOKIE.setMaxAge(0);
//2.使用response将COOKIE输出到客户端浏览器
response.addCOOKIE(COOKIE);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
setPath(String url) ;设置路径
有效路径作用 :
默认路径,例如:
访问http://localhost:8080/day24/aaa/demo01; COOKIE默认路径 /day24/aaa
访问http://localhost:8080/day24/aaa/bbb/demo01; COOKIE默认路径 /day24/aaa/bbb
携带COOKIE需要的条件: 只有当访问资源的url上一级目录与此COOKIE的有效path完全匹配的时候,才会携带这个COOKIE; url上一级目录如果是COOKIE有效路径的子目录也可以获取到反之不会.
eg:setPath("/")
http://localhost:8080/day24/COOKIEDemo02 /day24是/的子目录
eg: 设置COOKIE的路径 /day24/demo02
下次访问路径:http://localhost:8080/day24/demo02/abc/ccc; COOKIE是可以带过来
下次访问路径:http://localhost:8080/day24/demo03; COOKIE带不过来
COOKIE的路径通常设置 / 或者为发布项目名设置的有效是 /day24. 当前项目下的Servlet都可以使用该COOKIE. 一般这么设置: COOKIE.setPath(request.getContextPath());
只要是当前项目里面的资源 路径必须包含项目名路径.
/**
* COOKIE的基本使用
*/
@WebServlet("/aa/COOKIE04")
public class COOKIEDemo04 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("COOKIEDemo04...");
//COOKIE的基本使用
//1.创建COOKIE对象
//COOKIE使用细节1:COOKIE原来不可以存中文和特殊字符 tomcat8.5版本之后可以存储中文但是依然不能存储特殊字符
//COOKIE如果想存储特殊字符 需要将COOKIE的value使用URLEncoder进行编码,获取时就需要使用URLDecoder解码
//COOKIE存入时编码:URLEncoder.encode(value,"UTF-8");
//COOKIE取出时解码:URLDecoder.decode(value,"UTF-8");
String value = URLEncoder.encode("黄 文 龙", "UTF-8");
COOKIE COOKIE = new COOKIE("name",value);
//COOKIE使用细节2:可以一次写入多个COOKIE
COOKIE COOKIE1 = new COOKIE("address", "深圳");
/*设置有效路径:COOKIE.setPath();
如果不设置COOKIE有效路径:默认就是是当前servlet的资源路径
eg:/day25/COOKIE01 --> /day25
eg:/day25/aa/COOKIE04 --> /day25/aa
获取COOKIE所在的servlet资源路径只有与COOKIE路径同级或在其子目录下才能获取到COOKIE
COOKIE的路径一般设置为当前项目虚拟路径,这样就可以实现COOKIE在当前项目下进行共享了【也就是在任何地方Servlet中都可以获取COOKIE】
最后:这里大家只作了解 一般我们不设置COOKIE的有效路径 实际使用中一般只设置有效时间
*/
COOKIE.setPath(request.getContextPath());
COOKIE1.setPath("/day25");
//2.使用response将COOKIE写入到浏览器
response.addCOOKIE(COOKIE);
response.addCOOKIE(COOKIE1);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
在访问一个资源的时候,展示上次访问的时间
若是第一次访问则展示:你是第一次访问,若不是第一次则展示:你上次访问的时间是:xxxx
package com.itheima.web.COOKIE;
import com.itheima.utils.COOKIEUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.COOKIE;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/rem")
public class RememberServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//请求响应中文乱码处理
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
COOKIE[] COOKIEs = request.getCOOKIEs();
//1.根据COOKIE的name【lastTime】获取上次访问时间
String lastTime = COOKIEUtils.getCOOKIEValue(COOKIEs, "lastTime");
//2.判断value
if(lastTime==null){
//3.1:value==null:第一次访问
//获取当前时间,记录在COOKIE中,写入到浏览器
String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
COOKIE COOKIE = new COOKIE("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
response.addCOOKIE(COOKIE);
//响应浏览器 用户 你是第一次访问
response.getWriter().print("你是第一次访问!");
}else{
//3.2:value!=null:显示上次访问时间
//获取当前时间,记录在COOKIE中,写入到浏览器
String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
COOKIE COOKIE = new COOKIE("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
response.addCOOKIE(COOKIE);
//响应浏览器 用户 你上次访问的时间
response.getWriter().print("你上次访问时间是:"+ URLDecoder.decode(lastTime,"UTF-8"));
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
session是服务器端的会话技术,用于保存数据在请求间实现数据共享。
session是服务器端的会话技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到COOKIE中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象
1、获得COOKIE中传递过来的SessionId(COOKIE)(浏览器请求服务器会将该项目路径下的COOKIE带过去)
2、如果COOKIE中没有sessionid,则创建session对象(第一次调用request.getSession()创建Session对象)
3、如果COOKIE中有sessionid,找指定的session对象
如果有sessionid并且session对象存在,则直接使用
如果有sessionid,但session对象销毁了,则执行第二步
注意:
- 第一次调用request.getSession()才会创建session对象,不调用则session对象不存在
- session对象的生命周期范围就是从第一次调用request.getSession(),session对象被创建,当关闭浏览器,session对象被持久化到硬盘
- session对象在创建时,会自动产生sessionId,由服务器通过COOKIE方式写入到浏览器缓存中,该COOKIE的name是JSESSIONID
session:服务器端会话技术,保存数据在服务器内存中。
COOKIE和session的区别:
1. COOKIE存储会话数据在客户端浏览器,session存储数据在服务器
2. COOKIE存储的是字符串数据,session存储的是Object对象
3. COOKIE存储的数据量大小和个数有限,session没有限制
4. COOKIE一般存储不重要的数据,session存储重要数据
5. session基于COOKIE实现的
session工作原理:
1. 第一次请求,通过request.getSession()创建session对象
2. 创建完session对象时,会生成sessionId,保存到COOKIE中响应给客户端浏览器
3. 第二次请求时,客户端浏览器会携带sessionId到服务器,服务器就根据sessionId找到对应的session对象使用
ServletContext:整个应用
request:一次请求
Session使用:作为域对象存储数据使用
范围: 一次会话(多次请求) 保存用户各自的数据(以浏览器为单位)
@WebServlet("/session01")
public class SessionServlet01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet01...");
//使用Session共享数据 范围:一次会话:多次请求中
//1.获取Session对象
HttpSession session = request.getSession();
//2.调用方法存储数据
session.setAttribute("sname","优秀");
System.out.println("session01:"+session);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
@WebServlet("/session02")
public class SessionServlet02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet02...");
//获取session中的共享数据
HttpSession session = request.getSession();
Object sname = session.getAttribute("sname");
System.out.println("sname = " + sname);
System.out.println("session02:"+session);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
方式一:tomcat设置session失效时间,默认30min
conf/web.xml
方式二:设置失效时间 setMaxInactiveInterval(); 单位是秒
方式三:手动设置失效 invalidate();
@WebServlet("/session03")
public class SessionServlet03 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet03...");
//获取session中的共享数据
HttpSession session = request.getSession();
//设置session失效
//方式二:设置失效时间 单位是秒 正数表示有效时间 负数表示永远不会过时
//session.setMaxInactiveInterval(20);
//方式三:手动设置失效 立即失效
session.invalidate();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
浏览器关闭,会话结束,此时session对象有没有被销毁?没有
session对象虽然还存在,但是找不到了!因为新打开浏览器发起请求,产生了一个新的sessionId,找不到 原来的session对象了。
/**
* 使用COOKIE持久化session
*/
@WebServlet("/session04")
public class SessionServlet04 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SessionServlet01...");
//使用Session共享数据 范围:一次会话:多次请求中
//1.获取Session对象
HttpSession session = request.getSession();
//2.调用方法存储数据
session.setAttribute("sname","优秀");
System.out.println("session01:"+session.getId());
System.out.println("session01:"+session);
//将sessionId存入 COOKIE中
COOKIE COOKIE = new COOKIE("JSESSIONID",session.getId());
COOKIE.setMaxAge(60);
response.addCOOKIE(COOKIE);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
如果服务器正常关闭,浏览器没有关闭,session对象有没有被销毁?还能不能获取到session中存储的数据?
session钝化:指的是服务器正常关闭,会自动将session数据持久化保存到硬盘的文件上。
session活化:指的是服务器正常启动,会将持久化的session数据加载到内存中,重新创建一个session对象,存储活化后的数据,但是sessionId没有改变。
注意:session的钝化和活化是服务器自动完成的,我们了解服务器的这种机制即可。
session基本使用 范围:一次会话【多次请求】
session有效期设置
域对象 | 创建 | 销毁 | 作用范围 | 应用场景 |
---|---|---|---|---|
ServletContext | 服务器启动 | 服务器正常关闭/项目从服务器移除 | 整个项目 | 记录访问次数,聊天室 |
HttpSession | 第一次调用request.getSession()方法 | session过期(默认30分钟)/调用invalidate()方法/服务器正常关闭 | 会话(多次请求) | 验证码校验, 保存用户登录状态等 |
HttpServletRequest | 来了请求 | 响应这个请求(或者请求已经接收了) | 一次请求 | servletA和jsp(servletB)之间数据传递(转发的时候存数据) |
范围:httpServletReques【一次请求】--> HttpSession【一次会话】 --> ServletContext【整个应用】
基本使用:
存储数据:setAttribute(String name,Object value);
获取数据:getAttribute(String name);
移除数据:RemoveAttribute(String name);
在网站登录的时候,生成一个验证码.登录的时候对验证码进行校验.
2.1:创建登录页面login.html
2.2:验证码图片生成
1.导入验证码生成jar包
2.编写验证码生成Servlet CodeServlet
生成验证码
响应给页面
2.3:填写登录信息以及验证码,进行验证码比对登录LoginServlet
用户登录
用户名:
密码:
验证码:
HttpJspBase extends HttpServlet
JSP就是一个Servlet
JSP = Servlet+Html
JSP会翻译(通过默认的JspServlet,JSP引擎)成Servlet(.java),Servlet编译成class文件
JSP执行流程
1. 客户端发起第一次请求xxx.jsp,服务器就会找到对应的jsp文件
2. 服务器会将jsp文件翻译成xxx_jsp.java
3. 将xxx_jsp.java编译成xxx_jsp.class
4. 服务器执行xxx_jsp.class文件 输出结果给客户端浏览器
JSP:是一个动态网页,在jsp中既可以写java代码,又可以写html代码,作用:简化开发
JSP本质就是一个Servlet
JSP执行流程:请求-->index.jsp-翻译->index_jsp.java-编译->index_jsp.class-->执行-->响应给浏览器
在目前实际开发中,jsp基本不再使用了,1.执行效率低下 2.不利于分工协作
我们可以通过JSP脚本在JSP页面上编写Java代码. 一共有三种方式:
类型 | 翻译成Servlet对应的部分 | 注意 |
---|---|---|
<%...%>:Java程序片段 | 翻译成Service()方法里面的内容, 局部的 | |
<%=...%>:输出表达式 | 翻译成Service()方法里面的内容,相当于调用out.print() | 输出表达式不能以;结尾 |
<%!...%>:声明成员变量 | 翻译成Servlet类里面的内容 |
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>
<%!
//声明成员变量或方法 会被翻译到Servlet类中
String hehe = "hehe SZ118";
%>
<%
//编写java代码
System.out.println("Hello world!");
//声明一个变量 局部变量 会被翻译到service方法中
String msg = "Hello";
%>
Hello World
<%--输出表达式:用于输出数据到页面--%>
<%=msg %>
<%=hehe %>
注释类型 |
---|
HTML注释 |
JAVA注释 // 、/* */ |
JSP注释: <%--注释内容--%> |
JSP注释和java脚本中的java注释内容不会展现在网页源码中,而html注释会展现在网页源码中。
注释快捷键:Ctrl+Shift+/
package com.itheima.web;
import com.itheima.bean.User;
import com.itheima.utils.C3P0Utils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.COOKIE;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//设置代码模板:file--settings--editor--live temeplates
//请求响应中文乱码处理
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 2.获取请求参数【用户名和密码】
String username = request.getParameter("username");
String password = request.getParameter("password");
// 3.使用DBUtils操作数据库 根据用户名和密码查询数据库,返回user对象
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
String sql = "select * from user where username=? and password=?";
User user = queryRunner.query(sql,new BeanHandler<>(User.class),username,password);
// 4.根据返回处理结果进行响应 user==null:登录失败 user!=null:登录成功
if(user!=null){
String remember = request.getParameter("remember");
//登录成功
COOKIE COOKIE = new COOKIE("username", username);
if(remember!=null && remember.equals("on")){
//如果勾上记住用户名 将用户名保存在COOKIE中 并设置有效时间7天
COOKIE.setMaxAge(60*60*24*7);
}else{
//如果没有勾上记住用户名 就删除这个COOKIE
COOKIE.setMaxAge(0);
}
response.addCOOKIE(COOKIE);
response.getWriter().print("登录成功!");
}else{
response.getWriter().print("登录失败!");
}
} catch (Exception e) {
e.printStackTrace();
response.getWriter().print("服务器异常!");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
<%@ page import="com.itheima.utils.COOKIEUtils" %>
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>
用户登录
<%
String username = COOKIEUtils.getCOOKIEValue(request.getCOOKIEs(),"username");
username = username==null?"":username;
%>
姓名:
密码:
记住用户名
用户勾选了记住用户名复选框,我们把用户名存到COOKIE里面,并设置有效时间
在index.jsp里面 从COOKIE取出用户名展示
String remember = request.getParameter("remember");
//登录成功
COOKIE COOKIE = new COOKIE("username", username);
if(remember!=null && remember.equals("on")){
//如果勾上记住用户名 将用户名保存在COOKIE中 并设置有效时间7天
COOKIE.setMaxAge(60*60*24*7);
}else{
//如果没有勾上记住用户名 就删除这个COOKIE
COOKIE.setMaxAge(0);
}
response.addCOOKIE(COOKIE);
会话
COOKIE
概念:客户端的会话技术
基本使用
//1.创建COOKIE对象
COOKIE COOKIE = new COOKIE(String name,String value);
//2.写入COOKIE到浏览器
response.addCOOKIE(COOKIE);
//3.获取COOKIE
request.getCOOKIEs();
COOKIE.getName();
COOKIE.getValue();
进阶使用
//1.设置COOKIE的有效时长
COOKIE.setMaxAge();//-1:默认 会话级别 正整数:有效时间s 0:删除当前COOKIE
//2.设置COOKIE的有效路径
COOKIE.setPath();
//3.COOKIE存储中文和特殊字符
URLEncoder.encode(value); //编码
URLDecoder.decode(value); //解码
Session
概念:服务器端的会话技术
基本使用
//获取Session对象
request.getSession();
//存储数据
setAttribute(String name,Object value);
//获取数据
getAttribute(String name);
//移除数据
removeAttribute(Sring name);
进阶使用
//1.设置Session的有效时间
session.setMaxInactiveInterval(20); //单位是s
//2.在tomcat的web.xml中设置Session有效时间 单位是minutes
//3.设置Session手动失效
session.invalidate();
/*4.session持久化【了解】
1.手动持久化 将SessionId存入到COOKIE,并设置有效时间
2.自动持久化 服务器完成 ,当服务器正常关闭,进行Session钝化,
当重启服务器,进行Session活化
*/
JSP
概念:jsp本质上就是一个Servlet
JSP执行原理:index.jsp-翻译->index_jsp.java-编译->class文件-->执行
jsp基本语法
<% %>:java小脚本 用于编写java代码
<%= %>:输出表达式 用于输出内容到页面
<%! %>:声明 用于声明全局变量或方法
<%-- --%>:jsp注释
练习