kettas笔记Servlet.docx
- 文档编号:1632841
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:24
- 大小:96.75KB
kettas笔记Servlet.docx
《kettas笔记Servlet.docx》由会员分享,可在线阅读,更多相关《kettas笔记Servlet.docx(24页珍藏版)》请在冰点文库上搜索。
kettas笔记Servlet
Servlet
应用程序体系结构的演化过程
1)单机版应用程序,应用程序和程序要使用的数据,安装在一台计算机上。
优点:
不需要网络和数据库的支持,安装使用比较简单。
缺点:
用户和用户之间无法共享数据
2)C/S(两层体系)客户机/服务器结构(Client/Server)用户的电脑上只安装软件,软件用到的数据集中保存在数据库服务器中,程序利用网络对数据库中的数据进行访问,数据被集中管理,可以被多用户共享。
优点:
数据集中管理,能共享,集中利用硬件资源,保证数据的安全
缺点:
客户端软件升级维护困难
客户端必须安装特定的软件
程序员自定义的应用层协议,很难通过防火墙的过滤
3)C/S(三层体系结构)
客户端安装的软件,主要有三部分功能组成:
1)视图部分,用于和用户交互
2)处理业务逻辑的代码(业务层代码)
3)网络通信的功能
三层体系结构有了很大的优化,但是没有彻底解决c/s结构的问题
4)B/S(Browser/Server)
随着internet的发展,浏览器上的网页具有了和客户端界面相同的功能。
所以程序员开始使用浏览器作为应用程序的界面
a)浏览器中的内容是集中保存在服务器上统一管理的,没有客户端升级维护的问题
b)浏览器和服务器之间使用http协议通信。
可以在网络中畅通无阻,不需要进行协议转化
c)客户端不需要安装特定的客户端程序
简单B/S结构的工作原理
1)用户在浏览器上输入URL,一个完整的URL包括域名以及要查看的html文件的名字。
2)通过DNS将域名转化为web服务器的IP和端口,浏览器通过IP,PORT,建立于WebServer之间的连接。
3)浏览器将URL中的html文件名称通过刚刚建立的连接发送给WebServer。
4)WebServer根据文件名读取文件的内容,并将文件内容通过网络送回到浏览器,浏览器显示结果
5)连接关闭。
Servlet编程
Servlet是运行在Tomcat中的一小段java程序,用于为用户产生动态的应答内容。
每个Servlet都有自己独立的功能(查询,注册,登录....),针对用户发送的不同的请求,tomcat会调用不同Servlet进行处理。
Servlet的特征:
1)普通程序有main函数,代码由main函数进行调用。
对于Servlet而言,是被Tomcat调用的,不需要由自己的main函数进行调用
2)Servlet代码必须按照一个特定的规范来进行开发。
在编写Servlet时必须实现一个接口
3)每个Servlet都要对应一个特定的URL,Tomcat根据这个对应关系,来调用Servlet。
开发Servlet步骤:
1)按照接口实现Servlet的功能。
2)为Servlet分配URL(部署)
按照接口实现Servlet的功能
javax.servlet.Servlet
a)init用于初始化Servlet
b)Service用于处理请求(实现业务功能)
c)destroy销毁一个Servlet
编译:
需要用到两个jar包需要配置到CLASSPASE中。
TOMCAT/lib/servlet-api.jar和TOMCAT/lib/jsp-api.jar
部署Servlet
1)创建标准web应用的目录格式:
TOMCAT/
|-webapps所用的应用都存在这里
|->myapp:
应用的根。
|->a.html
|->WEB-INF:
区分大小写
|->classes:
类文件及package
|->lib:
保存jar包.
|->web.xml部署描述符
web.xml:
是程序员提供给tomcat的使用说明书。
用来描述Servlet的用法(与url的对应关系)。
http:
//localhost:
8080/myapp/showTime
1)浏览器向tomcat发送请求.
2)Tomcat接受请求.
3)Tomcat查看web.xml,在这个文件中找到对应的Servlet
4)初始化Servlet对象,调用service方法。
开发Servlet的一般性步骤
1,编写Servlet类
1.1写一个类,实现javax.servlet.Servlet接口
1.2业务逻辑写在service(…)方法中.
1.3对源码进行编译(在CLASSPATH中导入jar包)
2,部署Servlet
2.1创建web应用的目录结构.
TOMCAT/
|-webapps/
|-myapp
|-WEB-INF/
|-classes
|-lib
|-web.xml
2.2将编译得到的类文件和package,拷贝到classes中.
2.3修改web.xml对Servlet进行配置.
3重启tomcat,对servlet进行测试.
如何通过浏览器访问Servlet
通过在浏览器的地址栏输入地址
http:
//localhost:
8080/appname/urlpattern
通过网页上的超级链接访问
3)通过表单访问Servlet.
Servlet中如何处理客户端提交的数据
request.getParameter(“参数名称”);参数名称取决于输入框的name属性。
返回String类型的值
改Tomcat端口
Tomcat-->conf-->server.xml.找到8080端口,再修改
HttpServlet
HttpServlet是GenericServlet的子类,在这个子类中增加了对Http协议的特殊支持
客户端向服务器提交参数的手段.
1)通过表单
2)通过URL也可以携带参数.
http:
//localhost:
8989/myapp/login?
a=1234&b=4567
相当于向服务器提交了两a,b个参数,参数值分别是1234和4567
Http协议中客户端与服务器的通信方式
客户端可以通过两种方法向服务器发送请求:
post:
只有在form表单中特别声明了action时,才会是post,其他时候都是get
get:
地址栏,超链接,表单默认的
通过Get方式提交的表单,在地址栏上能显示表单内容.
通过Post方式提交的表单,在地址栏上不显示表单内容
使用Get方式发送参数时,参数的总长度有限制.
通过Post方式发送参数时,参数长度没用限制.
在HttpServlet中,可以区分Get和Post两种请求,可以对两种请求进行分别处理。
service(….)
doGet,doPost
http:
//localhost:
8989/myapp/http?
a=12345&b=67890
URL:
http:
//localhost:
8989/myapp/http
URI:
/myapp/http
ServletPath:
/http
QueryString:
a=12345&b=67890
doGet,doPost替换serviceimplementsServlet(service)
ClientTomcat->1号service:
不带Http的参数转化为带http的参数–>2号service:
调用getMethod,获得客户端请求是Get还是Post–>doGet/doPost
业务逻辑与显示逻辑分离
业务逻辑可以被多个显示逻辑共同使用,提高了业务逻辑的重用性以及可维护性.
显示逻辑灵活多变。
降低了二者之间的关联程度,实现了解耦合的目的.
需要解决的两个技术问题:
QueryServlet--ShowServlet
1)在多个Servlet之间转发请求。
不会改变地址栏里的地址
执行顺序:
客户端请求--->服务器(在服务器内部跳转,客户端并不知道)得到结果传给客户端-->客户端接收结果
RequestDispatcher:
相当于多个多个Servlet之间的接力棒.
RequestDispatcherdr=request.getRequestDispatcher("/要跳转的类的名字");
dr.forward(request,response);
重定向:
会改变地址栏里的地址
执行顺序:
客户端请求-->服务器收到后返回另一个地址--->客户端用另一个地址--->服务器返回结果--->客户端接收结果
response.sendRedirect("路径"):
处理统一业务的多个Servlet之间适合使用forward。
处理不同业务的Servlet之间适合使用sendRedirect
forward只能在用一个应用的Servlet之间工作。
重定向可以在不同应用之间完成,如果定向的目的地是跨应用的,地址应该写完整
2)在多个Servlet之间传递数据。
Request.setAttribute(名称,Object)
Request.getAttribute(名称)=Object
Reqest中的数据都是通过名字进行管理的,所以统称叫做命名属性
请求转发和重定向
请求转发:
forward
重定向:
sendRedirect
Forward在服务器内部完成。
浏览器中的地址不变
Redirect先将应答送回到浏览器,指示浏览器自己去申请其他资源.浏览器中的地址会改变.
Forward直能在用一个应用的Servlet之间工作.
重定向可以再不同应用之间完成,如果定向的目的地是跨应用的,地址应该写完整
Response.sendRedirect(“/myapp/emp/queryEmp”)统一应用
Response.sendRedirct(“”);跨应用
处理同一业务的多个Servlet之间适合使用forward
处理不同业务的servlet之间适合使用redirect。
QueryServlet----forward---->DispServlet
AddEmpServlet-----redirect------>QueryServlet
DelEmpServlet-----redirect------>QueryServlet
getSession(true)如果用户Session不存在,创建新的用户
getSession(false)如果Session不存在,返回null
getSession()getSession(true)
Request对象的生命周期只在一次请求和应答之间。
当应答回到浏览器之后,request对象就销毁了,如果浏览器向服务器再次发送新的请求,那么服务器会创建新的request对象给servlet使用.
受到生命周期的限制,request只能在多个由forward连接起来的Servlet之间共享数据。
因为forward(请求转发)是在服务器内部进行的。
因为应答一直没有回到客户端,所以可以利用request对象
追踪用户状态
1)Cookie
Cookie在服务器端使用一个对象表示。
在客户端是一个字符串
Javax.servlet.http.Cookie
|-->nameCookie的名字
|-->valueCookie的值
|-->doman:
表示Cookie是由哪个应用存储的,浏览器在提交请求时,只会携带本应用存储的Cookie
|-->maxAge:
字符串在客户端的存活周期(以秒为单位)
>0:
实际保存的秒数.60*60*24*30(一个月)
-1:
和当前浏览器保持一致,叫做会话Cookie(默认)
=0:
表示删除一个Cookie
如何将Cookie写入到客户端浏览器
response.addCookie(Cookie)
如何在服务器端获得浏览器中的Cookie
request.getCookie()返回Cookie[]数组
2)HttpSession:
相当于服务器为每个用户单独提供的私人存储箱,用于在服务器端追踪用户状态,与Cookie相比,放在Session中的数据存储在服务器上,Cookie存储在客户端上,所以Session中的数据更加安全,但服务器要为此付出额外的存储空间(内存)。
不同用户调用这个方法会获得不同的Session对象。
每个用户都会得到属于个人的Session对象
1)如何获得HttpSession对象
service(….){HttpSessionsession=request.getSession(true);}
不同用户调用这个方法会获得不同的Session对象,每个用户都会得到属于个人的session对象
2)如何操作HttpSession中的数据
Session.setAttribute("String存储数据的名称",Object存储的数据");
Session.getAttribute(“String存储数据的名称”);返回object对象。
根据名称得到的对象需要强制类型转化
1)用户登录的标记:
Session
2)一次查询的结果:
request.
3)用户的权限:
Session
Session和Request的区别:
1)Session生命周期长,适合存储在多次请求中重复使用的数据.
Request生命周期短,适合存放只在一次请求中用到的数据.
2)Session生命周期长,不适合存储体积较大(占用内存多)的数据。
Request生命周期短,可以存储体积大的数据.
Session的实际生命周期:
创建:
当用户第一次调用getSession(ture)的时候。
销毁:
通过超时机制(timeout)控制Session销毁。
两阶段:
1)内存---文件
存在Session中的数据最好实现Serializable接口.
2)从文件中删除.
HttpSession的实现原理
Request.getSession(true)
getSession(true)
1)首先从用户的请求中获得他的SessionID,SessionID是通过Cookie的形式保存在客户端浏览器上的.该Cookie的名字是JSESSIONID,值是实际的ID值.
2)根据SessionID的值,来返回相应的Session对象给客户使用.
3)JSESSIONID这个Cookie,是在用户第一次使用Session对象时保存在浏览器中的。
getSession(true)在请求中查找名字叫JSESSIONID的Cookie,没有找到,说明用户此前没有属于自己的Session对象。
getSession(true)会创建一个新的session对象给用户使用,同时,将新创建的SessionID,以Cookie的形式保存到客户端.服务器端用的地址可以不加应用名,客户端用的地址一定要加应用名。
getSession(true):
如果用户的Session不存在,则创建新的用户
getSession(false):
如果用户的Session不存在,则返回null
getSession()<=>getSession(true)
Servlet生命周期
Servlet生命周期受Tomcat的管理,由Tomcat为Servlet提供运行时环境(Request,Response),Tomcat可以叫做服务器,也可以叫做web容器或者Web中间件。
1)对于每一个Servlet来讲,在Tomcat中只有一个对象,这个对象在用户第一次访问这个Servlet时被创建。
这个对象在后面的多次请求中被重复使用
2)Tomcat如何调用Servlet对象中的方法
下面的箭头不代表调用过程,表示的是Servlet对象的生命周期
Init()在Servlet对象创建之后调用一次Service()每次接收到客户端请求时都会被调用,(多次)Destroy()Servlet对象被销毁之前调用一次
3)Servlet线程安全问题
由于Servlet只有一个实例,所以很可能被Tomcat运行在多线程的环境下,所以要求我们编写的Servlet一定是一个线程安全的对象。
线程安全问题是由多个线程同时操作一个对象的成员变量导致的。
在编程时尽量不在Servlet中定义成员变量,除非成员变量的值不会被修改
4)init用来初始化Servlet需要的一些数据,功能类似于构造函数。
Init的特殊作用在于init(ServletConfitconfit)能够接收Tomcat传递的ServletConfig对象。
init的一般实现方法是将ServletConfig对象保存在成员变量中,以便以后service使用。
如果我们的Servlet是继承自HttpServlet的话,init方法是由父类实现的,ServletConfig对象也就有父类保存在他的私有变量中了,在子类需要的时候,可以通过getServletConfig方法来获得这个对象。
如果子类要覆盖父类的init方法,要注意什么?
@Override
Publicvoidinit(ServletConfigconfig)throws…{
super.init(config);//履行父类的职责
xxxxxxx;}
ServletConfig对象的用法.
用于保存servlet的配置信息;
所有的XML格式的文件内容,都可以用一个java对象进行存储
Employee(name,age,salary)
通过ServletConfig获得Servlet中的初始化参数
oracle…….
数据源和连接池的管理和使用
每个线程必须拥有自己的连接,在需要连接时:
DriverManager.getConnection()----->获得连接.创建数据库连接是程序中比较消耗资源的操作.为了减少数据库连接的创建次数,就需要在程序中使用连接池
在servlet如何找到DataSource对象.
Tomcat为了让Servlet能够得到DataSource对象,他会把DataSource对象存储到LDAPServer中.目的是为了Servlet能够从LDAP中把DataSource找出来使用。
LDAPServer,和数据库类似,是用来存储数据的软件,数据在数据库中是以表和行的形式存储的,在LDAP中是以对象的形式存储的。
LDAP的特征:
1)LDAP相当于是在内存中创建的一个目录结构,存储在LDAP中的数据是存储在某个目录中的.
/root/
|->a
|->b
|->c/
|->sub1/
|->sub2/
|->DataSource
2)java----JDBC--->DataBase
Java-----JNDI---->LDAP
在Servlet中使用连接池:
1)omcat的配置文件中对连接池进行配置。
2)序中通过JNDI找到DataSource---->Connection
1)配置连接池和DataSource
编辑Tomcat/conf/context.xml
把数据库的驱动包保存在/Tomcat/lib中.
/Tomcat/lib:
这个目录中的jar,能被包括tomcat自己在内的所用应用共同使用
/WEB-INF/lib:
只能给本应用使用.
两个目录中不能有重复的jar包.
2)使用jndi查找数据源(DataSource)
Jndiname:
myapp/jdbc/oracle
Context:
表示LDAP中的一级目录.InitialContext:
表示LDAB的根目录
Contextctx=newInitialContext();
从LDAP的根目录(ctx)开始查找需要的对象:
DataSourceds=(DataSource)ctx.lookup(“myapp/jdbc/oracle”);
ds.getConnection()
在配置文件中对连接池中的配置
url="jdbc: oracle: thin: @10.10.20.20: 1521: kettas" usern
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- kettas 笔记 Servlet