一、预备知识

一、Servlet简介

  Servlet是sun公司提供的一门用于开发动态web资源的技术。
  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
  1、编写一个Java类,实现servlet接口。
  2、把开发好的Java类部署到web服务器中。
  按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet。

二、Servlet的运行过程(生命周期)

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
  ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
  ②装载并创建该Servlet的一个实例对象。
  ③调用Servlet实例对象的init()方法。
  ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
  ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

三、Servlet与普通Java类的区别  

  Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
  针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
  在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

  如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
    举例:
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
            org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

  用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。

四、缺省Servlet

  如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
  凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。 例如:

 1  <servlet>
 2     <servlet-name>ServletDemo2</servlet-name>  3 <servlet-class>gacl.servlet.study.ServletDemo2</servlet-class>  4 <load-on-startup>1</load-on-startup>  5 </servlet>  6  7 <!-- 将ServletDemo2配置成缺省Servlet -->  8 <servlet-mapping>  9 <servlet-name>ServletDemo2</servlet-name> 10 <url-pattern>/</url-pattern> 11 </servlet-mapping>

  当访问不存在的Servlet时,就使用配置的默认Servlet进行处理,如下图所示:

  



  1. 在myEclipse创建web project
  2. 在src包下编写一个java类。
public class MyServlet extends HttpServlet {/*** */private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,HttpServletResponse response){    this.doPost(request, response); }protected void doPost(HttpServletRequest request,HttpServletResponse response){System.out.println("第一个servlet"); }
}

解析:   MyServlet这个类要继承HttpServlet,而HttpServlet必须引入外部的jar包,tomcat服务器里有这个包,我们可以引入或者自己下载导入。   继承HttpServlet之后,一般覆盖其中的doGet()和doPost()方法。


  3.打开webroot/web-inf里的web.xml,点击source,添加下列:

    <servlet><servlet-name>hello</servlet-name><servlet-class>myServlet.MyServlet</servlet-class>    //创建 myServlet包下的MyServlet类的对象 hello
   </servlet><servlet-mapping><servlet-name>hello</servlet-name>   <url-pattern>/servlet</url-pattern>   //在地址栏里输入/servlet的时候调用对象hello
    </servlet-mapping>

  4.配置好xml文件之后可以初步使用了。结果如图:



Servlet基础配置

  • 配置:1.windows->proference->java->Build path->user library 引入tomcat里的Servletjar包(把开发包和工具关联起来)
2.右击项目名,properties->java Build path->libraries->add library->user library->用户类库名(将项目和开发包关联起来)
  • 特别注意版本问题,
JAVAEE 6 web3.0 要用tomcat7.0的服务器才能支持,否则不能支持,即在eclipse上JAVAEE 6 web3.0 的项目不能添加到tomcat6.0服务器里.
  • 把文件部署到服务器的三种方法:
1.把class文件直接赋值到tomcat下,再编写.xml文件,
2.在工具如myeclipse里写好后然后导出在tomcat下。
3.在开发工具里把项目与tomcat进行关联 。

  • init() 方法 
    在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。
  • service() 方法 
    service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
  • destroy() 方法 

    destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。

    当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。

  • 当用户第一次访问servlet的时候,容器会根据xml文件中的<url-patting>创建相应的对象,调用的构造方法肯定是无参的构造方法,可是此时如果我们需要向这个对象提供参数呢?所以java在创建对象即调用无参构造方法之后会自动调用init()方法,参数放在web.xml里。当用户请求请求一个HttpServlet 对象的时候,调用service()方法,判断是get还是post,如果是post则调用doPost()方法。对象创建一段时间后,调用destroy()方法销毁对象。


  • 当我们在实际开发的时候,经常改变的常量(比如密码)不能直接写在代码里,否则一旦修改就得修改源代码,可以把这些常量写在配置文件里,然后在我们的源代码读取即可,修改的时候只要修改配置文件就行了。

