Javaweb基础之Servlet学习

来源:互联网 发布:重庆行知技工学校 编辑:程序博客网 时间:2024/04/28 12:49

一、Servlet简介

1.1 什么是Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。Servlet是一套规范,也就是说其中的一部分的类抽象成了接口,实际过程中Servlet运行在web服务器中,具体的实现要由web服务器来实现(与JDBC的驱动一个道理)。

1.2 Servlet运行机制

浏览器发送一个HTTP请求,HTTP请求由Web容器(服务器)分配给特定的Servlet进行处理,Servlet的本质是一个Java对象,这个对象拥有一系列的方法来处理HTTP请求。常见的方法有doGet(),doPost()等。Web容器中包含了多个Servlet,特定的HTTP请求该由哪一个Servlet来处理是由Web容器中的web.xml来决定的。

1.3 Tomcat与Servlet关系

Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Servlet,并将Servlet的响应传送回给客户.而Servlet是一种运行在支持Java语言的服务器上的组件. Servlet最常见的用途是扩展Java Web服务器功能,提供非常安全的,可移植的,易于使用的CGI替代品。

二、实现javax.servlet.Servlet接口

2.1 Servlet接口的相关方法

(1) ServletConfig getServletConfig:获取Servlet的配置信息
(2) String getServletInfo:获取servlet的信息
(3) void init(ServletConfig config) :出生之后执行初始化操作(只执行一次)。
(4) void service(ServletRequest req,ServletResponse res):每次处理请求时都会被调用。
(5) void destory():临终前的处理善后工作,销毁servlet占用的非内存资源。

2.2 Servlet接口的具体实现

2.2.1 实现Servlet接口

    @Override    public ServletConfig getServletConfig() {        return null;    }    @Override    public String getServletInfo() {        return null;    }    @Override    public void init(ServletConfig servletConfig) throws ServletException {        System.out.println("init()...");    }    @Override    public void service(ServletRequest servletRequest, ServletResponse servletResponse)            throws ServletException, IOException {        System.out.println("service()...");    }    @Override    public void destroy() {        System.out.println("destroy()...");    }}

2.2.2 配置web.xml文件

<servlet><servlet-name>MyServlet</servlet-name><servlet-class>com.xxx.myServlet.MyServlet</servlet-class></servlet><servlet-mapping><servlet-name>MyServlet</servlet-name><url-pattern>/aServlet</url-pattern></servlet-mapping>

web.xml中配置Servlet的目的是把访问路径与一个Servlet绑定在一起。如本例配置的就是把com.xxx.myServlet.MyServlet和路径“/aServlet”绑定在一起。
:指定某个Servlet,并给其命名。
:指定访问路径访问的servlet的名称

2.3 Servlet的生命周期

Servlet的生命周期是指Servlet的出生,服务,以及死亡的过程。与Servlet生命周期相关的方法如下:
void init(ServletConfig servletConfig):出生时执行初始化操作(只能一次)
void service(ServletRequest request, ServletResponse response):每次处理请求时都会被调用。
void destory():关闭服务器时被销毁。

2.3.1 Servlet的出生

服务器会在Servlet第一次被访问时创建Servlet对象(或在服务器启动时创建),一个Servlet类型服务器只创建一个实例。
在服务器启动时创建Servlet需要在web.xml的<servlet>标签中配置<load-on-startup>2</load-on-startup>),数字2如果有数字1出现时会在其之前执行。数字范围1~9。

2.3.2 Servlet的服务

具体的对数据库的增删改查,当服务器每次接收请求时,都会调用Servlet的service(ServletRequest req,ServletResponse res)方法。service方法可以被多次调用。

2.3.3 Servlet的死亡

Servlet在关闭服务器时才会死亡,离去时会调用destory()方法,非内存资源会在destory()中被销毁。

2.4 Servlet接口相关参数

  • ServletRequest和ServletResponse(请求和响应)
  • ServletConfig
    ServletConfig
    ServletConfig对象由tomcat创建,然后传递给Servlet的init()方法,所以可以在init方法中使用ServletConfig对象。
    • String getServletName():获取Servlet在web.xml中配置的servlet名称()
    • ServletContext getServletContext():获取ServletContext对象
    • String getInitParameter(String name):用来获取在web.xml中配置的初始化参数,通过参数名获取参数值
    • Enummeration getInitParameterNames():用来获取web.xml中配置的所有初始化参数名称(可遍历打印)

2.4.1 在web.xml文件中初始化参数配置和ServletConfig方法调用

