#Tomcat、Servlet#JavaWeb学习笔记(2020/2/29-3/1)

Tomcat设置热配置:修改文件后不用重启Tomcat服务器。

image.png

Tomcat设置虚拟路径

image.png

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

具体内容由我们自己实现,在浏览器可以调用Servlet的实现类的方法。

配置Servlet

1、 在web.xml中配置:

    
            
            <servlet>
                <servlet-name>demo1</servlet-name>
                <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
            </servlet>
        
            <servlet-mapping>
                <servlet-name>demo1</servlet-name>
                <url-pattern>/demo1</url-pattern>
            </servlet-mapping>

2、使用注解配置:
Servlet 3.0之后支持使用\color{red}{@WebServlet("资源路径")}的方式就可以配置了,注解写在Servlet的实现类中,资源路径就是url-pattern中的内容。

WebServlet注解内容:

@Target({ElementType.TYPE})
                @Retention(RetentionPolicy.RUNTIME)
                @Documented
                public @interface WebServlet {
                    String name() default "";//相当于<Servlet-name>
                
                    String[] value() default {};//代表urlPatterns()属性配置,默认就是这个
                
                    String[] urlPatterns() default {};//相当于<url-pattern>
                
                    int loadOnStartup() default -1;//相当于<load-on-startup>
                
                    WebInitParam[] initParams() default {};
                
                    boolean asyncSupported() default false;
                
                    String smallIcon() default "";
                
                    String largeIcon() default "";
                
                    String description() default "";
                
                    String displayName() default "";
                }

三、Servlet的生命周期

1. 被创建:执行init方法,只执行一次
* Servlet什么时候被创建?
* 默认情况下,第一次被访问时,Servlet被创建
* 可以配置执行Servlet的创建时机。
* 在<servlet>标签下配置
1. 第一次被访问时,创建
<load-on-startup>的值为负数
2. 在服务器启动时,创建
<load-on-startup>的值为0或正整数

Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值


  1. 提供服务:执行service方法,执行多次
    • 每次访问Servlet时,Service方法都会被调用一次。
  2. 被销毁:执行destroy方法,只执行一次
    • Servlet被销毁时执行。服务器关闭时,Servlet被销毁
    • 只有服务器正常关闭时,才会执行destroy方法。
    • destroy方法在Servlet被销毁之前执行,一般用于释放资源

四、Servlet的执行原理

image.png

Servlet不需要主方法就能执行,因为用到了反射的技术。

五、Servlet的继承结构:

Servlet -- 接口:
实现Servlet接口的实现类,五个抽象方法都得实现。
         | 
GenericServlet -- 抽象类:
空实现了其余四个抽象方法,继承该抽象类只需要实现service()即可。
         | 
HttpServlet -- 抽象类:
对HTTP协议进行了封装、空实现了五个方法、只需要重写doGet/doPost方法即可、根据请求的方式来执行不同的代码。

六、HTML协议

1.HTML协议是基于TCP/IP协议的一种高级协议
2.默认端口号是:80
3.基于请求、响应模型:一次请求对应一次响应

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

HTML协议1.0版本,每次请求响应都会建立一个新的连接,显然这样是影响性能的。
HTML协议1.1版本、复用连接

请求消息的格式

请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
请求头
客户端通过请求头的键值对,告诉服务器一些信息。
常见的请求头的内容:

  • User-Agent:告诉服务器一些浏览器的版本等信息。
    在服务器端获取User-Agent,可以解决兼容性的问题。
  • Referer:告诉服务器,这个连接是从哪里来的。
    1.防止别的网站(盗版网站)盗取链接使用。
    2.可以进行统计流量的来源。

请求空行
用来分隔请求体与请求头的,注意:只有POST请求方式有请求体。
请求体
封装POST请求消息的请求参数的

image.png

关于GET方式与POST方式

1、请求方式:
直接访问网页资源是GET方式,表单中设置POST方式,再提交后才是POST方式。

GET方式与POST方式的区别:

  • GET
    1、get是相当于是明文传输,且url长度有限制,根据浏览器不同限制的长度不同。
    2、填入表单的请求参数会显示到地址栏后面、不太安全。
    3、没有请求体。

  • POST
    1、post的请求参数在请求体中,不是明文传输
    2.、请求的url长度没有限制的
    3.、相对安全

