三万字速通Servlet

ServletContext类的四个作用

1、获取web.xml中的配置的上下文参数,

易错点:

2、获取当前工程路径

3、获取部署后在服务器硬盘上的绝对路径

4、map一样存取数据

十一、什么是协议?

十二、请求的HTTP协议格式

GET请求

图示:

POST请求

十三、 常用请求头说明

十四、GET和POST请求的有哪些

GET请求:

POST请求:

十五、响应的HTTP协议格式

常见的响应吗说明

MIME类型说明

十六、 HttpServletRequest类

HttpServletRequest类的常用方法

方法演示:

运行之后:

十七、Servlet获取web表单中的参数

get请求:

post请求:

十八、请求的转发

请求转发的特点

十九、base标签

演示程序不能跳回来的情况

运行结果:

到位分析:

二十、Web中的相对路径和绝对路径

相对路径:

绝对路径:

二十一、web中/ 斜杆的不同意义

二十二、HttpServletResponse类

HttpServletResponse类的作用

两个输出流的说明

二十三、往客户端回传数据

中文乱码问题

第一种方式:

第二种方式:

第三种方式:

二十四、请求重定向

请求重定向的第一种方式

请求重定向的特点

请求重定向的第二种方法

二十五、使用注解配置Servlet

注解@WebServlet配置规则:


一、什么是Servlet

============

1、servlet是javaEE规范之一。规范就是接口

2、servlet就是javaweb三大组件之一。三大组件分别是:servlet程序、Filter过滤器、Listenter监听器。

3、servlet是运行在服务器上的一个java小程序,它可以接受客服端发送过来得请求**,并响应数据给客服端。**

手动实现Servlet程序


步骤:

1、编写一个类去实现Servlet接口

2、实现service方法,处理请求,并相应数据

3、到web.xml中配置Servlet程序的访问地址

创建一个servlet模块,和步骤之前tomcat类似

在src下创建一个类去实现Servlet接口,快捷键Alt+insert选择实现方法,回车即可

新建的这个类如是:

package com.servlet;

import javax.servlet.*;

import java.io.IOException;

public class HelloServlet implements Servlet {

@Override

public void init(ServletConfig servletConfig) throws ServletException {

}

@Override

public ServletConfig getServletConfig() {

return null;

}

/**

  • service方法是专门用来处理请求和响应的(只要执行这个类就会访问)

  • @param servletRequest

  • @param servletResponse

  • @throws ServletException

  • @throws IOException

*/

@Override

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

System.out.println(“hello servlet被访问了”);

}

@Override

public String getServletInfo() {

return null;

}

@Override

public void destroy() {

}

}

3.到web.xml配置,在web-app标签里写入如下

HelloServlet

com.servlet.HelloServlet

HelloServlet

/hello

4、我们在index.jsp下写入一些内容,然后启动

结果:

前面在Tomcat也说过了,只写到工程名,没有资源名默认访问index,index目录下的内容会呈现到浏览器上

我们前面给这个配置了路径为hello,我们在加上就会访问servlet程序

二、 常见的配置错误

==========

①起的路径名是随意起的,没有任何相关性,这虽然没有任何问题,但是不好分辨

②,路径没有以斜杆开头,如:

hello

这样会导致出错

所以一般起名字前得加/,正确写法:

hello

③、在名字不同

在idea还可以有提示,有些编辑器就不会给提示,运行之后

在servlet-mapping配置访问地址时,要和前面起的别名一致

④、标签的全类名写错、漏写

全类名是要写出实现Servlet接口那个类所在的位置,写错、少写都会报错,

圈起来的要一致

三、 Servlet-url如何定位到Servlet程序去访问

===============================

其中,一个端口号只能给一个工程,一个工程可以占用多个端口号,(工程就是文件夹,资源就是文件夹里的目录)

四、Servlet生命周期

=============

之前的类

package com.servlet;

import javax.servlet.*;

import java.io.IOException;

