个人博客网:https://wushaopei.github.io/ (你想要这里多有)
1、Servlet技术
1.1 Servlet 概述:
(1)什么是Servlet
- Servlet是一个接口。
- Servlet是一个运行在服务器上的小程序。
- Servlet可以用来接收客户端的请求。并且响应数据
Servlet是JavaWeb的三大组件之一。Servlet程序、Filter过滤器、Listener监听器。
(2)手动实现Servlet程序
- 编写一个类去实现Servlet接口
- 实现service方法
- 到web.xml中去配置一个访问地址
(3)Servlet 程序的代码:
public class HelloServlet implements Servlet {
/**
* service方法用来接收响应请求。<br/>
* 每次请求Servlet程序都会调用service方法
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("HelloServlet 程序被访问了!");
}
}
web.xml中的配置内容:
<!-- 告诉Tomcat服务器。我的这个web工程,有一个servlet程序 -->
<servlet>
<!-- servlet-name是给你要配置的Servlet程序起一个名称,不能重复。一般使用类名 -->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class是Servlet程序的全类名 -->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
</servlet>
<!-- servlet-mapping给servlet程序配置访问地址 -->
<servlet-mapping>
<!-- 当前配置的访问地址给哪个servlet程序使用 -->
<servlet-name>HelloServlet</servlet-name>
<!--
url-pattern是servlet程序的访问地址
在服务器中:
斜线 表示 http://ip:port/工程名/
/helloServlet 表示http://ip:port/工程名/helloServlet
-->
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
1.理解部署描述文件将URL映射到servlet:
将servlet部署到Web容器时,会创建一个相当简单的XML文档,这称为部署描述文件(DD),部署描述文件会告诉容器如何运行你的servlet和JSP。尽管使用部署描述文件不只是为了映射servlet名,最起码要知道,可以使用两个XML元素把URL映射到servlet,其中一个将客户知道的公共URL名映射到你自己的内部名,另一个元素把你自己的内部名映射到一个完全限定类名。
2.关于部署文件的其他作用:
除了把URL映射到实际的servlet,还可以使用部署描述文件对Web应用的其他方面进行定制,巴伯阔安全角色、错误页面、标记库、初始配置信息等。如果这是一个完整的J2EE服务器,甚至可以声明你要访问特定的企业Javabean。
3.好处:利用部署描述描述文件,我们能采用一种申明方式修改应用,而无需修改源代码!
4.容器怎么使用部署描述文件种的类名来找到一个特定的servlet类文件呢?
是不是还一个映射,支出了某个类名会映射到那个位置上的那个文件,是这样吗?
答:<servlet-class>元素里放了类名(完全限定类名、包括包名。因为,容器会在一个特定的位置寻找你再部署描述文件的映射中指定的所有servlet.
实际上,容器使用了一组很复杂的规则来寻找匹配的servlet,它会根据客户请求提供的URL查找位于服务器某个位置上的一个具体Java类。
1.2 配置Servlet程序的常见错误:
第一个 url-pattern配置错误:
第二个常见错误:servlet-name配置错误
第三个常见错误:servlet-class配置错误
1.3 解析url到servlet访问细节
1.4 Servlet的生命周期(了解内容
1、Servlet程序的构造方法
2、Servlet程序的init初始化方法
构造方法和init初始化方法只有第一次访问的时候调用。
Servlet程序是由Tomcat服务器负责创建。
Servlet程序是单例的。线程安全问题(尽量不要在Servlet类中定义一些有线程安全问题的变量)。
3、Servlet程序的service方法(每次访问都会调用
4、Servlet程序的destroy销毁方法(停止web工程的时候)
1.5 模拟GET请求和POST请求的分发
public class HelloServlet implements Servlet {
/**
* service方法用来接收响应请求。<br/>
* 每次请求Servlet程序都会调用service方法
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException {
// get请求 和 post请求做不同的工作
// 1、需要想办法知道当前请求是GET请求,还是POST请求,
// ServletRequest它表示请求,可以获取请求的信息
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// getMethod()方法可以获取当前请求的方式 GET或POST
String method = httpServletRequest.getMethod();
System.out.println( "当前的请求方式是:" + method );
// 2、然后执行不同的代码。
if ("GET".equals(method)) {
doGet();
} else if ("POST".equals(method)) {
doPost();
}
System.out.println("3 service 方法 HelloServlet 程序被访问了!");
}
public void doPost() {
System.out.println("当前请求是POST请求,执行POST请求的功能代码");
}
public void doGet() {
System.out.println("当前请求是GET请求,执行GET请求的功能代码");
}
}
1.6 通过继承HttpServlet实现Servlet程序(实际开发)
Servlet程序一定在直接或间接实现Servlet接口
- 编写一个类去继承HttpServlet类
- 根据你的需要重写doGet或doPost方法
- 到web.xml中去配置Servlet程序的访问地址
Servlet程序的代码:
public class HelloServlet2 extends HttpServlet {
/**
* doGet方法在每次get请求的时候就会被调用。用来处理get请求
*/
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("这是HelloServlet2类的doGet方法");
}
/**
* doPost方法在每次post请求的时候就会被调用。用来处理post请求
*/
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("这是HelloServlet2类的doPost方法");
}
}
web.xml中的配置:
<servlet>
<servlet-name>HelloServlet2</servlet-name>
<servlet-class>com.atguigu.servlet.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet2</servlet-name>
<!--
/helloServlet 表示http://ip:port/工程名/helloServlet
/helloServlet2 表示http://ip:port/工程名/helloServlet2
-->
<url-pattern>/helloServlet2</url-pattern>
</servlet-mapping>
1.7 使用Eclipse创建Servlet程序
2、Servlet 类的继承体
GenericServlet持有ServletConfig的引用,因为它实现Servlet接口;其继承子类的继承子类实现init()法时必须用super.init(config)调用HttpServlet继承类的方法,持有ServletConfig对象的引用。不然会报错!
重写doGet或doPost方法需要注意的点:HttpServlet实现了service的getMethod()方法,即doGet()、doPost(),
而任何继承HttpServlet的类,在重写方法时,默认super了该方法,再调用super.doGet 或super.doPost是错误的!
3、 ServletConfig 类
ServletConfig类从类名上来看,就知道它是Servlet程序的配置信息。
ServletConfig类由Tomcat服务器负责创建。在init初始化方法调用的时候,传递给程序员使用。
3.1 ServletConfig类的三大作用
- 可以获取到Servlet配置的名称 (servlet-name标签的值)
- 可以获取到Servlet程序的配置的初始化参数 <init-param>
- 获取ServletContext对象
Servlet配置的代码:
public class ConfigServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
// a)ServletConfig类的三大作用
// 1、可以获取到Servlet配置的名称 (servlet-name标签的值)
System.out.println( config.getServletName() );
// 2、可以获取到Servlet程序的配置的初始化参数 <init-param>
System.out.println( config.getInitParameter("user") );
System.out.println( config.getInitParameter("url") );
// 3、获取ServletContext对象
System.out.println( config.getServletContext() );
}
}
web.xml中的配置:
<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
<!-- init-param可以给Servlet程序配置一个专门的键值对信息。 -->
<init-param>
<!-- 是参数名 -->
<param-name>user</param-name>
<!-- 是参数值 -->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ConfigServlet</servlet-name>
<url-pattern>/configServlet</url-pattern>
</servlet-mapping>
当我们在自己的子类中重写init(ServletConfig)方法时需要注意的点:
其继承子类的继承子类实现init()法时必须用super.init(config)调用HttpServlet继承类的方法。不然会报错!
重写doGet或doPost方法需要注意的点:
HttpServlet实现了service的getMethod()方法,即doGet()、doPost(),
而任何继承HttpServlet的类,在重写方法时,默认super了该方法,再调用super.doGet 或super.doPost是错误的!
4、ServletContext 类
4.1 什么是ServletContext?
ServletContext是一个接口
ServletContext在Tomcat服务器里,一个web工程,只会创建一个ServletContext对象的实例。
ServletContext是域对象。
ServletContext对象在Web工程启动的时候创建。在web工程停止的时候销毁
域对象,是可以像map一样存取数据的对象。
map 有put 保存 get 获取
域对象 setAttribute保存 getAttribute获取
域指的是存取的数据的操作效范围。ServletContext域对象的数据操作范围是整个web工程。
ServletConfig ====>>>> init-param
ServletContext =====>>>>> context-param
4.2 ServletContext类的四个作用
- 获取上下文初始化参数 <context-param>
- 获取工程路径 比如/day06
- 获取web工程发布到服务器上之后,文件或目录在服务器磁盘上的绝对路径。
Servlet程序中的代码:
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 先获取到ServletContext对象
ServletContext servletContext = getServletContext();
// 1、获取上下文初始化参数 <context-param>
System.out.println(servletContext.getInitParameter("password") );
System.out.println(servletContext.getInitParameter("driverClass") );
// 2、获取工程路径 比如/day06
System.out.println( servletContext.getContextPath() );
// 3、获取web工程发布到服务器上之后,文件或目录在服务器磁盘上的绝对路径。
// / 斜线 表示http://ip:port/工程名/ 它 映射到代码的WebContent目录
System.out.println( servletContext.getRealPath("/") );
System.out.println( servletContext.getRealPath("/css") );
System.out.println( servletContext.getRealPath("/img/12.jpg") );
}
}
web.xml中的配置:
<!-- context-param配置整个web工程都可以使用的上下文参数 -->
<context-param>
<!-- 参数名 -->
<param-name>password</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</context-param>
<context-param>
<!-- 参数名 -->
<param-name>driverClass</param-name>
<!-- 参数值 -->
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
4.3 可以像map一样存取数据(并且数据的操作范围是整个web工程)
Context1代码:
public class Context1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
System.out.println( "Context1 保存之前获取abc:" + context.getAttribute("abc") );
System.out.println("往ServletContext域对象中保存 abc == abcValue");
context.setAttribute("abc", "abcValue");
System.out.println( "Context1 保存之后获取abc:" + context.getAttribute("abc") );
}
}
Context2代码:
public class Context2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
System.out.println("Context2 获取abc:" + context.getAttribute("abc"));
}
}
小总结:
Servlet程序
1 、 Servlet程序可以用来接收用户的请求和响应请求
Servlet程序的生命周期:
通过实现Servlet接口 继承 HttpServlet
1、构造器调用 1、构造器
2、init初始化方法 2、init初始化方法
3、service方法 3、doGet或doPost
4、destroy方法 4、destroy方法
实现Servlet程序:
1、编写一个类去实现Servlet接口 或 继承HttpServlet类
2、重写service方法 或 重写doGet或doPost方法
3、到web.xml中去配置一个访问地址
ServletConfig
ServletConfig类是servlet程序用来封装Servlet配置信息的类,它由Tomcat服务器负责创建,我们使用。
1、获取init-param初始化参数
2、获取servlet-name servlet配置的名称
3、获取ServletContext对象
ServletContext
1、ServletContext是一个域对象
域对象是指可以像map一样存取数据的对象。
setAttribute 保存数据
getAttribute 获取数据
域指的是数据操作的效范围 整个web工程。
2、一个web工程,只会创建一个ServletContext对象实例
3、ServletContext对象在web工程启动的时候创建,在web工程停止的时候销毁
常见作用:
1、获取上下文初始化参数 context-param
2、获取工程路径 比如:/day06
3、获取web工程布暑到服务器上之后。在服务器磁盘上的绝对路径
4、像map一样存取数据