然后在web.xml配置文件里设置参数:

      <servlet><servlet-name>hello</servlet-name><servlet-class>myServlet.MyServlet</servlet-class><init-param><param-name>charset</param-name><param-value>UTF-8</param-value></init-param></servlet>

解析:  在<servlet></servlet>里配置的参数只能在一个servlet里使用,其他的servlet不能使用。

接着在servlet里获取参数:

public class MyServlet extends HttpServlet {private String charset="UTF-8";        //设置默认值/*** */private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,HttpServletResponse response){   this.doPost(request, response); }protected void doPost(HttpServletRequest request,HttpServletResponse response){response.setContentType("text/html;charset="+charset); PrintWriter out=null;try {out = response.getWriter();out.print("你好世界!!");} catch (IOException e) {e.printStackTrace();}finally{out.close();}}@Overridepublic void init(ServletConfig config) throws ServletException {String  tmp=config.getInitParameter("charset");      //获取web.xml中的参数charset并赋给tmpcharset=(tmp!=null)?tmp:charset;              //如果tmp值不是空的,就把tmp值赋给charset,如果是空的就把默认值charset赋给charset}
}

结果:

当我们把web.xml文件里的<param-value>ASCII</param-value>改成这样的时候,结果为:

可以看到我们的配置生效了,以后如果要更改编码只要在xml配置文件修改即可无须修改源代码。

  • 注:  response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。

  • 上例的charset参数只能在一个servlet里使用,而如果一个项目有几十个srevlet每个servlet都要使用到同一个参数,按照上例则需要每个servlet都配置一个参数,这样就太麻烦了,

所以我们可以配置一个“全局参数”,这个参数定义的时候不能放在<servlet></servlet>便签里,要单独定义标签,具体如下:

  设置配置文件:

  <context-param><param-name>charset</param-name><param-value>UTF-8</param-value></context-param><servlet><servlet-name>hello</servlet-name><servlet-class>myServlet.MyServlet</servlet-class>  </servlet>

读取参数:

public class MyServlet extends HttpServlet {private String charset="UTF-8";  //设置默认值/*** */private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,HttpServletResponse response){   this.doPost(request, response); }protected void doPost(HttpServletRequest request,HttpServletResponse response){response.setContentType("text/html;charset="+charset); PrintWriter out=null;try {out = response.getWriter();out.print("你好世界!!");} catch (IOException e) {e.printStackTrace();}finally{out.close();}}@Overridepublic void init(ServletConfig config) throws ServletException {//String    tmp=config.getInitParameter("charset");  //获取web.xml中的参数charset并赋给tmpString tmp=config.getServletContext().getInitParameter("charset");charset=(tmp!=null)?tmp:charset;  //如果tmp值不是空的,就把tmp值赋给charset,如果是空的就把默认值charset赋给charset}
}

结果:

转载于:https://www.cnblogs.com/shyroke/p/6480450.html

