文章目录

  • Servlet
    • 一 快速入门
    • 二 Servlet执行流程
    • 三 Servlet生命周期
      • 3.1 Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
      • 3.2 Servlet方法介绍
    • 四 Servlet体系结构
    • 五 ServleturlPattern配置
    • 六 XML配置方式编写Servlet
      • 6.1 Request获取请求数据
        • 6.1.1 获取请求数据
        • 6.1.2 通用方式获取请求参数
        • 6.1.3 Request 请求参数中文乱码处理
        • 6.1.4 请求转发

Servlet

  • Serylet是Java提供的一门动态web资源开发技术
  • Servlet是JavaEE规范之一其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

一 快速入门

1.创建web项目,导入Servlet依赖坐标

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency>

2.创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

public class servletDemo1 implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("hello world~");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}
}

3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

@WebServlet("/demo")
public class servletDemo1 implements Servlet

4.访问:启动Tomcat,浏览器输入URL访问该Servlet

二 Servlet执行流程

三 Servlet生命周期

  1. Servlet由谁创建?Servlet万法由谁调用?
    Servlet由web服务器创建,Servlet方法由web服务器调用。
  2. 服务器怎么知道Servlet中一定有service方法?
    因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法。
  • 对象的生命周期指一个对象从被创建到被销毁的整个过程

3.1 Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:

  1. 加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
  2. 初始化:在Servlet实例化之后,容器将调用***Servlet的init()***方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
public class servletDemo2 implements Servlet {/*** 初始化方法* 1.调用时机:默认情况下,Servlet被第一次访问时,调用*  LoadOnStartup* 2.调用次数:1次* @param servletConfig* @throws ServletException*/@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("init...");}

@WebServlet(urlPatterns=“/demo”,loadOnStartup = 1)

  1. 负整数:第一次被访问时创建Servlet对象
  2. 0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高
  3. 请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理
    /*** 提供服务* 1.调用时机:每一次Servlet被访问时,调用* 2.调用次数:多次* @param servletRequest* @param servletResponse* @throws ServletException* @throws IOException*/@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("service");}

  1. 服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的***destroy()***方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
 /*** 销毁方法* 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用* 2.调用次数:1次*/@Overridepublic void destroy() {System.out.println("destroy");}



第一次启动时,会加载一大堆的jar包,请稍等。第二次启动的好了


3.2 Servlet方法介绍

  • 初始化方法,在Servlet被创建时执行,只执行一次
void init(ServletConfig config)
  • 提供服务方法,每次Servlet被访问,都会调用该方法
void service(ServletRequest reg,ServletResponse res)
  • 销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Serylet
void destroy()
  • 获取ServletConfig对象
ServletConfig getServletConfig()
  • 获取Servlet信息
String getServletlnfo()


四 Servlet体系结构

  • 我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会继承Httpservlet
public class servletDemo4 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost...");}
}


  1. HttpServlet使用步骤

    • 继承HttpServlet
    • 重写doGet和doPost方法
  2. HttpServlet原理
    获取请求方式,并根据不同的请求方式,调用不同的doxxx方法

五 ServleturlPattern配置

Servlet要想被访问,必须配置其访问路径(urlPattern)

  1. 一个Servlet,可以配置多个urlPattern
