servlet

servlet:就是一个Java程序,运行在web服务器中,用于接收和响应客户端的http请求。更多是配合动态资源使用。当然静态资源也要使用servlet,只不过Tomcat里面已经定义一个DefultServlet。这是我们安装完tomcat后访问8080端口后有信息的原因。

servlet用于接收响应http请求

Tomcat就是一个http容器

servlet的第一个程序(hello world)

servlet本质就是javax中的一个类,所以想要实现servlet,只需要实现servlet接口,或是继承servlet的实现类即可

1.首先建立一个web工程,并要有一个服务器。

2.测试运行web工程

​ 1.在Java Resources/src目录下新建包,并新建一个类(eg:test/helloservlet.class),实现Servlet接口。并重写方法,只重写,不进行任何操作,可以在重写的service方法中输出一句话检测servlet是否开启成功。

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class h2 implements Servlet {
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("h2的service被调用...");
}
public void init(ServletConfig config) throws ServletException {
return null;
}
public void destroy() {
return null;
}
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}

​ 2.配置Servlet。目的:告诉服务器,我们的应用中有该Servlet

servlet配置方法。

​ 在webContent/WEB-INF/web.xml里面写上以下内容。

<!-- 向tomcat报告, 我这个应用里面有这个servlet, 名字叫做HelloServlet , 具体的路径是
test/helloservlet.class -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>test/helloservlet.class</servlet-class>
</servlet> <!-- 注册servlet的映射。 servlet-Name : 找到上面注册的具体servlet, -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!--url-pattern: 在地址栏上的path 一定要以/打头。此处用a代替HelloServlet,
a命名随意 -->
<url-pattern>/a</url-pattern>
</servlet-mapping>

3.在地址栏上输入 http://localhost:8080/项目名称/a(eg: http://localhost:8080/test/a)。如果服务器正常开启并且,浏览器不显示任何信息,而在eclipse的控制台中有 “h2的service被调用…” 说明程序运行成功。

servlet执行过程

1.输入http://localhost:8080/test/a之后,浏览器先找到tomcat应用。

2.找到项目。

3.找到web.xml,然后找到所有< url-pattern >,查看是否有哪一个的文本内容是/a。

4.找到同一个下的

5.找到其中的HelloServlet

6.找到上面元素中,与中的同名的中的。

7.找到下面定义的开始创建类的实例。

8.继而执行servlet中的service方法。

Servlet的通用写法

Servlet 接口
  • 已知子接口:

HttpJspPage, JspPage

  • 已知实现类:

FacesServlet, GenericServlet, HttpServlet

GenericServlet 类
  • 已知子接口:

Serializable, Servlet, ServletConfig

  • 实现类:

HttpServlet

所以其通用写法为:定义一个类,继承HttpServlet类,并重写doGet()和doPoet(方法)

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class helloServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public helloServlet() {
super();
}
//get请求会调用这个方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
//post请求会调用这个方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}

Servlet的生命周期

生命周期

从创建到销毁的一段时间。

生命周期方法

从创建到销毁所调用的方法

  • init()方法(servlet初始化方法)

    在创建servlet实例时,就会执行此方法,一个servlet只会初始化一次,所以在servlet运行期间,init())方法只会执行一次。

    默认情况是:初次访问该servlet,才会创建实例

  • service()方法(请求处理方法)

    只要客户端发送了一个请求,就会执行该方法。

    该方法会被执行多次。一次请求,对应一次service()方法调用。

  • destroy()方法

    servlet销毁时就会执行该方法。

    两种情况调用destroy()方法

    1.该servlet项目从tomcat在移除时。

    2.正常关闭tomcat时,(执行shutdown.bat,等)

Servlet的创建时机提前

1.默认情况下,只有当初次访问servlet时,才会执行init方法。有时候,我们可能需要在init方法中执行一些初始化工作,甚至比较耗时的逻辑。那么,初次访问可能在init方法中消耗比较长的时间。这时就需要提前初始化时机。

2.提前servlet初始化时机的方法:在配置的时候,在元素中使用load-on-startup元素来指定,给定的数字越小,启动的时机越早。一般不写负数。从2开始即可。因为1已经被tomcat中的DefultServlet。占用。如果两个class的数字相同,则由tomcat确定哪一个先调用。

<servlet>
<servlet-name>test1</servlet-name>
<servlet-class>test.test1</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

ServletConfig 类

先从Servlet的getServletConfig()方法讲起:

public ServletConfig getServletConfig();该方法在
Servlet的实现类中返回一个ServletConfig 的对象。
作用

通过该类的对象,可以获取servlet的配置时的一些信息。哪个类调用servletconfig,就拿哪个类的配置servlet元素中的数据

方法介绍
  • getServletName()
public String getServletName():返回此 servlet 实例的名称

此处getServletName()获取的是配置servlet里面servlet-name的文本内容

<servlet>
<!--获取的是此处的name-->
<servlet-name>test2</servlet-name>
<servlet-class>test.test2</servlet-class>
</servlet>
  • getInitParameterNames()
public String getInitParameter(String name): 可以根据传
入name获取具体的某一个参数。

其通过的是web.xml配置文件中的servlet元素中的init-param中的param-name寻找param-value值

<servlet>
<servlet-name>test2</servlet-name>
<servlet-class>test.test2</servlet-class>
<!--获取这个元素中的元素对-->
<init-param>
<param-name>address</param-name>
<param-value>hhhhhhhh</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>ggggg</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>463</param-value>
</init-param> </servlet>
<servlet-mapping>
<servlet-name>test2</servlet-name>
<url-pattern>/t2</url-pattern>
</servlet-mapping>
  • getInitParameterNames()
