JavaWeb系列之:Servlet
一,什么是Servlet
Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过 请求-响应 编程模型来访问这个在服务器内存里的Servlet程序。
(Servlet可以指任何实现了Servlet接口的类。)
二,编写一个Serlvet的步骤
1,创建普通Java类,并继承HttpServlet(该类实现了Serlvet接口)
2,重写service方法
3,在web.xml中配置servlet
三,运行流程
浏览器发送请求到服务器,服务器根据请求URL地址中的URI信息在webapps目录下找到对应的项目文件夹,然后在web.xml中检索对应的servlet,找到后调用并执行Servlet。
url:http://localhost:8080/project/user -----> 服务器地址:端口号 / webapps下的文件夹名称(虚拟项目名) / 要执行的servlet的url-parten
四,Servlet生命周期
1,从第一次调用到服务器关闭
2,如果在web.xml配置了 <load-on-startup> 1</load-on -startup>,生命周期为从服务器启动到服务器关闭。(服务器启动即初始化Servlet)
注意:
init()方法:Servlet初始化方法,在Servlet第一次加载进内存时执行
destory()方法:Servlet销毁方法,服务器关闭时执行。
五,Servlet中的方法的区别
1,service():
可以处理get/post请求,如果servlet中同时有service(),doGet(),doPost()方法,优先执行service()方法。
2,doGet():
处理get方式的请求
3,doPost():
处理post方式的请求
注意:
如果在重写的service方法中调用了父类的service方法(super.service(arg0,arg1)),那么service方法处理完后,会再次根据请求方式相应的调用doGet , doPost方法。(一般情况下,不在重写的service中调用父类的service方法的,避免出现405错误。)
六,request对象
服务器接收到浏览器请求后,会创建一个Request对象,对象中存储了此次请求相关的请求数据。服务器(tomcat)在调用Servlet时会将创建的Request对象作为实参传递给Servlet的方法,比如:service方法。
注意:
request对象中封装了当前请求的所有请求信息
request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
获取数据:
1,获取请求头数据(键值对)
String mehtod = request.getMethod();//获取请求方法
String url = req.getRequestURL();//获取请求URL
String uri = req.getRequestURI();//获取URI
String h = req.getScheme();//获取协议
2,获取请求行数据
String value = req.getHeader("user-agent");//获取指定的请求行信息
Enumeration e = req.getHeaderName(); //获取所有的请求行的键的枚举
while(e.hasMoreElements()){
System.out.println(e.nextElement());
}
3,获取用户数据
String name = req.getParameter("username");//获取指定的用户数据
req.getParameterNames();//获取所有用户数据的键的枚举
七,response对象:
服务器在调用指定的Servlet进行请求处理时,会给Servlet的方法传递两个实参 request,response。其中request中封装了请求相关的请求数据,response是用来进行响应的对象
八,ServletContext对象
1,问题:
Request解决了一次请求内的数据共享问题,session解决了用户不同请求的数据共享问题,那么不同的用户的数据共享如何处理?(比如每个用户都可以看到网站的访问量),
2,解决:使用ServletContex对象。
3,原理:
ServletContext对象由服务器创建,一个项目只有一个对象。不管在项目的任意位置进行获取,得到的都是同一个对象,那么不同用户发起的请求时,获取到的也就是同一个对象了,该对象由用户共同拥有。由服务器进行创建。
生命周期:服务器启动到服务器关闭
4,作用域:项目内
5,如何使用:
获取ServletContext对象
ServletContext sc = this.getServletContext();方法一
ServletContext sc = req.getSession().getServletContext();//方法二
使用ServletContext对象完成数据共享
sc.setAttribute("name","yaming");//数据存储
String name = sc.getAttrubitu("name");//数据获取
6,ServletContext的其他功能
6.1,获取web.xml中的全局配置
<context-param>
<param-name>name</param-name>
<param-value>yaming</param-value>
</context-param>
String name = sc.getInitParameter("name");
6.2,获取webroot下项目资源流对象
InputStream is = sc.getResourceAsStream("/doc/1.txt");
6.3,获取webroot下资源绝对路径
String path = sc.getRealPath("/doc/1.txt");//获取的路径为项目根目录,参数为项目根目录中的路径。
7,实现计数器
ServletContext sc = this.getServletContext();
if(sc.getAttribute("name") != null){
int nums = sc.getAttribute("nums");
nums+=1;
sc.setAttribute("nums",nums);
}else{
sc.setAttribute("nums",1);
}