22-05-19 西安 javaweb(04) xml、DOM4J,Xpath、 tomcat应用服务器、HTTP协议
初识XML
xml: eXtensible Markup Language 可扩展标记语言
xml文件声明
版本号以及文档的字符编码 ,每一个xml配置文件都要有。也可以不写,因为每一个xml文件都有,不写的话默认有。
<?xml version="1.0" encoding="UTF-8"?>
注意:xml文件的声明只能出现在第一行,第一列。就连第一行是注释都不行
xml标签内容
xml标签里面的内容随便写,所以叫可扩展!xml可扩展表现在:它可以作为各种框架的配置文件。如下是springmvc的servlet的配置文件
<servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class></servlet><servlet-mapping><servlet-name>springMVC</servlet-name><!--设置springMVC的核心控制器所能处理的请求的请求路径/所匹配的请求可以是/login或.html或.js或.css方式的请求路径但是/不能匹配.jsp请求路径的请求--><url-pattern>/</url-pattern></servlet-mapping>
cdata区和xml转义字符
①CDATA区
c-data 区写的东西会原样解析 CD【idea快捷键】
<![CDATA[]]>
②转义字符
5个特殊字符所对应XML转义序列为:
& &
< <
> >
" "
' '
xml和html的区别
- html标签是提前定义好的,html是浏览器解析的,作用是展示数据
- xml标签需要我们自定义,是我们自己来解析的。作用是存储数据
xml语法比html更为严格:
1、xml文件的声明只能出现在第一行,第一列。注释都不行
2、xml中,根标签有且只能有一个,xml是我们自己去解析的
3、也分为双标签和单标签,xml标签可以嵌套,但不能交叉嵌套,xml标签区分大小写,html不区分大小写。
4、xml中注释不能嵌套 <!-- <!-- --> -->
5、xml标签名,属性名用小写,属性必须有值,属性和值之间使用=连接,必须用单引号或双引号括起来
xml约束
由于xml的标签由用户自己定义,这样导致项目中的xml难以维护,因此需要使用一定的规范机制来约束xml文件中的标签书写。
- DTD约束: mybatis,.dtd文件
- Schema约束:spring,springmvc,web.xml
如下是springmvc的web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"></web-app>
如下是mybatis的mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration></configuration>
引入约束之后,在写标签时会给我们提示,如在web.xml中:
DOM4J解析
dom4j:性能优异、灵活性好、功能强大和极端易用的特点。Hibernate也用DOM4J来读取XML配置文件
需要导入jar包,创建lib目录和src一级
或者在maven项目引入依赖
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version> </dependency> <dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.2.0</version> </dependency>
创建student.xml
如下:student.xml,我把它放在类路径下,这里是maven的resource目录下,也可以直接放在src目录
使用Java程序去解析这里面的存储的内容
<?xml version="1.0" encoding="UTF-8"?>
<student><studentInfo><id>1001</id><name>张三</name><gender>男</gender></studentInfo><studentInfo><id>1002</id><name>李四</name><gender>女</gender></studentInfo>
</student>
使用dom4j读取xml
java程序如下:
read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就带表了整个XML。
public class XMLParse {public static void main(String[] args) throws DocumentException {InputStream path = Thread.currentThread().getContextClassLoader().getResourceAsStream("student.xml");//创建SAXReader对象SAXReader saxReader = new SAXReader();//读取xml文件Document document = saxReader.read(path);//获取根标签Element rootElement = document.getRootElement();//获取子标签集合 List <studentInfo>List elements = rootElement.elements();for (Object o : elements) {Element element = (Element) o;//获取<studentInfo>标签中的子标签 <id> <name> <gender>Element idElement = element.element("id");Element nameElement = element.element("name");Element genderElement = element.element("gender");//获取子标签中的内容String id = idElement.getText();String name = nameElement.getText();String gender = genderElement.getText();System.out.println("id=" + id + ",name=" + name + ",gender=" + gender);}}
}
元素迭代elementIterator()
拥有了一个Element对象后,可以对该对象调用elementIterator()方法获得它的子节点的Element对象们的一个迭代器。使用(Element)iterator.next()方法遍历一个iterator并把每个取出的元素转化为Element类型。
public class XMLParse {public static void main(String[] args) throws DocumentException {InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("student.xml");//创建SAXReader对象SAXReader saxReader = new SAXReader();//读取xml文件Document document = saxReader.read(in);//获取根节点Element rootElement = document.getRootElement();for (Iterator i = rootElement.elementIterator(); i.hasNext();) {//取得某节点的单个子节点Element el = ((Element) i.next()).element("id");//取得节点的文字System.out.println("id标签内容:"+el.getText());}}
}
属性迭代 attributeIterator()
//获取根节点Element rootElement = document.getRootElement();// 迭代root元素的所有属性for (Iterator i = rootElement.attributeIterator(); i.hasNext(); ) {Attribute attribute = (Attribute) i.next();System.out.println(attribute.getName() + ":" + attribute.getValue());}
运行效果
删除结点
在dom4j中,只有父节点能删除直接子节点,并不能使用整个文档对象或者某个总节点来删除孙子节点。
idEle.getParent().remove(idEle);
//元素迭代for (Iterator i = rootElement.elementIterator(); i.hasNext();) {//取得某节点的单个子节点Element StuEle = (Element) i.next();if(StuEle.attributeValue("name").equals("stu1")){Element idEle = StuEle.element("id");//只有父节点能删除直接子节点idEle.getParent().remove(idEle);break;}}//将文档写入XML文件(更加美观的排版)OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8"); // 指定XML编码XMLWriter writer = new XMLWriter(new FileWriter(path),format);writer.write(document);writer.close();
代码运行后,标签就被删除了
java代码来生成xml
再来学习一下,怎么用java代码来创建xml吧。
public class XMLGenerate {public static void main(String[] args) throws DocumentException, IOException {Document document = DocumentHelper.createDocument();//创建一个标签Element rootElement = document.addElement("novel");//设置根标签document.setRootElement(rootElement);//设置子标签//小说名字Element nameElement = rootElement.addElement("name");nameElement.setText("开局签到荒古圣体");//小说主角Element leadRoleElement = rootElement.addElement("lead-role");leadRoleElement.setText("君逍遥");//小说作者Element authorElement = rootElement.addElement("author");authorElement.setText("J神");//设置节点的属性和文字authorElement.addAttribute("name", "san");///打印到控制台 ///输出格式化: OutputFormat(“缩进”,“换行”)OutputFormat outputFormat = new OutputFormat(" ", true);XMLWriter xmlWriter = new XMLWriter(outputFormat);xmlWriter.write(document);xmlWriter.close();//将文档写入XML文件OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("UTF-8"); // 指定XML编码XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);writer.write(document);writer.close();}
}
运行结果会打印在控制台
运行结果会生成output.xml
XML解析
xml解析:获取xml存储的数据
DOM 解析
封装所有xml内容为document对象。一次性全部读到了内存将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。
DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的
DOM的弊端
1.由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。
2.对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高
SAX解析:逐行读取,读一行释放一行,占内存小,效率低。
这种解析方式好像不受待见,以后在补充吧
Xpath
Xpath在dom4j基础上的简化,是读的功能,所以要同时引入这俩个jar包才行
novel.xml内容如下
<?xml version="1.0" encoding="UTF-8"?><novel><explain><name>开局签到荒古圣体</name><lead-role>君逍遥</lead-role><author>J神</author></explain><explain><name>我真不是隐世高手</name><lead-role>李凡</lead-role><author>归心</author></explain><explain><name>我在精神病院斩神</name><lead-role>林七夜</lead-role><author>三九音域</author></explain>
</novel>
Xpath中表达式的语法:
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集.
获取三本小说的名字
- 表达式匹配多个标签 document.selectNodes()
- 表达式匹配单个标签 document.selectSingleNode()
public static void main(String[] args) throws IOException, DocumentException {//创建SAXReader对象SAXReader saxReader = new SAXReader();//读取xml文件Document document = saxReader.read("day05_web/src/novel.xml");//通过xpath表达式获取指定节点,获取三本小说的名字List list = document.selectNodes("/novel/explain/name");for (Object o : list) {Node node = (Node) o;System.out.println(node.getText());}
}
Tomcat 应用服务器
为什么使用tomcat
tomcat用来管理web应用,叫应用服务器,tomcat本身也是java工程
为什么要使用tomcat 为了达到资源共享。
在静态web,俩种访问方式
一种是找到文件的磁盘路径,一种是直接点击右上角的浏览器图标
直接点击的话,有一个问题,63342是idea端口。
解决办法:tomcat
使用网络编程三要素:协议,ip,端口号
通过网络编程,在网络里访问服务器的资源了。
Tomcat的作用是作为Web服务器部署Web项目,从而让客户端能够访问
1.web服务器,web应用部署到tomcat,就可以通过url访问.
2. tomcat能管理servlet类 ,servlet类创建和销毁我们都不管。
tomcat 5个目录的作用
tomcat 解压后一定要放在没有中文,没有空格的目录。
- bin目录:启动startup.bat和停止tomcat
- lib目录:jar包,因为tomcat本身也是Java工程
1.webapps目录 web应用部署后都在,webapps里放着呢
在tomcat如何部署一个web项目,只要把war包扔到webapps中,在启动tomcat时会被解压。
部署后怎么访问:
localhost:8080 //8080是tomcat的默认端口号
localhost:8080 /工程名(war包名)
2.work目录中放的是tomcat工作过程动态生成的文件
2.1 jsp翻译成的servlet【jsp本质是一个servlet】
2.2 session的钝化文件
3.conf目录下:改了配置文件要重启tomcat
3.1 server.xml 用来配置tomcat本身的配置信息,就只需要知道一个地方,69行左右,设置当前的端口号。
3.2 web.xml 用来配置部署到tomcat的web应用
此处的web.xml 作用于部署到tomcat所有的web应用
当前web应用里也有web.xml,只作用于当前工程本身,俩个web.xml上有逻辑继承关系,配置有冲突时以它自己的为准【范围小的为准】比如说:欢迎页。访问工程的时候默认的访问地址就是欢迎页
tomcat 优化
tomcat最大线程
Tomcat使用线程来处理接收的每个请求。Tomcat最大线程连接数默认值200。
需要修改conf/server.xml文件,修改里面的配置文件: maxThreads=””
可以根据机器的时期性能和内存大小调整,一般 可以在400-500。最大可以在800左右
idea中集成tomcat
settings-build-applications servers-tocatserver-选择tomcat home[就是解压后的目录]
创建web应用
方式一:new moudle--java--web application--[和你的tomcat没有任何关系] 之后需要可以自己创建一个tomcat实例。不推荐
方式二:new moudle--java enterprise--web application【勾选create web.xml】-[工程会自动部署到tomcat]
之后还要改
Deployment 下的上下文路径【改】,通过它来访问部署到tomcat的wen应用。
建议改掉tomcat实例名,建议和工程名一致
1.redeploy 重新部署web应用,只部署更新后的,tomcat不需要重启,
改的是类和配置文件有效,点击左下方的刷新按钮,是update。【dont ask again】
2.update 当前窗口idea失去焦点,自动更新类和资源。【alt+tab】,
只适合改的是静态资源,改的是类和配置文件
HTTP协议 超文本传输协议
协议就是规定,http就是应用层的协议,规定浏览器和服务器之间的数据交互必须以报文的格式!
数据传输层是规定数据如何传输的,如TCP、UDP
HTTP报文
HTTP报文的格式
报文头部(键值对形式)
报文空行、
报文体(get请求没有请求体,post请求才有请求体)
请求头有三个部分要注意:
User-Agent | 浏览器的信息 |
Referer | 当前请求来源页面的地址(从哪个页面跳来的) |
Cookie | 浏览器访问服务器时携带的Cookie数据 |
post请求:请求参数放在请求体中,请求体发送数据的大小没有限制,在浏览器地址栏看不到。
get请求:没有请求体,请求参数附着在URL地址后面,数据容量非常有限
响应报文 响应状态码
作用:以编码的形式告诉浏览器当前请求处理的结果
状态码 | 含义 |
---|---|
200 | 服务器成功处理了当前请求,成功返回响应 |
302 | 重定向 |
400 | [SpringMVC特定环境]请求参数问题 |
403 | 没有权限 |
404 | 找不到目标资源 |
405 | 请求方式和服务器端对应的处理方式不一致 |
406 | [SpringMVC特定环境]请求扩展名和实际返回的响应体类型不一致 |
50X | 服务器端内部错误,通常都是服务器端抛异常了 |
22-05-19 西安 javaweb(04) xml、DOM4J,Xpath、 tomcat应用服务器、HTTP协议相关推荐
- javaweb(04) xml
javaweb(04) xml xml简介 什么是xml xml(eXtensible Markup Language) 是可扩展的标记性语言.xml的使命,就是以一个统一的格式,组织有关系的数据,为 ...
- xml+dom4j+xpath学生管理系统
<?xml version="1.0" encoding="UTF-8"?><student> <stu> <name ...
- 【跃迁之路】【468天】程序员高效学习方法论探索系列(实验阶段225-2018.05.19)...
@(跃迁之路)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. ...
- Secure Access Service Edge Experience Kit 22.05 版本发布
SecureAccess Service Edge Experience Kit Release 22.05 简介 Intel® Smart Edge Open即开放式网络边缘服务软件,是一套基于K ...
- JavaWeb(5)——XML Tomcat
目录 前置工作 创建一个javaweb5的Moudle模块 XML 什么是 xml? xml 语法 xml入门 创建一个xml文件,来描述图书信息 xml 注释 元素(标签) xml 属性 xml语法 ...
- LINQ之路19:LINQ to XML之X-DOM更新、和Value属性交互
本篇包含两部分内容:X-DOM更新一节中我们会详细讨论LINQ to XML的更新方式,包括Value的更新.子节点和属性的更新.通过Parent节点实现更新: 和Value属性交互一节会详细讨论XE ...
- linux mint 18.3浏览器,在Linux Mint 19/Ubuntu 18.04中安装Tor Browser浏览器的方法
本文介绍在Linux Mint 19/Ubuntu 18.04系统中安装Tor Browser浏览器的方法,本文不使用Tor的默认Ubuntu存储库,因为它们包含旧版本的Tor. 一.添加Tor存储库 ...
- XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML
XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...
- matlab算原函数,matlab中原函数如何求解其中f(x)的导数为(22.05/x)的平方减1再开根号...
答:%y'=sqrt((22.05/x)^2-1) syms x y y=dsolve('Dy=sqrt((22.05/x)^2-1)') 结果: y = C5 + t*(-(400*x^2 - 19 ...
最新文章
- 《JavaScript入门经典(第6版)》——2.7 问答
- 数仓 调度_网易实时数仓实践
- Unsafe类方法详解
- linux ulimit 永久生效设置方法
- HB-X打不开的解决办法
- php的declare,php 中的declare
- TTL怎么计算拉电流和灌电流_带你深入了解灌电流、拉电流与吸电流
- 利用Relations实现多DataTable的聚合
- Linux 0.11内核分析02:系统启动
- DockOne微信分享(七十七):用Harbor实现容器镜像仓库的管理和运维
- linux shell $#获取所有参数的个数 $@获取所有参数
- php文字音频插件下载安装,Goodhertz音频插件下载
- pdf文档怎样转换成word文档?2022pdf转word软件推荐
- 买到山寨版康师傅绿茶的后果
- Centos设置开机自动启动
- 原创|分享2个赚零花钱的小技巧
- Bandizip去除广告,注册图标,状态栏文本
- DSP快速复盘——时钟系统总结(基本知识+核心代码)基于TMS2802x处理器
- 数据库电话号码查询显示中间四位用****代替的SQL语句
- 想考阿里云acp证书,报哪个机构好?