@WebServlet(urPatterns = {"/demo1”,“/demo2”})
  1. urlPattern配置规则
    ①精确匹配

    • 配置路径:@webServlet(“/user/select”)
    • 访问路径:localhost:8080/web-demo/user/select

②目录匹配

  • 配置路径:@WebServlet(“/user/*”)

    • 访问路径:
localhost:8080/web-demc/user/oooo
localhost:8080/web-demo/user/mmm

③扩展名匹配

  • 配置路径:@WebServlet(“*.do”)
    - 访问路径:
localhost:8080/web-demgaaa.do
localhost:8080/web-demo/ccc.do

④任意匹配

配置路径:

@WebServlet("/")
@WebServlet("/ * ")
  • 访问路径:
localhost:8080/web-demc/hehe
localhost:8080/web-demo/haha
  • /和"/*"区别:

    • 当我们的项目中的Servlet配置了"/ * ",会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet
    • 当我们的项目中配置了"/ * ",意味着匹配任意访问路径
  • 优先级:
    精确路径>目录路径>扩展名路径>"/ * ">/

六 XML配置方式编写Servlet

Servlet从3.0版本后开始支持使用注解配置,3.0版本前只支持XML配置文件的配置方式

  • 3.0版本前的操作步骤:

    1. 编写Servlet类
    2. 在web.xml中配置该Servlet
<!--Servlet全类名-->
<servlet><servlet-name>demo4</servlet-name><servlet-class>com.yang.servletDemo4</servlet-class>
</servlet>
<!--Servlet访问路径-->
<servlet-mapping><servlet-name>demo4</servlet-name><url-pattern>/demo4</url-pattern>
</servlet-mapping>
  • 3.0版本后的操作步骤:
@WebServlet("/demo4")



Tomcat需要解析请求数据
1.封装为request对象,并且创建request对象传递到service方法中,使用request对象
2.查阅JavaEEAPI文档的HttpServletRequest接口

6.1 Request获取请求数据

6.1.1 获取请求数据

请求数据分为3部分:
1.请求行:
- GET/request-demo/req1?username=zhangsan HTTP/1.1
- StringgetMethodO:获取请求方式:GET
- StringgetContextPathO:获取虚拟目录(项目访问路径):/request-demo
- StringBuffergetRequestURLO:获取URL(统一资源定位符):http://localhost:8080/request-demo/reg1
- StringgetRequestURIO:获取URI(统一资源标识符):/request-demo/reg1
- StringgetQueryString0:获取请求参数(GET方式):username=zhangsan&password=123
2.请求头:
- User-Agent:Mozilla/5.0Chrome/91.0.4472.106
- StringgetHeader(Stringname):根据请求头名称,获取值
3.请求体:
- username=superbaby&password=123
- ServletInputStream getInputStream():获取字节数据流
- BufferedReader getReader():获取字节输入流

6.1.2 通用方式获取请求参数

  • 请求参数获取方式
    GET方式:
String getQueryString()

POST方式:

BufferedReader getReader()

思考:有没有统一的方法呢?

//获取请求方式
Stringmethod=this.getHethod()
if("GET".equals(method)) {//GET方式获取请求参数
params=this.getQuerystring();}
else if("POST".equals(method){//POST方式获收请求参数
BufferedReader reader=this.detReader();
params=reader.readline();
Map<String,String>getParameterMap();//获取所有参数Map集合
String[]getParameterValues(Stringname);//根据名称获取参数值(数组)
String getParameter(Stringname);//根据名称获取参数值(单个值)

//获取所有的参数Map集合
Map<String ,String[]> map=req.getParameterMap();
for(String key:map.keySet()) {System.out.println(key+":");//获取值String values=map.get(key);for(String value:values) {System.out.println(value+" ");}
}
String[] hobbies=req.getParameterValues("hobby");
for(String hobby:hobbies) {System.out.println("hobby");
}
//3 根据Key 获取单个参数值
String username =req.getParamter("username");
String password=req.getparameter("password");System.out.println("username");System.out.println("password");
  • 使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义这样的格式:
@WebServlet(name = "Servlet")
public class Servlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

可以使用Servle模板创建Servlet更高效

6.1.3 Request 请求参数中文乱码处理

  • 请求参数如果存在中文,可能会乱码

  • 解决方案:

    • POST:设置输入的编码
    • 通用方式(GET/POST):先编码,再解码
  • URL编码

  1. 将字符串按照编码方式转化为二进制
  2. 每个字节转化为2个十六进制数并在前边加上%


  • Tomcat8.0之后已将GET请求乱码问题解决,设置默认的解码方式为UTF-8

插件是tomcat7 会有乱码;本地的tomcat不会有乱码的问题

  • URL编码实现方式
方式 实现
编码 URLEncode.encoder(str,“utf-8”);
解码 URLDecoder.decode(s,“IOS-8859-1”);

6.1.4 请求转发

概念 实现方式
一种在服务器内部的资源跳转方式 req.getREquestDispatcher(“资源B路径”).forward(req,resp);
  • 请求转发特点

    • 浏览器地址栏路径不发生变化;
    • 只能转发到当前服务器的内部资源;
    • 一次请求,可以在转发的资源间使用request共享数据
  • 请求转发资源间共享数据:使用Request对象

    • void setAttribute(String name,Object o):存储数据到reques域中
    • Object getAttribute(String name):根据key,获取值
    • void removeAttribute(String name):根据key,删除该键值对

Servlet【黑马】相关推荐

  1. JavaWeb程序设计任务教程(黑马程序员 传智播客)测一测 编写一个Servlet,实现统计网站被访问次数的功能

    详细解释已在注释中给出 package 统计网站被访问次数;import java.io.*;import javax.servlet.*; import javax.servlet.http.*;p ...

  2. JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  3. JavaWeb黑马旅游网-学习笔记08【旅游线路详情】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  4. JavaWeb黑马旅游网-学习笔记06【旅游线路分页展示分页展示】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  5. JavaWeb黑马旅游网-学习笔记05【分类数据展示功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  6. JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  7. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  8. JavaWeb黑马旅游网-学习笔记02【注册功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  9. JavaWeb黑马旅游网-学习笔记01【准备工作】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  10. Maven-学习笔记06【基础-Maven工程servlet实例】

    Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...

最新文章

  1. 人工智能语音技术支持“多情感程度”调节,细腻演绎“人声”
  2. Openldap配置TLS加密传输(完整版——shell脚本实现[即在客户端执行代码,即可实现TLS加密])
  3. Python 技术篇-用os库实现删除本地文件、非空文件夹方法,python判断本地文件、文件夹是否存在方法
  4. java网络编程(二)
  5. mysql 打开远程服务
  6. linux 解压 视频插件,linux下压缩解压缩命令
  7. c语言 调用父类方法,关于C++:如何从派生类函数调用父类函数?
  8. 自制安装包集成.net framework 4.0
  9. 网络掩码和子网掩码区别?
  10. BUPT复试专题—最小距离查询(2013)
  11. 简单尝试windows多线程程序
  12. 安卓一键清理内存_教大家安卓怎么清理内存-装修攻略
  13. e480Linux无法发现无线网卡,ThinkPad无线不能用无法连接无线网络的具体排查流程图解...
  14. 论文数模真的好难?那是你还不会Matlab!
  15. Systrace 响应速度实战 2 :响应速度实战分析 - 以启动速度为例
  16. 单片机开发板的入门学习
  17. html页面批量打印EMS快递单,如何批量打印快递单/电子面单?
  18. JSON.stringify(value[, replacer[, space]])中三个参数详解
  19. 基于SpringBoot点餐小程序的开发【前后端】
  20. 小程序拼团商城系统开发

热门文章

  1. 视频格式与编码压缩标准 mpeg4,H.264.H.265 有什么关系?
  2. CSS 实现面包屑导航
  3. 网易的爆款密码,藏在Q3财报里
  4. c++ Beep函数的雪之梦
  5. 百度地图api将可视区域定位到当前所在位置
  6. Django实现邮箱激活
  7. OnTime pro for mac(多功能时钟工具)
  8. 关于skl计算机题目,系统崩溃,并且您不能更改 Windows 8.1 或 Windows Server 2012 R2 中的英特尔 SKL 平台上的 CPU 频率...
  9. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(5)
  10. 已知函数comp的C语言,在C ++ STL中设置value_comp()函数