Servlet 是javaweb 三大组件之一
三大组件:
1 Servlet
2 filter
3listener
1.servlet-api 和 javax.servlet-api的区别
在正式查看Servlet源码前,我们首先要分清楚上述两个jar包的区别。
引用:这两个构件都是 Servlet-Specificatoin Jar (Servlet 规范包),只不过因为版本升级:
3.1 之前的 Servlet API 构件叫做 servlet-api-xxx.jar
3.1 及之后的Servlet API 构件改名为 javax.servlet-api-xxx.jar
也就是说两者的区别其实就是版本上的区别,在下载源码包时注意对应的版本。
2.下载源码
据我刚才所说,下载源码时要注意相应的版本。但是从我的实际操作来看,查看servlet-api.jar,使用的是 javax.servlet-api的源码,源码能看问题也不大。
地址:http://www.java2s.com/Code/JarDownload/javax.servlet/javax.servlet-api-3.0.1-sources.jar.zip
3.搭建项目
3.1创建java web项目
3.2查看未引入源码的HttpServlet
3.3选中对应jar包,右键选择Properties
3.4导入下载到的源码jar
3.5导入成功
点击HttpServlet 类名称
例如登录请求找的是登录servlet,注册请求找的是注册servlet,就像每一个话务员一样,每个人 负责的任务都是不一样的,
每一个servlet 负责的请求是不一样的,例如在访问百度的时候,就是大家都在访问一个功能,但是并没有出现站排的现象,所以那就是异步的并发的,会出现线程安全的问题,线程不安全的好处就是快
Servlet概述
特性:
单例,一个类只有一个对象;当然可能存在多个Servlet类!
线程不案例的,所以它的效率是高的!
Servlet类由我们来写,但对象由服务器来创建,并且由服务器来调用相应的方法。
1 什么是Servlet
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
接收请求数据(最重要的就接收请求数据,就像是话务员一样,也是先接收你的请求数据);
处理请求,
完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
2 实现Servlet的方式(由我们自己来写!)
实现Servlet有三种方式:
实现javax.servlet.Servlet接口;
继承javax.servlet.GenericServlet类;
继承javax.servlet.http.HttpServlet类(只有这一个类和http请求最接近的,用来处理http请求);
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。
Servlet.java
publicinterfaceServlet{
public void init(ServletConfigconfig)throwsServletException;
public ServletConfig getServletConfig();
public void service(ServletRequestreq,ServletResponseres)
throws ServletException,IOException;
public String getServletInfo();
public void destroy();
}
一共就是五个方法
在创建servlet 的时候
一定要把这个导入进去,因为tomcat 当中含有servlet-api.jar.
因为servlet 不是jdk 当中的元素,所以采用的api 不是jdk,是
当继承了servlet 接口的时候就自动实现那个5种方法
package cn.itcast.web.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* 查看Servlet接口中的方法
*/
public class AServlet implements Servlet {
/*
* 它也是生命周期方法
* 它会在Servlet被销毁之前调用,并且它只会被调用一次!
*/
@Override
public void destroy() {
System.out.println("destory()...");
}
/*
* 可以用来获取Servlet的配置信息
*/
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig()...");
return null;
}
/*
* 获取Servlet的信息
*/
@Override
public String getServletInfo() {
System.out.println("getServletInfo()...");
return "我是一个快乐的Servlet";
}
/*
* 它是生命周期方法
* 它会在Servlet对象创建之后马上执行,并只执行一次!(出生之后)
*
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init()...");
/*
* 获取初始化参数
*/
System.out.println(servletConfig.getInitParameter("p1"));
System.out.println(servletConfig.getInitParameter("p2"));
/*
* 获取所有初始化参数的名称
*/
Enumeration e = servletConfig.getInitParameterNames();
while(e.hasMoreElements()) {
System.out.println(e.nextElement());
}
}
/*
* 它是生命周期方法
* 它会被调用多次!!!
* 每次处理请求都是在调用这个方法!
*/
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("service()...");
}
}
servlet 当中的大部分方法不由我们来调用,由服务器来调用,并且servlet 当中你的对象不由我们来创建由服务器来创建现在我们用的是tomcat 那么就是由tomcat 来创建的,由tomcat 来调用,其实我们写的是片段程序,一些固定不变的是由tomcat 已经写好的,我们写的部分是变化的部分,这两部合在一起才是完整的web 应用
生命周期方法:
void init(ServletConfig):它会在Servlet 对象创建之后马上执行,并只执行一次(出生之后);
voidservice(ServletRequestrequest,ServletResponseresponse):每次处理请求时都会被调用;
void destroy():临死之前(1次):它会在Servlet 被销毁之前调用,并且它只会被调用一次
生命周期的调用过程
还有其他的两种方法
public ServletConfig getServletConfig(); 获取servlet的配置信息
public String getServletInfo(); 获取servlet 的信息,表示的对servlet 的描述信息,一般没什么用。
如何才能用浏览器访问servlet ,浏览器的url 和servlet 如何建立连接呢?
浏览器首先通过url-parttern 写的浏览器的地址,通过浏览器的地址找的Servlet的类
web.xml 配置
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>
<init-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>p2</param-name>
<param-value>v2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
把服务器启动起来以后通过浏览器访问
http://localhost:8080/day09_1/AServlet
七月 07, 2018 1:37:46 上午 org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
七月 07, 2018 1:37:46 上午 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 4090 ms
七月 07, 2018 1:37:46 上午 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
七月 07, 2018 1:37:46 上午 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.82
七月 07, 2018 1:37:48 上午 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
WARNING: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [117] milliseconds.
hell