---Java的开发环境搭建
---Java的基础语法
---Java的面向对象
---数组
---常用类
---异常
---集合
---多线程
---IO流
---反射机制
---注解Annotation
--Tomcat(WEB服务器)
--jetty(WEB服务器)
--JBOSS(应用服务器)
--WebLogic(应用服务器)
--WebSphere(应用服务器)
-应用服务器实现了JavaEE的所有规范。(JavaEE有13个不同的规范)
-Web服务器只实现了JavaEE中的Servlet+JSP两个核心的规范
应用服务器是包含WEB服务器的
apache官网地址:https://www.apache.org/
tomcat官网地址:https://tomcat.apache.org
tomcat只实现了:Servlet+JSP规范
tomcat是Java语言写的
bin:存放服务器的命令文件存放的目录,比如;服务器的打开可重起
conf:配置文件
lib:核心程序目录jar包
logs:日志目录,启动,等信息都会在这个目录生成日志文件
temp:临时目录。临时文件
webapps:web应用
work;用来存放JSP文件翻译之后的文件
bin目录下有一个文件:startup.bat
xxx.bat文件是windows操作系统专用的,bat文件是批处理文件,这种文件可以编写大量的Windows的dos命令,然后执行bat文件就相当于批量的执行dos命令
start.sh这个文件在Windows当中无法执行,在Linux环境中可以使用。在Linux环境下可以使用,在Linux环境下能够执行的是shell命令,
大量的shell命令编写在shell文件当中,然后执行这个shell文件可以批量的执行shell命令。
在dos命令窗口中输入startup.bat来启动tomcat服务器
实现一个最基本的WEB应用(这个WEB没有Java小程序)
第一步:找到CATALINA_HOME\webapps目录
应为所有的webapp都要放到webapp目录下
第二步:在CALINA_HOME\webapps目录下新建一个子目录,起名:oa
这个目录名就是你这个webapp的名字
第三步:在oa目录下新建资源文件,例如index.html
编写index.html文件内容
第四步:启动Tomcat服务器
第五步:打开浏览器,在浏览器地址栏上输入这样的url
http://127.0.0.1:8080/oa/index.html
多个层级也没有关系,正常访问即可
注意:我们目前前端上的路径都以“/”开始,都是加项目名的
一个路径是一个资源:这个资源可能是静态的资源也可能是动态的资源(Java小程序)
后端到底要执行哪个Java小程序,取决于你的前端浏览器发送的请求路径。
一个路径对应一个Servlet程序
对于一个动态的web应用来说,一个请求和响应的过程有多少个角色参与,角色和角色之间有多少个协议
有哪些角色:(在整个BS结构的系统当中,有哪些人参与进去了)
。浏览器软件的开发商
。WEB Server的开发团队
。DB Server的开发团队
。webapp的开发团队
JavaEE规范之一Servlet规范
WEB Server和webapp解耦合
browser和WEBServer之间有一套传输协议:HTTP协议。(超文本传输协议)
webapp开发团队和DB Server之间有一套JDBC规范
步骤:
①在webapps目录下新建一个目录,起名crm(这个crm就是webapp的名字)。当然,也可以是其他目录,名字自拟
注意:crm就是这个webapp的根
②在webapp的根下新建一个目录:WEB-INF
注意:这个目录的名字是Servlet规范中规定的,必须全部大写,必需一摸一样
③在WEB-INF目录下新建一个目录:classes
注意:这个目录的名字必须全是小写。这也是Servlet规范中规定的。另外这个目录下一定存放的是Java程序编译之后的
class文件(这里存放的是字节码文件)
④在WEB-INF目录下新建一个目录:lib
注意:这个目录不是必须的。但如果是一个webapp需要第三方的jar包的话,这个jar包要放到这个lib目录下,这个目录的名字也不能随意编写,
必须全部是小写的lib。例如Java语言连接数据库的数据库驱动jar包,那么,jar包就一定要放到lib目录下
⑤在WEB-INF目录下新建一个文件:web.xml
注意:这个文件是必须的,这个文件名必须叫做web.xml。这个文件必须放在这里。一个合法的webapp,web.xml文件是必须的,这个web.xml文件
就是一个配置文件,在这个配置文件中描述了请求路径和Servlet类之间的对照关系。
这个文件最好从其他的webapp中拷贝,最好别手写。
⑥编写一个Java程序,这个小Java程序也不能随意开发,这个小程序必须实现Servlet接口
这个Servlet接口不在JDK中(应为Servlet不是JavaSE了。Servlet属于JavaEE,是另外一套类库)
Servlet接口(Servlet.class文件)是Oracle提供的
Servlet接口是JavaSE的规范中的一员
Tomcat服务器实现了Servlet规范,所以Tomcat服务器也需要使用Servlet接口。Tomcat服务器中应该有这个接口,Tomcat服务器
的CATALINA_HOME\lib目录下有一个servlet-api.jar,解压这个jar包后,你会看到里面有一个Servlet.class文件
重点:JakartaEE9开始,Servlet接口名就变了:Jakarta.servlet.Servlet
注意:编写这个小程序的时候,Java源代码你愿意放在那里就放在那里,位置无所谓,你只需要将Java源代码编译之后的class文件放到classes目录下即可
⑦编译我们编写的Java代码
⑧将以上编译之后的文件拷贝到WEB-INF\classes目录下
⑨在web.xml文件中编写配置信息,让“请求路径”和“”
⑩启动Tomcat服务器,然后打开浏览器
浏览器上编写的路径太复杂,可以使用超链接。(非常重要:惠HTML页面只能放到WEB-INF目录外面)
以后不需要我们编写main方法了,tomcat服务器负责调用main方法,tomcat服务器启动时执行的就是main方法。我们Java程序员
只需要编写Servlet接口的实现类,然后将其注册到web.xml文件中
将CATALINA_HOME/conf/logging.properties文件中的内容修改如下:
java.util.logging.ConsoleHandler.encoding=GBK
总结一下:
一个合法的WEBAPP目录结构应该是怎样的?
--webapp的根
WEB-INF
classes(存放字节码)
lib(第三方jar包)
web.xml(注册Servlet)
html
css
javascript
image
...
public void service(ServletRequest request,ServletResponse response)
throws ServletException,IOEception{
response.setContentType("text/html");
PrintWriter out=response.getWriter();
//编写JDBC代码来链接数据库
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
//注册驱动
Class.forName("com.mysql....");
//获取链接
String url="jdbc:mysql://localhost:8080/student";
String user="root";
String password="root";
conn=DriverManger.getConnection(url,user,password)
//获取预编译的数据库操作对向
String sql="select * from stu";
ps=conn.prepareStatement(sql);
//执行SQL语句
rs=ps.executeQuery();
//处理结果集
while(rs.next()){
String no-rs.getString("no");
String name=rs.getString("name");
}
}catch( Exception e){
e.printStackTrace();
}finally{
//释放资源
if(rs!=null){ rs.close();}
if(conn!=null){ conn.close();}
if(ps!=null){ps.close();}
}
}
Servlet是Java程序,所以在Servlet中完全可以编写JDBC代码连接数据库
在一个WEBAPP中去链接数据库,需要将驱动jar包放到WEB-INF/lib目录下
Servlet对象的生命周期
1.什么是Servlet的生命周期?
Servlet对象什么时候被创建,神魔时候被销毁。
Servlet对象创建了几个?
Servlet对象的生命周期表示:一个 Servlet对象从出生在最后死亡,整个过程是怎样的。
Servlet对象由随来维护?
Servlet对象的创建,对象上方法的调用,对象最终的销毁,Javaweb程序员是无权干预的。
Servlet对象的生命周期是由Tomcat服务器全权负责的。
Tomcat服务器通常我们又称web兼容器。(WEB Container)
web容器来管理 Servlet对象的死活。
我们自己new的 Servlet受web容器的管理吗?
我们自己new的 Servlet对象是不受web5容器管理的
web容器自己创建的 Servlet对象都会被放到一个集合中(HashMap),只有放到这个集合中的 Servlet才能被web容器管理
自己new 的不在容器里
。在 Servlet中提供一个无参的构造方法,启动服务器的时候看看构造方法是否执行。
。经过测试得出结论:默认情况下,服务器在启动的时候 Servlet对象并不会被实例化。
。这个设计是合理的,用户没有发送请求之前,如果提前创建出来所有的 Servlet对象,必然是耗费内存的,并且创建出来的 Servlet如果一直
没有用户访问,也没必要创建
怎末让启动服务器的时候创建 Servlet对象呢?
在 Servlet标签中添加
Servlet对象的生命周期?
Servlet更像是人的一生:
Servlet的无参构造方法执行:标志着你已经出生了
Servlet对象的init方法的执行:标志着你正在接受教育
Servlet对象的service方法的执行:标志着你已经开始工作了
Servlet对象的destory方法的执行:标志着临终。
Servlet类中方法的调用次数?
构造方法只执行一次。
init方法只执行一次。
service方法:用户发送一次请求则执行一次,发送N次执行N次
destroy方法只执行一次。
500报错
注意:500是一个HTTP协议的错误状态码
500一般是Java程序出现了异常
如果没有无参构造方法,会导致出现500错误,无法实例化 Servlet对象
所以,一定要注意:在 Servlet开发中不建议程序员来定义构造方法,应为定义不当,一不小心就会导致无法实例化 Servlet对象
思考: Servlet的无参构造方法是在对象第一次创建时候执行,并且只执行一次。init方法也是在对象第一次创建的时候执行,并且
只执行一次。那么这个无参数构造方法可以替代调init方法吗?
不能
Servlet规范中有要求,作为Javaweb程序员,编写 Servlet类的时候,不建议手的编写构造方法,很容易让无参数构造方法消失,这个操作
可能会导致 Servlet对象无法被实例化。所以init方法是有必要存在的
init。service。destroy方法中使用最多的是哪个方法?
使用最多的就是service方法,该方法是必须实现的,应为它是处理用户请求的核心方法。
什么时候使用init方法呢?
init方法使用的很少。
通常在init方法做初始化操作,并且这个初始化操作只需要执行一次。例如:初始化数据库连接池,初始线程池......
什么时候使用destroy方法呢?
destroy方法使用的也很少。
通常在该方法中进行资源关闭。马上对象要销毁了,还有什么要关闭,还有啥要保存的赶紧保存。
项目构建工具:http://maven.apache.org/
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
提供了一套标准化的项目结构
提供了一套标准化的构建流程(编译,测试,打包,发布)
提供了一套依赖管理机制
依赖管理其实就是管理你项目所依赖的第三方jar包和插件等
1.Maven使用标准的坐标配置来管理各种依赖
2.只需要简单的配置就可以完成依赖管理
标准化的项目结构
所有IDE使用Maven构建的项目结构完全一样,所有IDE创建的maven项目可以通用
标准化的构建流程:
Maven--->编译--->测试--->打包--->发布
Maven提供了一套简单的命令来完成项目的构建
Maven仓库:①本地仓库:自己计算机上的一个目录
②中央仓库:maven团队维护的全求唯一的仓库
③远程仓库(私服):一般由公司团队搭建的私有仓库
Maven常用命令:
compile:编译
clean:清理
test:测试
package:打包
install:安装
maven坐标?
maven坐标是资源的唯一标识
使用坐标来定义项目或引入项目中需要的依赖
maven坐标主要组成
groupld:定义当前maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
artifactld:定义当前maven项目名称(通常是模块名称,例如order-service、goods-service)
version:定义当前项目版本号
以后所有的Servlet类都要继承一个抽象类构成的适配器,将这个适配器实现Servlet接口然后重写五种方法,哪一个方法常用就将其写成抽象方法,
父类原始的init方法final了,我子类没有办法重写init方法了
如果这个时候还是想要重写这个init方法该怎末办呢?
* 1.SevletConfig是什么?
* jakerta.sevlet.Sevlet.COnfig
* 是一个接口
* 2.是谁实现了这个接口?
*ServletConfig是:org.apache.catalina.core.StandardWrapperFacade@1cc25be
* WEB服务器实现了
* 3.一个Servlet对象中有一个ServletConfig对象。(Servlet和ServletConfig对象是一对一)
* 100个Servlet,就应该有100个ServletConfig对象
* 4.ServletConfig对象是谁创建的?创建了Servletconfig对象
* Tomcat服务器(web服务器)创建了ServletConfig对象
* 在创建ServletConfig对象的时候,同时创建ServletConfig对象
* 5.ServletConfig接口到底是干啥的?到底有森马用?
* ServletConfig:Servlet对象那个的配置信息对象
*一个ServletConfig对象就有一个配置信息对象()
*
tomcat小猫咪解析web.xml文件,将web.xml文件中的
在用户发送第一次请求时创建
6.ServletConfig接口中有哪些方法?
8.Servletconfig接口中有4个方法:
* 1.public String GteInitParameter(string name)
* 2. Enumeration
* 3.public ServletContexxt getServletContext();
* 4.public string getServletName();
* 以上的4个方法也可以使用this去调用
*
* 以上
* * */
public class ConfigTestSevlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//获取sevletconfig对象
servletResponse.setContentType("text/html");
PrintWriter out=servletResponse.getWriter();
//获取Sevletcofig对象
ServletConfig config=this.getServletConfig();
//输出该对象
out.println("ServletConfig是:"+config.toString());
//获取
String servletName=config.getServletName();
out.println("
");
out.println("
//通过Servletconfig对象的两个方法,可以获取到WEB.xml文件中的初始化参数配置信息
Enumeration
//遍历集合
out.print("
");
// while(initParameterNames.hasMoreElements()){
// String parameterName=initParameterNames.nextElement();
// out.print(parameterName);
// out.print("
");
// }
//改造
while (initParameterNames.hasMoreElements()){
String parameterName=initParameterNames.nextElement();
String parametervar=config.getInitParameter(parameterName);
out.print(parameterName+"="+parametervar);
out.print("
");
}
/* //通过初始化参数的name获取value
String driver=config.getInitParameter("driver");
*/
}
-------------------------------------------------------------------------------------遍历集合
while(initParameterNames.hasMoreElements()){
// String parameterName=initParameterNames.nextElement();
// out.print(parameterName);
// out.print("
");
// }
-----------------------------------------------------------------------------------
/*this.getInitParameterNames();
this.getInitParameter("driver");
this这里相当于ConfigTestSevlet
*/
Enumeration
while (initParameterNames1.hasMoreElements()){
String name=initParameterNames1.nextElement();
String varlue=this.getInitParameter("name");
out.print(name+"="+varlue);
out.print("
");
}
ServletContext接口
怎末获取Servletcontext对象?
1.通过ServletConfig对象获取Servletcontext对象
2.通过this获取
1.servletContext是什么?
ServletContext是一个接口,是Servlet规范中的一员
2.ServletContext是tomcat实现的
3.ServletContext对象是在WEB服务器启动的时候创建的
ServletContext对象是WEB服务器创建的
对于一个webapp来说,ServletContext对象只有一个
ServletContext对象爱服务器关闭的时候销毁
4.ServletContext原理?
Servlet对象的环境对象。Servlet的上下文对象
ServletContext对象其实对应的就是整个web.xml文件。
放在ServletContext对象当中数据,所有Servlet一定是共享的。
比如:一个教室中的空调是所有学生共享的,教师是共享的
tomcat是一个容器,一个容器当中可以放多个webapp,一个webapp对应一个ServletContext对象。
ServletContext接口中有哪些常用方法?
public String getInitParameter(String name);//通过name获取value
public Enumeration
以上的配置信息是应用级的配置信息,一般一个项目中共享的配置信息会放到以上的标签中。
如果你的配置信息只是想给某一个servlet作为参考,那么你配置到servlet标签当中即可,使用servletConfig对象来获取
获取context path(获取应用上下文的根)
//在Java源代码当中,不要将应用的根路径写死,应为你永远都不知道这个应用在最终部署的时候,起一个什么名字?
String contextPath=context.getContextPath();
//获取文件的绝对路径
String realPath=this.ServletContext.getrealPath("这里写要得到路径的文件名");
//通过ServletContext对象也是可以记录日志的
public void log(String message);
public void log(String message,Throwable t);
*/
ServletContext对象还有另一个名字:应用域(后面还有:请求域,会话域)
如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,可以将这些数据放到ServletContext这个应用域中
为什么是所有用户共享的数据?
不是共享的没有意义,应为ServletContext这个对象只有一个。只有共享的数据放进去才有意义。
为什么数据量要小?
应为数据量比较大的话,太占堆内存,并且这个对象那个的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据量会影响服务器的性能。占用内存较小的数据量可以考虑放进去。
为什么这些共享数据很少的修改,或者几乎不修改?
所有用户共享数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。
//数据量小,所有用户共享。又不修改,这样的数据放到ServletContext这个应用域中,会大大提升效率。应为应用域相当于一个缓存,放到缓存中的数据,下次在用的时候,不需要从数据库中再次获取,大大提升了执行效率。
//存(怎么向ServletContext应用域中存数据)
public void setAttribubute(String name,Object value);//map.put(k,v)
//取(怎么从ServletContext应用域中取数据)
public Object getAttribute(String name);//object v=map.get(k)
//删(怎么删除ServletContext应用域中的数据)
public void removeAttribute(String name);//map.remove(k)
以后我们编写Servlet类的时候,实际上是不会去直接继承GenericServlet类的,因为我们是B/S结构的系统,这种系统是基于HTTP超文本传输协议的,在Servlet规范中,提供了一个类叫做HTTPServlet,它是专门为HTTP协议准备的一个Servlet类.我们编写的Servlet类·要继承HttpServlet。()
我们更加便捷
继承结构
jakarta.servlet.Servlet(接口)---->爷爷
jakarta.servlet.GenericServlet implements Servlet(抽象类)----->儿子
jakarta.servlet.http.HttpServlet extends GenericServlet (抽象类)--->孙子
我们以后编写的servlet要继承HttpServlet类
缓存机制?
--堆内存当中的字符串常量池
"abc"先在字符串常量池中查找,如果有,直接拿来用。如果没有则新建,然后再放入字符串常量池
--堆内存当中的整数型常量池。
--连接池
--线程池
--redis
--NoSQL数据库。非关系型数据库。缓存数据库
---------------------------------------------------------------------------
HTTP协议
HTTP:Hyper Text Tranfer Protocol,超文本传输协议,规定了浏览器和服务器之间的数据传输的规则
什么是超文本?
不是普通的文本,比如说流媒体:声音、视频、图片等
特点:1.TCP协议:面向连接,安全
2.基于请求-响应模型的:一次请求对应一次响应
3.HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的
--缺点:多次请求间不能共享数据。Java中会使用会话技术(cookie、session)来解决这个问题
--优点:速度快
HTTP请求数据格式
1.请求行:请求数据的第一行。其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本
2.请求头:第二行开始,格式为key:value形式
3.空白行
4.请求体:POST请求的最后一部分,存放请求参数
请求行
三部分:
-请求方式(7种):get,post,delete,put,head,options,trace
-uri:统一资源标识符。代表网络中某个资源的名字。但是通过uri是无法定位资源的。
url:统一资源定位符。代表网络中某个资源,同时,通过url是可以定位到该资源的。
URL包括URI
http://localhost:8080/servlet04/index.html-----URL
/servlet04/index.html-----URI
-HTTP协议版本号
HTTP响应数据格式:
1.响应行:响应数据的第一行。其中HTTP/1.1表示协议版本,200表示响应状态,OK表示状态码描述
2.响应头:第二行开始,格式为key:value形式
3.空白行
4.响应体:最后一部分。存放响应数据
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Content-Length: 140
Date: Sun, 17 Jul 2022 01:32:37 GMT
Keep-Alive: timeout=20
Connection: keep-alive