public class HelloServlet implements Servlet {

public HelloServlet() {

System.out.println(“1 构造器”);

}

@Override

public void init(ServletConfig servletConfig) throws ServletException {

System.out.println(“2 init初始化方法”);

}

@Override

public ServletConfig getServletConfig() {

return null;

}

/**

  • service方法是专门用来处理请求和响应的(只要执行这个类就会访问)

  • @param servletRequest

  • @param servletResponse

  • @throws ServletException

  • @throws IOException

*/

@Override

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

System.out.println(“3 Servlet==hello servlet被访问了”);

}

@Override

public String getServletInfo() {

return null;

}

@Override

public void destroy() {

System.out.println(“4 destroy销毁方法”);

}

}

当我们启动,访问http://localhost:8080/01_servlet/hello

一开始出现1 2 3,后面一直刷新就一直出现3,退出程序出现4

Servlet生命周期总结


1.执行setvlet构造器方法

2.执行init初始化方法

第一和第二步是在第一次访问的时候创建servlet程序会调用,

3.执行servlet方法

第三步,每次访问都会调用

4.执行destroy销毁方法

第四步,在web工程停止的时候调用

五、Servlet 请求的分发处理

=================

我们使用表单提交时,有get(非加密)和post(加密)两种提交方式

创建一个表单a.html

Title

在实现的Servlet接口的类,中的重写的service方法中

@Override

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

System.out.println(“3 Servlet==hello servlet被访问了”);

//类型转化,因为HttpServletRequest有getMethod方法

HttpServletRequest httpServletRequest= (HttpServletRequest) servletRequest;

//getMethod识别当前提交方式是get还是post,分别返回"GET"和"POST"

String method=httpServletRequest.getMethod();

if(“GET”.equals(method)){

//为了防冗余和更好的维护,定义方法

// System.out.println(“get请求”);

doGet();

}else if (“POST”.equals(method)){

// System.out.println(“post请求”);

doPost();

}

}

public void doGet(){

System.out.println(“get请求”);

}

public void doPost(){

System.out.println(“post请求”);

}

启动服务器,后如图所示

运行在浏览器后,每次提交都会访问service方法,并打印出对应的method

六、通过继承HttpServlet实现Servlet程序

=============================

实际开发中,一般使用继承HttpServlet类的方法去实现Servlet程序。

步骤:

1、编写一个类去继承HttpServlet类

2、根据业务需要重写doGet或doPost方法

3、到web.xml中配置Servlet程序

1、编写一个类,Alt+insert快捷键重写里一些需要的方法

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class HelloServlet2 extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// super.doGet(req, resp);

System.out.println(“HelloServlet2的 get请求”);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// super.doPost(req, resp);

System.out.println(“HelloServlet2的 post请求”);

}

}

到web.xml文件中配置访问路径

HelloServlet2

com.servlet.HelloServlet2

HelloServlet2

/hello2

将表单中的访问地址hello改变为hello2

运行提交后:

七、使用idea创建Servlet程序

====================

选择要实现的包→Servlet程序

配置信息

勾选上用的就是3.0的注解配置

只需要在web.xml中加上路径即可(其他的已经自动生成了)

HelloServlet2

com.servlet.HelloServlet3

HelloServlet3

/hello3

八、Servlet的继承体系

==============

doGet和dopost源码


protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String msg = lStrings.getString(“http.method_get_not_supported”);

this.sendMethodNotAllowed(req, resp, msg);

}

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String msg = lStrings.getString(“http.method_post_not_supported”);

this.sendMethodNotAllowed(req, resp, msg);

}

servlet方法部分源码


protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

String method = req.getMethod();

long lastModified;

if (method.equals(“GET”)) {

lastModified = this.getLastModified(req);

if (lastModified == -1L) {

this.doGet(req, resp);

} else {

long ifModifiedSince;

try {

ifModifiedSince = req.getDateHeader(“If-Modified-Since”);

} catch (IllegalArgumentException var9) {

ifModifiedSince = -1L;

}

if (ifModifiedSince < lastModified / 1000L * 1000L) {

this.maybeSetLastModified(resp, lastModified);

this.doGet(req, resp);

} else {

resp.setStatus(304);

}

}

}

