Servlet基础


title: "Servlet"
date: 2019-08-17T11:01:12+08:00


本章内容为:《Servlet基础》

作者:nuoccc

这篇文章 主要是了解Servlet的一些基础。

Servlet(Server Applet)是Java] Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,

具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

而Servlet/JSP是SUN公司定义的一套动态网页开发的技术。

所以我们首先来了解一下什么是JSP。

1.JSP

1.1 JSP简介

JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。

JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。

Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。

1.2 JSP基础运用

这里主要其实还是把JSP当做一个网页来使用,所以就不深入,就基础运用就行。

我使用的是IDEA,所以可能跟Eclipse的创建JSP方式不同,这里讲IDEA创建JSP方式。

1.File->New->Project

Servlet1.png

2.Java->Web application->Next

Servlet2.png

3.ProjectName->Finish

Servlet3.png

4.Projetc->web->New->JSP/JSPX


Servlet4.png

这样一个JSP文件就创建完成,然后我们来运用一下,JSP就其实跟HTML文件很类似,然后能以( <%, %>形式

实现JAVA代码,我们就编写一个最基础的JAVA的九九乘法表,看下运行效果

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <%
        //运行JAVA的标签
        for(int i=1;i<=9;i++){
            for(int j=1;j<=i;j++){
                out.print(i+"*"+j+"="+i*j+"&nbsp&nbsp");
                //要打印在网页上,就不再是Syetem.out.print而是out.print
            }
            out.print("<br>");
        }
    %>

</body>
</html>

然后要注意一点,如果编译器代码报错,显示红色,只要确认你代码没问题就别管,有时候编译器会识别错误

然后我们加入Tomcat,在左上角,如下图,然后点击Add Config...

Servlet5.png

进入到下面这个页面,点左上的+,然后找到Tomcat Server 然后点击 Local

Servlet6.png

Servlet7.png

然后进到下面这个页面先不管Server的内容,点击Deployment,然后点击左边的“+”,然后点击第一个,加入完成后点击OK就配置好了

Servlet8.png

然后点击右上面的那个三角形启动图标,就会自动弹出一个页面,然后在网址后面跟上你的文件名,就能看到你的页面了。

Servlet9.png

然后jsp的运用我们就先讲到这里,这不是这篇文章的关键,然后我们来了解下Servlet。

2.Servlet

2.1创建一个Servelt

我们前面知道一般的web项目都是通过Servelt加JSP来实现的,所以我们创建的项目一定就要既能创建JAVA文件又能创建JSP文件,在IDEA中可以快速创建这样的文件。


Servlet10.png

1.File->New->Project

2.Java Enterprise->Web Application->Next

这种创建方式会直接导入Tomcat

然后我们创建第一个Servlet

public class HelloServlet implements Servlet {
    //HelloServlet是我们创建的类必须要继承或者实现Servlet接口之后,我们的类才是一个真正意义上的"Servelt"。
    
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

Servlet接口自带五个方法,我们来仔细看下这五个方法的意义

void init(ServletConfig var1) throws ServletException;

我们先来看第一个方法,init是initialization的缩写,这个是一个初始化函数,初始化一个Servlet配置对象

我们在来看下ServletConfig这个类定义了什么

public interface ServletConfig {
    String getServletName();
    //定义了一个获得我们Servlet名字的方法

    ServletContext getServletContext();
    //获得我们Servlet环境的方法

    String getInitParameter(String var1);
    //获得初始化参数

    Enumeration<String> getInitParameterNames();
    //获得初始化参数的集合
}

所以ServletConfig这个类的对象获得了就是一些配置信息,然后调用init方法来初始化,此方法是系统自动调用!

public ServletConfig getServletConfig() ;

第二个方法,获得一个ServletConfig对象,就是获取Servlet的配置信息,也是系统自动调用!

void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

第三个方法,定义了一个服务方法,传递了两个参数

第一个是一个ServletRequest对象,然后我们去原码看看这个服务请求对象定义了什么,

Servlet11.png

我们看到全是一些set,get方法用来设置或者获取某个值,但是太多了就不一一讲,我们就看几个经常用到的函数。

void setCharacterEncoding(String var1) throws UnsupportedEncodingException;
这个是我们经常使用的一个方法,传入一个字符集参数,设置字符集,主要是防止数据传递时乱码。

String getParameter(String var1);
这个方法用来获得一个参数,这个方法还有几个兄弟方法

Enumeration<String> getParameterNames();
String[] getParameterValues(String var1);
Map<String, String[]> getParameterMap();

都是获得参数的方法,只不过返回值不一样

Object getAttribute(String var1);
void setAttribute(String var1, Object var2);
这两个方法是成对存在的一半,第一个是获得一个对象的属性,第二个是设置一个对象的属性

ServletRequest对象常用的方法,就这些,接下来我们来看看ServletResponse对象的方法
同样的ServletResponse服务器响应类也是一些set和get方法,我们也了解最常用的方法:

void setContentType(String var1);
这个方法是跟请求的时候设置字符集类似的,这个是设置内容格式的一个方法,也是我们常用的方法。

PrintWriter getWriter() throws IOException
这个方法是获得文件打印流的方法,PrintWriter继承Writer,所以拥有write()方法,可以输出内容。
ServletResponse常用的就这两个方法,然后我们继续看Servlet接口的方法。

String getServletInfo();

第四个方法,获得SevletInfo就是获得Sevlet的信息,也是系统自动调用!

void destroy();

第五个方法,销毁Servlet对象,也是系统调用!

所以Servlet接口定义的五个接口,有四个都是系统自动调用的,只有service()方法是需要我们自己调用的,所以service()就是我们在Servlet中最重要的一个方法。

我们知道JSP其实是简化的Servlet,所以学完上述方法后,我们也能用Servlet写一个页面

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        
        servletResponse.setContentType("text/html;charset=utf-8");
        //设置内容格式为html,字符集为utf-8
        servletResponse.getWriter().write("<html>");
        servletResponse.getWriter().write("<head>");
        servletResponse.getWriter().write("<meta charset=\"UTF-8\">");
        servletResponse.getWriter().write("<title>this is title</title>");
        servletResponse.getWriter().write("</head>");
        servletResponse.getWriter().write("<body>");
        servletResponse.getWriter().write("<h1>第一个Servlet</h1>");
        servletResponse.getWriter().write("</body>");
        servletResponse.getWriter().write("</html>");
        //输出内容,这里我们直接输出一个html页面
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

但是只有代码还是无法输出在浏览器上,因为根本不知道你是哪一个页面,所以我们还需要去配置xml告诉浏览器我这个代码服务在哪个页面上,找到web->WEB-INF下面的web.xml我们对这个文件进行配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    
    <servlet>
        <!--配置Servlet-->
        <servlet-name>HelloServlet</servlet-name>
        <!--Servlet的名字,一般默认我们写类名-->
        <servlet-class>com.testServlet.HelloServlet</servlet-class>
        <!--我们Servlet的所在的位置-->
    </servlet>
    <servlet-mapping>
        <!--Servlet的映射,告诉浏览器我的这个代码对应的哪一个页面-->
        <servlet-name>HelloServlet</servlet-name>
        <!--Servlet的名字跟前面对应-->
        <url-pattern>/helloservlet</url-pattern>
        <!--Servlet的访问地址-->
    </servlet-mapping>
</web-app>

配置完后,再运行Tomcat,在输入我们的地址,就能访问我们的第一个Servlet了。

3.Servlet的生命周期

我们再来思考一个问题,我们整个过程其实是B/S通信过程,那浏览器的操作其实是传给我们的服务器的,

但如果多台计算机打开我们同一个页面,怎么保证每个人看见的是同一个页面,也就是要保证数据是同样的;

不可能说比如我看股票网站,不可能我两个人看同一支股的数据再不同页面看到的数据不一样,这样会乱套的。

所有我们就必须要保证所有浏览器访问的是同一个Servlet对象,所以我们一个Servlet只能存在一个对象。
也就是说Servlet对象是单例创造的!
这样就保证所有浏览器看到的是同一个实时的页面,但是B/S结构,是浏览器跟服务器的通信,跟我们Servlet并没有实际的关系,还记得我在前面说的Servlet的方法是由系统自动调用吗?
其实这里的"系统"不是指我们虚拟机而是指的我们的服务器,还有种说法叫做"容器",这里我们使用的Tomcat,所以是Tomcat创建的我们Servlet对象。
Tomcat并不是我们自己定义的,它只有通过反射的原理,来获取我们的Servlet并给它创建对象。
所以Servlet对象是由容器反射创建的!

然后我们来说一下Servlet的整个生命周期是怎样的:

1.容器(也就是服务器)启动,这样别人才能开始访问你的网页,当有第一次请求时,就创建Servlet对象

只创建一次,因为Servlet对象是单例的。

2.创建了对象,就会调用初始化函数init(),同样的init()只执行一次,只有创建对象时才调用

3.容器要解析浏览器发送的HTTP请求到底是干啥的,解析完之后根据不同的操作,去调用service()方法

每次请求都会去调用service()方法,然后把得到的响应信息,再响应给浏览器。

4.当容器关闭时,不是浏览器关闭!最后调用Dstory()方法,销毁Servlet对象,Servlet也就生命结束了。

到此,这篇文章到此结束,如果对Servlet还有兴趣,可以看下一篇文章对Servlet进行的一些优化。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 转自陈明乾的博客,可能有一定更新。 转原文声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、...
    C86guli阅读 4,664评论 6 72
  • cs和bs架构 cs是客户端服务器模式;bs是浏览器服务器模式。它们最主要的区别是cs架构的应用程序需要在用户的计...
    孙浩j阅读 766评论 0 1
  • 现在学习Servlet,我的主要目的是做整体了解,作为学习SSM的热身,所以本篇的目的是以一篇文章实现对servl...
    kindol阅读 375评论 0 1
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,396评论 0 10
  • 文/诗文 这年月,活出自己确实需要勇气。 张小北租住的小区几个月前新搬进一户人家。女主人四十有余,是位全职主妇,常...
    王诗文circle阅读 975评论 6 23