(二)第一个Servlet相关推荐

  1. 玩转Web之servlet(一)---怎样创建一个servlet

    Servlet概念:servlet就是用java编写的服务器端的小程序,用来完成下B/S架构(即浏览器和服务器架构)下客户端请求的响应处理. servlet通常在容器中运行Tomcat是常见的serv ...

  2. java从入门到精通二十三(Servlet)

    java从入门到精通二十三(Servlet) Servlet 说明 Servlet初步入门尝试 Servlet生命周期 Servlet方法说明和体系结构 方法说明 体系结构说明 一些优化封装 urlP ...

  3. Idea2020创建一个Servlet

    前言:在创建一个web项目的基础上,创建一个Servlet.Servlet可以用来接收页面的请求并可以做出响应Idea2020 创建web项目_txj的博客-CSDN博客目录一.创建一个空项目二.创建 ...

  4. 创建一个Servlet项目流程(入门)

    版本 IDEA 2020.2 JDK1.8 apache-tomcat-9.0.36 项目流程 一.IDEA中新建JaveEE项目 项目起名,选择项目存放地址,点击finish创建成功 进入项目后,右 ...

  5. idea 如何新建一个Maven项目并且写第一个servlet

    使用idea已经有段时间了,但是一直没有自己亲自新建一个项目,从头开始写一个Servlet,今天就来学习一下,并且记一个笔记. 一. 1.首先,打开idea new-->Project 2.选择 ...

  6. 一个Servlet同一时刻只有一个实例。 当多个请求发送到同一个Servlet,服务器会为每个请求创建一个新线程来处理。

    Servlet是一种独立于操作系统平台和网络传输协议的服务器端的Java应用程序.  相同点:  1. 不是独立的应用程序,没有main()方法.  2. 不是由用户调用,由另一个应用程序(容器)调用 ...

  7. java servlet 周期_java servlet生命周期详解,一个servlet生命周期包括哪些?

    小伙伴们知道servlet吗?这次我们要说的是java中的servlet,小伙伴们知道servlet的声明周期都包括哪些吗?下面就听小编介绍介绍吧. Servlet生命周期包含哪些? 我们要了解,一个 ...

  8. Servlet入门总结及第一个Servlet程序

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 S ...

  9. J2EE总结(二)——与servlet从相识到相知

    话说这J2EE视频看的本身每天活蹦乱跳的我是天天都像得了重病似的,怎么也犯不过劲儿来.里面接触了大量关于Java的专业词汇,如JNDI,ANT,servlet,Java Bean等等.让人一时难以消化 ...

  10. 【JavaEE】 IntelliJ IDEA 2022.2最新版Tomcat导入依赖详细教程全解及创建第一个Servlet程序

    目录 一.软件资源 二.放置settings.xml文件 三.创建项目 四.引入依赖 ​五.创建目录 六.编写代码 写在前面:☞What is Servlet? Servlet其实是一种实现动态页面的 ...

最新文章

  1. Python Qt GUI设计:QSlider滑动条类(基础篇—16)
  2. java希尔排序的实例,Java 插入排序之希尔排序的实例
  3. 计算机二级c语言考试真题及答案详解,2021全国计算机二级C语言程序设计历年真题及答案节选...
  4. UVC系列3-研究UVC控制协议
  5. python调用so文件
  6. 原生android系统换主题字体,Android 自定义字体,更换系统默认显示的字体使用自定义字体...
  7. vim插件配置安装与分享
  8. java 定义二维数组_java定义二维数组的几种写法(小结)
  9. 计算机专业师范类毕业论文,师范生毕业论文范文
  10. Delphi的常用函数
  11. 北航数理统计大作业_2019复旦大学大数据学院统计学硕总分411考研初试经验
  12. 【转】在win10接双显示器(扩展模式)怎么把鼠标游标切换到第二台显示器上?
  13. python-科研绘图系列(3)-雷达图
  14. 火车站信息服务系统之LED大屏显示
  15. Developing Large Web Applications
  16. iapp退出软件按钮代码_昆仑通态软件应用(23):酒店触摸屏点菜系统的设计(案例)...
  17. redis持久化详解
  18. HackTools————3、简易Web端口扫描
  19. 如何删除CSDN自己上传的资源(2021年12月29亲测有效)
  20. Blender RizomUV to Zbrush 头部低模高模映射

热门文章

  1. 第九讲 自定义函数参数预定义
  2. Guava库学习:学习Concurrency(二)Monitor_2
  3. IBM AIX5.3 linux下C/C++实现HTTPS接口
  4. PhpED和Zend Studio for Eclipse的Debugger配置
  5. L3-015 球队“食物链” (30 分)
  6. Binary String Constructing(CodeForces - 1003B)
  7. two pointers(双指针思想)
  8. ? extends T 与 ? super T
  9. html中图片路径的几种使用方式
  10. HUSTOJ(2019)在线判题系统的搭建