博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第71节:Java中HTTP和Servlet
阅读量:6850 次
发布时间:2019-06-26

本文共 12279 字,大约阅读时间需要 40 分钟。

第71节:Java中HTTP和Servlet

前言

哭着也要看完!!!字数:

学习xmlTomCat

会写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();List
list = 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: 响应时间复制代码

GETPOST的区别

请求路径不同,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.获取所有的参数名称		Enumeration
names = 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是一个属于应用层的面向对象的协议..

优点:

  1. 简捷
  2. 快速
  3. 适用于分布式超媒体信息系统

HTTP协议:

客户:传送请求方法路径常用呢方法:GET、HEAD、POST复制代码
  1. 支持客户/服务器模式
  2. 简单快速
  3. 灵活:允许传输任意类型的数据对象
  4. 无连接:请求完就断看
  5. 无状态: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();						//map
list set //获取根元素下的所有stu元素 List
list = rootElement.elements("stu"); for(int i= 0 ; i

如果看了觉得不错

点赞!转发!

达叔小生:往后余生,唯独有你 You and me, we are family ! 90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通 简书博客: 达叔小生

结语

  • 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞

转载地址:http://wsvul.baihongyu.com/

你可能感兴趣的文章
UIView 的 alpha,hidden,opaque 属性之间的关系影响 图层混用
查看>>
关于runtime的一些补充
查看>>
【Linux】操作系统
查看>>
如何使用zabbix初级监控
查看>>
TPC-H Q1 测试显示 PgSQL 11 JIT 带来 30% 性能提升
查看>>
Confluence 6 使用 LDAP 授权连接一个内部目录 - 成员 Schema 设置
查看>>
如何编写linux下nand flash驱动-4
查看>>
poj-1146 ID codes
查看>>
查看Java的汇编指令
查看>>
【亲测有效】无法定位链接器!请检查 tools\link.ini 中的配置是否正确的解决方案...
查看>>
2018-08-31
查看>>
Zookeeper的集群配置和Java测试程序
查看>>
求浮点数的整数次幂
查看>>
请求https错误: unable to find valid certification path to requested target
查看>>
从零开始撸一个Fresco之总结
查看>>
[python skill]Python 中 NaN 和 None 的详细比较
查看>>
「架构技术专题」作为java程序员的你还不知道网站架构的演化(2)?
查看>>
业界 | Nature:AI为什么总是歧视重重?
查看>>
9- Flask构建弹幕微电影网站-后台逻辑(一)
查看>>
Linux_服务器_03_xxx is not in the sudoers file.This incident will be reported.的解决方法
查看>>