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
在实现的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一样存取数据的对象,叫做域对象。
这里的域指的是存取数据的操作范围。
对照示意表:
存数据 | 取数据 | 删除数据 | |
Map | put() | 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文件
账号:
密码 :
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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ParameterServlet
com.servlet.ParameterServlet
ParameterServlet
/parameterServlet
在web目录下写html文件
账号:
密码 :
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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!