P3 JavaWeb:servlet

638 阅读6分钟

一.是什么

1. 概述

servlet是sun公司用来开发动态web的技术,sun公司在API中提供的接口就叫servlet, 在java中也可以说,把实现了servlet接口的java程序叫做servlet(本质就是java程序)

二.为什么用

因为web服务器(tomcat、Weblogic、iis、apache)**没有处理动态资源请求的能力**(即该请求需要计算),只能处理静态资源的请求(如果浏览器请求某个html页面,web服务器查看请求的html页面是否存在,存在则返回。)如果要让web服务器处理动态资源的请求,则需要使用CGI组件加容器的方式。
Servlet就是web服务器处理动态资源的具体实现。

三.怎么用

1.开发servlet程序,需要两步:

<1>.编写一个类,实现servlet接口

<2>.把开发好的java类部署到web服务器中

2.代码实现

<1>创建maven工程

I.创建一个普通的maven项目作为父工程(直接构建,不使用模块构建)

II.导入servlet、jsp的依赖

Snipaste_2021-12-31_16-00-00.png

III.创建web项目(模块搭建maven)作为子工程

IV.修改web.xml为最新版本的,将maven的结构搭建完整

Snipaste_2021-12-31_16-32-09.png

<2>.编写一个servlet程序

I. 编写一个普通类,实现servlet接口(直接继承HTTPServlet)

public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();//响应流 
        write.print("hello");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp)
    }
}

II. web.xml中注册servlet并编写servlet映射

为什么需要映射:编写好的类是java程序,而浏览器访问需要连接web服务器,所以需要在web服务中注册我们写的servlet,还需要给浏览器一个能够访问的路径                          
<!--注册一个servlet-->
<servlet>
    <servlet-name>ServletDemo</servlet-name>
    <servlet-class>com.itcast.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/itcast</url-pattern>
</servlet-mapping>

III. 配置tomcat

注意配置项目的发布路径

Snipaste_2021-12-31_16-50-29.png

IV. 启动测试

http://localhost:8080/alex  

四.servlet原理

servlet是由web服务器调用的,web服务器收到浏览器的请求后。。。

1.servlt有两个默认的实现类:

sun公司为servlet接口提供了两个默认的实现类
HTTPServlet
GenericServlet

<1>.继承关系:

  HTTPServlet extend GenericServlet
  GenericServlet extend servlet

<2>.结构图:

Snipaste_2021-12-31_16-26-03.png

<3>.重写doGet和doPost方法的分析

I.顶层接口servlet

image.png

II.GenericServlet

image.png

III.HTTPServlet

image.png

2.原理流程

<1>.浏览器向web容器(tomcat)发起请求

第一次访问发送的请求,会生成target的class文件并生成编写的servlet       

Snipaste_2021-12-31_17-14-57.png

<2>.tomcat产生两个对象请求request和响应response

<3>.请求和响应对象会调用servlet中的service方法处理请求和响应

<4>.自己重写的两个实现类是真正处理请求和响应的

<5>.web容器(tomcat)读取响应内容

<6>.tomcat将响应内容返回给客户端(浏览器)

3.原理流程图解

Snipaste_2021-12-31_17-25-44.png

五.servlet中web.xml的mapping

1.配置解析

<1>.xml中注册一个servlet

<!--注册一个servlet-->
<servlet>
    <servlet-name>ServletDemo</servlet-name>
    <servlet-class>com.itcast.servlet.HelloServlet</servlet-class>
</servlet>

<2>映射路径

I一个servlet指定一个映射路径

<!--servlet的请求路径-->
<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/itcast</url-pattern>
</servlet-mapping>

II.一个servlet指定多个映射路径

<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/itcast</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/itheima</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/it</url-pattern>
</servlet-mapping>

III.一个servlet指定通用映射路径

