1.WEB的概述
1.1 什么是WEB
web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。
1.2 什么是JavaWEBa
使用Java语言进行WEB的开发
1.3 软件架构
- CS结构的软件
CS:Client/Server 客户端和服务器,这种软件往往需要安装。比如QQ、迅雷、播放器。
优点:可以减轻服务器端的压力,将部分代码写到客户端,界面很美观。
缺点:一旦服务器更新了,客户端也需要更新。分布式开发比较弱。 - BS结构的软件
BS:Browser/Server 浏览器和服务器,这种软件不需要安装,只需要通过浏览器就可以访问。
优点:服务器端的代码一旦更新,不需要更新客户端,因为客户端就是浏览器,有比较强的分布式能力。
缺点:服务器端压力比较大,界面效果不如CS结构软件。
但随着技术的进步,BS的缺点逐渐被克服,所以软件的整体发展方向是朝着BS发展的。
1.4 WEB服务器
- 服务器:
硬件:其实就是一条电脑(这台电脑配置要求很高)。
软件:需要在这台电脑上安装web服务器的软件。
1.5 常见的有哪些web服务器
- Tomcat:Apache组织提供的一个开源的免费的web服务器。满足EE的Serlet和JSP的规范。
- WebSphere:IBM公司的开发的一个收费的大型web服务器。满足了EE开发的所有规范。
- WebLogic:BEA公司开发的收费的大型web服务器。满足了EE开发的所有规范。
- IIS:应用在.NET平台上。
- Apache:应用在PHP平台上。
1.6 WEB开发中的资源
- 静态web资源
HTML
CSS
JS - 动态web资源
Servlet、JSP
PHP
ASP
2.Tomcat
2.1 Tomcat的概述及安装
2.1.1 什么是Tomcat
Tomcat就是一个web的服务器,用来发布web项目。
2.1.2 下载Tomcat
下载后,解压放到C盘根目录下
2.1.3 启动Tomcat
启动 tomcat/bin/startup.bat
2.1.4 测试Tomcat
打开浏览器,输入localhost:8080/
出现
说明已经安装完成
2.1.5 Tomcat的安装注意事项
① Java环境变量的配置
Tomcat运行需要依赖Java环境,也就是说需要在电脑上安装了JDK之后才可以安装和启动Tomcat。
因为Tomcat启动的时候需要使用JRE的环境。必须要配置JAVA_HOME环境变量,如果没有配置JAVA_HOME环境变量,那么服务器在启动的时候就会一闪然后关闭。
② Tomcat端口号冲突的问题
如果电脑上安装了一个应用之后,有可能会占用Tomcat的端口,如果将Tomcat端口占用了,同样这个Tomcat是启动不了的。
Tomcat默认端口号是8080。一般80端口容易被其他的程序所占用。因为80端口是HTTP协议的默认端口(可以省略) 。
- 解决方法:
① 将占用端口的程序结束掉。
可以通过在cmd中输入 netstat - ano来查看哪些程序占用了哪些端口号
知道对应程序的PID之后,打开任务管理器在详细信息标签内即可查看。
② 改变自身程序的端口。
即修改Tomcat的端口号:
进入tomcat/conf/server.xml
端口被占用的异常信息:java.net.BindException: Address already in use:
2.2 Tomcat目录结构
- bin:二进制文件(命令文件:开启和关闭)
- conf:配置文件
- lib:tomcat所需的jar包
- logs:tomcat服务器日志文件
- temp:tomcat运行产生临时文件
- webapps:需要发布的项目需要放在webapps下
- word:JSP翻译(编译)成Servlet产生的代码
2.3 动态WEb资源的目录结构
2.4 Tomcat的项目发布方式
2.4.1 方式一
直接将项目赋值到tomcat/webapps目录下
① 复制到目录下
② 启动服务器
③ 访问项目
http://localhost:8080/项目名称/index.html
2.4.2 方式二
在Tomcat/conf/server.xml配置tomcat的虚拟路径
这种方式并不推荐使用,因为需要修改server.xml。server.xml是tomcat的核心配置文件,一旦修改错误,那么tomcat服务器就会出现问题。
虚拟路径
虚拟路径:配置一个名称与一个真实的路径进行绑定,然后访问这个名称从而找到真实路径。
如何配置虚拟路径
在tomcat/conf/server.xml中进行配置
① 创建一个项目
② 配置虚拟路径
③ 启动服务器进行访问
localhost:8080/虚拟路径/index.html
2.4.3 方式三
在tomcat/conf/Catalina/localhost/下配置tomcat的虚拟路径
第三种方式也需要配置虚拟路径,推荐使用第三种方式。
① 创建web项目
② 创建一个xml(在tomcat/conf/Catalina/localhost)
文件的名称就是虚拟路径(Rarity),只需要访问Rarity就可以访问C:\ccc这个路径
③ 配置虚拟路径
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="C:\ccc"></Context>
④ 访问项目
localhost:8080/Rarity/index.html
2.5 IDEA中配置Tomcat
具体操作可以学习:
https://www.jianshu.com/p/455c7c11dfb2
2.6 虚拟主机的配置
2.6.1 虚拟主机的概述
虚拟主机:在电脑上设置一个目录,使用一个名称来与该目录进行绑定。这个路径成为是虚拟主机。主机是可以发布web项目的。
2.6.2 虚拟主机配置过程
① 抓取百度页面
② 创建一个路径(虚拟主机)
这里的baidu是虚拟主机的目录,website是项目名称
③ 配置虚拟主机
在tomcat/bin/server.xml 中进行配置
④ 修改本地的hosts文件
hosts文件在C盘windows目录下
在文件末尾添加
⑤ 启动服务器,访问项目
3.Servlet
3.1 Servlet的概述
3.1.1 什么是Servlet
Servlet其实就是一个运行在web服务器上的小的Java程序,用于处理从web客户端发送的请求,并且对请求做出相应。
3.1.2 使用Servlet
- 编写一个Java类实现Servlet的接口
- 配置Servlet
① 创建包和类
② 实现Servlet接口
③ 配置这个类
在web.xml中配置这个类
④ 访问Servlet
在浏览器输入localhost:8080/firstJavaWeb/hello即可
/hello是在③中配置的访问路径
3.2 Servlet的执行流程
3.3 Servlet的实现关系
3.3.1 基本的实现关系
Servlet接口
|
|
GenericServlet类——通用的Servlet,是一个与协议无关的Servlet
|
|
HttpServlet类——Http专用的Servlet
3.3.2 关系实现的概述
HttpServlet是一个与协议相关的Servlet是专门用来处理HTTP协议的请求。通常编写一个Servlet一般都会让这个Servlet继承HttpServlet,然后再重写service方法。
在service方法内部根据请求方式不同执行不同的doXXX的方法(get请求doGet方法,如果是post请求就会执行doPost方法)。
所以往往继承了HttpServlet之后不需要重写service方法,只需要重写doGet和doPost方法即可。往往请求要处理的内容的代码都是一致的,所以需要让doGet和doPost相互调用可以简化编程。
3.4 Servlet的生命周期
3.4.1 Servlet的生命周期概述
生命周期:一个对象从创建到销毁的过程。
3.4.2 Servlet的生命周期
Servlet生命周期:Servlet对象从创建到销毁的过程。
-
Servlet何时被创建又是何时呗销毁的?
Servlet中有 init,service,destory方法,这几个方法成为是servlet生命周期相关的方法。 -
Sevlet是在第一次被访问的时候会被实例化,只要Servlet一被实例化那么Servlet中的init方法就会执行(init只会执行一次)。任何一次从客户端发送来的请求,那么Servlet中的service方法就会执行(在service方法的内部根据请求的方式不同调用不同doXXX方法)。当Servlet从服务器中移除或者服务器关闭的时候Servlet对象被销毁,里面的desrtoy方法就会执行,然后垃圾回收就会将其回收掉。
3.5 Servlet的启动时加载
3.5.1 为什么使用启动时加载
Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。如何使第一个用户在第一次访问的时候不需要花费这么长时间?
3.5.2 什么是启动时加载
Servlet默认是在第一次访问的时候创建的对象,现在通过一个配置将Servlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建Servlet的对象)。如果现在这样做那么之前花费的时间就会在服务器启动的时候一起花费掉。对于用户来讲就不需要额外花费这个时间。
3.5.3 配置完成启动时加载
3.6 Servlet的访问路径配置
3.6.1 Servlet中的urlPattern的配置
- 完全路径匹配
以/
开始
比如:/ServletDemo1
/aaa/ServletDemo2
- 目录匹配
以/
开始,以/*
结束
比如:/*
/aaa/*
/aaa/bbb/*
- 扩展名匹配
不能以/
开始,以*
开始
比如:*.action
*.do
*.jsp
完全路径匹配:
如何访问:localhost:8080/firstJavaWeb/aaa
目录匹配:
如何访问:localhost:8080/firstJavaWeb/aaa/任意字符
拓展名匹配:
如何访问:localhost:8080/firstJavaWeb/任意字符.abc
3.6.1 访问的优先级:
完全路径匹配>目录匹配>拓展名匹配
3.7 Servlet的API
3.7.1 ServletConfig对象
ServletConfig用来获得Servlet的相关的配置的对象。
获得ServletConfig对象
getServletConfig()
3.7.2 ServletContext对象
ServletContext:Servlet的上下文对象。ServletContext对象队Servlet之前和之后的内容都知道。这个对象一个web项目只有一个。在服务器启动的时候为每个web项目创建一个单独的ServletContext对象。
3.7.2.1 作用一:获取web项目信息
- 用来获取web项目信息
因为一个web项目只有一个ServletContext对象,所以这个对象对整个项目的相关内容都是了解的。
相关方法:
获取文件的MIME类型
获取web项目请求工程名:
getContextPath()
Return the context path og the web application
获取web项目的初始化参数:
3.7.2.2 作用二:读取web项目下的文件
web项目中读取文件不能使用传统方法InputStream来读取,所以要通过ServletContext来读取。
读取web项目下的文件
之前使用IO流就可以读取文件(java项目中)。现在是一个web项目,web项目需要发布到tomcat下才能访问的。获取web项目下的文件如果使用传统的IO就会出现问题。
如果把路径换成绝对路径倒是可以成功。
改进后:使用ServletContext
这里使用的路径是该项目经tomcat发布后的所在位置,如何查看发布的路径:
如果不习惯使用getResourceAsStream,也有改进方法:
使用getRealPath方法来获取绝对路径
所以,在web项目中读取一定不能直接使用传统方法来读取文件,要使用SerlvetContext来读取。
3.7.2.3 作用三:作为域对象存取数据
域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围。
ServletContext作为域对象的API
获取数据的方法:
存入数据的方法:
移除数据的方法:
ServletContext作为域对象的作用范围
ServletContext是在服务器启动的时候为每个web项目单独创建一个ServletContext对象。当web项目从服务器中移除,或者是关闭服务器的时候ServletContext对象会被销毁。向ServletContext中保存的数据一直存在(当服务器关闭的时候ServletContext对象被销毁,然后里面数据才会失效)。
范围:整个web应用。
代码演示:
//ServletDemo7
public class ServletDemo7 extends HttpServlet {
@Override
public void init() throws ServletException {
ServletContext servletContext = getServletContext();
servletContext.setAttribute("name","张三");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String name = (String) servletContext.getAttribute("name");
System.out.println(name);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
//ServletDemo8
public class ServletDemo8 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = (String) this.getServletContext().getAttribute("name");
System.out.println(name);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
3.8 Response对象的概述
3.8.1 什么是Response
开发的软件是B/S结构的软件,可以通过浏览器访问服务器的软件。从浏览器输入一个地址访问服务器(将这个过程称为是请求)。服务器接收到请求,需要进行处理,处理以后需要将处理结果显示回浏览器端(将这个过程称为是相应)。
3.8.2 Response对象的API
3.8.2.1 关于响应行的方法
设置响应的状态码:例如200、302、304、404、500
3.8.2.2 关于响应头的方法
set开头的方法:针对一个key对应一个value的情况。
举例:比如有一个头content-Type:text/html
setHeader(“content-Type”,“text/plain”);
最终得到头的结果:content-Type:text/plain
add开头的方法:针对一个key对应多个value的情况。
举例:比如有一个 content-Type:text/html
addHeader(“content-Type”,“text/plain”);
最终得到头的结果:content-Type:text/html,text/plain
3.8.2.3 关于响应体的方法
3.8.2.4 Response其他的API
- 重定向的方法
sendRedirect(String location)
- 设置浏览器打开页面时候采用字符集
setContentType(String type)
- 设置响应字符流的缓冲区字符集
setCharacterEncoding(String charset)
- 服务器向浏览器回写Cookie的方法
addCookie(Cookie cookie)
3.8.3 Response对象的API的代码演示
3.8.3.1 设置状态码
但是,只设置状态码并无任何用处。
3.8.3.2 完成重定向
重定向:302状态码和Location响应头结合使用的效果。
- 实际开发中可以使用 response.sendRedirect("/firstJavaWeb/ServletDemo10");
3.8.3.3 完成定时刷新效果
除了Location头还有Refresh头
3.8.3.4 定时刷新跳转加强之读秒效果
在HTML中完成页面跳转
3.8.4 Response对象响应的中文乱码处理
这两个方法可以向页面进行响应了,不过一个使用字节流响应一个使用字符流响应。
3.8.4.1 使用字节流响应中文
-
编写代码
write()里要传入字节数组,所以使用getBytes将“中文”转换为字节数组 -
上述代码不一定会出现乱码
这个乱码的产生与中文转成转成字节数组及浏览器打开方式(打开的时候采用的默认字符集)有关,有些浏览器乱码,有些浏览器正常 -
解决:
将中文转成字节数组的时候和浏览器默认打开的时候采用的字符集一致即可 -
解决代码
3.8.4.2 使用字符流响应中文
- 编写代码
使用上述代码来输出中文一定会出现乱码
原因:字符流是有缓冲区的,response获得字符流,response设计缓冲区的缓冲区编码是ISO-8859-1。这个字符集不支持中文。
解决:设置response获得字符流缓冲区的编码和设置浏览器默认打开时候采用的字符集一致即可。
简化版:
这一句setContextType
完成了上面两句的工作
3.9 Request 对象的概述
3.9.1 什么是Request对象
开发的软件都是B/S结构软件,从浏览器向服务器提交一些数据,将这些内容进行封装就封装成了一个请求对象(Request对象)。
3.9.2 Request对象的API
3.9.2.1 获得客户机信息
- 获得请求的方式,比如你是get请求还是post请求
- 获得请求路径后的提交参数的字符串
- 获得请求路径的URL和URI
3.9.2.2 获得请求头的方法
- 获得一个key对应一个value的请求头
- 获得一个key对应多个value的请求头
3.9.2.3 获得请求参数的方法
- 获得提交的参数(一个name对应一个value)
- 获得提交的参数(一个name对应多个value)
- 获得提交的参数,将提交的参数的名称和对应的值存入到一个Map集合中
3.9.2.4 Request作为域对象存取数据的方法
- 向request域中存数据
- 从request域中获取数据
- 从request域中移除数据
3.9.3 Request对象的API的代码演示
3.9.3.1 Request对象获取客户机信息
3.9.3.2 Request对象获得请求头的信息
比如获得客户机访问的浏览器的类型
3.9.3.3 Request对象接收表单请求参数
编写一个静态的页面以提供静态资源
接受一个值使用getParameter
接收多个值使用getParameterValues
全部接收用getParameterMap
3.9.3.4 Request对象接收中文数据
Post方式接收中文
※※ 此处按照教程操作结果操作之后反而乱码了。
Get方式接受中文
※※ 此处同样,不用操作就没有乱码,但操作之后也没有乱码
表单提交一般都是Post提交的,很少使用get,所以只需了解get的方式即可