九、ServletConfig类

================

  • ServletConfig是Servlet程序的配置信息类。
  • Servlet程序和ServletConfig对象都是有Tomcat负责创建,我们负责使用。
  • Servlet程序默认是一次访问的时候创建,ServletConfig是每个Servlet程序创建时,就创建一个对应的ServletConfig对象

ServletConfig类的三大作用


1、可以获取Servlet程序的别名(servlet-name的值)

2、获取初始化参数init-param

3、获取ServletContent对象

所处位置init方法

**1、**获取servlet别名

public void init(ServletConfig servletConfig) throws ServletException {

System.out.println(“HelloServlet 的别名是”+servletConfig.getServletName());

}

**2、**获取初始化参数init-param,其他的前面写过了

现在web.xml文件中配

HelloServlet

com.servlet.HelloServlet

username

root

url

jdbc:mysql://localhost:3306/text

在实现Servlet接口的类中的init()下

// 2、获取初始化参数init-param

System.out.println(“初始化参数username的值是”+servletConfig.getInitParameter(“username”));

System.out.println(“初始化参数url的值是”+servletConfig.getInitParameter(“url”));

**3、**获取ServlertContent对象

// 3、获取ServletContent对象

System.out.println(“servletcontent对象是”+servletConfig.getServletContext());

以上运行结果:

每一个ServletConfig程序独立 ,在web.xml 中每个类中信息不共享,

重写init方法时得加上super.init(config),得访问父类的init初始化方法,否则报错

继承体系可以得知ServletConfig在GenericServlet类中,该类中的init定义:

public void init(ServletConfig config) throws ServletException {

this.config = config;

this.init();

}

所以如果重写init方法,必须加上super.init(config),否则父类的init方法不会执行(父类中中的保存操作执行不了)

十、ServletContext类

=================

什么是ServletContext?


1、ServletContent是一个接口,他表示Servlet上下文对象

2、一个web工程,只有一个ServletContext对象实例。

3、ServletContent对象是一个域对象。

4、在web工程启动后创建,在web工程结束后销毁

什么是域对象?


域对象,是可以像Map一样存取数据的对象,叫做域对象。

这里的域指的是存取数据的操作范围。

对照示意表:

存数据取数据删除数据
Mapput()get()remove()
域对象setAttribute()getAttribute()removeAttribute()

ServletContext类的四个作用


1、获取web.xml中的配置的上下文参数context-param

2、获取当前的工程路径你,格式:/工程路径

3、获取部署后在服务器硬盘上的绝对路径

4、像Map一样存取数据

用快捷方式创建一个类ContextServlet,在web.xml中配置路径(   其余的已经自动生成了)

ContextServlet

com.servlet.ContextServlet

ContextServlet

/contextServlet

1、获取web.xml中的配置的上下文参数,

首先得在web.xml中配置context-param(一般写在其他servlet之上)

username

context

password

root

在ContextServlet类中doGet()方法

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

//1、获取web.xml中的配置的上下文参数context-param

//获取对象

ServletContext context = getServletConfig().getServletContext();

String username = context.getInitParameter(“username”);

String password = context.getInitParameter(“password”);

System.out.println(“context-param参数username的值是”+username);

System.out.println(“context-param参数password的值是”+password);

}

}

运行之后结果是:

易错点:

①:在配置web.xml文件中地址中的/斜杆不要忘记,否则会报地址无效

/contextServlet

②:在类中获取参数是应在doGet()方法中书写,否则运行之后访问地址不会显示处对应的信息

2、获取当前工程路径

System.out.println(“当前工程路径:”+context.getContextPath());

3、获取部署后在服务器硬盘上的绝对路径

System.out.println(“获取工程部署的路径”+context.getRealPath(“/”));