七、Request对象与Response对象

request对象和response对象的原理

  1. request和response对象是Tomcat服务器给我们创建的。
  2. request对象是来获取请求消息,response对象是来设置响应消息做出回应的。

1、Request对象(请求)

Request对象的继承结构:

ServletRequest -- 接口
 | 继承 
HttpServletRequest -- 接口
 | 实现 
org.apache.catalina.connector.RequestFacade 类(tomcat)

获取请求行的数据的方法

请求行中的数据有:请求方式、请求的URL、HTTP协议版本信息

  • 1、获取请求方式:
    String getMethod()
  • 2、获取URL中的虚拟路径的方法:\color{red}{虚拟路径是在Tomcat设置的}
    String getContextPath()
  • 3、获取Servlet资源路径: (常用)
    String getServletPath()
  • 4、获取get方式的请求参数:
    String getQueryString()
  • 5、获取URI路径
    String getRequestURI(): (常用)
  • 6、获取URL路径
    StringBuffer getRequestURL()
    \color{red}{URL与URI的区别:URL是URI的子集}
  • 7、获取HTTP协议版本:
    String getProtocol()
  • 8、获取客户机的IP地址:
    String getRemoteAddr()

获取请求头中的数据

  • 1、(常用)String getHeader(String name):通过请求头的名称获取请求头的值
  • 2、Enumeration<String> getHeaderNames():获取所有的请求头名称\color{red}{Enumeration<String> 的对象可以当做迭代器使用,再用getHeader方法获取所有头的值}

获取请求头的数据(使用流)

步骤:

  • 1、BufferedReader getReader():获取字符输入流,只能操作字符数据 。
  • 2、ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
  • 3、使用流对象,获取数据。

POST方法和GET方法都可以使用的、获取请求参数的方法(常用)

    1. String getParameter(String name):根据参数名称获取参数值
    1. String[] getParameterValues(String name):根据参数名称获取参数值的数组
    1. Enumeration<String> getParameterNames():获取所有请求的参数名称
    1. Map<String,String[]> getParameterMap():获取所有参数的map集合

关于请求参数乱码问题:

Q:为什么会出现乱码?
A:request对象是Tomcat创建的,所以解析请求参数使用的是Tomcat的编码集iso-8859-1,但是浏览器使用的是html设置的编码集(utf-8),所以就乱码了。

目前Tomcat 8 已经解决了get方法的乱码问题,但是post方法依然还会乱码。
需要我们自己设置编码集。

\color{red}{在接收请求参数前,设置字符集!}

      request.setCharacterEncoding("utf-8");

2.Response对象(响应)

