Web阶段–Servlet基础知识点
一、静态页面与动态页面
1.静态页面
概念:在Web模型中,页面中的信息是在html文件中定义好的,数据不会改变,称为“静态页面”,无法根据用户需求实时定制数据
2.动态页面
概念:网页中展示的数据来自于java程序的运行结果,随着业务的发展,网页中的数据会发生改变
工作原理:
输入URL,通过互联网与WEB服务器建立网络连接(Request请求)---->
WEB服务器接受到请求后调用一段Java程序--->
WEB服务器将Java程序的输出结果传输给客户端(Response响应,通常以“网页”)---->
浏览器将程序的输出结果显示在网页上
二、Servlet概念
1.什么是Servlet?
Servlet是一种生成动态网页的技术,是JavaEE规范的一部分,一种运行在tomcat服务器上的,用java编写小程序,可以接收浏览器(客户端—client)发出的http请求,并且服务器为client做出响应( 一般以网页的形式体现 --- 动态网页)
2.运行方式
开发好的java程序,需要发布到tomcat服务器上,由服务器在用户请求达到时调用
三、动态B/S结构的开发
1.开发流程
环境搭建--->程序开发--->部署应用--->配置文件--->程序访问
2.环境搭建
1 在Tomcat服务器的webapps目录下新建myweb应用
2 在myeclipse里新建一个javaproject项目
3 将servlet开发所需的servlet-api.jar引入到建好的webproject中
备注:servlet-api.jar 存放于 tomcat安装路径/lib目录中
3.程序开发----第一个Servlet程序
1. 实现servlet程序的三种方式
implements Servlet是javax.servlet包里的接口,覆盖5个方法(重点是service方法),与协议无关程序
extends GenericServlet是javax.servlet包里的抽象类覆盖其中的抽象方法service(),定义与协议无关的程序
extends HttpServlet是javax.servlet.http包里的类覆盖其中与http协议相关的service(),必须使用http协议通信
2.具体代码实现
案例:
public class FirstServlet extends HttpServlet{
@Override
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=GBK");
PrintWriter out = response.getWriter();
Date time = new Date();
out.println(""
+time+"");
out.flush();
}
}
4.部署(deploy)应用(手动部署)
找到存放Tomcat的文件夹
|-- lib 存放tomcat里所有应用都可以使用的jar包
|-- conf tomcat的配置文件
|-- bin 存放tomcat里所有应用都可以使用的程序
|-- work
|-- webapps 存放应用程序
|-- myweb 项目名或者应用程序名
|-- html文件,image图片,css文件
|-- WEB-INF
|-- classes 存放java程序的字节码文件(注意:带着包结构)
|-- lib 如果有,存放当前应用需要使用的私有的jar包
|-- web.xml文件 当前应用所需的配置文件
5.配置文件—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>
5.程序访问
1 启动tomcat服务器:执行tomcat/bin/startup.bat文件
2 打开浏览器,在浏览器地址输入程序的url访问
http://127.0.0.1:端口号/应用名或者项目名/程序网名
注意:任何java源码的修改都需要重新部署.class文件,重新启动服务器访问
四、基于MyEclipse自动部署Web应用
1.配置tomcat服务器
1) window --- show view --- others --- 搜索servers -- 选中
2 ) 在console窗口找到server窗口右键 --- configurer server connector ---Tomcat--tomcat版本选择 --- 选中enable--- 在第一个选择框指定tomcat安装路径
2.新建web project
1.classes目录依然存在,只是不会在MyEclipse中显示,存放MyEclipse工作空间的项目WEB-INF目录下
2.采用自动部署功能,项目名就作为将来的web应用名使用
3.如果要修改项目名字,需要同时修改web应用的部署路径(不同myeclipse版本有所差别)
项目右键 --- propertis --- 搜索web --- 改路径
五、请求发送的三种方式
1.地址栏手工输入
这种只适用于用户访问应用首页
2.点击超链接发送请求
<a href="目标资源的地址(如果在同一个服务器上写uri即可)">提示文字</a>
3.点击表单的提交按钮发送请求
<form action="目标资源的uri" method="post">所提交的内容信息 </form>
六. 关于servlet程序的生命周期
1. 请求响应过程
1.地址栏输入请求地址 --- 通过ip 和端口找到tomcat服务器
2.根据地址的应用名,确定所访问的web应用,同时获取应用的配置文件web.xml
3.读取配置文件,在配置文件中查找 网名对应的servlet程序 “全类名”
4.根据全类名获取程序的对象(第一次被请求则创建对象,不是第一次则直接获取之前创建的对象)
Class a = Class.forName(" 全类名 ");
Object obj = a.newInstance(); --- 根据类对象创建 “类的对象 -- 实例 ”
5.使用对象调用service方法
6.service方法运行,将结果(响应)发还给客户端
2. 关于servlet程序的对象创建
1.tomcat默认只会为每个servlet程序创建一个对象(在第一次请求到达时创建) --- 应用层面的单例
2.servlet程序的四个生命阶段
① 构造阶段 构造方法 1次 第一次请求到达时执行
② 初始化阶段 init方法 1次 构建对象成功后
③ 服务阶段 service方法 n次 每次请求到达后
④ 销毁阶段 destroy方法 1次 服务器关闭时
3.人为干预servelt程序对象的创建和初始化时机
3. 关于程序对象的线程安全问题
1) tomcat会为每一个servlet程序创建一个对象,由这个对象为所有请求它的客户端(线程)提供服务,这个对象(临界资源)有可能被多个客户端并发访问 , 需要在代码上保证程序的线程安全。
2)保证安全的策略
① 尽量不要为servlet程序定义 “成员变量”
② 如果使用了成员变量,需要为“敏感代码”(所有操作临界资源数据的代码)加锁
七. Servlet 与 Jdbc 整合
项目开发步骤
1.搭建环境 --- 引入项目所需要的各种jar包 + 引入工具所需要的配置文件
2.复用代码 --- JdbcUtil工具类的复用(修改配置文件路径)
3.建表 , 实体 , dao , service
4.view层程序的开发 : servlet程序 + html网页
八. 多个servlet配合完成用户需求
1. 配合方式(两种)【重点】
1.请求转发:forward
a.代码 --- 在第一个程序里添加如下代码
RequestDispatcher rd = request.getRequestDispatcher("下一个程序的url-pattern网名");
rd.forward( request,response );
b.forward工作方式的特点
① forward连接的多个servlet程序有明显的先后顺序,形成工作流,在这个流程中,只有最后一个servlet有权向client输出结果内容,前面servlet的输出一律清空
② forward连接的多个servlet程序处于一个请求的生命周期
③ forward动作发生在服务器内部,浏览器不知晓,最终导致地址栏和网页内容不匹配
④ 可以使用request作用域传递数据
⑤ forward方式不能在两个应用的程序之间跳转(不能跨应用, 不能跨域)
c.关于forward过程中数据的传递问题
在forward连接的两个程序间可以使用request对象来传递数据,request本身又是一个存储空间(作用域),可以存放起了名字的值(命名属性)
① 存数据:request.setAttribute( "name" --- String , value --- Object );
② 取数据:Object value = request.getAttribute( "name" );
2.请求重定向 redirect
a.特点
① 重定向redirect连接的两个servlet程序处于两个请求的生命周期
② 第二次请求是浏览器根据第一次请求的响应自动发出的, 会导致浏览器地址栏发生改变
③ 不能使用request作用域传递数据( 整个过程是两个请求)
④ 可以跨域(在两个不同应用的程序之间跳转)
b.代码
response.sendRedirect( " 下一个程序的uri ");
c.数据传递
① 一般情况下,不需要数据传递
② 可以人为模拟表单的get提交方式,将数据直接拼接到地址后面传递
response.sendRedirect( "uri?name=value&name=value");
接收: request.getParameter("name")
注意: 这种数据传递方式同时适用于超链接数据传递
2.forward和redirect异同点
1.相同: 代码运行后都可以使得程序的流程由AServlet跳转到Bservlet程序运行
2.不同: forward(一个请求,地址栏不变) , redirect(两个请求,地址栏变化)
3.使用选择:
① 如果当前程序执行结束,功能没有彻底完成 or 有大量数据需要传递,则选择 forward 跳转
② 如果当前程序执行结束, 功能已经完成(下一个程序涉及其他功能),选择 redirect 跳转
③ 无法确定,优选 redirect
九、用户信息追踪
1. 概念:
在通信过程中,保存记录用户一些重要的业务步骤操作 涉及的数据
2. 方式
1.cookie : 在客户端浏览器中保存用户状态数据
a.概念
1.服务器写到浏览器上的一小段String,由name和value两部分组成(不支持中文)
2.当浏览器访问服务器时,服务器可以读取浏览器上曾经自己写过的cookie
3.cookie有存活时间(可以设置)
b.操作cookie的API
1.创建cookie对象 --- Cookie c = new Cookie( name , value );
2.写cookie --- response.addCookie(c);
3.读cookie ---request.getCookies() --> Cookie[] 如果没有读到,返回值为null
4.设置存活时间 --- cookie.setMaxAge( xxx );
① 数字为正数: 表示存活多少秒
② 数字为负数: 表示cookie会在浏览器关闭时被销毁
5.设置cookie的访问路经 --- cookie.setPath(".....");
注意: http协议规定,只有处于同一路径下的程序才能访问该路径下程序写过的cookie(默认不能跨应用)
2.HttpSession:在服务器端保存用户状态数据
a.定义:会话:client与服务器端的一次完整的通信过程(涵盖多次请求)
b.使用【重点】
1.获取 --- HttpSession session = request.getSession( boolean -- true );
2.HttpSession是一个作用域,可以存放“命名属性”
① 存数据 --- session.setAttribute("name",value);
② 取数据 --- Object value = session.getAttribute("name");
③ 移除数据 --- session.removeAttribute("name");
c.session对象的特点
1.生命周期比较长
begin:当client访问的程序里第一次出现request.getSession(true)代码时(懒汉式创建)
end:timeout关闭session(服务器会为session设置一个有效存活时间 --- 默认30分钟 )
b.控制session的有效存活时间
① 可以在tomcat的配置文件中修改tomcat产生的所有session的存活时间(统一修改)
tomcat --- conf --- web.xml:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
② 可以针对某一个应用中使用的session进行修改 --- 程序中通过函数调用修改
session.setMaxInactiveInterval( time ); time单位秒
③ 主动销毁session对象 --- 完成安全退出
session.invalidate();
3.与用户相关(一个用户对应一个session对象) — 浏览器软件
1.问题:在A程序里 sesssion.setAttribute("name","hehe"); client1 访问了A程序
问:之后哪些程序可以通过session.getAttribute("name") 获取hehe数据
答:只要被client1请求的程序(不论功能),就可以得到hehe数据
2.原理:当client向server申请session对象时,tomcat会首先读取浏览器上的cookie,查找JSESSIONID的cookie
a.没找到: tomcat会为client创建新的session,同时将session的id以cookie的形式写入浏览器
b.找到:获取cookie里的session id,在内存中查找对应的session对象,返回给client使用
3.安全退出---关闭浏览器退出的区别
a.安全退出:直接销毁client对应的session对象,并清除浏览器上的cookie
b.关闭浏览器退出: 存储了sessionid的cookie被销毁,再次访问时,无法提供之前session的id,tomcat为client创建了新的session(原有session仍然存活30分钟)
注意: 保存sessionid的cookie JSESSIONID -- 32位16进制数
4.url重写
1.如果浏览器拒绝接收cookie,则程序无法完成功能(一般不要求程序做出处理)
2.如果使用response.encodeURL() 来处理跳转路径,则可以在浏览器不支持cookie的情况下,让前后两个网页使用同一个session对象
3.方法功能: 检测浏览器是否支持cookie,支持(不做任何处理原样返回),不支持(将当前网页里的
sessionid拼接到地址后面 url;jsessionid=32位16进制数 )
十、ServletContext
1. 从文件的角度理解ServletContext对象
1.tomcat启动时,会去读取每一个web应用的配置文件web.xml,并将读到的内容封装成ServletContext对象保存在内存中, ServletContext对象就是web.xml文件在内存中的体现
2.一个web应用只有一个web.xml文件,只对应一个ServletContext
3) ServletConfig对象: tomcat在读取配置文件过程中,封装一段关于servlet的描述信息(servlet标签)
4) 使用场景
2. 从作用域的角度理解ServletContext对象
1.ServletContext对象是一个作用域,可以存放命名属性
a.获取对象:ServletContext context = session.getServletContext();
b.存数据:context.setAttribute("name",value);
取数据:context.getAttribute("name") --> Object value
移除数据:context.removeAttribute("name");
2.servlet里的三大作用域
十一、过滤器 Filter
1. servlet冗余代码种类( 多次出现,通用基础功能与主要业务无关 )
① 设置request和response的编码方式
② 检查登陆标志的代码
③ 异常处理的代码
try{
}catch(Exception e){
String str = e.getMessage();
String mess = java.net.URLEncoder.encode(str,"GBK");
response.sendRedirect("/Telbook/ErroView?mess="+mess);
}
2.冗余代码的解决方案
通过定义“过滤器”程序来解决servlet程序中出现的冗余代码
3. 特点:双向过滤
1.是一个web应用程序,主要对request和response进行预处理
2.过滤器会在请求到达servlet程序前执行代码,也会在response回到client之前运行代码
3.servlet里的冗余代码通常都定义在filter程序中
4.自定义过滤器程序
1.写程序 --- 实现指定的接口 Filter
2.写配置文件web.xml
<filter>
<filter-name>filter程序的简称filter-name>
<filter-class>filter程序的全类名filter-class>
filter>
<filter-mapping>
<filter-name>filter程序的简称,与上面的定义保持一致filter-name>
<url-pattern> 需要被当前程序预处理的servlet的网名 /*所有请求url-pattern>
filter-mapping>
3.部署到tomcat上
5. 过滤器执行先后顺序
当请求需要通过多个过滤器时,会按照配置文件中声明的先后顺序通过
6. 过滤请求的方向
1.filter默认只过滤来自于client端的请求,不考虑tomcat内部forward过来的
2.通过配置可以使得过滤器全方向过滤
<filter-mapping>
<filter-name>定义过滤源文件的名字filter-name>
<url-pattern>被过滤的源文件名字url-pattern>
<dispatcher> REQUEST(默认值),FORWARD,INCLUDE dispatcher>
filter-mapping>
注意:标签里的值必须大写,默认值只在不提供<dispatcher>标签时生效,如果提供了标签,按照定义方向进行过滤,全方向过滤需要通过三个<dispatcher>定义
7. 关于过滤器url-pattern的实战技巧
1.如果需要过滤少量的servlet请求 --- 通过定义多个url-pattern进行网名的罗列
2.如果需要过滤所有的client端请求 ---
4.如果需要过滤全部servlet请求(强调 区别请求类型,不包括html和其他请求)--- 为网名添加后缀
十二、监听器Listener
1. 监听事件模型【重点】
1.组成:事件源(source) 事件对象(event) 监听器(listener)
2.关系:当事件源产生特定的事件对象时,会触发监听器代码的运行
3.监听器代码是由事件触发运行,不需要client请求
2. servlet里的监听器
1.生命周期监听器【重点】 ---- 监听三大作用域的创建和销毁
ServletContextListener --- 监听servletContext对象的创建和销毁
HttpSessionListener --- 监听session对象创建和销毁
ServletRequestListener --- 监听request对象的创建和销毁
2)命名属性监听器 ---- 监听命名属性的添加,移除和修改动作
ServletContextAttributeListener HttpSessionAttributeListener
ServletRequestAttributeListener
3. 自定义监听器
1.写程序 --- 实现指定接口
所有event都有一个通用方法 getSource()(一般不建议用)
ServletContext context = arg0.getServletContext();(建议用)
2.写配置文件
<listener>
<listener-class> 全类名 </listener-class>
</listener>