这个斜杆/表示到当前工程的路径

4、map一样存取数据

创建一个Servlet类,在web.xml文件中配置好路径

ContextServlet1

com.servlet.ContextServlet1

ContextServlet1

/contextServlet1

在类中:

public class ContextServlet1 extends HttpServlet {

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

//获取ServletContext对象

ServletContext context = getServletContext();

System.out.println(“保存之前Context获取key1的值是:”+context.getAttribute(“key1”));

context.setAttribute(“key1”,“value1”);

System.out.println(“context获取数据key1的值为:”+context.getAttribute(“key1”));

}

}

我们直接可以用getServletContext()获取对象,这样简单些,而不用getServletConfig().getServletContext();

我们ctrl+b看源码可知:

public ServletContext getServletContext() {

return this.getServletConfig().getServletContext();

}

源代码已经做好了那步,所以我们直接返回即可。

我们继续定义一个类叫ContextServlet2

public class ContextServlet2 extends HttpServlet {

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

ServletContext context = getServletContext();

System.out.println(“ContextServlet2中 context获取数据key1的值为:”+context.getAttribute(“key1”));

}

}

部署就省略了,运行之后

不难发现当ContextServlet1中的有数据存入,ContextServlet2中就可以查到该数据。也可以context下的数据是共享数据

ContextServlet对象在web工程启动后创建,在web工程结束后销毁,且共享

重启和重新部署都会导致web工程销毁

ContextServlet1、2的地址也是一样的

十一、什么是协议?

=========

协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫做协议

而http协议就是说,客户端和服务器之间的通信时,发送的数据,需要遵守的规则,叫做HTTP协议

HTTP中的数据又叫报文

十二、请求的HTTP协议格式

==============

客服端给服务器发送的数据叫请求。

服务器给客服端回传数据叫响应。

请求又分为GET和POST请求两种

GET请求


1、请求行

(1)请求的方式                GET

(2)请求的资源路径[+?+请求参数]

(3)请求的协议的版本号      HTTP/1.1

2、请求头

key:value  组成          不同的键值对,表示不同的含义。

启动服务器:

图示:

POST请求


1、请求行

(1)请求的方式               POST

(2) 请求的资源路径[+?+请求参数]

(3) 请求的协议号                 HTTP/1.1

2、请求头

1)key:value         不同的请求头,有不同的含义

空行

3、请求体===>>是发送给服务器的数据

表单中主要内容:

图示:

十三、 常用请求头说明

===========

Accept:表示客服端可以接受的数据类型

Accpet-languege:表示客户端可以接受的语言类型

User-Agent:表示客户端浏览器的信息

Host:表示请求时的服务器ip和端口号

十四、GET和POST请求的有哪些

=================

GET请求:


1、form标签method=get

2、a标签

3、link标签引入css

4、Script标签引入js文件

5、img标签引入图片

6、ifram引入html页面

7、在浏览器地址栏中输入地址后回车

POST请求:


1、from标签method=post

十五、响应的HTTP协议格式

==============

1、响应行

(1)响应的协议和版本号

(2)响应的状态码1

(3)响应状态描述符

2、响应头

(1)key:value    不同的响应头,有他的不同的含义

空行

3、响应体——>>>就是回传给客户端的数据

常见的响应吗说明


200           表示请求成功

302           表示请求重定向

404           表示请求服务器已经收到了,但是你要的数据不存在(地址错误)

500           表示服务器已经收到请求,但是服务器内部错误(代码错误)

MIME类型说明


MiME是HTTP协议中数据类型。

MIME的英文全称是"Multipurpose  Internet  Mail  Extensions"多功能Internet邮件扩充服务,MIME类型的格式是"大类型/小类型",并与某一种文件的扩展名相对应。

如:gif类型;大类型是图片,小类型就是gif,表示为image/gif

常见的MIME类型:

十六、 HttpServletRequest类

=======================