<!--默认请求路径-->
<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/itcast/*</url-pattern>
</servlet-mapping>

IV.默认请求路径(不要用)

<!--下面/*这个路径映射会导致请求不进首页面index,优先级较高-->
<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

V.自定义后缀和前缀请求映射

<!--默认请求路径-->
<servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>*.itcast</url-pattern>
</servlet-mapping>

<3>mapping映射的优先级问题

2.应用场景

<1>404页面

I.servlet编写

image.png

II.xml中注册servlet并编写mapper映射路径

image.png

六.servlet3.0

注解开发,简化web.xml配置servlet的复杂性

1.编写servlet并继承httpservlet

image.png

2.使用注解代替xml配置

// @WebServlet(name = "QuickServlet",urlPatterns = "/quickServlet")
// @WebServlet(urlPatterns = "/quickServlet")
// @WebServlet(value = "/quickServlet")
@WebServlet("/quickServlet") // 注解中有且仅有一个属性,名为value时,属性名可以省略...
public class QuickServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("QuickServlet....3.0");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

3.配置tomcat并测试

image.png

七.ServletContext对象

1.是什么:

web容器(tomcat)在启动的时候,会为每个web程序都创建一个ServletContext对象,它代表了当前的web应用;servlet之间想要实现通信,需要经过一个中间商,如果用io方式比较麻烦,因此servletcontext就可以作为中间商(数据存到ServletContext中,所有的servlet就可以从这里拿到保存的数据),就可以实现会话共享        

Snipaste_2022-01-02_00-42-20.png
Snipaste_2022-01-02_00-50-39.png

2.用来干什么:

<1>共享数据:(被session代替)

我在这个servlet中保存的数据,可以在另一个servlet中拿到;    

I.编写servlet用于存取数据

Snipaste_2022-01-02_00-38-01.png Snipaste_2022-01-02_00-44-27.png

II.编写mapping映射

Snipaste_2022-01-02_00-44-59.png

<2>获取初始化参数

参考<1>共享数据的servlet

<3>请求转发(url不发生变化)(被request代替)

Snipaste_2022-01-02_01-09-48.png

<4>读取资源文件(项目中会大量应用)(被类加载,反射代替)

注意:maven项目下,main目录下的java和resources统称为类路径classpath,properties文件不论是放在java或者resources下,都会被打包生成在target的classes下,如果放在java中没有导出,用maven中资源无法导出的解决方法

I.查看properties类常用方法

Snipaste_2022-01-02_01-16-12.png

II.编写properties文件并查看class路径

Snipaste_2022-01-02_01-19-33.png

III.编写servlet

Snipaste_2022-01-02_01-33-17.png

IV.编写mapping映射

Snipaste_2022-01-02_01-30-40.png

V.测试

Snipaste_2022-01-02_01-31-46.png

八.HttpServletResponse 对象

1.是什么

HttpServletResponse extend ServletResponse
web服务器接受客户端的http请求,针对这个请求,分别创建一个代表请求和响应的HttpServletResponseHttpServletRequest对象;
如果要获取客户端请求过来的参数,找HttpServletRequest,如果要给客户端响应一些信息,用HttpServletResponse 

2.为什么用

学习servlet,主要就是学习请求和响应两个对象

3.怎么用

<1>常用方法简单分类:

Snipaste_2022-01-02_22-40-52.png Snipaste_2022-01-02_22-44-24.png

I. 负责向浏览器发送数据

Snipaste_2022-01-02_22-42-30.png

II . 负责向浏览器发送响应头的方法

Snipaste_2022-01-02_22-43-19.png

III. 设置响应的状态码

Snipaste_2022-01-02_22-47-19.png

<2>常见应用(下面几个应用都在response目录下)

Snipaste_2022-01-02_23-36-06.png

I . 向浏览器输出消息

II . 下载文件

这个需求在java基础中,前3步用字符串,后几步用io流,下面是javaweb中的实现
i.servlet编写
①获取下载文件的路径与文件名        
②设置让浏览器支持我们要下载的东西
③获取下载文件输入流
④创建缓冲区
⑤获取OutpUTStream对象
⑥将FileOutputStream流写入buffer缓冲区
⑦使用OutpUTStream将缓冲区的数据输出到客户端

Snipaste_2022-01-02_23-14-04.png

Snipaste_2022-01-02_23-17-36.png

ii.servlet注册并编写mapping映射路径

Snipaste_2022-01-02_23-16-25.png

iii.部署tomcat

Snipaste_2022-01-02_23-15-44.png

iv.测试下载文件

Snipaste_2022-01-02_23-19-00.png

Snipaste_2022-01-02_23-19-06.png

III. 验证码实现

i.前后端分离使用不同的技术:
前端可以用js等技术
后端用到java图片类,生成一个图片
ii.下面是用后端技术实现
①servlet编写

Snipaste_2022-01-02_23-24-56.png Snipaste_2022-01-02_23-25-39.png

②注册servlet并编写mapping映射路径

Snipaste_2022-01-02_23-23-43.png

IV . 实现重定向(url变化)(重点)

i.原理
    一个servlet要找另一个servlet,先要告诉中间商,然后中间商告诉servlet去哪里找另一个servlet,这个过程url发生变化
ii.场景
①用户登录,登录成功就会跳转到另外一个页面
    1>.编写servlet

Snipaste_2022-01-02_23-42-43.png

    2>.注册servlet并编写mapping映射路径

Snipaste_2022-01-02_23-39-50.png

    3>.测试访问

Snipaste_2022-01-02_23-41-30.png

②重定向使用的登录Demo练习
    1>.主页面与访问成功页面编写

Snipaste_2022-01-02_23-54-21.png
Snipaste_2022-01-02_23-57-01.png

    2>.编写servlet

Snipaste_2022-01-02_23-56-04.png

    3>.部署tomcat并测试访问

Snipaste_2022-01-02_23-57-45.png Snipaste_2022-01-02_23-57-58.png

九.HttpServletRequest对象

1.是什么:

    代表客户端的一个请求,用户通过http协议访问服务器,http请求中的所有信息会被封装到HttpServletRequest对象中,通过这个对象中的方法,可以获取客户端的所有信息

2,怎么用:

<1>常用方法

Snipaste_2022-01-02_23-59-45.png

<2>常见应用

I.获取前端传递的参数

Snipaste_2022-01-03_00-28-17.png

II.请求转发(登录Demo练习)

i.主页面与登录成功页面编写

Snipaste_2022-01-03_00-07-43.png Snipaste_2022-01-03_00-08-57.png

ii.编写servlet

Snipaste_2022-01-03_00-29-46.png

iii.注册servlet并编写mapping

Snipaste_2022-01-03_00-12-53.png

iv.部署tomcat

Snipaste_2022-01-03_00-16-33.png

v.测试访问

Snipaste_2022-01-03_00-20-41.png