<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/23
Time: 16:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
登录系统
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/23
Time: 16:18
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//判断校验码
String code=request.getParameter("code");
//判断验证码是否一致
String imgcode=(String)session.getAttribute("code");
if (imgcode==null||!code.equals(imgcode)){
out.print("校验码错误,2秒返回登录页面");
response.setHeader("refresh","2;login.jsp");
return;
}
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "password";
String name=request.getParameter("name");
String password=request.getParameter("password");
String sql="SELECT * FROM login WHERE name=? and password=?";
try {
// 数据库连接
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1,name);
psmt.setString(2,password);
ResultSet rs=psmt.executeQuery();
if (rs.next()){
//验证令牌
session.setAttribute("passcard","ok3");
//转到成功页面
response.sendRedirect("3.jsp");
}else {
//转到失败页面
response.sendRedirect("fail.jsp");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
%>
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/23
Time: 16:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
fail
登录失败,请重新登录三秒后自动跳转
<%
response.setHeader("refresh","3;login.jsp");
%>
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/23
Time: 17:10
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
//导入四个包
<%@ page import="javax.imageio.*,java.awt.*,java.awt.image.*,java.io.*" pageEncoding="GBK" %>
<%
//浏览器缓存
response.addHeader("expires","0");
response.addHeader("cache-control","no-cache");
response.addHeader("Pragram","no-cache");
//清除服务器输出对象
out.clear();
pageContext.pushBody();
//生成一张图片
BufferedImage bimg=new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//画笔
Graphics g=bimg.getGraphics();
//设置颜色
g.setColor(Color.black);
g.fillRect(0,0,80,20);
g.setColor(Color.yellow);
String str=""+(1000+(int)(9000*Math.random()));
session.setAttribute("code",str);
g.drawString(str,20,15);
//图片转化为二进制数组
ByteArrayOutputStream bout=new ByteArrayOutputStream();
ImageIO.write(bimg,"jpeg",bout);
byte[] bb=bout.toByteArray();
//获得二进制数据流
OutputStream outx = response.getOutputStream();
//设置浏览器接收数据类型与处置类型
response.setContentType("image/jpeg");
response.addHeader("content-disposition","inline;file=xx.jpg");
//将数据发送出去
outx.write(bb,0,bb.length);
outx.close();
%>
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/23
Time: 16:48
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%!
int totalpages = 0; //总页数
int pageSize = 20; //每一页展示的数据行数
int totalRecords = 0; //总的数据条数
int xpage = 1; //当前页
%>
<%
//验证
String passcard=(String)session.getAttribute("passcard");
if (passcard==null||!passcard.equals("ok3")){
out.print("尚未登录,2秒返回登录页面");
response.setHeader("refresh","2;login.jsp");
return;
}
// 权限分级,分类
if (passcard.equals("ok1")){
}
%>
<%
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "password";
try {
// 数据库连接
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
String sql = "SELECT count(*) FROM web_class";
PreparedStatement psmt = conn.prepareStatement(sql);
ResultSet rs = psmt.executeQuery();
rs.next();
totalRecords = rs.getInt(1); //获取所有的数据条数
String aa = request.getParameter("page"); //获取当前页
if (aa == null || xpage < 1) {
xpage = 1;
} else {
try {
xpage = Integer.parseInt(aa);
} catch (NumberFormatException e) {
xpage = 1;
}
}
if (totalRecords % pageSize == 0) {
totalpages = totalRecords / pageSize;
} else {
totalpages = totalRecords / pageSize + 1;
}
totalpages = (totalRecords + pageSize - 1) / pageSize;
//显示当前数据
sql = "SELECT * FROM web_class";
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
if (xpage >= totalpages) {
for (int i = 1; i <= (totalpages - 1) * pageSize; i++) {
rs.next();
}
} else {
for (int i = 1; i <= (xpage - 1) * pageSize; i++) {
rs.next();
}
}
%>
Trump成绩查询
学生成绩
添加学生信息
学号
姓名
科目
成绩
操作
操作
<% //数据库调取数据
for (int i = 1; i <= pageSize; i++) {
if (!rs.next()) {
break;
}
int a = rs.getInt(1);
String b = rs.getString(2);
String c = rs.getString(3);
int d = rs.getInt(4);
%>
<%-- 数据展示 --%>
<%
}
%>
<%
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/21
Time: 13:19
To change this template use File | Settings | File Templates.
--%>
<%@ page pageEncoding="UTF-8" language="java" %>
<%
// 获得id
String id = request.getParameter("id");
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "password";
try {
// 数据库连接
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
String sql = "DELETE FROM web_class where id=?";
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setInt(1,Integer.parseInt(id));
psmt.executeUpdate();
conn.close();
response.sendRedirect("test_03.jsp");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
%>
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/21
Time: 15:24
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//获得参数
String id = request.getParameter("id");
String name = request.getParameter("name");
String course = request.getParameter("course");
String score = request.getParameter("score");
System.out.println("***********");
System.out.println("course:"+course);
//访问数据库
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "password";
String sql = "UPDATE web_class SET name=?,course=?,score=? WHERE id=?";
try {
// 数据库连接
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1,name);
psmt.setString(2,course);
psmt.setInt(3,Integer.parseInt(score));
psmt.setInt(4,Integer.parseInt(id));
psmt.executeUpdate();
conn.close();
response.sendRedirect("test_03.jsp");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
%>
增加页面
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/21
Time: 13:37
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "password";
String sql = "SELECT max(id) FROM web_class ";
try {
// 数据库连接
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement psmt = conn.prepareStatement(sql);
ResultSet rs = psmt.executeQuery();
rs.next();
int id=rs.getInt(1)+1;
conn.close();
%>
添加信息
学生信息添加
<%
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
%>
```jsp
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/21
Time: 14:50
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String id = request.getParameter("id");
String name = request.getParameter("name");
String course = request.getParameter("course");
String score = request.getParameter("score");
String JDBC_DRIVER = "com.mysql.jdbc.Driver";
String DB_URL = "jdbc:mysql://localhost:3306/test";
String USER = "root";
String PASS = "password";
try {
// 数据库连接
Class.forName(JDBC_DRIVER);
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
String sql = "INSERT into web_class(id,name,course,score) VALUES (?,?,?,?)";
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setInt(1,Integer.parseInt(id));
psmt.setString(2,name);
psmt.setString(3,course);
psmt.setInt(4,Integer.parseInt(score));
int rs=psmt.executeUpdate();
conn.close();
response.sendRedirect("test_03.jsp");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
%>
```
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/28
Time: 9:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%-- 链接下载--%>
download
<%--
Created by IntelliJ IDEA.
User: 11637
Date: 2020/4/28
Time: 8:52
To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.io.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
// 1、得到二进制流
OutputStream outx=response.getOutputStream();
// 2、设置头,告知浏览器需要下载
response.setContentType("application/x-download");
// 3、告诉浏览器接收文件是下载还是打开
response.addHeader("Content-Disposition","attachment;filename=test.mp4");
// 4、通过二进制流,将文件的数据发送到客户端
FileInputStream fin=new FileInputStream("E:\\software\\apache-tomcat-9.0.33-windows-x64\\apache-tomcat-9.0.33\\webapps\\test\\test.mp4");
byte[] bb=new byte[1024];
int length=-1;
length=fin.read(bb);
while (length!=-1){
outx.write(bb,0,length);
length=fin.read(bb);
}
// 5、关闭流对象
outx.close();
%>
邮件编程的步骤
1、准备一个Properties类;
准备邮件发送的两个参数,验证与地址
2、准备一个验证类
3、通过验证类创建一个验证对象
就是 邮箱的:用户名与密码
4、创建一个通道对象,将参数与验证对象传递进来;
5、通过通道对象创建一个邮件对象;
6、设置邮件的5个参数
发送者;
接收者;
主题;
时间;
内容;
7、通过发送器类直接发送该邮件对象
参考链接:菜鸟教程描述
1、邮件编程概述
不是太重要了;
java提供了一个类库,能够实现邮件编程;
邮件的发送 邮件的接收
SMTP 25 POP3 110
就是一个套设计出来的指令集合,
通过该套指令,我们用户可以实现与邮件服务器的
功能通信,这些功能都是围绕邮件来的。
2、邮件库介绍
activation.jar包
mail.jar包
这两个包都不是jdk或者tomcat的默认包,
如果你想让jdk支持邮件编程,需要引入这两个包;
如果你想让tomcat支持邮件编程,需要tomcat中引入这两个包;
3、涉及到的相关类
邮件通道类; Session类 邮件验证类; Authenitication类 邮件类; Message类 邮件发送器类; Transport类
四个主类
邮件中添加附件相关的几个文件处理类
通过上述类可以实现各种类型的邮件发送编程;
邮件接收编程还有相关的类,本课不做介绍。
4、邮件编程的步骤
1、准备一个Properties类;
准备邮件发送的两个参数,验证与地址
2、准备一个验证类
3、通过验证类创建一个验证对象
就是 邮箱的:用户名与密码
4、创建一个通道对象,将参数与验证对象传递进来;
5、通过通道对象创建一个邮件对象;
6、设置邮件的5个参数
发送者;
接收者;
主题;
时间;
内容;
7、通过发送器类直接发送该邮件对象
5、邮件编程的案例1
普通邮件发送 发送成功;
案例2:如何发送带附件的功能
普通邮件用setText来设置邮件的内容;
带附件的邮件用setConent()来设置邮件的内容;
带附件的邮件发送成功;
如何变成网页发送邮件:
我们就是把网页中获得的数据
变成 msg的五个参数,
然后还使用 刚才发送程序,实现用户通过网页发送邮件。
自己搭建一个邮件服务器,很简单,只需要找一个服务器软件,很小,在自己的电脑上搭建一个
邮件服务器,自己连接自己,实现发送;
[email protected] fzxy123456
如何在JSP中 使用自定义类
1、回顾
2、自定义类
1、如何在tomcat中使用第三方类
tomcat\lib 就是第三方jar的存放目录
这个目录是一个全局目录,如果我们把jar放置到这个位置,这个tomcat 服务器上的任何项目可以用;
webapp下的每一个文件件 都代表一个 web app 一个独立的web 应用;
webapp下的每一个文件夹都代表一个 web 项目;
所以,以后说一个web项目,和一个 web 应用是一回事;
web 应用技术 开发 web 项目开发
一般情况下,我们不会跨项目 共享 jar的;jar一般都是随项目走的;
如何让第三方包,跟项目走
该项目下的web-inf\lib下,放置第三方包,则该包的工作范围就是该项目;
2、自己想封装一个类自己用,怎么办?
第一步:在自己的wen-inf\classes下编译自己的java代码;
第二步:编译该代码 javac -d . ****.java ====> 为什么-d . 这个不解释;
它能够自动帮助我们创建存放类需要的文件夹;
第三步: 在jsp中使用自己的类
在jsp中使用自己的类 和第三方类 没有区别;
该import 该 new 对象使用就new 对象使用;
需要注意的是,如果你的类需要被使用,千万千万要 public
3、封装的好处是什么?感觉更麻烦了
不解释;代码重复使用 代码重复使用 代码重复使用
程序,结构性强 可读;
代码重复使用 结构清晰 可读性强 》是所有软件重构 代码重构的 目标;==》让软件的质量高;
3、JavaBean
本来啊,自己定义自己的类自己用,好好的,javaBean就是 web服务器特殊支持的 自定义类;
因为获得了web服务器的特殊支持,能够更加方便的 jsp编程;
javabean作为特殊的自定义类,有如下特殊的地方;
1、类必须有包;
2、类必须有无参构造函数;
3、类必须public
4、类中的属性 最好都带set/get 方法
数据的自动装配,就是 这个最最最最重要的特殊的支持;
2.jsp 和 3.jsp对比案例 深刻的说明, 数据自动装配能够让服务器的初始化 减少90%的工作量;
本质上,所谓的数据自动装配,就是 javabean 能够将我们的数据 自动初始化,甚至在初始化过程中,自动完成数据类型的匹配;
就是将用户提交的数据变量和需要自动装配的对象 一对一的赋值;
千万注意:
为什么没有值?谁知道,奖励2分,期末成绩? 谁回答?
如果想要实现自动装配,
用户端提交的变量的名字 和 服务器端 对象的属性的名字 必须一样
不一样的不能够 自动装配;
4、关于javaBean的5个指令
指令1:
指令2:
指令3:
d**.e** = ***;
指令4:
aa.name = request.getParameter(name);
指令5:
aa.name = request.getParameter(“age”);
5、总结
javabean 就是特殊的自定义类,特殊的地方见1234;
javabean的最大好处是 能够将数据自动装配;
涉及到数据装配的指令有5个,如上。
1、Servlet概述
Servlet是真正的服务器程序;
JSP难道是假程序吗?
JSP程序不是服务器最终执行的实体,JSP被调用,实际上会让服务器将jsp程序
编译成Java源代码====》java的可执行程序 ===》执行
用户调用jsp====>tomcat引擎编译jsp====>.java====>java编译器====>.class====>tomcat的执行器执行该
*.class程序。
JSP的执行效率高 还是 Servlet 的执行效率高?
jsp 选1
servlet 选2
jsp好的好处是 编写方便
servlet的好处是运行效率高;
你就明白? 很多情况下,我们需要手动编写servlet ,为了效率;===》程序的目标是功能 ===》功能使用者是用户
所以,编程的最终目标是用户 不是程序员;
经常是因为 我们需要 用户一点点 体验上的改变 性能上的提升 我们需要 翻越10万大山…
这个世界不是先有jsp,先有的是Servlet,编写servlet确实很不爽的情况下,有人定义了一个jsp技术,让程序员的更加有效率;
看项目。 有些项目是 以 用户为中心;
3、Servlet编写步骤
1、找到位置 自己项目的web-inf\classes下
2、继承HttpServlet类
3、重写service方法
4、在service中编写自己的功能;
5、编译 想在jdk中成功编译servlet,需要jdk中引入servlet的jar才可以; tomcat中有servlet的jar,导入到jdk中即可。
6、部署
servlet需要配置才可以调用;
在该项目对应的web-inf\web.xml中配置该sevlet;
7、测试
调用成功;
演示:
4、如何理解 Servlet 与 JavaBean
JavaBean 是一个第三方类,不是一个独立的程序?
class Student{
。。。。
。。。。
}
是独立的程序吗?
1 是
2 不是
JavaBean 必须别JSP、Servlet或者是其它的代码调用,它不面对客户调用;
一段代码是不是独立的程序?判断的标准就是你是对内,还是对外;
对外的代码,可以被用户直接触发的从才是独立程序;
Servlet是独立的程序,可以直接面对用户触发;
5、Servlet在开发中的位置
我们经常发那些需要高效执行的代码直接编写为Servlet,提高软件的效率;
6、Servlet生命周期
JDK中,我们一个独立的程序,它的执行的入口是main()方法;
在Servelt中,它执行的入口是什么?
Servlet程序与JDK中的程序相比,执行过程稍微不一样;
它有5个方法,分别参与了整个程序的执行过程;
init();
service();
doget();
dopost();
destroy();
Servlet第一次被调用,则执行顺序为init()=>service()=>doget()||doPost()
Servlet非第一调用,则执行顺序为service()===>doget()||doPost()
web-app 被shutdown的时候,该web-app中的servlet被统一的调用destroy()方法;
有什么用?
用处大了?
我们可以考虑,在不同的周期的,安排不通的功能,实现 一个软件功能更加合理的安排;
7、Servlet和JSP的关系
Servlet和JSP之间是替代关系,是效率关系 是方便关系;
7、一个案例来证明servlet的生命周期
4、Servlet 部署执行
5、Serlet调用执行
6、Servlet自动加载、
Servlet的多重映射
7、Servlet默认映射 没有匹配到的请求都来匹配这个Servlet
8、Servlet的部署技巧
学习Servlet的部署配置
aa //对象的名字,也是自己命名的; Servlet2 //Servlet对应的类 aa //对象的名字,也是自己命名的; /s2 //表示用户访问设计的地址标签部署自动加载模式
aa //对象的名字,也是自己命名的;
Servlet2 //Servlet对应的类
1 //表示该Servlet可以自动触发
有很多程序,是服务器的内部功能程序,不面向用户使用:例如:监控程序,后台定时器,任务管理程序…
这些程序,可以考虑在tomcat自动的时候自动调用,就可以用Servlet配置为自动记载模式;
多映射部署 ——好处就是让用户不知道服务器的执行架构(软件更安全),不要将真实的命名与调用逻辑暴露给用户;
aa //对象的名字,也是自己命名的; /s2 //表示用户访问设计的地址标签 aa //对象的名字,也是自己命名的; /s3 //表示用户访问设计的地址标签默认映射—》 与一个网站有默认的首页一样,如果用户的访问路径不一样,应该导到统一的一个处理页面,增加用户体验
aa /通配符映射 ====>用通配符将一类请求,映射到一个Servlet上.
aa /* //所有的请求的到aa上; aa /abc/* //所有/abc/开头的请求都映射到aa上9、两类特殊的Servlet之一_Filter过滤器
互联网上有很多的流量 不是人生成。。
2010左右 50%的流量不是人生成的。机器的访问请求超过人的访问请求;
爬虫。。。。。。。百度的数据怎么来的?爬虫爬来的。mapping数据库中
爬虫用来获取数据
引擎为了搜索数据
防灾科技学院=服务器====》800用户并发 2000个爬虫
原理特别简单: request.getHead(“user-agent”); 通过这个数据,就能够获得用户的客户请求信息
根据用户请求信息的数据,来判断请求的是用户 ,还是爬虫,如果是用户,继续请求,
如果是爬虫,拒绝访问。
user-agent代表 客户端的信息;
不通的浏览器,得到的关于用户的信息不一样
如果我们自己开发一个爬虫,看看能得到什么信息
Java/1.7.0_15
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
chain.doFilter(request,response);//将用户的请求传递的请求的位置;
我们的服务器的过滤器,用来过滤所有的用户请求,如果是浏览访问,则正常通过,
如果是非浏览,则过滤该请求,不让通过。
通过这个模式,可以让我们的网站,抵御爬虫;
为什么?网站可以抵御爬虫,也可以不抵御爬虫,甚至可以设置一个管理器,
让爬虫在特定的时间内,访问我们的网站; 例如:从夜间10点 到第二天早晨6点;
我们的网站,也盼望爬虫访问。
aa
cn.edu.cidp.wlwgc.Filter1
aa
/*
package cn.edu.cidp.wlwgc;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
加载更多
1、监听器
tomcat 提供了四个状态允许Servlet来监听
ServletContext 这个是服务器的状态
ServletContextAtrribute 服务器状态的属性的
SessionListener 来访用户
SesssionAtrribute 来访用户的属性
实际使用中,绝多数都是监听Session来监听服务器的实时在线用户数
服务器端的session代表的是一个到访用户,来一个客户端,服务器为它创建一个session;
所以,如果可以直接到服务器有多少个session.就可以知道,当前在线有多少个用户。
如果一个用户离开了服务器,则服务器销毁该用户对应的session。 ??
一个需要特别注意的问题:什么叫做离开的了服务器?
部署
案例
部署完成
启动服务器 则该监听器 就已经在运行了;
普通的Servlet需要被触发;---------------》明确的请求触发
过滤器也需要被用户请求触发;---------------》任意的用户请求,都会触发过滤器
监听器 ===========》服务器启动,监听器就自动运行,不是用户触发的,是服务器启动自带的;
1是登录状态
2 非登录状态 2
360浏览器 访问服务器的时候,服务器作为一个用户来管理 所以,无论多少个360浏览器,服务器只
为该浏览器创建一个session。
ie浏览器访问服务器的时候,服务器作为一个用户在管理,所以,无论多少个ie浏览器,服务器只
为该浏览器创建一个session。
上面的这个说法,不取决于 客户如何?取决于服务如何。
所以:作为程序员,要注意,服务器是可以调整设置,如何创建session策略的。
关闭浏览器,服务器的session是否销毁,销毁后应该 count应该减少才对.
服务器用户数减少没有?
1 减少
2 没减少
我们用浏览器访问了淘宝,登录成功;关闭浏览器,再打开,发现还是登录状态,说明
服务器把我看做老用户,意味着服务器不会创建新的session。
刚才的案例:我们自己关闭自己的浏览器,来重新访问tomcat服务器的时候,新的浏览被tomcat
当做新用户,所以才count++;
来访问淘宝的时候,淘宝当做老用户,所以,保持登录状态;
这就说明,我们的tomcat关于session的管理策略,与taobao的session管理策略不通。
重新打开浏览器后,访问邮箱,需要重新的登录吗?
1、需要
2、不需要
请选择
为什么,还是深刻的说明,不通的服务器的关于session的管理策略是不一样的,客户端无从知道。
既然新打开当做新用户,为什么老用户没有销毁,从而count–呢?
这个是服务器的默认销毁策略,tomcat默认的销毁策略是30分钟;我估计taobao也是30分钟
不动,明天来,还是在登录状态吗?
1、登录
2、不登录
请选择
通过上面几个案例,你会深刻的理解 服务器的session,
服务器的session就是 服务器为每一个用户保持的一个对象,session的状态消失与否,
就是服务器对于客户登录或者新客户的分界线。
一般默认都是30分钟。
可以不可以自动销毁呢;
可以。
session.invalidate();//该方法,就是主动触发,服务器销毁该session.
所以,所以系统的退出起就是都是触发 该代码。
session invalidate 表示session失效,session失效 未必很快就是session销毁,所以有延迟。
上面的案例就是一个同样的案例;
你可以引用一下,开发中直接使用;
2、MVC开发模式
语法讲述的不够完整,但是,这个课程的核心技术,都传授给你了
语法不是重点
技术是重点
JSP的技术体系
登录
校验码
增产查改
访问数据库
分页显示
邮件编程
html界面
注册界面
上传与下载
javabean
servlet
上述技术?那个最重要,必须掌握,代表编程入门了?
数据库的增删查改
成绩的增删查改
id name class score 实现增删查改
业务核心
3、四个内置对象