public java.util.Enumeration<E>
getInitParameterNames():以 String 对象的 Enumeration
的形式返回 servlet 的初始化参数的名称,如果 servlet 没有
初始化参数,则返回一个空的

使用

Enumeration<String> e=  sc.getInitParameterNames();
while (e.hasMoreElements()) {
String string = (String) e.nextElement();
s = sc.getInitParameter(string);
System.out.println(string +"===="+ s);
}

测试代码

import java.io.IOException;
import java.util.Enumeration; import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class test2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig sc = getServletConfig();
String s = sc.getServletName();
System.out.println("ServletName = "+s);
System.out.println("--------");
s = sc.getInitParameter("adress");
System.out.println("adress = "+s);
System.out.println("--------");
Enumeration<String> e= sc.getInitParameterNames();
while (e.hasMoreElements()) {
String string = (String) e.nextElement();
s = sc.getInitParameter(string);
System.out.println(string +"===="+ s);
}
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(req, resp);
}
}
out:
ServletName = test2
--------
adress = hhhhhhhh
--------
name====ggggg
adress====hhhhhhhh
age====463
ServletConfig的存在意义
  1. 未来我们自己开发的一些应用,使用到了一些技术,或者一些代码,我们不会。 但是有人写出来了。它的代码放置在了自己的servlet类里面。
  2. 刚好这个servlet 里面需要一个数字或者叫做变量值。 但是这个值不能是固定了。 所以要求使用到这个servlet的公司,在注册servlet的时候,必须要在web.xml里面,声明init-params

在开发当中比较少用。

JavaWeb之servlet(1)的更多相关文章

  1. JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  2. JavaWeb之Servlet入门(二)

    1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...

  3. JavaWeb学习--Servlet认识

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  4. IDEA新建javaWeb以及Servlet简单实现

    刚开始用IDEA开发,还不太熟悉,因此写一个教程,加深印象 1.新建一个Web项目 两种方法:java 和 Java Enterprise(推荐) 第一种)通过Java工程创建,这个方法需要手动导入T ...

  5. Intellij IDEA创建javaWeb以及Servlet简单实现

    1.创建web工程 File --> New --> Project...

  6. javaweb之servlet 全解

    ①Servlet概述 ⑴什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源.Servlet的作用是处理请求, 服务器会把接收到的请求交给Servlet来处理,在Serv ...

  7. JavaWeb学习—Servlet

    1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...

  8. JavaWeb之Servlet总结

    今天上班居然迟到了,昨天失眠了,看完吐槽大会实在不知道做些什么,刚好朋友给我发了两个JavaWeb的练习项目,自己就又研究了下,三四点才睡,可能周日白天睡的太多了,早上醒来已经九点多了,立马刷牙洗脸头 ...

  9. javaWEB之Servlet

    Servlet 1. 什么是Servlet  * Servlet是JavaWeb三大组件之一(Servlet.Filter.Listener)  * Servlet是用来处理客户端请求的动态资源  * ...

  10. Intellijidea建javaWeb以及Servlet简单实现

    一.创建并设置javaweb工程1.创建javaweb工程File --> New --> Project... 点击Project后出现如下界面,选择Java Enterprise,选中 ...

随机推荐

  1. InnoSetup跨脚本传参数

    需求:在a.iss脚本传递参数给b.iss 举例: a.iss:传程序安装路径给b.iss Parameters: /Path={app} b.iss:接收a.iss传过来的安装路径 DefaultD ...

  2. PHP+Ajax实现文章心情投票功能实例

    一个PHP+Ajax实现文章心情投票功能实例,可以学习了解实现投票的基本流程:通过ajax获取心情图标及柱状图相关数据,当用户点击其中的一个心情图标时,向Ajax.php发送请求,PHP验证用户coo ...

  3. PHP+Mysql统计文件下载次数实例

    PHP+Mysql统计文件下载次数实例,实现的原理也很简单,是通过前台点击链接download.php传参id,来更新点击次数. 获取文件列表: <?php require 'conn.php' ...

  4. 前端vuex基础入门

    vuex简介 是一个专门为vue.应用程序开的状态管理模式 它采用集中式存储管理应用的所有组件的状态 (类似于全局变量) 并以相应的规则保证以一种可预测的方式发生改变(相应式变化) 应用场景 多个视图 ...

  5. 为什么局部内部类中访问同一方法中的变量,该变量一定要是final修饰的

     最近有一个疑惑:为什么局部内部类中访问同一方法中的变量,该变量一定要是final修饰的         首先,我们看一个局部内部类的例子:             class OutClass {  ...

  6. 利用css将英文转为大写或小写

    项目需要在后台接收的字段值为小写,但在页面上显示大写英文,但操作页面之后,最终传给后台的依旧是小写,所以就需要使用css转化一下即可 <li>This.is.a.book,全部转为大写:& ...

  7. 模拟超市付款 (if 多分支结构)

    """ 模拟超市付款: 商品单价 商品数量 键盘上输入商品单价,以及商品数量, 然后计算应付总额 计算总额 float 提示用户可以有4种付款方式 不同的付款方式有不同的 ...

  8. 《数据挖掘导论》实验课——实验一、数据处理之Numpy

    实验一.数据处理之Numpy 一.实验目的 1. 了解numpy库的基本功能 2. 掌握Numpy库的对数组的操作与运算 二.实验工具: 1. Anaconda 2. Numpy 三.Numpy简介 ...

  9. acwing 471. 棋盘 解题记录

    题解地址  https://www.acwing.com/problem/content/description/473/ 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的. 你现 ...

  10. C++ 标准库,可变参数数量,参数类型相同

    #include <iostream> // 可变模板参数 // 此例:可以构造可变数量,可变类型的函数输入. // 摘自:https://www.cnblogs.com/qicosmos ...