前言:通过编写一个servlet类,向浏览器发送hello world来阐述servlet。


一:创建动态web项目

  1. 首先切换到javaEE视图。

  在ecplise左边即项目管理器哪里右键点击新建一个 Dynaimc Web  Project,输入项目名(eg:StudyServlet),Dynaimc  web module version 选择

2.5版本【2.5使用xml文件配置servlet】,点击完成。

  在src下新建一个servlet,类名HelloWorld。

  

  

  2.打开servers(Window --> Show View --> Servers),右键单击tomcat服务器,选择 Add and Remove,把新建的web项目部署到

服务器上。运行服务器。运行完成后打开浏览器。

  

  显示Hello world!代表一个简单的servlet编写成功。

二:servlet

  1.什么是servlet

    servlet本身就是一种Java类,这种Java类提供了web形式的方法(JavaEE规范中),只要实现了servlet接口的类,都是一种servlet资源。

  2.如何创建servlet

    servlet有三种创建方法:

      实现servlet接口

      继承GenericServlet

      继承HttpServlet

    HttpServlet-继承-->GnericServlet-实现-->Servlet

    第一种方式:实现servlet接口

       public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; /*主要实现该方法,当浏览器访问一个servlet    时,该方法被tomcat服务器调用*/

    

    第二种方式:继承GenericServlet

    

  service方法:

    我们可看出来,service还是抽象方法,并没有被重写,如果以这种方式创建servlet我们需要自己写service方法。

  init方法:

    有个带参数的init方法,该方法在启动tomcat服务器时会被调用【执行一些初始化工作】。

    

    @Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}

    该方法就两句代码,将config成员变量初始化,然后调用init()方法。去看无参的init方法发现是空实现。

  可以想想一下why?该方法会在tomcat服务器启动时执行一些初始化工作【带参数的init】,如果粗心的程序猿直接重写带参的init方法却忘记了

  将config成员变量初始化,而使用了声明却未定义的变量可能会造成意料不到的结果。所以,如果你要执行一些初始化工作,实现无参的init方法。

  

  第三种方式:继承HTTPServlet抽象类

    这种方法使我们最常用的也是最好用的。

    

    仔细看可以发现HTTPServlet并没有抽象方法,却是抽象类,why?

    回想一下抽象类和接口。当写了一个类,方法也全部实现,但是却不想别人直接使用它,可以把它声明为抽象类,让想使用

  他的人通过继承来使用。

    

    service源码:

    

    @Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException { HttpServletRequest request;
HttpServletResponse response; try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}

  声明了两个HTTPServletRequest和response变量,将servletRequest和response对象强转。然后调用另一个service方法

  

protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
} catch (IllegalArgumentException iae) {
// Invalid date header - proceed as if none was set
ifModifiedSince = -1;
}
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
} } else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp); } else if (method.equals(METHOD_POST)) {
doPost(req, resp); } else if (method.equals(METHOD_PUT)) {
doPut(req, resp); } else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp); } else {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
// String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}

  该方法就判断了浏览器的提交方式然后调用相应方法。一般我们使用doGet和doPost方法【实际上我们只重写了doGet方法】。

三:servlet配置

  当我们写了一个servlet,如何让他与一般的java类不同,tomcat服务器如何识别他?这就需要配置文件【配置文件会在tomcat服务器启动时被解析,只要按它的约束,就能正常解析】。

当然,直接创建servlet,ecplise会帮我们配置好。

 <servlet>
    <description></description>
    <display-name>HelloWorld</display-name>

    <!-- servlet的名字 -->
      <servlet-name>HelloWorld</servlet-name>

    <!-- servlet的限定名,包名+类名 -->
      <servlet-class>com.briup.servlet.HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>

    <!-- servlet的名字,和上同 -->
      <servlet-name>HelloWorld</servlet-name>

   <!-- url匹配 http://IP:Port/项目名 /HelloWorld  就可以访问该servlet -->
      <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>

四:servlet的生命周期

  servlet默认是单例,在web运行期间一个servlet类只会创建一个对象。

  servlet的生命周期可以用3个方法体现init、service、destory

            init(ServletConfig config)

  servlet初始化。调用时间取决于<load-on-startup>标签。
        <load-on-startup>标签表示当前这个servlet需要在启动tomcat服务器期间就被创建出来
        <load-on-startup>标签里面需要放一个正整数,数值的大小可以决定servlet对象被创建的先后顺序,【数值越小就越先被创建】。
        (如果有多个servlet对象需要在tomcat启动期间被创建的话)
    注意:如果值一样,也是可以创建成功的,有内部顺序,并非依次创建。

            service(ServletRequest req,ServletResponse res)

  tomcat服务器会执行该方法处理浏览器的请求。

            destory()

  当servlet需要销毁时调用servlet中的该方法。

  销毁时间:

    1.tomcat服务器【正常】关闭

    2.tomcat重新加载项目的时候

  

    

总结:

  通过创建一个动态的web程序向浏览器发送Hello World阐述了servlet,如何创建,如何配置,生命周期,简要的介绍了一下servlet接口,GenericSerlvet、HTTPServlet类。

接下来就要详细介绍一些方法,以及如何使用servlet做一些东西。

  

  

java web(二): servlet的简单使用和介绍的更多相关文章

  1. Java Web(二) Servlet详解

    什么是Servlet? Servlet是运行在Web服务器中的Java程序.Servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户端的请求.Java Web应用程序中所有的请求-响应 ...

  2. Java Web(二) Servlet中response、request乱码问题解决

    三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, M ...

  3. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  4. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  5. 使用Intellij idea新建Java Web项目(servlet) 原理及初步使用

    准备 JDK       (配置JDK_HOME\bin   和 CLASSPATH)   注:JDK8下载已经需要注册了,请使用JDK11(现在是官方长期支持的版本)     对于我们新手来说,JD ...

  6. java web中servlet、jsp、html 互相访问的路径问题

    java web中servlet.jsp.html 互相访问的路径问题 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可 ...

  7. java web 二维码生成

    pom支持: <!-- 二维码支持包 start--> <dependency> <groupId>com.google.zxing</groupId> ...

  8. Java Web之Servlet

    Servlet参考文献: 1.http://www.cnblogs.com/luoxn28/p/5460073.html 2.http://www.cnblogs.com/xdp-gacl/p/376 ...

  9. Java Web(一) Servlet详解!!

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

随机推荐

  1. 本周HTML5的知识点

    html5一般用<meta>标签描述网页的摘要信息.标题标签一共有6个,标题字体加粗<h1>最大,<h6>最小. <p>标签标示内容都在一行显示,结束后 ...

  2. 第一次作业_ChenHong1998

    我的目标 学习到软件工程的实践过程 回想一下你初入大学时对软件工程专业的畅想 当初你是如何做出选择软件工程专业的决定的? 计算机是热门专业,软件工程专业好找工作 你认为过去两年中接触到的课程是否符合你 ...

  3. Vue语法学习第四课(2)——class与style的绑定

    之前学到的指令 v-bind 在用于绑定class和style时,表达式结果可以是字符串.数组.对象. 一.绑定HTMLClass ① 对象语法 <div class="static& ...

  4. 马凯军201771010116《面向对象与程序设计Java》第十六周知识学习总结

    一:理论知识部分 1.线程的概念: 程序是一段静态的代码,它是应用程序执行的蓝 本. ‐进程是程序的一次动态执行,它对应了从代码加 载.执行至执行完毕的一个完整过程. 多线程是进程执行过程中产生的多条 ...

  5. Springboot添加定时任务

    请参考这篇文章:https://blog.csdn.net/ysp_0607/article/details/71430281

  6. Labview笔记-创建自定义控件

    labview中的控件种类很多,但是样式或者外观有时不能满足我们的需求.如何制作一个好看酷酷的自定义控件呢? 以开关为例,我们先添加一个labview中自带的确定开关控件 之后右键该控件--高级--自 ...

  7. dos3章

    FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法! 先把FOR的变量全部列出来: ~I          - 删除任何引号("),扩展 %I     %~f ...

  8. Arm11-mini6410入坑

    Mini6410 学习Stm32的时候原子哥的资料真全啊,而且原子哥在他论坛也解答问题.然而现在学习ARM买了一套友善之臂的开发板,官方的资料只能刚好入门而已,其实入门都算不上.看了一下,网上的资料很 ...

  9. 'touch' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    touch是Linux环境下的命令,当我们在cmd中使用时会弹出以下问题 在cmd中我们可以使用echo test> 然后我们用dir命令来查看一下当前文件夹下文件有没有创建 文件成功创建.

  10. 剑指Offer 61. 序列化二叉树 (二叉树)

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 题目地址 https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84 ...