# JavaWebServlet **Repository Path**: fowner/java-web-servlet ## Basic Information - **Project Name**: JavaWebServlet - **Description**: 重新系统学习JavaWeb基础之Servlet - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-11-06 - **Last Updated**: 2022-06-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Servlet技术 ## servlet概述 + Servlet是javaEE规范(即接口)之一。 + Servlet是JavaWeb三大组件之一。 + Servlet是运行在服务器上的一个Java小程序。 ## 如何手动实现Servlet程序 + 编写一个类实现Servlet接口。 + 实现service方法,处理请求,并响应数据。 + 到web.xml中去配置Servlet程序的访问地址。 ## Servlet生命周期 1. 执行Servlet构造器 第一次请求的时候,被执行。以后再次请求不执行。 2. 执行init初始化方法 第一次请求的时候,被执行。以后再次请求不执行。 3. 执行servlce方法 每次访问都会被执行。 4. 执行destroy方法 在Web工程停止的时候执行。 ## Get请求方式和Post请求方式的分发处理(实现servlet接口情况下) 1. 将ServletRequest对象进行类型进行类型转换(HttpServletRequest) 2. 通过强转后的对象获取请求方式 3. 对请求方式进行判断分别处理即可。 ## 通过继承HttpServlet类的方式实现Servlet程序 注意: 一般在开发中通常使用这种方式,去实现servlet程序。 1. 编写一个类继承HttpServlet类。 2. 根据业务需要重写doGet方法或者doPost方法。 3. 到web.xml中配置servlet程序访问地址。 ## 也可以通过IDEA(非交流版)直接创建servlet(是以继承HttpServlet方式创建的) ## Servlet继承体系 详见servlet学习.drawio笔记 ## ServletConfig类 ``` ServletConfig类是servlet的配置信息。 servlet程序和servletConfig对象都是有tomcat服务器进行创建,我们负责使用。 Servlet程序默认是第一次访问的时候创建。servletConfig对象是每一个servlet程序创建的时候对应的一个配置文件。 ``` ### ServletConfig类三大作用 + 可以获取Servlet程序别名,即servlet-name的值。 + 获取初始化参数值,即init-param。 + 获取ServletContext对象 ``` 注意: 1.只能获取当前servlet的以上信息,不能获取其他servlet的信息。 2.当对通过继承HttpServlet方法实现Servlet程序时,并对init方法进行了重写,那么在init方法必须调用super.init()方法。否则当想获取不到servletConfig信息。 ``` ## ServletContext类 ### ServletContext概述 + ServletContext是一个接口,它是上下文对象。 + 一个web工程只有一个servletContxt对象实例。 + servletContext是一个域对象。 + ServletContext在Web工程启动的时候执行,工程停止的时候销毁。 ``` 补充: 1.什么是域对象? 域对象是一个可以像map一样存取数据的对象。 这里的域指存取数据的操作范围。范围是整个工程。 2. ``` Map和域对象操作方式一览 Map/域对象 | 存数据 | 取数据 | 删除数据 ---|---|---|--- Map | put("") | get("") | remove("") 域对象 | setAttribute("") | getAttribute("") | removeAttribute("") ### ServletContext类的四个作用 + 获取web.xml配置文件中上下文参数context-param + 获取当前工程路径。格式:/工程路径 + 获取工程部署后在服务器硬盘的绝对路径。 + 像map一样存取数据。 ## Http协议 ### Http协议概述 ``` 什么叫协议? 指双方或者多方需要遵守的规则,即协议。 什么是Http协议? 所谓的Http就是,客户端和服务端之间通信时,发送的数据需要遵守的规则。Http协议中的数据又叫报文。 ``` ### 请求的Http协议 ``` 客户端给服务端发送数据叫请求。 服务端给客户端发送数据叫响应。 请求又分为Get请求和Post请求。 ``` #### Get请求 1. 请求行 + 请求的方式 GET + 请求的资源路径[+?+请求参数] 注:[]部分是可选的 + 请求协议版本 http/1.1 2. 请求头 key:value组成。不同的键值对表示不同的含义。 常用的请求头 Accept:告诉服务器,客户端可以接收口的数据类型。 Accept-Language:告诉服务器可以接受的语言类型。 User-Agent:浏览器信息。 Accept-Encoding:告诉服务器客户端可以接受的数据编码类型。 Host:表示请求的服务器iphe端口号。 Connection:告诉服务器请求连接如何处理。 Keep-Active:告诉服务器传回数据不立刻关闭。 Closed:马上关闭。 #### Post请求 1. 请求行 + 请求的方式 POST + 请求的资源路径[+?+请求参数] 注:[]部分是可选的 + 请求协议版本 http/1.1 2. 请求头 key:value组成。不同的键值对表示不同的含义。 3. 空行 4. 请求体 发送给服务器的数据。 Accept:告诉服务器,客户端可以接收口的数据类型。 Accept-Language:告诉服务器可以接受的语言类型。 User-Agent:浏览器信息。 Accept-Encoding:告诉服务器客户端可以接受的数据编码类型。 Host:表示请求的服务器iphe端口号。 Connection:告诉服务器请求连接如何处理。 Keep-Active:告诉服务器传回数据不立刻关闭。 Closed:马上关闭。 Referer:表示请求发起时,浏览器地址栏中的地址。 Content-Type:表示发送的数据类型。 application/x-www-form-urlencoded:表示提交的数据是:key1=value1&key2=value2,然后对其进行url编码。 url编码是指把非英文内容转换为:%xx%xx multipart/form-data:表示已多端的形式提交给服务器。(以流的形式,用于上传) Content-Length:表示发送数据的长度。 Cache-Control:表示如何控制缓存。 no-cache:表示不缓存。 #### 常用的请求头 Accept:告诉服务器,客户端可以接收口的数据类型。 Accept-Language:告诉服务器可以接受的语言类型。 User-Agent:浏览器信息。 Host:表示请求的服务器iphe端口号。 #### 哪些是Get请求,哪些是POST请求 + Get请求有哪些? + form标签method=get + a标签 + link标签引入css + Scrript标签引入js文件 + img标签引入图片 + iframe引入html页面 + 在浏览器中输入地址后敲击回车 + Post请求有哪些? + form标签method=post ### 响应Http协议格式 1. 响应行 + 响应协议和版本号 + 响应状态码 + 响应状态描述符 2. 响应头 + key:value 不同的响应头有不同的含义。 3. 空行 4. 响应体 + 回传给客户端的数据 ### 常用的响应码 + 200 表示请求成功 + 302 表示请求重定向 + 404 表示请求服务器已经收到,但是数据不存在。(请求地址不存在) + 500 表示服务器已经收到请求,只是服务器代码或者内部错误。 ### MIME类型说明 ``` MIME是HTTP协议中数据类型。 全称是Multipurpose Internet Mail Extentions。多功能网络邮件扩充服务。 MIME类型的格式: 大类型/小类型 并与一种文件的扩展名对应。 ``` 常用的MIME类型 文件 | 文件扩展名 | MIME类型 ---|---|--- 超文本标记文本 | .html/.htm | text/html 普通文本 | .txt | text/plain RTF文本 | .rtf | application/rtf GIF图片 | .gif | image/gif JEPG图片 | .jepg/.jpg | image/jpeg au声音文件 | .au | audio/basic MIDI音乐文件 | .mid/.midi | audio/midi,audio/x-midi RealAudio音乐文件 | .ra/.ram | audio/x-pn-realaudio MPEG文件 | .mpg/.mpeg | video/mpeg AVI文件 | .avi | video/x-msvideo GZIP文件 | .gz | application/x-gzip TAR文件 | .tar | application/x-tar ## HttpServletRequest类 ### HttpServletRequest类的作用 ``` 每次只要请求进入到服务器(Tomcat等),服务器就会把请求的信息封装到request中去,然后传递到service方法中去给我们使用。我们可以通过HttpServletRequest获取所有的请求信息。 ``` ### HttpServletRequest类的常用API方法 + getRequestURI() 获取请求的资源路径 + getRequestURL() 获取请求的统一资源定位符(绝对路径) + getRemoteHost() 获取客户端的ip地址 + getHeader(key) 获取请求头 + getParameter(key) 获取请求参数 + getParameterValues(key) 获取请求参数的值 + getMethod() 获取请求方法 + setAttribute(key,value) 设置域数据 + getAttribute(key) 获取域数据 + getRequestDispatcher() 获取请求转发对象 ### 请求转发 ``` 什么是请求转发? 请求转发是指当服务器收到请求后,从一个资源跳转到另一个资源的过程。 ``` 请求转发特点 + 浏览器地址栏没有变化 + 它们是一次请求 + 它们可以共享域数据 + 可以转发到web-inf目录下 + 不可以访问到工程以外的目录 ### Base标签的作用 ``` base标签解决了,请求转发跳转后,返回请求转发之前页面的访问路径的问题。 ``` ### Web工程中的绝对路径和相对路径 + 相对路径 + .表示当前路径 + ..表示上一级目录 + 资源名 表示当前目录/资源名 + 绝对路径 http://ip:port/工程路径/资源路径 ### Web项目中 / 的不同意义 ``` 在web中是一种绝对路径,在不同的地方值不同。 ``` + 被浏览器解析 + 表示 http://ip地址:端口号/ + 例 ```斜杠``` + 被服务器解析 + 表示 http://IP地址:端口号/工程路径/ + 例 1. web.xml中servlet-mapping标签配置的url-pattern。 ``` ForwardC /forwardc ``` 2. servletContext.getRealPath("/") 3. request.getRequestDispatcher("/") + 特殊情况 + 表示 把斜杠转发给浏览器解析。 + 例 response.sendRedirect("/") ## HttpServletResponse类 ### HttpServletResponse类的作用 ``` HttpServletResponse和HttpServletRequest一样,每次请求进来,服务器都会创建一个response对象传给servlet程序使用。只是HttpServletRequest表示请求来的信息,HttpServletResponse表示响应的信息。 ``` ### 两个输出流 + 字节流 getOuputStream() 常用于下载,传递二进制文件。 + 字符流 getWriter() 常用于回传字符串 ``` 两个流只能使用一个,使用了字节流,就不能使用字符流。反之亦然。否则报错。 ``` ### 往客户端回传数据 ``` 通过输出流进行数据的回传。 PrintWriter printWriter = resp.getWriter(); printWriter.println("this is OK!"); printWriter.println("测试中文乱码:我爱你中国!"); ``` ### 中文乱码解决 ### 方案1 1. 设置服务端的字符集 resp.setCharacterEncoding("UTF-8"); 2. 设置浏览器的字符集 resp.setHeader("Content-Type","text/html;charset=UTF-8"); ### 方案2 同时设定服务端的字符集和客户端的字符集 resp.setContentType("text/html;charset=UTF-8"); ### 请求重定向 ``` 当客户端向服务器进行请求的时候,服务器告诉客户端,自己的地址变更了。你去新地址进行访问。这就叫做重定向。 ``` #### 请求重定向的两种方式 + 方式1 + 设定状态码为302 ``` resp.setStatus(302); ``` + 设定重定向的地址Location的值 ``` resp.setHeader("Location","http://www.baidu.com"); ``` + 方式2 下面的代码 ``` resp.sendRedirect("http://www.baidu.com"); ```