Servlet笔记01
一. 引言
1. 概念
1) servlet一段运行在tomcat服务器上的java小程序,能够生成动态网页,是JavaEE规范的一部分
2)动态网页 : 构成网页内容的数据是实时变化
3)运行方式: 开发好的java程序,需要发布到tomcat服务器上,由服务器在用户请求达到时调用
2. 搭建开发环境
需要将servlet技术对应的servlet-api.jar引入到java项目中
二. 第一个servlet程序开发
1. 写代码
1) 实现servlet程序的三种方式
① implements Servlet , 覆盖5个方法(service方法),与协议无关程序
② extends GenericServlet,覆盖service方法,定义与协议无关的程序
③ extends HttpServlet , 覆盖service方法, 必须使用http协议通信
2) 具体代码
2. 发布程序(手动发布) — 部署(deploy)
~~~java
Tomcat
|-- lib
|-- conf
|-- bin
|-- work
|-- webapps
|-- myweb
|-- html文件,image图片,css文件
|-- WEB-INF
|-- classes 存放java程序的字节码文件(注意:带着包结构)
|-- lib 如果有,存放当前应用需要使用的私有的jar包
|-- web.xml文件
~~~
3. 写配置文件web.xml
<servlet>
<servlet-name> servlet程序的简称(必须保证当前文件中唯一)</servlet-name>
<servlet-class> servlet程序的全类名(包名.类名)</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> servlet程序简称,与上面的简称一致(注意区分大小写)</servlet-name>
<url-pattern> /程序网名 (必须以/开头) </url-pattern>
</servlet-mapping>
4. 启动服务器访问程序
http://127.0.0.1:8989/myweb/first
访问程序
http://127.0.0.1:8989/myweb/first
Servlet笔记02
一.复习
-
Servlet : 生成动态网页技术
-
第一个动态网页
1)写程序
① implements Servlet ② extends GenericServlet ③ extends HttpServlet
继承HttpServlet 覆盖 service方法
Public void service(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException{
Request response
}
2)部署( 目录 ) — 手动部署
Tomcat —webapps — myweb
|-- others( html image css js jsp 视频… )
|-- WEB-INF ( 是client屏蔽 )
|-- classes .class文件和它所在的包结构
|-- lib .jar包
|-- web.xml 一个web应用的配置文件Tomcat软件默认的CLASSPATH是什么? classes + 两个lib
3)写配置文件web.xml
---- 全名
— /xxx
4)访问( 地址 )
http:// ip : port / 应用名 / 网名 -
请求的发送方式 — 3种
- 地址栏手工输入 2) 超链接 href 3) 表单的提交按钮 action
二.Web应用3.0版 — 利用myeclipse自动部署web应用
- 将tomcat服务器软件配置到myeclipse里
- 菜单window --> show view --> others --> 搜索Servers --> 选中
- 右键 --> configure server connector
- 选择tomcat7 --> enable --> 第一个对话框选择tomcat安装路径
- 在myeclipse里启动关闭tomcat软件
-
在myeclipse里新建web project
在myeclipse里完成应用的所有编写开发任务, 然后再部署
1)写程序 2) 写配置文件 3) 部署 4) 启动tomcat 5) 使用外部的浏览器软件访问 -
在myeclipse里自动部署
- 方法一: 选中tomcat7.x --> 右键–> add deployment --> 选中部署的项目
- 方法二: 选择工具栏里的deploy按钮 --> 选中项目 --> 添加服务器 --> 部署
注意:
1)部署时 , 会自动使用项目名作为web应用名发布
2)如果单方面修改了项目名 , 则需要手动更新部署后的应用名
项目右键 --> properties --> 搜索web --> 修改web context root值
三.Servlet程序的生命周期
-
Servlet程序的生命周期由Tomcat服务器来管理
-
Client发出请求后 , tomcat做了哪些工作使得响应回到client
- client在地址栏发出请求 , 根据请求里的ip和port找到tomcat服务器
- 根据请求里的”应用名”找到应用的配置文件web.xml
- 读取web.xml , 查找”请求里的网名”对应的程序名
- 利用反射技术 , 获取程序对象 ( 第一次请求到达,使用”全类名”构建程序对象 ; 不
是第一次请求 , 则直接获取之前创建好的对象 )
Class a = Class.forName(“全类名”);
Object obj = a.newInstance();
5)使用obj对象调用程序的service()
6)service()运行,将结果输出到浏览器
-
Servlet程序的声明周期相关方法
-
关于构建时机问题
Tomcat会为每一个servlet程序构建1个对象, 为所有client提供服务, 默认对象会在第
一次请求到达时构建 , 也可以通过配置, 人为设置构建时机( 可以控制在启动时构建)
-
线程安全问题
Tomcat容器中,每个servlet只有一个对象为所有请求它的client服务,多个client(线
程)并发访问该对象(临界资源)时,要求程序必须有保证数据线程安全的措施:
1) 优选 : 尽量不要为servlet程序定义”成员变量”(静态成员或者实例变量)
2) 如果定义了成员 , 则需要对”敏感代码”(修改临界资源数据的代码)加锁
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210605134237334.png)
三.关于servlet程序间的跳转问题
- 当client的请求过于复杂 , tomcat端需要多个servlet配合来完成要求 ,配合方式
- 请求转发 forward 2) 请求重定向 redirect
相同点: 都可以将 “程序的流程” 和 “请求” 由servlet1同时送入servlet2 , 在servlet2
执行结束后 , 请求不会”回头”(随着响应发出,request消亡) , 流程会遵照”函
数调用”的特点回到调用点执行跳转后的代码( 不能再使用request和response)
-
请求转发 forward
-
代码
RequestDispatcher rd = request.getRequestDispatcher(“下一个程序的网名”);
Rd.forward(request,response); -
数据的传递
① request本身是一个存储空间( 作用域 )可以存放起了名字的数据( 命名属性 )
② 代码
存数据 —> request.setAttribute(“name”,value);
取数据 —> Object value = request.getAttribute(“name”);
-
-
forward特点
① forward连接的多个程序之间 共享”一个请求” *****
② 请求在服务器内部被转发 , client不知晓 , 浏览器地址栏和网页内容不匹配
③ 使用request对象做数据传递
④ forward方式不能”跨域”( 跨应用 )- action代码模版
- action代码模版
Servlet笔记 第三天
一.复习
- 自动部署web项目 ( 工具使用 )
- Servlet程序的生命周期
1)请求响应的过程
Ip和port --> tomcat --> 应用名 --> 读取配置文件web.xml --> 找网名对应的程序名
–> 创建对象( 反射 + 第一次请求到达 ) --> 对象.service(request,response)
2)生命周期里的方法
构造方法 --> init() —> 反复调用service() --> destroy()
3)servlet程序初始化时机 ****
① 默认第一次请求到达时
② 手动设置 : —
4)临界资源
Tomcat只为servlet创建一个对象, 会被多线程(client)并发访问
① 尽量不定义成员变量( 实例 和 静态 )
② 对敏感代码(修改成员变量的代码)加锁 - 多个servlet配合
1)配合方式(跳转方式) : forward(转发) redirect(重定向)
提示: ① 处理请求(应对request相关功能) — XxxAction
② 作出回应(应对response相关功能) ---- XxxxView
③ action是纯java代码,需要通过”代码”(forward或者redirect)控制跳转
View可以向浏览器输入界面,可以将跳转封装成超链接或者表单,不需要
借助代码跳转
2)Forward
① 代码
RequestDispatcher rd = request.getRequestDispatcher(“下一个资源的网名”);
Rd.forward( request,response) ;
资源: 静态网页 动态网页( view 或者 action )
② 数据传递 — 借助”作用域request”
request.setAttribute(“name”,value); Object value = request.getAttribute(“name”);
③ 特点
共享一个请求 发生在服务器内部,client的表现( 地址栏和网页内容不匹配 )
二.多个servlet配合方式二 — 重定向redirect
-
代码
response.sendRedirect( “ 下一个资源的uri — /应用名/网名 ” ); -
特点
1) 重定向连接的两个程序,处于两个请求的生命周期中 ( 浏览器会根据第一次请求的
响应,自动发送第二次请求)
2) 浏览器地址栏会发生改变 , 地址和网页内容最终匹配的
3) 重定向不能使用request传递数据
4) 重定向可以跨应用 ( 跨域 )
- 选择标准( forward 和 redirect ) ---- 重点
1) 如果当前action程序结束时, 业务功能完成 , 向下一个目的地跳转选择redirect
2) 如果当前action程序结束时, 业务功能没完成 , 则选择forward向下跳转
Action和view做同一个业务功能, 一定会有业务数据的传递
3) 如果无法确定是否结束 , 建议选择redirect
- 重定向过程的数据传递问题 — 不重要
1) 一般重定向过程伴随着功能切换, 通常不需要数据传递
2) 非传不可
① 简单少量数据(String -- 非中文 , 整数)
传 -- response.sendRedirect(uri?name=value);
收 -- String value = request.getParameter(“name”);
② 中文数据 或者 复杂数据(对象,集合)
使用作用域HttpSession传递数据
三.用户信息追踪
-
概念: 保留用户做个的重要步骤的信息数据(痕迹) , 供后续程序使用
-
Cookie
- 概念 : 是服务器程序写到浏览器上的一小段字符串(name和value组成,不支持中文)
http协议规定server有权读写浏览器上的cookie(读”自己”写过的cookie)
2)读写cookie的api
① 写cookie
A. 创建一个cookie对象( 在java里一切都是对象 )
Cookie c = new Cookie(“name”,”value”);
B. 写出去 — 随着response发出去
response.addCookie© ;
C. 可以设置cookie的存活时间
c.setMaxAge( time ); – time单位是秒
注意: time为正数单位是秒 ; time为0表示删除cookie ; time为负数表示可以活
到浏览器关闭
D. 可以设置cookie的路径( http协议规定默认只能读取同一路径下的程序写的
cookie )
cookie.setPath(“/” ); — 当前服务器里的所有应用程序都可以访问
② 读cookie
Cookie[] cs = request.getCookies() ; – 如果没有cookie , cs值为null
- HttpSession — 服务器端存放数据的手段
1) 获取HttpSession对象
HttpSession session = request.getSession( true );
2) 是一个作用域 , 可以存放命名属性
存数据: session.setAttribute(“name”,value );
取数据: Object value = session.getAttribute(“name”);
移除数据: session.removeAttribute(“name”);
3) session的特点
① 生命周期长 ( 至少比request长 )
A. Begin : 从用户请求里第一次出现request.getSession(true)时创建session对象
“懒汉式”
B. End : 用户离开session销毁( timeout ) , 在设置的有效时间内,用户没有任何操
作视为离开(tomcat默认有效时间为30分钟).
调整有效时间:
I. 统一修改tomcat里session的有效时间 tomcat/conf/web.xml
II. 可以在应用的程序里通过方法修改
session.setMaxInactiveInterval( time ); --> 单位是秒
III. 直接销毁session
Session.invalidate(); --- 销毁session 实现安全退出功能
时间长短?
I. 数据安全角度 : 短
II. 内存的使用: 短 , 提高用户体验( 内存置换 -- 将到期的session以及里面
的数据写入”硬盘” , 用户访问时,再将session恢复回内存 )
② 保存用户相关信息( 用户特指浏览器软件 -- 一个浏览器软件在tomcat上对应一
个session对象 )
如何保证用户(client)与session的一一对应关系:
答: 当client发出请求获取session时, tomcat会首先读取浏览器上的cookie,查找
叫做JSESSIONID的cookie( 32位16进制数)
I. 找到 : 说明曾经为client创建过session , 拿着sessionId去内存中查找对应
的session对象,返回给client使用
II. 没找到 : 说明client是第一次申请session , tomcat创建新的session给
client使用 , 同时将新session的id以cookie的形式写入浏览器
注意: 保存session id的cookie 默认存活时间为负数( 浏览器关闭销毁 )
Servlet笔记04
一.复习
- Redirect
- 代码 response.sendRedirect(“uri”); /应用名/网名
- 和forward区别
请求 : forward 一个 ; redirect 两个( 用户发送 , 浏览器自动发送 )
地址栏 : forward地址栏不变 ; redirect 地址栏会发生改变
数据传递: forward使用request ; redirect使用session
跨域 : forward不能 ; redirect可以 - 应用选择
当前action程序结束业务功能结束使用redirect
当前action程序结束, 跳转前业务功能未结束 , 使用forward
无法区分使用redirect
- Cookie
- 是什么 : 一小段String (http协议允许server写到浏览器) , 由name=value组成,不能
有中文,有大小限制 - api : Cookie c = new Cookie(name,value);
c.setMaxAge(time); 正数(秒) 0( 读取cookie ,将cookie的time设为0, 在将
cookie写回浏览器) 负数(浏览器关闭销毁)
c.setPath(“/”); 只有同一路径下的程序可以读取彼此写过的cookie
response.addCookie©;
request.getCookies() —> Cookie[]
- HttpSession ******
- 获取session对象 : request.getSession(true); [新建 , 获取原有的 ]
- 是一个作用域 ( 存放命名属性 — 与用户相关的数据 )
Session.setAttribute(name,value) Object value = session.getAttribute(name);
session.removeAttribute(name); - 特点
① 存放与用户相关数据 ( 登陆标识 username password 购物车 )
② 生命周期长
Begin : 用户访问的程序第一次出现request.getSession(true);
End : 有效时间结束 , session被销毁
I. 默认时间tomcat设置为30分钟
II. 通过 session.setMaxInactiveInterval(time);
III. 直接注销 session.invalidate()
③ 与用户一一对应
Server每次回读取浏览器上的cookie, 寻找JSESSIONID
找到: 根据cookie的value查找对应的session对象
没找到: 创建新的session, 并将id写入浏览器
二.HttpSession的补充 ( 了解 )
- 如果浏览器拒绝接受cookie
1) 一般不要求程序员在代码中处理此种情况
2) 可以使用函数 response.encodeRedirectURL(“正常的跳转地址”) --> String 处理跳转
地址 , 该函数会自动检测浏览器是否支持cookie :
支持 : 不对地址做任何操作,原样返回
不支持: 会自动将session的id拼接到给定的地址后, 带着id跳转到下一个程序 ,
目的程序就可以使用当前程序的session
三.ServletContext
- 从文件的角度
- tomcat启动时会读取每一个应用的配置文件 , 并将读到的内容封装成ServletContext
对象保存在内存中.
ServletContext对象是配置文件在内存中的表现 .
一个web应用只有唯一一个ServletContext对象
2)tomcat读取配置文件时, 将读到的每一段servlet配置信息封装成ServletConfig对象
- 获取ServletContext对象
ServletContext application1 = this.getServletContext();
This指当前servlet程序对象( 同时也是ServletConfig对象 – 父类实现了
ServletConfig接口)
4)使用场景
可以借助web.xml文件保存web程序需要的配置数据
① 将配置数据写入配置文件
② 获取配置文件中的数据
String value = application.getInitParameter(“ 参数名 ”);
String value = config.getInitParameter(“ 参数名 ”);
- 从作用域角度
- 是一个作用域 , 可以存放命名属性
ServletContext application2 = session.getServletContext();
— application1 == application2 —> true
存数据: application.setAttribute(“name”,value);
取数据: Object value = application.getAttribute(name);
删除数据: application.removeAttribute(name);
2)特点:
① 生命周期 : 最长 , 与”天地”同寿 , tomcat启动begin, tomcat关闭end
② 数据共享范围:里面的数据被当前应用的所有程序共享
-
三大作用域
-
tomcat正常关闭时, 会自动将内存中所有处于活动状态的session以及里面的数据,
以文件的形式保存在硬盘上 ( tomcat/work/应用/sessions.ser ) , 再次启动时,自动将文
件内容读回 , 并在内存中恢复session.
— 注意: session里的数据必须是可以”序列化的” ( implements Serializable )
四.过滤器 Filter
- 对于java程序中的”冗余代码”( 多次出现的基础功能代码 )处理方式
- corejava里处理 : 封装成函数 , 在需要的地方调用
- servlet里处理 : 将冗余代码单独定义在Filter程序里
特点: Filter程序会对request和response进行”预处理” , 会在request到达servlet之前 以
及 response返回到client之前 运行
- 开发过滤器程序(封装冗余代码)
-
写程序 — implements Filter
-
写配置文件
filter的简称
filter程序的全类名
与上面一致
需要被当前filter预处理的请求的网名
注意: 如果有多个请求需要过滤器预处理, 可以定义多个url-pattern罗列所有网名
/* — 表示来自于client端的所有请求( servlet请求 html请求 图片请求… ) -
部署 访问
-
当一个请求需要通过多个过滤器时, 通过的顺序与配置文件里配置的先后顺序一致
-
关于请求方向问题
- 过滤器默认只过滤来自于client的请求 , 对于服务器内部转发的请求不过滤
- 如果需要全方位过滤 , 需要手动设置
|--
|--
|-- REQUEST(默认值) FORWARD INCLUDE
注意: 不写dispatcher标签默认值生效 , 写了这个标签,则写什么过滤什么
-
关于过滤器的配置数据处理 [ 了解 ]
-
如果配置数据只有Filter程序需要使用,可以将数据定义在里
-
filter程序中通过FilterConfig获取
filterConfig.getInitParameter(“xxxx”);
-
-
Url-pattern的处理技巧
- 过滤少量的servlet请求 — 定义多个url-pattern标签进行罗列
- 过滤所有的请求 — /*
- 过滤大量的请求(不是所有) — /tel/* 通过添加前缀的方式来区分
/LoginAction ----> /user/LoginAction
/QueryAllAction —> /tel/QueryAllAction
/DeleteAction —> /tel/DeleteAction
/InsertAction --> /tel/InsertAction
4)如果需要按资源类型过滤( 静态网页 动态网页(servlet , jsp) ) — *.action
http://ip:port/myweb/xxx.html
http://ip:port/myweb/index.jsp
http://ip:port/myweb/first.action —> servlet程序的网名添加后缀
五.监听器 Listener [ 了解 ]
- 事件监听模型 [ 掌握 ]
事件源(Source) 事件对象(Event) 监听器(Listener)
工作方式: 当事件源产生特定的事件对象时, 会触发监听器相应功能运行
- Servlet里的监听器(接口)
-
作用域生命周期监听器
ServletContextListener : 监听ServletContext对象的创建和销毁 常用
HttpSessionListener : 常用
ServletRequestListener
-
命名属性监听器 [ 了解 ]
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
- 编码
1)写程序 implements XxxxListener
每一个event都有一个方法getSource() 获取事件源
2)写配置文件
监听器全名
六.验证码