Servlet基础

Servlet: servlet applet

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

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

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

快速入门:

        1.创建JavaEE项目

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

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

        4、配置servlet     在web.xml中     

<!--配置servlet-->
<servlet>
    <servlet-name>demo1</servlet-name>
    <servlet-class>servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>demo1</servlet-name>
    <url-pattern>/demo1</url-pattern>
</servlet-mapping>

执行原理:

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

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

                3、如果有,则在找到对应的<servlet-class>全类名

                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的创建时机

                                在<servlet>标签下配置

                                1、第一次被访问时,创建 <load-on-startup>的值为负数

                                2、在服务器启动时,创建 <load-on-startup>的值为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<String>  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<String>  getParameterNames():获取所有请求的参数名称

                        4、Map<String,String[ ]> 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的编码方式不同         

                                        

                                                


 

                   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值