Servlet 总结
1.什么是servlet?
servlet(server applet)是在服务器上运行的小程序(servlet=service + applet)。servlet其实是一个用java语言定义的接口,但一般情况下说的servlet是指直接或间接实现了这个servlet接口的类。
2.为什么要用servlet?
服务器上需要一些程序,例如根据用户输入访问数据库的程序。在以前这些程序通常是使用公共网关接口(common gateway interface,cgi)应用程序完成的。而与传统的 cgi相比,javaservlet效率更高,cgi处理每个请求都要启动一个新的进程,而servlet每个请求都由一个轻量级的 java 线程处理。
3.servlet的作用
servlet带给我们最大的作用就是能够处理浏览器带来http请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。
4.servlet的特点
1.servlet不是独立的应用程序,他没有main方法不能独立运行。
2.它不是由用户或程序员调用,而是由支持servlet的web服务器调用和启动运行。
3.可以在服务器端动态生成html/css/js/xml数据。
5.servlet运行流程
1.浏览器发送请求到服务器
2. 服务器根据请求的url,去调用相应的serlvet类。
3.servlet执行代码生成数据输出给服务器
4.服务器将servlet生成的数据再输出给客户端浏览器
6.一个简单的servlet
一个servlet需要实现servlet接口或继承实现了servlet的类,这里使用的是servlet的实现类httpservlet。实现servlet有5个方法必须重写:init【初始化】,destroy【销毁】,service【服务】,servletconfig【servlet配置】,getservletinfo【serlvet信息】。一般逻辑代码写在service方法中。
1 public class firstservlet extends httpservlet { 2 @override 3 protected void service(httpservletrequest arg0, httpservletresponse arg1) 4 throws servletexception, ioexception { 5 arg1.getwriter().write("hello world!"); //获取响应对象的字符输出流,并写入一个字符串 6 system.out.println("我的第一个servlet"); //在服务器控制台输出一句话 7 } 8 }
光写了servlet是不行的,还要告诉tomcat怎么访问这个servlet。(配置xml文件)
1 <?xml version="1.0" encoding="utf-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="webapp_id" version="3.1"> 3 4 <display-name>web</display-name> 5 <!-- --> 6 <servlet> 7 <!-- 为servlet命名(一般与类名一致) --> 8 <servlet-name>firstservlet</servlet-name> 9 <!-- servlet的类名(含包名) --> 10 <servlet-class>com.gjs.sxt.firstservlet</servlet-class> 11 </servlet> 12 13 <!-- 配置servlet的映射路径 --> 14 <servlet-mapping> 15 <!-- servlet映射路径名(必须与servlet标签中的name一致) --> 16 <servlet-name>firstservlet</servlet-name> 17 <!-- 外界访问servlet的路径 --> 18 <url-pattern>/aaa</url-pattern> 19 </servlet-mapping> 20 21 <welcome-file-list> 22 <welcome-file>index.html</welcome-file> 23 <welcome-file>index.htm</welcome-file> 24 <welcome-file>index.jsp</welcome-file> 25 <welcome-file>default.html</welcome-file> 26 <welcome-file>default.htm</welcome-file> 27 <welcome-file>default.jsp</welcome-file> 28 </welcome-file-list> 29 </web-app>
工作原理:(当浏览器访问 http://localhost:8080/aaa时)
1.服务器查看web.xml文件中是否有配置这个映射路径
2.查看映射路径的name
3.通过映射路径名找到找到servlet名
4.通过servlet名找到servlet编译过后的.class文件
5.执行servlet
7. web.xml
1.<welcome-file-list> 欢迎页的列表
<welcome-file> 欢迎页(主页)
一般如下
v<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
当用户没有指定访问哪个页面时,会默认显示欢迎页,有多个时按从上到下的顺序,在项目中查找对应的欢迎页显示,如果没有找到欢迎页,会显示404页面或webroot目录的列表(取决于listings的值)
2.<load-on-startup> servlet启动时加载
如果在<servlet>标签下配置了该标签,则表示servlet将会在服务器启动时,加载servlet,并调用servlet的init()方法。<load-on-startup>标签中的数字越小代表越早被加载,等于负数或无值代表在接收到第一请求再加载。
8.servlet的生命周期
1.载入:在tomcat第一次访问servlet时(接收到用户的第一个请求)将servlet加载到jvm上,并创建servlet实例
2.初始化:在servlet实例化后,调用init()方法对servlet对象进行初始化,如建立数据库的连接,获取配置信息等。init()只会被调用一次
3.执行:每当接收到一个请求,服务器就会创建一个线程调用service()方法,处理用户的请求,(由于是多线程所以在使用全局变量等共享资源时要注意线程安全问题)。
4.销毁:在服务器关闭或者servlet太久没有被使用,自动调用destroy()方法销毁servlet对象,释放该servlet对象所占的资源。destroy()方法也只会调用一次
5.卸载:等待垃圾回收器回收
9. httpservlet
继承httpservlet一般不重写service方法(httpservlet中的service方法用于报状态码),在子类中重写httpservlet的doget(处理get请求)和dopost(处理post请求)。必须重写这两个方法否则就会报405错误。
10.httpservletrequest
httpservletrequest对象封装了一次来自客户端的请求信息
1.请求行
2.请求头
3.实体内容
4.网络相关信息
11.httpservletresponse
httpservletresponse对象封装了服务器的响应信息
状态行一般不需要自己设置
应答头
响应实体
12.中文乱码问题
12.1客户端请求服务器的数据有乱码
get方式请求
①修改tomcat/conf/server.xml,在<connector> 标签中添加属性usebodyencodingforuri="true"(tomcat 8之后版本可不改,默认就是utf-8)
②在获取请求数据之前,设置 request.setcharacterencoding("utf-8");
post方式请求
在获取请求数据之前,设置 request.setcharacterencoding("utf-8");
12.2 服务器返回给客户端的数据有乱码
response.setcontenttype("text/html; charset=utf-8");
13.请求转发和重定向
13.1请求转发
request.getrequestdispathcer("path").forward(reqeust,response);
请求转发的特点:
1.地址栏不会变化
2.用户只发起了一次请求
3.请求转发只能转发本服务器以内的资源
4.由于只有一次请求,reqeust是同一个对象,所以可以利用request在servlet之间进行数据的传输
13.2重定向
response.sendredirect("path")
重定向的特点:
1.地址栏会发生改变
2.用户发起了两次请求
3.重定向可以访问服务器以外的资源
4.重定向由于请求多次的,所以httpservletrequest不是同一个对象,故不能使用它传递数据。
14.路径问题(path中的“/”)
路径前面加“/”代表绝对路径,不加就是相对路径
1.绝对路径根目录
项目名前面的“/”代表服务器地址根目录,例:http://127.0.0.1:8080/
项目名后面的“/”代表项目地址根目录,例:http://127.0.0.1:8080/proejctname/
2.判断一次请求行为是谁发出的
如果是浏览器行为,则表示项目名称前面的“/”,即服务器地址根目录
如果是服务器内部行为,则表示项目名称后面的“/”,即项目地址根目录
3.行为
服务器内部行为:请求转发
浏览器行为:重定向、页面中form提交、页面中a标签、js中通过location.href定位一个路径
15.cookie
cookie是由服务器发送给客户端(浏览器)的小量信息,以{key:value}的形式存在。由于http协议是无状态的,如果服务器需要记录该用户状态,客户端请求服务器时就通过response向客户端浏览器颁发一个cookie。而客户端浏览器会把cookie保存起来。当浏览器再请求 服务器时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器通过检查该cookie来获取用户状态。
15.1使用:
1.创建cookie
cookie cookie = new cookie("name","value");
2.发送cookie到浏览器
response.addcookie(cookie对象);
(1+2等同于response.setheader("set-cookie", "name=value"))
3.获取来自客户端的cookie
cookie[] cookies = request.getcookies();
4.maxage()设置cookie的有效时间,单位秒。
正数,则超过maxage秒之后失效。
负数(默认),该cookie为临时cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该cookie。
为0,表示删除该cookie。
15.2使用注意:
1.cookie第一次是由servlet发送到浏览器中,第一次不能获取cookie
2.不同的浏览器存放的cookie不是同一个
3.如果设置了cookie的maxage,则cookie会保存在浏览器所在电脑的硬盘上,如果没设置该属性,则保存在浏览器的内存中,进程关闭cookie就会被清理掉
16. session
当客户端请求一个session的时候,服务器会先检查这个客户端的请求里是否已包含了一个session标识(sessionid),如果已包含这个sessionid,则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用。如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid。这个sessionid会在本次响应中返回给客户端保存。sessionid一般保存在cookie中。
16.1 httpsession的使用:
1.获取session(已经创建session)或创建session:
httpsession session = request.getsession();
2.设置session最大不活跃时间(以秒为单位)
session.setmaxinactiveinteval()
3.使用session保存信息
session.setattribute(string key,object value);
session.getattribute(string key);
4.立即销毁session
session.invalidate();
17.servletconfig
servletconfig对象可以用来读取web.xml配置文件中的初始化参数
方法:config.getinitparameter()
18.servletcontext
servletcontext对象代表着当前web站点,在tomcat(服务器)启动时创建,被项目中所有servlet共享,实现了servlet间的信息通讯。
servletcontext常用方法:
1.获取全局的初始化参数
context.getinitparameter()
2.获取上下文路径(部署在tomcat中的项目目录名)
context.getcontextpath()
3.获取文件的绝对路径(从webroot下开始定位文件)
context.getrealpath()
4.获取资源,将资源作为流返回
context.getresourceasstream();
5.显示目录下的资源
set<string> paths = sc1.getresourcepaths();
6.存储一个key-value数据
context.setattribute(key,value)
根据key获取value
context.getattribute(key)
19.作用域对象
作用域对象共同的方法:
1.setattribute(string key,object value);
2.getattribute(string key);
3.removeattribute(string key);