第71节:Java中HTTP和Servlet
前言
哭着也要看完!!!字数:
学习xml
和TomCat
会写xml,看懂xml解析对象SAXReader reader = new SAXReader();解析文件Document document = reader.read(...);获取根元素Element rootElement = document.getRootElement();Element element = rootElement.element("stu").element("name");String namerootElement.element("stu").element("name").getText();Listlist = rootElement.elements("stu");for(int i= 0 ; i
协议HTTP
HTTP
协议和Servlet
什么是协议,就是规则,规范,用于双方在交互,通讯的时候遵循的一种规范,规则.而http
协议是对网络上的客户端和服务端在执行http
请求的时候遵循的一种规范,其实就是规定了客户端在访问服务器端的时候,要带上一些东西,服务端返回数据的时候,也要带点东西,礼尚往来嘛!!!
http协议的版本有: "1.0" 和 "1.1"等.
"1.0"在请求数据,服务器返回后,就会断开连接.而"1.1"版本在请求数据,服务器返回后,还会保留连接,除了服务器关掉(一定时间会自动关掉).
安装抓包工具.
下载HttpWatch
http://localhost:8080/examples/servlets/复制代码
HW3001
功能请求返回HTTP
状态代码失败或导致内部浏览器错误。失败的请求可能会阻止网页正常运行并导致性能问题1发生
请求行
请求的数据包含三种: 请求头,请求行,请求体.
请求行 请求地址路径
POSTGET复制代码
Accept: 客户端向服务器表示,我能支持什么类型的数据Referer:真正请求的地址路径,全路径Accept-Language:支持语言格式User-Agent:用户代理 向服务器表明 当前来访的客户端信息Content-Type:提交的数据类型,经过urlencoding编码的form表单的数据Accept-Encoding:压缩算法Host:主机地址Content-Length:数据长度Connection:保存连接Cache-Control:对缓存的操作复制代码
浏览器发送的数据
key = value复制代码
htttp
响应
数据分析: 响应行, 响应头, 响应体
状态码:
200: 成功404: 找不到资源403: 拒绝500: 服务器异常复制代码
响应头:
Server: 服务器类型Content-Type: 服务器返回客户端的内容类型Content-Length: 返回数据长度Date: 响应时间复制代码
GET
和POST
的区别
请求路径不同,post
请求不带数据,Get
带数据. 带上的数据不同,post
会使用流方式写数据,GET
请求在地址上带数据. post
使用流写数据,所以要Content-Length
说明长度.
post数据是一流的方式写的,不会显示在地址上以流的方式写数据,所以没有大小限制复制代码
get会再地址上拼接数据数据有限制复制代码
有两种分类: 静态: html
,js
,css
动态: servlet/jsp
servlet
servlet
是什么? 其实就是一个java
程序,用于接收和响应.
创建
web
工程
测试
servlet
javax.servlet
中 接口 interface servlet
all known implementing Classes:复制代码
public interface Servlet Implemented by: FacesServlet,GenencServlet,JspPage复制代码
servlet
是用来接收和响应客户端的请求.
servlet
是运行在web
服务器中的小型java
程序,servlet
通常通过http
超文本传输协议接收和响应来自web
客户端的请求.
ctrl+t
Servlet -> GenericServletHelloServletConetProcessorJspPage复制代码
Provides an abstract class to be subclassed to createan htttp servlet suitable for a web site, a subclass of httpservlet
must override at least复制代码
// servletservletgenericservlethttpservlet复制代码
// 源码 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } }复制代码
文件目录
package com.dashucoding;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet{ @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("helloservlet"); } @Override public void destroy() { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub }}复制代码
package com.dashucoding;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class HelloServlet02 extends HttpServlet{// @Override// public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {// // TODO Auto-generated method stub// System.out.println("helloservlet02");// } //Get请求会来这个方法 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get---"); } //POST请求会来这个方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post----"); } }复制代码
// web.xml复制代码 HelloServlet index.html index.htm index.jsp default.html default.htm default.jsp Hello com.dashucoding.HelloServlet Hello /hello Hello2 com.dashucoding.HelloServlet02 Hello2 /hllo2
@Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("helloservlet"); } @Override public void destroy() { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub }// init方法在创建实例的时候就会执行的方法一个servlet只会初始化一次init方法只会执行一次默认下会初次访问该servlet时才会创建实例// service方法只要客户端发送请求就会执行的方法该方法可以执行多次,一次请求调用一次service方法// destroy方法servlet销毁的时候执行// deGet 和 doPost这两个不算生命周期方法生命周期:从对象的创建到销毁一定会执行的方法// 这两个方法不一定执行复制代码
如何让创建
servlet
的时候提前初始化
servlet生命周期复制代码
构造servlet
,然后使用init
方法进行初始化 处理来自客户端的对service
方法的调用 从服务中取出servlet
然后用destroy
方法进行销毁 最后进行垃圾回收
/** * 该servlet 用于演示servlet的生命周期调用时机 */public class HelloServlet03 implements Servlet{ //1、 //在创建该servlet的实例时,就执行该方法。 //一个servlet只会初始化一次, init方法只会执行一次 //默认情况下是 : 初次访问该servlet,才会创建实例。 @Override public void init(ServletConfig config) throws ServletException { System.out.println("HelloServlet03 初始化..."); } //2. /* * 只要客户端来了一个请求,那么就执行这个方法了。 * 该方法可以被执行很多次。 一次请求,对应一次service方法的调用 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("helloservlet03 service方法调用了"); } /** * servlet销毁的时候,就会执行该方法 * * 1. 该项目从tomcat的里面移除。 * 2. 正常关闭tomcat就会执行 shutdown.bat */ @Override public void destroy() { System.out.println("helloservlet03 destroy方法调用了"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; }}复制代码
让servlet
创建实例提前,进行初始化
load-on-startup元素来指定给的数字越小,启动的时机就越早一般从2开始复制代码
servletconfig
配置
http
协议和servlet
掌握httpwacht
后的http
背后的意思
写类,实现接口servlet配置servlet会访问servletservlet生命周期init 一次load-on-startupservice 多次destory 一次servleconfig 获取配置信息复制代码
案例:
aa com.dashu.servlet.HelloServletConfig name zhangsan age 18 address bejing... 复制代码 aa /HelloServletConfig
// 04/** * 该servlet 用于让servlet创建实例的时机提前。 */public class HelloServlet04 implements Servlet{ //1、 //在创建该servlet的实例时,就执行该方法。 //一个servlet只会初始化一次, init方法只会执行一次 //默认情况下是 : 初次访问该servlet,才会创建实例。 @Override public void init(ServletConfig config) throws ServletException { System.out.println("HelloServlet04 初始化..."); } //2. /* * 只要客户端来了一个请求,那么就执行这个方法了。 * 该方法可以被执行很多次。 一次请求,对应一次service方法的调用 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("HelloServlet04 service方法调用了"); } /** * servlet销毁的时候,就会执行该方法 * * 1. 该项目从tomcat的里面移除。 * 2. 正常关闭tomcat就会执行 shutdown.bat */ @Override public void destroy() { System.out.println("HelloServlet04 destroy方法调用了"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; }}复制代码
// servletconfigpublic class HelloServletConfig extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletConfig 可以获取servlet在配置的一些信息 //1. 得到servlet配置对象 专门用于在配置servlet的信息 ServletConfig config = getServletConfig(); //获取到的是配置servlet里面servlet-name 的文本内容 String servletName = config.getServletName(); System.out.println("servletName="+servletName); //2、。 可以获取具体的某一个参数。 String address = config.getInitParameter("address3333"); System.out.println("address="+address); //3.获取所有的参数名称 Enumerationnames = config.getInitParameterNames(); //遍历取出所有的参数名称 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); } } //来了post请求,就让它去执行doGet方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }}复制代码
HTTP
是一个属于应用层的面向对象的协议..
优点:
- 简捷
- 快速
- 适用于分布式超媒体信息系统
HTTP
协议:
客户:传送请求方法路径常用呢方法:GET、HEAD、POST复制代码
- 支持客户/服务器模式
- 简单快速
- 灵活:允许传输任意类型的数据对象
- 无连接:请求完就断看
- 无状态:
HTTP
协议是无状态协议
URL
超文本传输协议是http
一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP
的连接方式.
1.1版本的是支持持续连接的机制
URL
是一种特殊类型的URI
http
要通过HTTP
协议来定位网络资源 host
合法的Internet
主机域名或者IP
地址 port
指端口号 abs_path
指定请求资源的URI
1xx:表示请求已接收2xx:成功3xx:重定向--必须进行更进一步的操作4xx:客户端错误5xx:服务器端错误复制代码
200 OK //客户端请求成功400 Bad Request //不能被服务器所理解401 Unauthorized //请求未经授权403 Forbidden //服务器收到请求,拒绝提供服务404 Not Found //请求资源不存在500 Internal Server Error //服务器发生错误503 Server Unavailable //服务器当前不能处理客户端的请求复制代码
Dom4j //1. 构建解析对象 SAXReader reader = new SAXReader(); //2. 指定到底解析谁。 文件 Document document = reader.read(path|file|inputStream); //3. 获取根元素 Element rootElement = document.getRootElement(); //获取根元素下的子元素 ,元素名称 : stu Element element = rootElement.element("stu").element("name"); String namerootElement.element("stu").element("name").getText(); //maplist set //获取根元素下的所有stu元素 List list = rootElement.elements("stu"); for(int i= 0 ; i
如果看了觉得不错
点赞!转发!
达叔小生:往后余生,唯独有你 You and me, we are family ! 90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通 简书博客: 达叔小生
结语
- 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
- 小礼物走一走 or 点赞