第71节:Java中HTTP和Servlet
第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();
List<Element> list = rootElement.elements("stu");
for(int i= 0 ; i<list.size ; i++){
Element element = list.get(i);
element.getText();
}
rootElement.selectNodes("//stu");
rootElement.selectSingleNode("//stu");
协议HTTP
HTTP
协议和Servlet
什么是协议,就是规则,规范,用于双方在交互,通讯的时候遵循的一种规范,规则.而http
协议是对网络上的客户端和服务端在执行http
请求的时候遵循的一种规范,其实就是规定了客户端在访问服务器端的时候,要带上一些东西,服务端返回数据的时候,也要带点东西,礼尚往来嘛!!!
http协议的版本有: "1.0" 和 "1.1"等.
"1.0"在请求数据,服务器返回后,就会断开连接.而"1.1"版本在请求数据,服务器返回后,还会保留连接,除了服务器关掉(一定时间会自动关掉).
安装抓包工具.
下载HttpWatch
http://localhost:8080/examples/servlets/
HW3001
功能请求返回HTTP
状态代码失败或导致内部浏览器错误。失败的请求可能会阻止网页正常运行并导致性能问题1发生
请求行
请求的数据包含三种:
请求头,请求行,请求体.
请求行 请求地址路径
POST
GET
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 ->
GenericServlet
HelloServlet
ConetProcessor
JspPage
Provides an abstract class to be subclassed to create
an htttp servlet suitable for a web site, a subclass of
<code> httpservlet </code> must override at least
// servlet
servlet
genericservlet
httpservlet
// 源码
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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>HelloServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.dashucoding.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Hello2</servlet-name>
<servlet-class>com.dashucoding.HelloServlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello2</servlet-name>
<url-pattern>/hllo2</url-pattern>
</servlet-mapping>
</web-app>
@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
会访问servlet
servlet生命周期
init 一次
load-on-startup
service 多次
destory 一次
servleconfig 获取配置信息
案例:
<servlet>
<servlet-name>aa</servlet-name>
<servlet-class>com.dashu.servlet.HelloServletConfig</servlet-class>
<!-- 可以添加初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>18</param-value>
</init-param>
<init-param>
<param-name>address</param-name>
<param-value>bejing...</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>aa</servlet-name>
<url-pattern>/HelloServletConfig</url-pattern>
</servlet-mapping>
// 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;
}
}
// servletconfig
public 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<String> 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
是一个属于应用层的面向对象的协议..
优点:
- 简捷
- 快速
- 适用于分布式超媒体信息系统
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();
//map<key ,value> list set
//获取根元素下的所有stu元素
List<Element> list = rootElement.elements("stu");
for(int i= 0 ; i<list.size ; i++){
//这里是遍历出来了根标签下的所有子标签 stu
Element element = list.get(i);
element.getText();
}
Xpath : 快速的定位到具体的元素 path --路径
//dom4j 支持xPath的方法有哪些。
//2. 指定到底解析谁。 文件
Document document = reader.read(path|file|inputStream);
//3. 获取根元素
Element rootElement = document.getRootElement();
Element这种类型的对象
但是定义这个selectNodes的方法是定义在一个接口中 Node
rootElement.selectNodes("//stu");
//获取文档中第一个出现的stu
rootElement.selectSingleNode("//stu")
如果看了觉得不错
点赞!转发!
达叔小生:往后余生,唯独有你
You and me, we are family !
90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
简书博客: 达叔小生
https://www.jianshu.com/u/c785ece603d1
结语
- 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
- 小礼物走一走 or 点赞
第71节:Java中HTTP和Servlet的更多相关文章
- 第83节:Java中的学生管理系统分页功能
第83节:Java中的学生管理系统分页功能 分页功能一般可以做成两种,一种是物理分页,另一种是逻辑分页.这两种功能是有各自的特点的,物理分页是查询的时候,对数据库进行访问,只是查一页数据就进行返回,其 ...
- 第82节:Java中的学生管理系统
第82节:Java中的学生管理系统 学生管理系统的删除功能 删除,点击超链接,点击弹出对话框式是否进行删除,如果确定,就删除,超链接执行的是js方法,在js里访问,跳转servlet,,servlet ...
- 第80节:Java中的MVC设计模式
第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...
- 第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...
- 第79节:Java中一些要点
第79节:Java中一些要点 前言 一些知识点忘了没,可以通过一个点引出什么内容呢?做出自己的思维导图,看看自己到了哪一步了呢 内容 如果有人问jre,jdk,jvm是什么,你怎么回答呢? jre的英 ...
- 第78节:Java中的网络编程(上)
第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...
- 第76节:Java中的基础知识
第76节:Java中的基础知识 设置环境,安装操作系统,安装备份,就是镜像,jdk配置环境,eclipse下载解压即可使用,下载tomcat 折佣动态代理解决网站的字符集编码问题 使用request. ...
- 第70节:Java中xml和tomcat
第70节:Java中xml和tomcat 前言: 哭着也要看完,字数: jdbc crud - statement dao java.sql.Driver The interface that eve ...
- 第69节:Java中数据库的多表操作
第69节:Java中数据库的多表操作 前言 学习数据库的多表操作,去电商行业做项目吧!!! 达叔,理工男,简书作者&全栈工程师,感性理性兼备的写作者,个人独立开发者,我相信你也可以!阅读他的文 ...
随机推荐
- Java多线程中static变量的使用
轉:https://blog.csdn.net/yy304935305/article/details/52456771 鲁迅先生曾说过:“时间就像海绵里的水,只要愿挤,总还是有的”.不管肿(怎)么说 ...
- 博客三--tensorflow的队列及线程基本操作
连接我的开源中国账号:https://my.oschina.net/u/3770644/blog/3036960查询
- 微信小程序 - 曲线图
最近要做微信小程序,项目中需要曲线图显示数据,所以在网上看了一下找了很久都没有找到一个,不知道是我查找的姿势不对,还是什么的.所以就自己做了一个曲线图,现在分享给大家. wxml代码: <can ...
- 在anguler项目中引用fullCalendar
1.css文件引用 <link href="/CSS/Fullcalendar.css" rel="stylesheet" /> <!--插件 ...
- pycharm汉化(3.6版本)
step 1:下载pycharm汉化包 链接:https://pan.baidu.com/s/1htgcbZY 密码:8uia step 2:将pycharm安装目录下的lib文件夹内下的resou ...
- H5新特性-canvas绘图--渐变对象路径(最复杂)--图片--变形操作
今天的目标 3.1:canvas绘图--(重点掌握:渐变对象.路径.图片.变形) 3.2:canvas绘图--渐变对象 线性渐变: linearGradient 径向渐变: var g = ctx.c ...
- a,b值进行交换的方法
方法一 最容易想到的就是拿一个空“杯子”进行转换,代码如下: <script type="text/javascript"> ; ; var c; c = a; a = ...
- 82、iOS 基本算法
“冒泡排序.选择排序.快速排序.归并排序.逆序.二分查找.求两个整数的最大公约数和最小公倍数.” 一.冒泡排序 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的 ...
- python3 爬取搜狗微信的文章
目标地址:http://weixin.sogou.com/weixin? 这个地址是搜狗微信的文章搜索,可以搜索到微信的文章,而我们目标就是这些文章内容 这个url经过测试,当我们没登陆微信只能看到1 ...
- android各种笔记
一.生成key http://blog.csdn.net/anyanyan07/article/details/53493785 二.mac os项目变大 删除 项目中app->build文件夹 ...