Javaweb学习之Servlet

Servlet

Servlet 简介

Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
Servlet可完成如下功能:
创建并返回基于客户请求的动态HTML页面。
与其它服务器资源(如数据库或基于Java的应用程序)进行通信。


image.png

Servlet本质上就是一个运行在Servlet容器中的Java类,现在充当Servlet容器的就是我们刚刚安装的Tomcat

第一个Servlet——HelloWorld

image.png

image.png

1.创建一个Java类实现Servlet接口,并实现其中所有的方法;

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by wth on 2019/2/10.
 */
@WebServlet(name = "HelloServlet")
public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 System.out.println("HelloServlet");
    }
}

@WebServlet(name = "HelloServlet")
表示的是为helloServlet映射一个访问路径/hello,我们在浏览器上输入http://localhost:8080/hello,代码执行程序流会进入到HelloServlet 的doGet方法。

3.运行Tomcat,在浏览器中输入http://localhost:8080/hello,可以发现控制台输出了一些内容,首先是构造器,然后是init,再然后是service,然后每次刷新,每次都只出现了service,然后关闭服务,发现出现destory。

如果出现错误查看一下tomcat


image.png

image.png

image.png

image.png

Servlet的生命周期

package servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by ttc on 2018/3/6.
 */
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("service");
        HttpServletRequest request = (HttpServletRequest)req;
        System.out.println(request.getMethod());
        super.service(req, res);
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("init");
        super.init();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");
    }
}

①服务器加载Servlet
②创建Servlet实例
--只有第一次请求Servlet时,创建Servlet实例,调用构造器
③初始化init()
--只被调用一次,在创建好实例后立即被调用,用于初始化当前Servlet
④service()处理用户请求
--可以被多次调用,每次请求都会调用service方法,实际用于响应请求的,根据用户请求的类型(get或者post),调用doGet或者doPost方法。
⑤destory()销毁
--只被调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet所占用的资源

load-on-startup

可以指定Servlet被创建的时机

package servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by ttc on 2018/3/6.
 */
@WebServlet(value = "/hello",loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("service");
        HttpServletRequest request = (HttpServletRequest)req;
        System.out.println(request.getMethod());
        super.service(req, res);
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("init");
        super.init();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");
    }
}

在加载完Servlet后直接就创建了Servlet实例,并进行了初始化,在此期间我们并没有提出请求。
如果配置了多个Servlet, load-on-startup的值越小越先启动(包括0,负数不会被启动,还是需要发出请求才创建实例并初始化);


Servlet映射细节

在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定的格式:
一种格式是“* .扩展名”

@WebServlet(value = "*.do")
public class HelloServlet extends HttpServlet
 {
}

另一种格式是以正斜杠(/)开头并以“/ * ”结尾。

@WebServlet(value = "/*")
public class HelloServlet extends HttpServlet
 {
}

注意:既带 / 又带 * 的,又带扩展名的,是不合法的(例如:/.do)。*

HTTP简介

WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。
HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。

HTTP 的会话方式

四个步骤:

![### load-on-startup

可以指定Servlet被创建的时机

package servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by ttc on 2018/3/6.
 */
@WebServlet(value = "/hello",loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("service");
        HttpServletRequest request = (HttpServletRequest)req;
        System.out.println(request.getMethod());
        super.service(req, res);
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
        super.destroy();
    }

    @Override
    public void init() throws ServletException {
        System.out.println("init");
        super.init();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet");
    }
}

在加载完Servlet后直接就创建了Servlet实例,并进行了初始化,在此期间我们并没有提出请求。
如果配置了多个Servlet, load-on-startup的值越小越先启动(包括0,负数不会被启动,还是需要发出请求才创建实例并初始化);


Servlet映射细节

在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定的格式:
一种格式是“* .扩展名”

@WebServlet(value = "*.do")
public class HelloServlet extends HttpServlet
 {
}

另一种格式是以正斜杠(/)开头并以“/ * ”结尾。

@WebServlet(value = "/*")
public class HelloServlet extends HttpServlet
 {
}

注意:既带 / 又带 * 的,又带扩展名的,是不合法的(例如:/.do)。*

HTTP简介

WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是HTTP协议。
HTTP是 hypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式。

HTTP 的会话方式

四个步骤:

image

浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。

image

HTTP请求消息(了解即可)

请求消息的结构:
一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

image

HTTP响应消息(了解即可)

响应消息的结构:
一个状态行、若干消息头、以及实体内容 ,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

image

这里举个小实例:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form action="/loginServlet" method="post">
        user:<input type="text" name="user">
        password:<input type="password" name="password">
        <input  type="submit" value="Submit">
    </form>

</body>
</html>

运行服务器,在浏览器中打开这个网页,开发者工具,提交表单,提示404(申请资源不存在),在chrome network中查看请求及响应消息。

POST和GET请求

post请求方式我们可以看到请求参数在请求体里面
将请求方式改为get后再运行观察

<form action="/loginServlet" method="get">
        user:<input type="text" name="user">
        password:<input type="password" name="password">
        <input  type="submit" value="Submit">
</form>

可以观察到地址栏是这样的:http://localhost:8080/loginServlet?user=123&password=123
get请求把请求参数附着在url后面,中间以"?”分割。

使用GET方式传递参数

①在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。
②如果网页中的<form>表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。
③使用GET请求方式给WEB服务器传递参数的格式:
http://www.neusoft.net/counter.jsp?name=yzn&password=123
④使用GET方式传送的数据量一般限制在1KB以下。

使用POST方式传递参数

①POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。
②POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。
3.如果网页中的<form>表单元素的method属性被设置为了“POST”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为POST。


如何在Servlet中获取信息

这里我们可以新建一个Servlet。

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post");
    }

}

其中,方法的参数HttpServletRequest requestHttpServletResponse response封装了请求和响应信息

一.如何获取请求信息

HttpServletRequest常用的方法:
String getParameter(String name)
--根据请求参数的名字,返回参数值,特别常用

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String user = request.getParameter("user");
        String password = request.getParameter("password");
        System.out.println(user+"   "+password);
}

image

String[] getParameterValues(String name)
--根据请求参数的名字,返回请求参数对应的字符串数组(例如:一组复选框-->名字是一样的)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String intrests[] = request.getParameterValues("hobby");
        for(String str:intrests) {
            System.out.println(str);
        }
}

获取请求的URI
获取请求方式

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String method = request.getMethod();
        System.out.println(method);

        String servletPath = request.getServletPath();
        System.out.println(servletPath);
}

解决请求中的中文乱码问题:

request.setCharacterEncoding("utf-8");

二.如何返回响应信息

HttpServletResponse常用的方法:
①getWriter()方法
--返回PrintWriter对象,调用这个对象的println()方法可以将信息直接打印在客户的浏览器上

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

        PrintWriter out = response.getWriter();
        out.println("hello...");

}

解决回应中的中文乱码问题

//1.设置response的编码为utf-8
response.setCharacterEncoding("utf-8");
//2.通知浏览器,以UTF-8的编码打开
response.setContentType("text/html;charset=UTF-8");

浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接。
浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应对。

image

HTTP请求消息(了解即可)

请求消息的结构:
一个请求行、若干消息头、以及实体内容,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

image

HTTP响应消息(了解即可)

响应消息的结构:
一个状态行、若干消息头、以及实体内容 ,其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开。

image

这里举个小实例:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form action="/loginServlet" method="post">
        user:<input type="text" name="user">
        password:<input type="password" name="password">
        <input  type="submit" value="Submit">
    </form>

</body>
</html>

运行服务器,在浏览器中打开这个网页,开发者工具,提交表单,提示404(申请资源不存在),在chrome network中查看请求及响应消息。

POST和GET请求

post请求方式我们可以看到请求参数在请求体里面
将请求方式改为get后再运行观察

<form action="/loginServlet" method="get">
        user:<input type="text" name="user">
        password:<input type="password" name="password">
        <input  type="submit" value="Submit">
</form>

可以观察到地址栏是这样的:http://localhost:8080/loginServlet?user=123&password=123
get请求把请求参数附着在url后面,中间以"?”分割。

使用GET方式传递参数

①在浏览器地址栏中输入某个URL地址或单击网页上的一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET。
②如果网页中的<form>表单元素的method属性被设置为了“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。
③使用GET请求方式给WEB服务器传递参数的格式:
http://www.neusoft.net/counter.jsp?name=yzn&password=123
④使用GET方式传送的数据量一般限制在1KB以下。

使用POST方式传递参数

①POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据。
②POST方式将各个表单字段元素及其数据作为HTTP消息的实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。
3.如果网页中的<form>表单元素的method属性被设置为了“POST”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为POST。


如何在Servlet中获取信息

这里我们可以新建一个Servlet。

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post");
    }

}

其中,方法的参数HttpServletRequest requestHttpServletResponse response封装了请求和响应信息

一.如何获取请求信息

HttpServletRequest常用的方法:
String getParameter(String name)
--根据请求参数的名字,返回参数值,特别常用

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String user = request.getParameter("user");
        String password = request.getParameter("password");
        System.out.println(user+"   "+password);
}

image

String[] getParameterValues(String name)
--根据请求参数的名字,返回请求参数对应的字符串数组(例如:一组复选框-->名字是一样的)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String intrests[] = request.getParameterValues("hobby");
        for(String str:intrests) {
            System.out.println(str);
        }
}

获取请求的URI
获取请求方式

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String method = request.getMethod();
        System.out.println(method);

        String servletPath = request.getServletPath();
        System.out.println(servletPath);
}

解决请求中的中文乱码问题:

request.setCharacterEncoding("utf-8");

二.如何返回响应信息

HttpServletResponse常用的方法:
①getWriter()方法
--返回PrintWriter对象,调用这个对象的println()方法可以将信息直接打印在客户的浏览器上

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  

        PrintWriter out = response.getWriter();
        out.println("hello...");

}

解决回应中的中文乱码问题

//1.设置response的编码为utf-8
response.setCharacterEncoding("utf-8");
//2.通知浏览器,以UTF-8的编码打开
response.setContentType("text/html;charset=UTF-8");

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

推荐阅读更多精彩内容

  • 配置完Tomcat后就正式步入了后端JavaWeb的学习,学习servlet是JavaWeb的第一步,那下面就开始...
    lhdoeo阅读 421评论 0 1
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,401评论 0 10
  • Servlet:Sun公司制订的一种用来扩展Web服务器功能的组件规范。当浏览器将请求发送给Web服务器(比如:a...
    南山伐木阅读 583评论 0 4
  • Web应用被应用开发者创建,这些开发者给予、卖应用,或者为了安装到一个运行时环境,把应用转移应用到一个部署者。应用...
    Lucky_Micky阅读 2,531评论 0 1
  • 连着三个晚上在老妈家陪老妈睡觉,我感觉很不好,每天早上眩晕,还有点恶心,眼睛睁开会忽然感觉面前都是黑色的。我想这会...
    xianma123456阅读 567评论 3 14