javaweb_4

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>");

    }
}

猜你喜欢

转载自blog.csdn.net/Hpsyche/article/details/81464215