前言:
承接前面的内容,继续来学习javaweb
XML
以前我写过一篇关于xml的简单了解,有兴趣的同学可以先去看看那个
什么是xml:
xml是可扩展性标记语言
xml的发展与html
html和xml都有一个共同的父亲——W3C(万维网联盟:World Wide Web Consortium)
早年期间,由于各个浏览器的恶性竞争(攀比着“解析错误html”的能力),导致HTML语法非常松散。
W3C组织觉得html语法过于松散,于是想要放弃html,于是发明出来了xml,用严格的语法取代html。
可惜大家都喜欢松散的语法,故xml没有竞争过html,xml于是就想去换发展方向。
于是就在“配置文件”的道路上发展了。
是的,开始去针对properties了
xml作用
- 保存数据,而且这些数据具有自我描述性
- 作为项目或者模块的配置文件
- 作为网络传输数据的格式(现在以json为主)
xml语法
我们新建一个项目——JavaWeb(后面就会一直用这个项目了),然后新建一个Java模块(不是static web了,注意),然后新建一个目录叫xml,用来存放一会用到的东西。再在xml目录下新建一个文件,我这里叫 books.xml
- 文档声明:<?xml version=”1.0″ encoding=”utf-8″ ?>
- 属性列表:
- version:版本号
- encoding:编码方式,告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
- standalone:是否独立
- yes:不依赖其他文件
- no:依赖其他文件
- 属性列表:
- 元素(标签):xml元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可以包含其他的元素(子元素)、文本或者两者的混合物,元素也可以拥有属性。关于xml元素的命名规则参考下面:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标签符号开始
- 名称不能以字符 “xml”(或者 XML、Xml)开始
- 名称不能包含空格
- xml注释:与html中一样,使用<!–内容–>来注释
- 文本区域(CDATA区):<![CDATA[这里可以把你输入的字符原样显示,不会解析xml ]]>(不必专门使用字符实体啦!)
xml示例:
<?xml version="1.0" encoding="utf-8" ?> <!--xml的声明-->
<books>
<book sn="SN123123123">
<name>时间简史</name>
<author>霍金</author>
<price>55</price>
</book>
<book sn="SN123123124">
<name>Java从入门到放弃</name>
<author>小明</author>
<price>47</price>
</book>
<book sn="SN123123125" name="吉他自弹300首" author="佚名" price="30"/>
</books>
xml的语法要求会比html严格很多,xml有很多编写要求,例如:
- 标签必须闭合
- 不可交叉嵌套
- 区分大小写
- 必须有跟标签
- 属性值必须加双引号
- 特殊字符要使用字符实体
一个xml文件示例
<?xml version="1.0" encoding="utf-8" ?> <!--xml的声明-->
<books>
<book sn="SN123123123">
<name>时间简史</name>
<author>霍金</author>
<price>55</price>
</book>
<book sn="SN123123124">
<name>Java从入门到放弃</name>
<author><小明></author>
<price>47</price>
</book>
</books>
XML约束
概念
很多时候,程序员需要通过修改xml文件来调整一些半成品软件的配置,即框架的配置。
但是程序员会很迷茫,不知道在配置文件中应该怎么去编写,故框架提供方会提供一个文档,即约束文档,来告诉程序员配置文件的编写规范。
分类
- DTD:一种简单的约束技术
- Schema:一种复杂的约束技术
DTD约束技术
在pers.luoluo.xml.dtd下有文件student.dtd:
//student.dtd
<!ELEMENT students (student*) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
解读约束文档:
- 元素students下有元素student*(student+0个或多个字符串)
- 元素student下有元素name、age、sex,且必须保持顺序
- name、age、sex的类型是字符串
- student有属性number,属性类型为ID(表示属性值必须唯一),且属性是必须出现的
引入dtd文档到xml文档中
- 内部dtd:将约束规则定义在xml文档中
- 外部dtd:将约束的规则定义在外部的dtd文件中
- 本地:<!DOCTYPE 根标签名 SYSTEM “dtd文件的位置”>
- 网络:<!DOCTYPE 根标签名 PUBLIC “dtd文件名字” “dtd文件的位置URL”>
我们写一个students示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="s001">
<name>Tom</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="s002">
<name>Tom</name>
<age>23</age>
<sex>male</sex>
</student>
</students>
Schema约束技术
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="heima_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
有此我们可以编写xml文档:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 如何引入配置文档
1.填写xml文档的根元素
2.引入xsi前缀. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.为每一个xsd约束声明一个前缀,作为标识 xmlns="http://www.itcast.cn/xml"
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
>
<student number="heima_0001">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="heima_0002">
<name>jack</name>
<age>26</age>
<sex>female</sex>
</student>
</students>
其中注意对约束文档的引入:
- xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”:引入xsi前缀,固定写法
- xsi:schemaLocation=”http://www.itcast.cn/xml student.xsd”:文档命令空间,可以理解为student.xsd路径的命名空间为:http://www.itcast.cn/xml(可以理解为起了一个名字)。如此一来,下面的标签就都需要先写上命名空间再写标签了。
- xmlns=”http://www.itcast.cn/xml”:意为给http://www.itcast.cn/xml声明一个前缀,为了简化书写,例如xmlns:a=“http://www.itcast.cn/xml”,故后面的标签就都需要先加上“a:”来引入,a则代表http://www.itcast.cn/xml该命名空间,如果什么也不写,直接写xmlns=“http://www.itcast.cn/xml”,则表示空前缀,下面的标签就不必都加前缀来使用了。
这个规则你可能不好理解,没关系,我们用mvc框架的配置文件的引入声明来距离:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
beans标签下定义了引入声明,可知:
- http://www.springframework.org/schema/beans/spring-beans.xsd的命名空间为:http://www.springframework.org/schema/beans,使用该空间使用空前缀,即不用加前缀。
- http://www.springframework.org/schema/context/spring-context.xsd的命名空间为:http://www.springframework.org/schema/context,使用该空间前缀是context
- http://www.springframework.org/schema/mvc/spring-mvc.xsd的命名空间为:http://www.springframework.org/schema/mvc,使用该空间的前缀是mvc
XML的解析技术
xml是可扩展的标记语言。
操作xml文档:
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中,持久化的存储
不管是html文件还是xml文件他们都是标记型文档,都可以使用W3C组织制定的dom技术来解析。
DOM将xml文档定义为一个树状结构,而树叶被定义为节点。
document对象表示的是整个文档(可以是html,也可以是xml)
早期的时候,JDK为我们提供了两种解析技术:DOM和SAX,但是现在而言,这两已经过时。
- DOM:将标记语言文档一次性加载进内存,然后形成一个DOM树。
- 优点:操作方便,可以对文档进行CRUD(增查改删)的所有操作
- 缺点:消耗内存
- SAX:逐行读取,基于事件驱动。
- 优点:占用很少内存(因为这种方式每次读取一行,都会将前一行释放掉,通过事件来监听)
- 缺点:只能读取,不能增删改
现在我们主要使用的第三方解析:
- jdom:在dom的基础上进行了封装
- dom4j:又对jdom进行了封装
- Jsoup:一款java的HTML解析器,可直接解析某个URL地址、HTML文本内容。他提供了一套非常省力的API。
- pull:主要用在Android 手机开发,跟sax非常类似,都是事件机制
我们重点了解一下dom4j,Jsoup(这是第三方解析技术,我们需要使用第三方给我们提供好的类库才可以解析xml文件。)
DOM-four-j
DOM4j类库的使用
首先我们可以去官网下载dom4j
或者可以直接用我分享的点击这里,提取码:mcez
下载下来之后是一个压缩包,
解压出来大概是这些内容
- docs目录下面,会有一个index.html文件,这个通过这个就可以打开这个dom4j的帮助手册。
- lib目录存放了dom4j需要的包
- src目录存放了dom4j的源码以及示例的代码。
下面我们来实际操作。
在刚才的模块下的src目录下新建一个包,然后新建一个java文件。
我们会通过Book.java来解析books.xml(books.xml的内容就是上面那个)
在Book.java中,我们简单写好(利用快捷键 Alt+Insert快速构造 ,巨爽的快捷键):
package com.ishashtest.xmlparsel;
public class Book {
private String sn;
private String name;
private double price;
private String author;
public Book(String sn, String name, double price, String author) {
this.sn = sn;
this.name = name;
this.price = price;
this.author = author;
}
public Book() {
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"sn='" + sn + '\'' +
", name='" + name + '\'' +
", price=" + price +
", author='" + author + '\'' +
'}';
} }
}
下面我们在该模块下新建一个目录lib,将dom4j下的那个dom4j-1.6.1 .jar 复制到lib下面。
然后在Idea中,右击这个jar文件,选择添加到库(add as library),这一步是将 jar包 添加到类路径
然后我们在刚才的包下面创建一个新的java类——Dom4jTest,写上test代码。
下面我们会使用Java中的单元测试,不了解的同学可以看这篇文章,
然后,我们导入jUnit.jar。(提取码:qtte) ,将这两个文件添加到刚才的lib目录下,再将这两个文件添加到库。
好,到这里为止,配置问题就解决了。
接下来我们对Dom4jTest类的代码动手:
package com.ishashtest.xmlparsel;
import org.junit.Test;
public class Dom4jTest {
@Test
public void test1(){
}
}
最终代码如下,请根据注解理解
@Test
public void test(){
//读取books.xml文件,生成book类
try{
//创建一个saxReader输入流
SAXReader reader=new SAXReader();
//再Junit测试中,相对路径是从模块开始算
Document document=reader.read("xml/books.xml");
//通过Document对象获取根元素(books)
Element rootElement=document.getRootElement();
//通过根元素获取book标签对象
List<Element> elems=rootElement.elements();
elems.forEach(book->{
//asXML:把标签对象转换为标签字符串
System.out.println(book.asXML());
//得到book的子元素
Element nameElem=book.element("name");
System.out.println(nameElem.asXML());
});
}catch(Exception e){
e.printStackTrace();
}
}
输出:
<book sn="SN123123123">
<name>时间简史</name>
<author>霍金</author>
<price>55</price>
</book>
<name>时间简史</name>
<book sn="SN123123124">
<name>Java从入门到放弃</name>
<author><小明></author>
<price>47</price>
</book>
<name>Java从入门到放弃</name>
这些字符串显然很难去利用,那我们应该怎么进一步得到书名文本内容呢?
elems.forEach(book->{
//得到book的子元素
Element nameElem=book.element("name");
String nameText=nameElem.getText();
System.out.println(nameText);
});
输出:
时间简史
Java从入门到放弃
另外还可以一步直接获取指定标签名的文本内容
elems.forEach(book->{
//直接获取指定标签名的文本内容
String priceText=book.elementText("price");
System.out.println(priceText);
});
输出:
55
47
获取属性又应该怎么做呢?
elems.forEach(book->{
String snText=book.attributeValue("sn");
System.out.println(snText);
});
输出:
SN123123123
SN123123124
最后我们可以整合成一个对象(利用之前的Book.java)
package com.ishashtest.xmlparsel;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.List;
public class Dom4jTest {
@Test
public void test(){
//读取books.xml文件,生成book类
try{
//创建一个saxReader输入流
SAXReader reader=new SAXReader();
//再Junit测试中,相对路径是从模块开始算
Document document=reader.read("xml/books.xml");
//通过Document对象获取根元素(books)
Element rootElement=document.getRootElement();
//通过根元素获取book标签对象
List<Element> elems=rootElement.elements();
elems.forEach(book->{
Element nameElem=book.element("name");
String nameText=nameElem.getText();
String priceText=book.elementText("price");
String authorText=book.elementText("author");
String snText=book.attributeValue("sn");
System.out.println(new Book(snText,
nameText,
Double.parseDouble(priceText),
authorText));
});
}catch(Exception e){
e.printStackTrace();
}
}
}
输出:
Book{sn='SN123123123', name='时间简史', price=55.0, author='霍金'}
Book{sn='SN123123124', name='Java从入门到放弃', price=47.0, author='<小明>'}
Jsoup
导入jar包
这里我分享一个jsoup包
链接:https://pan.baidu.com/s/19W0Fu1uRCDR2imZ6dF0F4g
提取码:2ue3
实操
student.xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="01">
<name>tom</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="02">
<name>jack</name>
<age>19</age>
<sex>male</sex>
</student>
</students>
java代码:
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//1.导入jar包
//2.获取Document对象
//2.1 获取student.xml的path
String path=JsoupDemo1.class.getClassLoader() //类加载器
.getResource("student.xml")
.getPath();
//url解码一下,避免中文路径
path= URLDecoder.decode(path,"utf-8");
//2.2 解析xml文档,即加载文档进入内存,获取dom树
Document document = Jsoup.parse(new File(path), "utf-8");
//3. 获取元素对象
Elements elements = document.getElementsByTag("name");
//3.1 获取第一个name的Element对象
Element element=elements.get(0);
//3.2 获取数据
String text = element.text();
System.out.println(text);
}
}
输出:tom,可见实验成功。
Jsoup对象
- Jsoup:工具类,可以解析html或xml文档,返回Document对象
- parse():解析文档,值得一提的是有一种重载就是parse(URL url,int timeoutMillis),这种方式可以用来做爬虫系统,后面正好结合Xpath解析数据。
- Document:文档对象。代表内存中的dom树
- getElementByXXX():就像前端JavaScript中DOM的操作一样
- Elements:元素Element对象的集合。可以当作ArrayList<Element>来说明
- Element:元素对象
- Element也有很多的getElementByXXX()方法,但是这样的方法仅针对当前Element的子元素。
- 获取属性值:attr(String attributeKey),改方法继承自父类Node
- 获取纯文本内容:text()(不同于html()方法,后者是获取innerHtml,即标签体所有内容包括子标签)
- Node:节点对象
具体的对象的方法在我分享的目录jsoup-1.11.2-javadoc下会有说明,详情请参考那个。
快捷查询方式
- selector选择器
- 使用Document的方法:Elements select(String cssQuery)
- 语法:参考Selector类中定义的语法(其实就是CSS选择的语法)
public static void main(String[] args) throws IOException {
//1.导入jar包
//2.获取Document对象
//2.1 获取student.xml的path
String path=JsoupDemo1.class.getClassLoader()
.getResource("student.xml")
.getPath();
//url解码一下,避免中文路径
path= URLDecoder.decode(path,"utf-8");
//2.2 解析xml文档,即加载文档进入内存,获取dom树
Document document = Jsoup.parse(new File(path), "utf-8");
//3. 获取student标签,且number属性值为01的age子标签
Elements elements=document.select("student[number='01'] age");
String age=elements.get(0).text();
System.out.println(age);
}
输出:18
- XPath:XML路径语言,这是老朋友了
- 使用Jsoup的XPath,需要额外的jar包:JsoupXpath-0.3.2
给xml文件中的某个name标签添加id=”itcast”
public static void main(String[] args) throws Exception{
//1.导入jar包
//2.获取Document对象
//2.1 获取student.xml的path
String path=JsoupDemo1.class.getClassLoader()
.getResource("student.xml")
.getPath();
//url解码一下,避免中文路径
path= URLDecoder.decode(path,"utf-8");
//2.2 解析xml文档,即加载文档进入内存,获取dom树
Document document = Jsoup.parse(new File(path), "utf-8");
//3.根据document对象,创建JXDocument对象
JXDocument jxDocument=new JXDocument(document);
//4.利用XPath,查询student标签下带有id属性的name标签,且id属性值为itcast
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id='itcast']");
for(JXNode jx:jxNodes2){
System.out.println(jx);
}
}
输出:
<name id=”itcast”>
tom
</name>
Tomcat
久仰大名,今天终于来做了解了,默默问一下,你和 猫和老鼠 真的没关系吗?
什么是JavaWeb
JavaWeb是指所有通过Java语言编写的可以通过浏览器访问的程序的总称,叫做JavaWeb。
JavaWeb是基于请求和响应来开发的。
- 请求:请求是指客户端给服务器发送数据,叫请求
- 响应:响应是指服务器给客户端回传数据,叫响应
请求和响应是成对出现的,有请求就有响应。
Web资源的分类
web资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种。
- 静态资源:html、css、js、txt、mp4(视频)、jpg(图片)
- 动态资源:jsp页面、Servlet程序
常用的Web服务器
- Tomcat:由Apache组织提供的一种Web服务器,提供对jsp和Servlet的支持。它是一种轻量级的javaWeb容器(服务器),也是当前应用最广的JavaWeb服务器
- Jboss:是一个遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,他支持所有的JavaEE规范
- GlassFish、Resin、WebLogic等
Tomcat和Servlet版本对应关系
Tomcat安装与启动
我这里分享一个8.0版本的tomcat
链接:https://pan.baidu.com/s/1YxsqJae2YMpzldWq_oSDTw
提取码:013n
找到对应版本的Tomcat,解压到对应的文件夹。
目录介绍
- bin:专门用来存放 tomcat 服务器的可执行程序(tomcat8.exe)
- conf:专门用来存放 Tomcat 的配置文件
- lib:专门用来存放 Tomcat 服务器的 jar 包
- logs:专门用来存放 Tomcat服务器运行时输出的日记信息
- temp:专门用来存放 Tomcat 运行时产生的临时数据
- webapps:专门用来存放部署的Web工程
- work:是Tomcat工作时的目录,用来存放 Tomcat 运行时jsp翻译为Servlet的源码,和session 钝化(序列化)的目录。
启动
1.startup.bat
找到Tomcat目录下的bin目录下的startup.bat文件,双击,就可以启动Tomcat服务器
如何测试Tomcat启动成功???
打开浏览器,访问:http://localhost:8080(http://127.0.0.1:8080)
如果出现这个丑陋的猫,恭喜你启动成功了!
常见启动失败的情况
双击startup.bat文件,就会出现一个小黑窗口一闪而过,这种情况失败原因多是因为没有配置好JAVA_HOME环境变量
2.命令行 catalina run
打开命令行
切换到Tomcat的bin目录下面,然后输入启动命令:
catalina run
也可以正常启动Tomcat
停止
- 关闭 Tomcat 服务器的窗口
- Tomcat 服务器窗口下按住 Ctrl+C
- 找到 Tomcat 的 bin 目录下的 shutdown.bat 双击,就可以停止 Tomcat 服务
Tomcat的操作
如何修改 Tomcat 的端口号
Tomcat默认的端口号是 8080
找到 Tomcat 目录下的 conf 目录,找到 server.xml 配置文件
找到大概69行左右,修改这个port即可
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
端口号范围(1-65535),另外,修改完配置文件之后,一定要重启才能生效
如何部署web工程到Tomcat中(第一种方式)
把web工程的目录拷贝到 Tomcat 的 webapps 目录下即可。
我就用上一篇文章里我们那个疯人院来示例了:
拷贝过来之后,访问本机地址加上 /crazy/index.html 即可看到首页。
简化部署:将项目打成一个war包,再将war包放置到webapps目录下,启动项目时war包会自动解压缩
如何部署web工程到Tomcat中(第二种方式)
需要写配置文件
在Tomcat的/conf/Catalina/localhost 下面新建一个xml文件。
一般一个xml文件就对应一个工程。
写入下面的内容:
<Context path="/crazy" docBase="E:\Tomcat\apache-tomcat-8.0.50\webapps\crazy" />
xml文件的名称就是你的项目虚拟目录,即web访问的目录。
如何部署web工程到Tomcat中(第三种方式)
配制conf/server.xml文件
在<Host>标签体中配置
<Context path="/crazy" docBase="E:\Tomcat\apache-tomcat-8.0.50\webapps\crazy" />
其中, Context 表示一个工程上下文,
Path 表示工程的访问路径,即虚拟目录,
docBase 表示你的工程目录在哪里,即项目存放的位置。
默认访问的工程和默认访问的资源
当我们在浏览器访问如下地址:
http://IP:port/
没有工程名的时候默认访问的是/webapps/ROOT 目录
当我们在浏览器访问如下地址:
http://IP:port/工程名
没有资源名的时候默认访问index.html页面
目录结构
在webapps中可以看到tomcat的项目目录结构
- 静态目录
- 动态目录(java为例)
- 项目的根目录
- jsp文件
- WEB-INF目录
- web.xml:web项目的核心配置文件
- classes目录:放置字节码文件的目录
- lib目录:放置依赖的jar包
- 项目的根目录
这些内容就是将来IDEA中out目录下的东西。
IDEA与Tomcat服务器整合
整合服务器
打开IDEA,选择 文件=》设置=》构建、执行、部署=》Application Servers,然后新建一个 Tomcat服务器 即可
然后浏览填入你的Tomcat的目录即可
然后我们创建Java模块就会发现服务器的存在了(即整合成功)
IDEA创建动态的web工程
承接上面,我们创建一个JavaEE模块
注意勾选 Web Application
然后点击下一步,输入模块名即可。
到这里,我们就创建了一个动态Web工程
web工程目录介绍
首先我们在IDEA为我们创建的WEB-INF下面再创建一个 lib 目录(用来存放以后的jar包)
目录结构大概是这样:
- src:存放自己编写的java源代码
- web:存放web工程的资源文件(比如html页面、css文化部、js文件等)
- WEB-INF:受服务器保护的目录。客户端浏览器无法直接访问到此目录的内容
- lib:存放第三方的jar包(IDEA还需要自己配置导包)
文件:
- web.xml:整个动态web工程的配置部署描述文件,可以在这里配置很多web工程的组件,比如:Servlet程序、Filter过滤器、Listener监听器、Session超时……
给Tomcat添加第三方jar包
第一种方式:
直接将你的jar包拷贝到WEB-INF的lib目录下面,然后右键选择,添加到库即可。
第二种方式:
选择文件=》项目结构=》Libraries
然后选择你要添加的那些jar包到对应模块。
然后在右边的Artifacts里,点击右边的fix,将类库添加到打包部署中。
不管哪种方式都要选择对应的模块。
在IDEA中部署工程到Tomcat上运行
首先,我们建议先修改过一下Web工程中对应的Tomcat运行实例
编辑配置就可以修改了。
另外,在编辑配置中的Deployment下面,注意将需要部署的web工程添加到Tomcat运行实例中。
下面的Application Context是工程路径(即对应访问地址,可以修改)。
另外在Server中我们还可以修改实例启动后默认访问地址等信息
回到主界面就可以正常启动了。
补充:IDEA服务器热部署
下面内容转载自这里
场景:一般服务器(比如tomcat,jboss等)启动以后,我们还需要进一步修改java代码,或者是jsp代码。一般来说,改完重启以后才会生效。但如果配置了服务器的热部署,就可以改完代码后立即生效,而不是重启服务器再生效。这样就会节省大量时间!
目前有两个选项:
On Update action : 顾名思义,当代码改变的时候,需要IDEA为你做什么;
On Frame deactivation : 当失去焦点(比如你最小化了IDEA窗口),需要IDEA为你做什么。
On Update action 里面有四个选项(一般选Update classes and resources):
-Update resources :如果发现有更新,而且更新的是资源文件(*.jsp,*.xml等,不包括java文件),就会立刻生效
-Update classes and resources : 如果发现有更新,这个是同时包含java文件和资源文件的,就会立刻生效
这里需要注意一下:在运行模式下,修改java文件时不会立刻生效的;而debug模式下,修改java文件时可以立刻生效的。当然,两种运行模式下,修改resources资源文件都是可以立刻生效的。
-Redploy : 重新部署,只是把原来的war删掉,不重启服务器
-Restart : 重启服务器
On Frame deactivation:
-Do nothing : 不做任何事 (一般推荐这个,因为失去焦点的几率太大)
-Update resources : 失去焦点后,修改的resources文件都会立刻生效
-Update classes and resources : 失去焦点后,修改的java ,resources文件都会立刻生效(与On update action中的Update classes and resources一样,也是运行模式修改的java文件不会生效,debug模式修改的java文件会立刻生效)
另外,如果Artifact是war包形式的话,On Update action与On frame deactivation中的选项也是不一样的:没有Update resources和 Update classes and resources这种选项,取而代之的是Hot Swap Classes选项,本质的意思是一样的
这一部分先到这里了。
商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