java自学之路-----Servlet_基础

来源:互联网 发布:张韶涵范玮琪 知乎 编辑:程序博客网 时间:2024/05/01 23:09

Servlet基础{

定义:是sun公司提供的一门用于开发动态web资源的技术

步骤:1.编写一个java类 2.把开发好的java类部署到web服务器中

调用流程:

Servlet程序是由web服务器调用的,web服务器接收到了客户端的Servlet访问请求后:

1.web服务器先判断是否装载并创建了Servlet实例对象,如果是执行第4步,否执行第二步

2.装载并创建了该Servlet的一个实例对象

3.调用Servlet实例对象的init的方法

4.创建request和response,调用Servlet的service方法,请求和响应作为参数传入

5.WEB应用程序被停止或者重新启动之前,Servlet先调用destroy方法,Servlet引擎再卸载Servlet对象,



两个实现类(不需要覆盖全部方法){

GenericServlet:Servlet的默认实现类

HttpServlet:

1.指能够处理Http请求的servlet,在原有的Servlet接口上添加了一些与HTTP协议处理方法,比Servlet接口的功能更强大

2.该实现类覆写了service方法,该方法体内的代码会自动判断用户是以什么方式提交的请求。如果是GET提交就调用doget方法,POST请求就调用dopost方法,开发人员通常只需要覆盖doGet和doPost方法即可

}

web.xml{

由于客户端是通过URL地址访问服务器的资源的,所以Servlet程序想要被外界访问到就需要映射到一个URL地址上,这个工作就在web.xml文件中完成

  <servlet>    <servlet-name>LoginServlet</servlet-name><!-- 设置Servlet的注册名称 -->    <servlet-class>cn.halm.web.client.LoginServlet</servlet-class><!-- Servlet的完整类名 -->  </servlet> <servlet-mapping>    <servlet-name>LoginServlet</servlet-name><!-- Servlet的注册名称 -->    <url-pattern>/client/LoginServlet</url-pattern><!-- Servlet的对外访问路径 -->  </servlet-mapping>

注意:

1.同一个Servlet可以被映射到多个URL地址上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名

2.如果在<Servlet>元素中配置了<load-on-startup>元素,那么WEB服务器在启动时,就会装载并创建Servlet的实例对象,以及调用init方法

3.在Servlet的映射地址中可以使用通配符*,有两种固定格式:1. "*.扩展名 " 2. " /*"

4.如果某个Servlet的映射路径为正斜杠(/),表示这个Servlet为当前Web应用的程序的缺省Servlet(WEB服务器有定义一个缺省的Servlet)

5.凡是在web.xml找不到的匹配的URL时,他们的访问请求都会交给缺省Servlet。当访问静态文件时,实际上就是先访问缺省的Servlet,再由这个Servlet找静态文件

6.Servlet是一个供其他java程序(servlet引擎即web服务器)调用的java类,它不可以独立运行,它完全由Servlet引擎来控制和调度

7.对于客户端的多次Servlet请求,通常服务器只会创建一个Servlet实例对象,也就是Servlet实例对象一旦被创建就会驻留在内存中,供其他请求服务,直到web容器退出,Servlet实例对象才被摧毁

8.在Servlet的生命周期内,Servlet对象的的init方法只会被调用一次。而对于每次访问请求都会导致Servlet引擎调用一次Servlet的service方法。对于每次请求Servlet引擎都会创建一个新的HttpServletRequest对象和HttpServletResponse对象,作为参数传入service方法,然后再根据请求方式调用doXXX方法。

9.HttpServletRequest对象和HttpServletResponse对象,他们的生命周期很短,请求结束就会销毁

线程安全问题:(当有资源共享的时候才需要考虑线程安全问题)

1.当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个新的线程,并在这个线程上调用service方法时,如果有使用到共享资源的话就会引起线程安全问题

2.如果Servlet实现了SingleThreadModel接口,那么Servlet引擎就会以单线程模式来调用service方法。这个接口是一个标记接口,不需要实现任何方法,只要在定义Servlet类,增加声明实现接口即可

3.对于实现了SingleThreadModel接口的Servlet,对于客户端的访问采用的方式是产生多个Servlet的实例对象,并发的线程每次调用不同的Servlet对象

4.这个接口已经过时,不太适合使用,还是应该使用同步代码块方式解决该问题

}

}


ServletConfig{

1.Servlet的配置文件中,通过<init-param>标签为Servlet配置一些初始化参数(为那个Servlet配置就放在哪个Servlet的标签内)

  <servlet>    <servlet-name>ServletConfigDemo</servlet-name>    <servlet-class>ServletConfigDemo</servlet-class>    <init-param>    <param-name>name</param-name>    <param-value>halm</param-value>    </init-param>  </servlet>

2.配置了这些参数后,当Web服务器创建Servlet实例对象之后就会将这些初始化参数封装到ServletConfig对象中,并在调用Servlet的init方法时,把这个对象传递给Servlet对象。所以程序员就可以获得当前的Servlet的初始化信息

3.在实际开发中,有些信息不适合直接在程序中写死,所以可以从配置文件中获取相应信息

String value1 = this.getServletConfig().getInitParameter("data");//获取指定配置值Enumeration<String> values = this.getServletConfig().getInitParameterNames();//获取所有配置的值while(values.hasMoreElements()){String value2 = values.nextElement();}

}


ServletContext{

1.WEB服务器在启动的时候,会为每个Web应用程序创建一个ServletContext对象,它代表当前的web应用。当web服务器停止,该对象会销毁

2.在ServletConfig对象中维护了对ServletContext对象的引用,可以通过config.getServletContext()方法获得该对象

3.由于一个Web应用中的所有Servlet共享一个ServletContext对象,所以可以通过这个对象来实现数据共享,该对象也被称为“context域对象”

4.可以设置web应用的初始化参数,供所有Servlet共享

  <context-param>  <param-name>name</param-name>  <param-value>halm</param-value>  </context-param>

5.转发的使用

//使用转发对象,将一些数据转到另一个页面进行显示。转发只有一次请求。重定向有两次请求this.getServletContext().getRequestDispatcher("/1.jsp").forward(request, response);

6.读取文件信息

//斜杠代表当前web应用,需要读取哪些文件,就写入该文件相对于web应用的相对位置this.getServletContext().getResourceAsStream("/......");

}

0 0