Servlet学习
一、Servlet简介及实现原理
1.Servlet是javaweb三大组件之一,它属于动态资源,作用是处理请求
在Servlet中通常需要:
接受请求数据
处理请求
完成响应
2.实现Servlet的三种方式:(自己来写,对象由服务器来创建,并且由服务器创建相应的方法)
实现javax.servlet.Servlet接口
继承javax.servlet.GenericServlet类
继承javax.servlet.http.HttpServlet类(常用)
注意:Servlet中的方法大多数不由我们来调用,而是用tomcat来调用,并且servlet的对象也是不由我们来创建,是由tomcat来创建
3. 如何让浏览器访问Servlet
1.给Servlet指定一个Servlet路径,让Servlet与一个路径绑定在一个
2.浏览器访问Servlet路径
(给Servlet配置Servlet路径,这需要在web.xml中对Servlet进行配置)
4.Servlet:5个方法,3个生命周期方法
生命周期方法:void init(ServletConfig):出生之后(一次)
void service(ServletRequest request,ServletResponse response):每次处理请求时都会被调用
void destroy():临死之前(一次)
5.Servlet特性:
单例:一个类只有一个对象,当然可能存在多个Servlet类
线程不安全的,所以它的效率是高的,避免多线程安全问题的方式,创建成员状态必须为只读的。
二、ServletConfig
一个ServletConfig对象(由tomcat提供)对应一段web.xml中Servlet的配置信息。
1.其API:
String getServletName(), 获取的是<servlet-name>中的内容
ServletContext getServletContext(),获取Servlet上下文对象
String getInitParameter(String name):通过名称获取指定初始化参数的值
Enumeration getInitParameterNames():获取所有初始化参数的名称
2.HttpServlet,是GenericServlet的子类,而GenericServlet实现了ServletConfig接口 :
HttpServlet其中的doGet和doPost由我们自己来覆盖;
如果没有覆盖doGet和doPost,并且它们被调用了,那么会出现405
图片来源:传智播客
3. 在web.xml中
<servlet>中的<load-on-startup>,其中给出一个非负数,表示创建顺序
<url-pattern>中可以使用通配符*,但是*只能出现在两端,前缀或后缀
三、ServletContext
一个项目只有一个ServletContext对象
1.可以在N个Servlet中获取这个唯一的对象,使用它可以在给多个Servlet传递数据,这个对象在Tomcat启动时就创建,在Tomcat关闭时才会死去;所以其作用为:在整个web应用的动态资源中共享数据。
2.获取ServletContext
ServletConfig--getServletContext()
GenericServlet--getServletContext()
HttpSession--getServletContext()
ServletContextEvent--getServletContext()
3.域对象:
(就是用来在多个Servlet中传递数据,域对象必须要有存和取数据的功能)
域对象内部其实有一个Map,用于存储数据
void setAttribute(String name,Object value):存储属性
Object getAttribute(String name):获取某属性的值
void removeAttribute(String name):移除某属性
Enumeration getAttributes():获取所有域属性的名称
4.获取应用初始化参数
Servlet也可以获取初始化参数,但他是局部的参数,也就是说,一个Servlet只能获取自己的初始化参数,不能获取别人的;
即此初始化参数只为一个Servlet准备;
可以配置公共的初始化参数,为所有Servlet而用,这需要使用ServletContext
<context-param>
<param-name>context-param</param-name>
<param-value>context-value</param-value>
</context-param>
四、练习:访问量统计
需创建一个int类型的数据,用来保存变量,然后把它保存在ServletContext的域中,这样保证所有的Servlet都可以访问到
获取ServletContext对象,查看是否存在名为count的属性,如果存在,说明不是第一次访问,如果存在,说明是第一次访问;
第一次访问:setAttribute()
第n次访问:getAttribute()获取原来访问量,setAttribute()加一
public class EServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext app=this.getServletContext();
Integer count= (Integer) app.getAttribute("count");
if(count==null){
app.setAttribute("count",0);
count=1;
}else {
app.setAttribute("count",count+1);
}
/**
* 向浏览器输出
* 需要使用响应对象!
*/
PrintWriter pw=response.getWriter();
pw.write("<h1>"+count+"</h1>");
}
}