作用:

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTp协议信息解析好封装到Request对象中,然后传递得到service方法(doGet和doPost中给我们使用,我们可以通过HttpServletRequest对象,获取到所有请求的信息)

HttpServletRequest类的常用方法


getRequestURI()                        获取请求的资源路径

getRequestURL()                       获取请求的统一资源定位符(绝对路径)

getRemoteHost                          获取客户端的ip地址

getHeader()                                获取请求头

getParameter                              获取请求参数

getParameterValues()                 获取请求对的参数(多个值的时候同时使用)

getMethod()                                 获取请求的方式GET或POST

setAttribute(key,value)                  设置域数据

getAttribute(key)                            获取域数据

getRequestDispatcher                   获取请求转发对象

方法演示:

创建一个web工程03_servlet,在web.xml中配置

RequestAPIServlet

com.servlet.RequestAPIServlet

RequestAPIServlet

/requestAPIServlet

在src下创建一个类RequestAPIServlet继承HttpServlet

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

public class RequestAPIServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// getRequestURI() 获取请求的资源路径

System.out.println(“URI->”+req.getRequestURI());

// getRequestURL()  获取请求的统一资源定位符(绝对路径)

System.out.println(“URL->”+req.getRequestURL());

// getRemoteHost 获取客户端的ip地址

System.out.println(“客户端ip地址:”+req.getRemoteHost());

// getHeader()   获取请求头

System.out.println(“请求头User-Agent->”+req.getHeader(“User-Agent”));

// getMethod()获取请求的方式GET或POST

System.out.println(“请求的方式:”+req.getMethod());

}

}

在编辑配置中修改信息,改为03_servlet之类的。

运行之后:

URI->/03_servlet/requestAPIServlet

URL->http://localhost:8080/03_servlet/requestAPIServlet

客户端ip地址:0:0:0:0:0:0:0:1

请求头User-Agent->Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36

请求的方式:GET

我们也能发现URI只是到工程名下的资源路径,而URL是全路径,可以直接访问的。

十七、Servlet获取web表单中的参数

=====================

get请求:


在src下创建一个参数类ParameterServlet继承HttpServlet类

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.Arrays;

public class ParameterServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//获取请求参数

String username=req.getParameter(“username”);

String password=req.getParameter(“password”);

String[] hobby=req.getParameterValues(“hobby”);

System.out.println(“账号:”+username);

System.out.println(“密码:”+password);

//Arrays.asList()返回的是一个数组

System.out.println(“爱好:”+ Arrays.asList(hobby));

}

}

在web.xml中配置参数

ParameterServlet

com.servlet.ParameterServlet

ParameterServlet

/parameterServlet

在web目录下写html文件

Title

账号:

密码 :

HTML

Java

JavaScript

Spring全家桶

Servlet

启动运行:

填入几组信息,提交得:

post请求:


类中:

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//获取请求参数

String username=req.getParameter(“username”);

String password=req.getParameter(“password”);

String[] hobby=req.getParameterValues(“hobby”);

System.out.println(“账号:”+username);

System.out.println(“密码:”+password);

//Arrays.asList()返回的是一个数组

System.out.println(“爱好:”+ Arrays.asList(hobby));

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

ParameterServlet

com.servlet.ParameterServlet

ParameterServlet

/parameterServlet

在web目录下写html文件

Title

账号:

密码 :

HTML

Java

JavaScript

Spring全家桶

Servlet

启动运行:

填入几组信息,提交得:

post请求:


类中:

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//获取请求参数

String username=req.getParameter(“username”);

String password=req.getParameter(“password”);

String[] hobby=req.getParameterValues(“hobby”);

System.out.println(“账号:”+username);

System.out.println(“密码:”+password);

//Arrays.asList()返回的是一个数组

System.out.println(“爱好:”+ Arrays.asList(hobby));

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-0m2tFXRS-1715803650884)]

[外链图片转存中…(img-YwrYf8O5-1715803650884)]

[外链图片转存中…(img-htnBINNv-1715803650885)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值