<servlet>    <servlet-name>MyServlet</servlet-name>    <servlet-class>com.xxx.myServlet.MyServlet</servlet-class>      <init-param>        <param-name>name1</param-name>        <param-value>Jack</param-value>     </init-param>    <init-param>        <param-name>name2</param-name>        <param-value>Jerry</param-value>    </init-param>  </servlet>  ``` ```         //获取sevlet的名称(在init方法中)        System.out.println("servlet的名称"+servletConfig.getServletName());        System.out.println("---------------------");        //获取初始化参数值        System.out.println("获取name1的值:"+servletConfig.getInitParameter("name1"));        System.out.println("获取name2的值:"+servletConfig.getInitParameter("name2"));        System.out.println("---------------------");        //获取全部的初始化参数        Enumeration e=servletConfig.getInitParameterNames();        while(e.hasMoreElements()){            System.out.println(e.nextElement());        }   

三、继承HttpServlet

HttpServlet类是GennericServlet类的子类,提供了对HTTP请求的特殊支持,因而应用更为广泛。

3.1 doGet()和doPost()方法

tomcat创建HttpServlet对象,调用HttpServlet的service(HttpServletRequest req, HttpServletResponse resp)方法,并判断当前请求是get还是post,是get调用doGet(),post调用doPost()。

3.2 具体实现方法

1.继承HttpServlet
public class AServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {        resp.setContentType("text/html;charset=gbk");        resp.getWriter().print("你好呀");    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp)            throws ServletException, IOException {    }}
2.配置web.xml文件
  <servlet>    <servlet-name>AServlet</servlet-name>    <servlet-class>com.xxx.test.AServlet</servlet-class>  <servlet-mapping>    <servlet-name>AServlet</servlet-name>    <url-pattern>/servlet/AServlet</url-pattern>  </servlet-mapping>
注:调用doPost方法需要表单提交方式为method="post"

四、Servlet与线程安全

因为一个类型的Servlet只有一个实例对象,那么所以可能会出现一个Servlet同时处理多个请求。Servlet不是线程安全的,工作效率较高,但同时也存在线程安全问题。
不要在Servlet中创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程进行读操作。

五、标签

是的子元素,用来指定Servlet的访问路径(url),一般以“/”开头,*.x除外。
当在同一个中配置多个时,无论访问哪一个路径都可以访问该Servlet。
通配符”*”代表可以匹配任何URL前缀(或后缀)如:
/* 代表匹配所有url
.do:只要后缀是 .do都可以匹配

六、ServletContext

6.1概述

ServletContext(上下文对象)是Java四大域对象之一。服务器会为每一个应用创建一个ServletCotext对象。随着tomcat的启动而产生,随着tomcat的关闭消失。ServletContext对象的作用是整个Web应用的动态资源之间共享的数据。例如AServlet中向ServletContext对象中保存一个值,然后在BServlet中可以获取这个值。

6.2 ServletContext对象的获取

  • 在void init(ServletConfig servletConfig)中:servletConfig可以调用ServletContext getServletContext()
  • 在HttpServlet中获取ServletContext对象:
    因为HttpServlet继承GenericServlet类,而该类中有一个方法 ServletContext getServletContext() ;所以可以在HttpServlet的方法中直接使用this.getServletContext()来获取ServletContext对象。

6.3 获取应用初始化参数

  • Servlet也可获取初始化参数,但是它的参数是局部参数,也就是说,一个Servlet只能获取自己的初始化参数,不能获取别的Servlet的初始化参数。
  • 可以配置公共的初始化参数,为所有的Servlet而用!这个就需要使用ServletContext!
    1. 需要在web.xml中配置应用初始化数据
<web-app>.....    <context-param>        <param-name>name1</param-name>        <param-value>value1</param-value>    </context-param></web-app>  
  1. 使用ServletContext获取应用初始化数据
ServletContext sc=  servletConfig.getServletContext();String value1 = sc.getInitParamter("name1");

6.4 ServletContext作为域对象的功能

6.4.1.域对象简介

ServletContext对象用来操作数据的方法
* void setAttibute(String name,Object value):用来存储一个对象。多次调用setAtrribute(“name1”)会对上一个name1的值产生覆盖效果
* Object getAttribute(String name):获取存储数据name所对应的值 value
* void removeAttribute(String name):移除ServletContext中域属性
* Enumeration getAttributeNames():获取所有的域属性的名称;
Servlet获取资源路径
* 获取绝对路径
ServletContext sc = config.getServletContext();
String realPath = sc.getRealPath(“/a.txt”);
* 获取资源流
ServletContext sc = this.getServletContext();
InputStream is1 = sc.getResourceAsStream(“/a.txt”);
InputStream is2 = sc.getResourceAsStream(“/WEB-INF/b.txt”);
* 获取指定目录下的所有资源路径
ServletContext sc = request.getServletContext();
Set set = sc.getResourcePaths(“/WEB-INF”);
System.out.println(set);