Servlet
引言
问题1: tomcat+HTML展示信息不变?
原因:
① HTML网页中信息是静态(数据不变)
② tomcat直接读取html源文件内容,响应给浏览器.
解决思路:
将java程序交给tomcat管理.
服务器调用java程序,获得结果响应浏览器.
概念:
概念: 一段Java程序,可以运行在tomcat端.
语法: Servlet标准.(接口) JavaEE标准(servlet-api.jar)
Servlet开发的具体步骤
手动部署servlet程序[最重要基础]
需求: 显示当前系统时间?
编写Servlet程序
导入servlet-api的jar.(编写编译java程序使用)
将servlet部署tomcat
在tomcat/webapps下创建文件夹(web项目)
在项目下创建创建WEB-INF/classes,将代码带包拷贝在classes下面
在web.xml描述(全类名+访问路径)
启动tomcat
访问servlet,查看执行响应的结果.
MyEclipse集成开发Servlet和部署
MyEclipse管理tomcat
tomcat交个MyEclipse管理
window--preferences--搜tomcat--->tomcat 8.x---brwose--找到tomcat目录+ 选择ebable.---apply
管理tomcat窗口: window-showview--other-->servers
启动tomcat
servers-tomcat8.x---右键---run server
关闭tomcat
servers-tomcat8.x---右键--stop server
部署项目
参考下面
MyEclipse开发部署Servlet
新建web project
创建web.xml
自动创建好对应的目录结构(WEB-INF classes web.xml)
编写servlet
编写web.xml
部署
servers--tomcat8.x---右键---add deployment--选择项目部署
Servlet生命周期[面试]
概念: servlet创建时机和活跃使用时机,销毁时机.
servlet创建
第一个浏览器访问servlet,对象会被创建
一个Servlet类只会创建一个servlet对象.
servlet服务
浏览器每次访问都会调用service方法.
servlet销毁
tomcat关闭,销毁servlet对象
重点:
Servlet对象只有一个单实例,面向多线程(用户)访问,线程不安全.
如果servlet有属性, service方法中对属性的操作,加锁.
要求: Servlet中不要添加数据属性
Servlet执行原理(原理)
问题: 浏览器发送url的请求---直到浏览器接收到响应结果,过程发生了什么?
浏览器向tomcat发出url的http请求: http://ip:port/web项目名/servlet的url-pattern
tomcat
获得url的项目名, 从本tomcat下的webapps下找到对应文件夹.
根据url中servlet的url-pattern,从web.xml找到 servlet-name, 找到servlet-class
Class clazz = Class.forName('Servlet的全类名');//获得servlet的类对象.
Servlet servlet = (Servlet)clazz.newInstance();//创建出了类的对象(Servlet),
tomcat先调用 方法,(servlet第一被访问)
调用servlet的service方法;
服务器将响应结果返回给浏览器.
浏览器发出第二次请求.
tomcat会直接根据url-pattern,找到servlet对象,调用servlet.service方法.
Servlet请求参数
概念: 浏览器请求servlet携带的数据,叫做请求参数
Servlet接收请求参数:
浏览器请求Servlet的方式
浏览器地址栏.
form表单(的action)请求Servlet
超链接的href.
请求参数乱码问题
Post提交乱码
了解: tomcat接收数据默认编码:
接收:
注意: 设置编码,在接收请求参数之前设置
Get提交乱码
方式:
form action='' method='get'
超链接携带的数据.
浏览器发送请求参数
修改tomcat的conf/server.xml中
多个Servlet配合工作
请求转发(foward)
作用:多个Servlet配合完成一个功能
核心特点:
是服务器(当前web项目)内部发送的流程跳转.
forward请求转发连接的多个servlet,处于一个请求过程中.
页面显示信息和浏览器地址栏不一致(效果,不是错)
代码:
Request作用域
概念: JavaEE提供的存储数据(命名属性)的空间.
命名属性: 名字---值
生命周期: 一次请求过程.[备注:请求转发的servlet正好处于一次请求过程]
存:
取:
请求重定向(Redirect)
核心特点:
服务器(web应用)外部跳转。
通知浏览器,自动去请求下一个要跳转的页面或者Servlet(不需要用户操作)
重定向连接的servlet或者资源,处于两个不同的请求过程。
请求重定向后的页面和浏览器的地址一致。
代码实现:
总结跳转方式
会话技术
http协议: 无状态协议,(协议本身不会记录任何信息,两次信息传输之间没有任何关系)
概念: 客户端(浏览器)会话技术。
应用场景: 浏览器记录 登录验证 验证码 购物车(阉割版)
另一种解释: 浏览器和服务器之间,多次交互依然保存数据(状态)的一种机制。(每个浏览器一份)
Cookie
概念: 服务器保存在浏览器上的一小段字符串[key=value]
工作机制:
服务器tomcat创建
保存在浏览器
浏览器每次访问服务器,都会将服务器(web项目)保存在本浏览器上的cookie发送到服务器上。(发送当前服务器保存的cookie)
编码:
创建:
将cookie存入浏览器
其他方法(设置生命周期,设置存活多久)
获得浏览器请求携带的cookie信息?
总结Cookie的特点
存在浏览器上的一小段字符串
缺点: (数据不太安全)
优点: 分担服务器的压力。(不会占用服务器的任何资源)
cookie只能保存字符串,不能保存中文。
cookie生命周期: (跨多次请求)
设置: setMaxAge(秒)
10 存活10s
0 删除cookie
-1 设置cookie浏览器关闭之前。
默认: 浏览器关闭,cookie丢失。
cookie和浏览器(用户)一一对应。
HttpSession
概念: 服务器会话技术。
核心工作机制: 服务器为每个浏览器分配的一个一一对应的存储空间。
详细: 浏览器第一次访问web应用服务器,服务器分配一个session对象,该浏览器第二次后再访问,服务器直接将原有sessino对象分配给该浏览器。
HttpSession的特点
存放在服务器
每个浏览器和session一一对应
HttpSession的生命周期夸多次请求依然存在。
HttpSession 相关的API
属性: id.
获得session:
浏览器第一次访问: 创建session对象。
浏览器第二 三…次访问: 获得原有的session对象给你。
HttpSession作用
作用域,存储命名属性
存:
取:
移除:
特点:
浏览器一一对应
跨多次请求依然存在
存放在服务器
Session失效时机(补充)
浏览器关闭,session失效。
session默认保留30分钟。 【浏览器和服务器之间,超过30分钟没有请求】
主动失效:
应用: 用户退出登录:
①
②
Cookie和Session对比[笔试]
Session和Cookie的相同点:
和浏览器一一对应。
生命周期跨多次请求依然存。
Session和Cookie的不同点:
Cookie:
存在浏览器
cookie只能存储字符串,不能存汉字.(缺点)
cookie数据容易通过浏览器直接查看,不太安全。(缺点)
Session:
存在于服务器端
session可以存对象,可以存入任何类型。(优点)
session数据保存服务器,相对安全。(优点)
session中数据过多,侵占服务器内存资源(对服务器运行造成压力)[缺点]
应用场景分析:
用户私密信息(Session)
用户浏览器过的商品信息(cookie保存)
Session实现原理
机制:
浏览器第一请求服务器web项目,会为该浏览器创建一个session对象。获得session的id,并且将id以cookie的形式写回到浏览器。以后每次浏览器,请求服务器都会自动携带该cookie(JsessionId)信息,tomcat通过获得cookie中名字为jesessionid的cookie的value值,和内部所有的session对象匹配,找到对应的session对该浏览器使用。
内部代码实现(局部代码):
浏览器第一请求服务器
浏览器第二次(以后)请求服务器
用户禁用cookie(了解)
导致session失效,解决办法?
总结:
对所有超链接+表单等一切请求服务器的url路径,全部进行url重写。
方法:
纠错: ;
Filter过滤器
概念: Servlet中提供的技术,可以过滤浏览器发出的请求,并且决定放行请求还是中断请求。
核心工作机制:
编码步骤
自定义一个java类,实现Filter接口
}
}
在web.xml中注册信息
生命周期(了解)
创建: tomcat启动
销毁: tomcat关闭
Filter的url-pattern的写法:
写多个。
---过滤所有请求
---过滤请求以.do的请求
----过滤路径中的url-pattern部分,以/xxxxxooaa开头的请求
联系客服