响应消息与请求消息的格式类似:

  • 响应行
    内容:协议/版本 响应状态码 状态码描述
    • 状态码分类:
      1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
      2. 2xx:成功。代表:200
      3. 3xx:重定向。代表:302(重定向),304(访问缓存)
      4. 4xx:客户端错误。 代表: 404(请求路径没有对应的资源)、405:请求方式没有对应的doXxx方法 (例如post方式的请求,却没有doPost方法。
      5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
  • 响应头
    • 常见响应头:
      1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式。
      2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据。
        • in-line:默认值,在当前页面内打开
        • attachment;filename=xxx:以附件形式打开响应体。文件下载
  • 响应空行
    用于分隔响应头与响应体的。
  • 响应体
    用于传输数据
image.png

Response对象是用来设置响应消息的。

①、设置响应行

  • 设置状态码:setStatus(int sc)
    ②、设置响应头
  • setHeader(String name, String value)
    ③、设置响应体
  • 获取Tomcat提供的输出流对象,向响应体中写数据,输出到浏览器。
    • PrintWriter getWriter()、获得字符输出流(打印流)
    • ServletOutputStream getOutputStream()、获得字节输出流

关于输出乱码问题:

Q:为什么会乱码?
A:因为输出流对象是Tomcat给的,编码集是Tomcat设置的ISO-8859-1,浏览器解析请求体是用的系统的编码集(GBK),所以对应不上就乱码了。

解决方法:

  • 1.设置流的编码集:\color{red}{光写这个还不行,因为浏览器不一定是utf-8的编码集}
    response.setCharacterEncoding("utf-8");
    1. 设置浏览器解析的编码集:\color{red}{使用响应头把浏览器的字符集也设置为一样}
      response.setHeader("content-type","text/html;charset=utf-8");

两步合一的简便方法:\color{red}{设置流的字符集+设置浏览器字符集}

  • response.setContentType("text/html;charset=utf-8");
    \color{red}{注意!上述操作要在获取流之前设置}

重定向:

步骤:

  • 1.设置状态码为302、
    response.setStatus(302);
  • 2.设置重定向地址、由响应头中的location头指定:
    response.setHeader("location","重定向的地址");

一步设置重定向:

  • response.sendRedirect("重定向的地址");

重定向(redirect)与请求转发(forward)的区别:

  • 重定向
    • 地址栏会发生改变
    • 可以重定向到服务器外的资源
    • 重定向是两次请求、重定向不能由request域共享数据。
  • 请求转发
    • 地址栏不会改变
    • 只能转发到当前服务器中的资源
    • 转发是一次请求、转发可以由request域共享数据。


      image.png

八、请求转发:服务器内部的资源访问

步骤:

  1. 通过request对象获取请求转发器对象:
    RequestDispatcher getRequestDispatcher(String path)
  2. 使用RequestDispatcher对象来进行转发:
    forward(ServletRequest request, ServletResponse response)

特点:

  1. 浏览器地址栏路径不发生变化
  2. 只能转发到当前服务器内部资源中。
  3. 转发是一次请求

九、路径的虚拟目录的使用情况

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

  • 1、给客户端浏览器请求资源使用:需要加虚拟目录(项目的访问路径)

    • 建议虚拟目录动态获取:request.getContextPath()
    • 重定向:因为是客户端请求的。
  • 2、 给服务器请求资源使用:不需要加虚拟目录

    • 转发路径:因为是服务器请求的。

十、共享数据——域对象

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:一次请求的范围,一般用于请求转发的多个资源中共享数据

1、向域对象中存储数据:
void setAttribute(String name,Object obj)
2、通过键获取值:
Object getAttitude(String name)
3、通过键移除键值对
void removeAttribute(String name):

十一、ServletContext:代表整个web应用

如何获取?

  • 通过request对象获取:request.getServletContext();
  • 通过HttpServelet获取:this.getServletContext();
    作用:
    • 1.获取MIME类型
      • 什么是MIME类型?一种互联网通信过程中定义的文件数据类型。
        格式为: 大类型/小类型
        例如:text/html、image/jpeg
        \color{red}{这种类型是在Tomcat的web.xml中定义好的,我们可以通过文件的后缀名来获取}
        context.getMimeType(String file)
    • 2.作为域对象
      因为ServletContext对象是整个web应用,所以所有的servlet资源都能访问到存在ServletContext对象中的数据,比较的不安全。
      相比request域对象的范围是一次请求经过的servlet、ServletContext的范围太大了。
      ServletContext对象的生命周期很长,从服务器启动到服务器关闭。
  • 3.获取文件的真实(服务器)路径
    在之前获取的文件都是默认在src路径下的,使用ClassLoader就能获取。
    但是ClassLoader并获取不了web路径下的文件。
    这时就需要ServletContext对象来获取了。
String b = context.getRealPath("/a.txt");//web目录下资源访问 
D:\ideaProject\basic-code\out\artifacts\Servlet_Response_war_exploded\a.txt

String c = context.getRealPath("/WEB-INF/b.txt");//WEB-INF目录下的资源访问
D:\ideaProject\basic-code\out\artifacts\Servlet_Response_war_exploded\WEB-INF\b.txt

String a = context.getRealPath("/WEB-INF/classes/c.txt");//src目录下的资源访问 
D:\ideaProject\basic-code\out\artifacts\Servlet_Response_war_exploded\WEB-INF\classes\c.txt

\color{red}{ src下的资源会被放到web/WEB-INF/classes中。}
服务器路径是:D:\ideaProject\basic-code\out\artifacts\Servlet_Response_war_exploded
(本地)工作空间路径是:D:\ideaProject\basic-code\Servlet-Response

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351