• Servlet基础


    Servlet: servlet applet

            概念:运行在服务器端的小程序

                            Servlet就是一个接口 定义了Java类被浏览器访问到(tomcat识别)的规则

                            将来我们自定义一个类,实现了Servlet接口,复写方法

    快速入门:

            1.创建JavaEE项目

            2、定义一个类,实现servlet接口

            3、实现接口中的抽象方法

            4、配置servlet     在web.xml中     

    
    
        demo1
        servlet.ServletDemo1
    
    
        demo1
        /demo1
    

    执行原理:

                    1、当服务器受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源文件

                    2、查找web.xml文件,是否有对应的标签体内容

                    3、如果有,则在找到对应的全类名

                    4、tomcat会将字节码文件加载进内存,并且创建其对象

                    5、调用其方法

    public class ServletDemo1 implements Servlet 

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hello Servlet"); }

            1、tomcat将全类名对应的字节码文件加载进内存。Class.forName();

            2、创建对象.cls.newInstance();

            3、调用方法——service

    servlet中的生命周期:
    

            1、被创建:执行init方法,只执行一次

                    Servlet什么时候被创建

                            默认情况下,第一次被访问时,servlet被创建

                            可以配置执行servlet的创建时机

                                    在标签下配置

                                    1、第一次被访问时,创建 的值为负数

                                    2、在服务器启动时,创建 的值为0或正整数 

                    servlet的init方法只执行一次,说明一个servlet在内存中只存在一个对象servlet是单例的

                            多个客户同时访问时,可能会存在线程安全问题

                            解决:经量不在servlet中定义成员变量,即使定义了成员变量,与不要对其修改值

            2、提供服务:执行service方法,执行多次

                    每次访问servlet时,service方法都会被调用一次

            3、被销毁:执行destroy方法,只执行一次

                    servlet被销毁时执行,服务器关闭时,servlet被销毁,只有服务器正常关闭时,才会执行destroy方法,destroy方法在servlet被销毁之前执行,一般用于释放资源

    servlet 3.0:

            好处:

                    支持注解配置,可以不需要web.xml了。

    步骤:
                    1、创建JavaEE项目,选择servlet的版本3.0以上,可以不创建web.xml

                    2、定义一个类,实现servlet接口

                    3、复写方法

                    4、在类上使用@webservlet注解,进行配置

                                    @webServlet("/资源路径")

    IDEA与tomcat的相关配置

            1、IDEA会为每一个tomcat部署的项目单独建立一份配置文件           

    查看控制台的log:Using CATALINA_BASE:"C:\Users\zjl\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\3f211537-8884-4164-a357-56510ce86fef"

            2、工作空间项目    和     tomcat部署的web项目

                            tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源

                            WER-INF目录下的资源不能被浏览器直接访问

            3、断点调试:使用debug启动

    servlet的体系结构

            servlet - - 接口

                 |

            GenericServlet - - 抽象类

                    |

            HttpServlet - - 抽象类

               GenericServlet:将servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象

                            将来定义servlet类时,可以继承GenericServlet,实现service()方法即可

                                            判断请求方式        String  method=req.getMethod();

                                                                            if("GET".equals(method))//get方式获取数据

                                                                            }else if("POST".equals(method)){//post方式获取数据

                                                                             }

                    HttpServlet:对HTTP协议的一种封装,简化操作

                                    1、定义类继承HttpServlet

                                    2、复写doGet/doPost方法

            Servlet相关配置

                    1、urlpartten:Servlet访问路径

                            一个servlet可以定义多个访问路径: @webServlet({"/资源路径1","/资源路径2",})

                    2、路径定义规则:

                            1、/xxx

                             2、/xxx/xxx

                             3、*.后缀名

    HTTP协议

            简单概念: Hyper Text Transfer Protocol  超文本传输协议

                    传输协议:定义了,客户端和服务器端通信时,发送数据的格式

                    特点:

                            1、基于TCP/IP的高级协议

                            2、默认端口号:80

                            3、基于请求/响应模型:一次请求对应一次响应

                            4、无状态的:每次请求之间相互独立,不能交互数据

                    历史版本:

                            1.0:每一次请求响应都会建立的连接

                            1.1:复用连接

             请求消息的数据格式

                    1、请求行

                            请求方式  请求url  请求协议/版本

                            GET  /login.html  HTTP/1.1

                            请求方式

                                    HTTP协议有7中请求方式,常用的有2种

                                            GET:

                                                    1、请求参数在请求行中,在url后

                                                    2、请求的url长度是有限制的

                                                    3、不太安全

                                            POST:

                                                    1、请求参数在请求体中

                                                    2、请求的url长度没有限制的

                                                    3、相对安全(仅仅是相对)

                    2、请求头:客户端浏览器告诉服务器一些信息

                            请求头名称 :请求头值

                                    常见的请求头:

                                            User-Agent : 浏览器告诉服务器,我访问你使用的浏览器版本信息

                                                    可以在服务器端获取该头的信息,解决浏览器的兼容性问题

                                            Referer : http://localhost/login.html

                                                    告诉服务器,我(当前请求)从哪里来

                                                            作用:

                                                                    1、防盗链

                                                                    2、统计工作        

                    3、请求空行

                            空行 就是用于分割POST请求的请求头,和请求体

                    4、请求体(正文)

                            封装POST请求消息的请求参数的

                    字符串格式:

                    请求与响应

                    1、tomcat服务器会根据请求中的url中的资源路径,创建对应的Servlet。。的对象

                    2、tomcat服务器,会创建request和response对象,request对象中的封装请求消息数据

                    3、tomcat将request和response两个对象传递给service方法,并且调用service方法

                    4、程序员(我们)可以通过request对象获取请求消息数据,通过对response对象设置响应消息数据

                    5、服务器在给浏览器做出响应之前,会从response对象中拿程序员设置的响应消息数据

    Request :

            1、request对象和response对象的原理

                    1、request和response对象是由服务器创建的,我们来使用它们

                    2、request对象是来获取请求消息,response对象是来设置响应消息

            2、request对象继承体系结构

                    ServletRequest        --  接口——继承

                    HttpServletRequest        -- 接口——实现

                    org.apache.catalina.connector.RequestFacade 类(tomcat)

            3、request:功能

                    1、获取请求消息数据

                            1、获取请求行数据

                                    GET/day14/demo1?name=zhangsan HTTP/1.1

                            方法:
                                    1、获取请求方法   :GET

                                            String   getMethod()

                                    2、获取虚拟目录   :/day14

                                            String   getContextPath()

                                    3、获取Servlet路径:  /demo1

                                            String   getServletPath()

                                    4、获取get方法请求参数:name=zhangsan

                                            String   getQueryString()

                                    5、获取请求URI:/day14/demo1

                                            String   getRequestURI():/day14/demo1

                                            StringBuffer   getRequestURL():http://localhost/day14/demo

                                            URL:统一资源定位符  :http://localhost/day14/demo

                                            URI:统一资源标识符   /day14/demo1

                                    6、获取协议及版本:HTTP/1.1

                                            String   getProtocol()

                                    7、获取客户机的IP地址

                                            String   getRemteAddr()

                    2、获取请求头数据

                            方法:

                                    String   getHeader(String   name)通过请求头的名称获取请求头的值

                                    Enumeration  getHeaderNames():获取所有的请求头的名称

                    3、获取请求体数据

                            请求体:只有POST请求方法,才有请求体,在请求体中封装了POST请求的请求参数

                            步骤:

                                    1、获取流量

                                            BufferReader   getReader():  获取字符输出流,只能操作字符数据

                                            ServletInputStream  getInputStream():获取字节输入流,可以操作所有类型数据                在文件上传知识点后讲解

                                    2、再从流对象中获取数据

            2、其他功能:

                    1、获取请求参数通用方式:不论是get还是post请求方法都可以使用下列方法来获取请求参数

                            1、String  getParameter(String  name):根据参数名称获取参数值   username=z&password=123

                            2、String[ ]  getParameterValues(String  name):根据参数名称获取参数值的数值   

                            3、Enumeration  getParameterNames():获取所有请求的参数名称

                            4、Map getParameterMap(): 获取所有参数的map集合、

                            中文乱码问题:

                                    get方式:tomcat 8 已经将get方式乱码问题解决了

                                    POST方式:会乱码

                                            解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8")

                    2、请求转发:

                            1、步骤:

                                    1、通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

                                    2、使用RequestDispatcher对象来进行转发:forword(ServletRequest request, ServletResponse response)
                              2、特点:
                                    1、浏览器路径栏路经不发生变化

                                    2、只能转发到当前服务器内部资源中

                                    3、转发是一次请求

                    3、共享数据

                            域对象:一个有作用范围的对象,可以在范围内共享数据

                            request域:代表一次请求的范围,一般用于请求转发的多个资源中的共享数据

                            方法:

                                    1、void setAttribute(String name,Object obj):存储数据

                                    2、Object getAttitute(String name):通过键获取值

                                    3、void removeAttitute(String name):通过键移除键值对

                    4、获取ServletContext:

                            ServletContext servletContext

                                    BeanUtils工具类,简化数据的封装

                                        用于封装JavaBean的

                                          1、要求    

                                            1、JavaBean:标准的Java类

                                            2、类必须提供空参的构造方法

                                            3、成员变量必须使用private修饰

                                            4、提供公共setting和getting方法

                                           2、概念

                                                    成员变量:

                                                    属性:setting和getting方法截取后的产物

                                                            例如:getUsername()——>Username——>username

                                            3、方法:
                                                    1、setProperty():设置属性值

                                                    2、getProperty():获得属性值

                                                    3、populate(object obj ,Map  map):将map集合的键值对信息,封装到对应的JavaBean对象中

    HTTP协议:响应消息

            数据格式:

                    1、响应行

                            1、组成:协议/版本  响应状态码  状态码描述:HTTP/2.0   200  OK

                            2、响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态

                                    1、状态码都是数字

                                    2、分类:

                                            1、1xx:服务器接收客户端消息,但没有接收完成,等待一段时间后,发送1xx的状态码

                                            2、2xx:成功。代表200

                                            3、3xx:重定向。代表:302(重定向),304(访问缓存)

                                            4、4xx:客户端错误

                                                    代表:
                                                            404(请求路径没有对应的资源)

                                                            405(请求方式没有对应的doxxx方法)

                                            5、5xx:服务器端错误》代表500(服务器内部出现异常)

                    2、响应头

                            1、格式:头名称:值

                            2、常见的响应头:

                                    1、Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式

                                    2、Content-disposition:服务器告诉客户端以什么格式打开响应数据

                                            值:

                                                    in-line:默认值,在当前页面内打开

                                                    attachment;filename=xxx:以附件形式打开响应体。文件下载

                    3、响应空行

                    4、响应体:传输的数据

    Response对象:

            功能:设置响应消息

                    1、设置响应行

                            1、格式:HTTP/1.1  200  ok

                            2、设置状态码:setStatus(int sc)

                    2、设置响应头:setHeader(String name,String value)

                    3、设置响应体:

                             使用步骤:

                                    1、获取输出流:

                                            字符输出流:PrintWriter  getWriter()

                                            字节输出流:ServletOutputStream getOutputStream()

                                    2、使用输出流,将数据输出到客户端浏览器

    案例:

            1、完成重定向                

    访问/responseDemo1,会自动跳转到/responseDemo2资源

    1、设置状态码为302 // response.setStatus(302); 

    2、设置响应头location // response.setHeader("location","/day14_test/responseDemo2");

    简单的重定向

    sendRedirect response.sendRedirect("/day14_test/responseDemo2"); 

            重定向的特点 redirect

                    1、地址栏发生变化

                    2、重定向可以访问其他站点(服务器)的资源

                    3、重定向是两次请求,不能使用request对象来共享数据

            转发的特点:forword
                    1、转发地址栏路径不变

                    2、转发只能访问当前服务器下的路径

                    3、转发是一次请求,可以使用request对象来共享资源

            forword 和 redirect 区别

            路径写法:

                 1、相对路径:通过相对路径不可以确定唯一资源

                            如:./index.html

                            不以/开头,以 . 开头

                            规则:找到当前资源和目标资源自建的相对位置

                                    ./:当前目录

                                    ../:后退一级目录

                    2、绝对路径:通过绝对路经可以确定唯一资源

                            如:http://localhost/day14_test/responseDemo2           /day14_test/responseDemo2

                            以/开头的路径

                            规则:判断定义的路径是给谁用的 ?判断请求从哪发出来的

                                    给客户端浏览器使用:需要加虚拟目录(项目的访问路径)

                                    给服务器使用:不需要加虚拟目录

                            动态获取虚拟目录        String  contextPath = request.getContextPath();

                   2、 服务器输出字符数据到浏览器

                            获取流对象前,设置流的默认编码:ISO-8859-1 设置GBK

                            1、获取字符输出流

                            2、输出数据

                                    注意乱码问题:

                                          1、PrintWriter   pw=response.getWriter();获取流的默认编码是ISO-8859-1

                                            2、设置该流的默认编码

                                            3、告诉浏览器响应体使用的编码                                        

                            //简单形式,设置编码,是在获取流之前设置
                            response.setContentType("text/html;charset=utf-8");

                    3、服务器输出字节数据到浏览器

                            1、获取字节输出流

                            2、输出数据

                    4、验证码

                            本质:图片

                            目的:防止恶意的表单注册

    ServletContext对象

            1、概念:代表整个web应用,可以和程序的容器(服务器)来通讯

            2、获取:

                    1、通过request.getServletContext();获取

                    2、通过HttpServlet获取

                            this.getServletContext();

            3、功能:

                    1、获取MIME类型:
                            MIME类型:在互联网通信过程中定义的一种文件数据类型

                                    格式:大类型/小类型        text/html   image/jpeg

                                    获取:String getMimeType(String file)

                    2、域对象:共享数据

                            1、setAttribute(String  name,object  value)

                            2、getAttribute(String  name)

                            3、removeAttribute(String  name)

                            ServletContext:对象范围:所有用户请求的数据

                    3、获取文件的真实(服务器)路径

                            方法:String getRealPath(String  path)

    文件下载需求:

            1、页面显示超链接

            2、点击超链接后弹出下载提示框

            3、完成图片文件下载

    分析:

            1、超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框

            2、任何资源都必须弹出下载提示框

            3、使用响应头设置资源的打开方式:

                            content-disposition:attachment;filename=xx

     步骤:

            1、定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename

            2、定义servlet

                    1、获取文件名称

                    2、使用字节输入流加载文件进内存        

                    3、指定response的响应头:content-disposition;attachment‘filename=xx

                    4、将数据写入response输出流         

          问题:

                    中文文件问题

                            解决思路:

                                    1、获取客户端使用时浏览器版本信息

                                    2、根据不同的版本信息,设置filename的编码方式不同         

                                            

                                                    


     

                       

  • 相关阅读:
    Swagger
    PHP中流的理解
    SpringMVC相关知识点
    C++ 罗马数字转整数
    spfa求解图中是否含有负环 C++实现
    2.Vue-从零开始搭建一个vue项目
    StackOverflowError和OutOfMemoryError区别
    Vuex详解(五种状态)
    网络请求(四)—Socket
    Ant Design Vue 注册全局消息通知组件
  • 原文地址:https://blog.csdn.net/m0_62938286/article/details/126946065