javaweb
软件系统体系结构
1.1:常见体系结构B/S、C/S
C/S(client/Server):
- 缺点:软件更新时需要同时更新客户端和服务器端两端,比较麻烦;
- 优点:安全性比较好。
B/S(Browser/Server):
- 优点:只需要编写服务器端程序;
- 缺点:安全性较差。
只要有浏览器即可
C/S架构和B/S 架构都可兼具,java: 90% 开发B/S
1.2: WEB资源
- html/CSS/JS/图片…:静态资源;
- JSP/Servlet:动态资源。
区别:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Njzi0o3D-1666191656930)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1666167401299.png)]
1.2.1:访问Web资源
打开浏览器,输入URL:
协议名://域名:端口/路径,例如:http://www.baidu.com:80/index.html
www.baidu.com 域名 映射IP地址 14.215.177.39
http://14.215.177.39:80/index.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O6Df30Zz-1666191656931)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1666168125534.png)]
协议:ftp,git,jdbc
javaWeb用到的协议:http
端口:
- HTTP:80
- HTTPS:443
服务器:表示硬件服务器和软件服务器。
- 硬件server:电脑
- 软件server:软件 Javaweb使用软件服务器
1.2.2:web服务器
Web服务器的作用是接收客户端的请求,给客户端作出响应。
对于JavaWeb程序而已,还需要有JSP/Servlet容器,JSP/Servlet容器的基本功能是把动态资源转换成静态资源,
我们需要使用的是Web服务器和JSP/Servlet容器,通常这两者会集于一身。下面是对JavaWeb服务器:
- Tomcat(Apache):Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。
2.1:Tomcat
2.1.1:概述
Tomcat服务器由Apache提供,开源免费。由于Sun和其他公司参与到了Tomcat的开发中,所以最新的JSP/Servlet规范总是能在Tomcat中体现出来。当前最新版本是Tomcat10,我们课程中使用Tomcat8.5。Tomcat7支持Servlet3.0,而Tomcat6只支持Servlet2.5!
2.1.2 安装、启动、配置Tomcat
下载Tomcat可以到http://tomcat.apache.org下载。
Tomcat分为安装版和解压版:
- 安装版:一台电脑上只能安装一个Tomcat;
- 解压版:无需安装,解压即可用,解压多少份都可以,所以我们选择解压版。
2.1.3:部署
- 直接将项目放到webapps目录下即可
-
项目名就是我们该项目的访问路径
-
简单部署:将项目打成一个war包,再将war包放置到webapps目录下。war会自动解压
虚拟目录: 项目名或者war名字
- 配置conf/server.xml文件,在
<Host>
标签体中配置
<Context docBase="D:/hello" path="/hehe" />
- docBase:项目存放的路径
- path:虚拟目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcqxqR9c-1666191656932)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1666167790179.png)]
-
在conf/Catalina/localhost创建任意名称的xml文件。在文件中编写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2UGjdi7-1666191656934)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1666167839330.png)]
虚拟目录:xml文件的名称
推荐使用第三种: 因为它支持热部署,当我们不想部署项目,那我们就把hello.xml修改为hello.xml.back,那我们不需要重新启动tomcat,再访问,就无法访问到hello项目了
2.1.4: Web应用(重点)
创建静态应用
- 在webapps下创建一个hello目录;
- 在webapps/hello 下创建index.html;
- 启动tomcat;
- 打开浏览器访问http://localhost:8080/hello/index.html
index.html
<html> <head> <title>hello</title> </head> <body> <h1>Hello World!</h1> </body> </html>
1.5.2 创建动态应用
- 在webapps下创建hello1目录;
- 在webapps/hello1 下创建WEB-INF目录;
- 在webapps/hello1 WEB-INF 下创建web.xml;
- 在webapps/hello1 下创建index.html。
- 打开浏览器访问http://localhost:8080/hello/index.html
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> </web-app>
完整的Web应用还需要在WEB-INF目录下创建:
- classes;
- lib目录;
webapps
|- hello
|-index.html
|-WEB-INF
|-web.xml
|-classes
|-lib
-
hello:应用目录,hello就是应用的名称;
-
index.html:应用资源。应用下可以有多个资源,例如css、js、html、jsp等,也可以把资源放到文件夹中,例如:hello html index.html,这时访问URL为:http://localhost:8080/hello/html/index.html;
-
WEB-INF:这个目录名称必须是大写,这个目录下的东西是无法通过浏览器直接访问的,也就是说放到这里的东西是安全的;
-
web.xml:应用程序的部署描述符文件,可以在该文件中对应用进行配置,例如配置应用的首页:
<welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list>
-
classes:存放class文件的目录;
-
lib:存放jar包的目录;
-
jar包:java项目打成jar
war包:web项目打成war
3.1:Servlet
3.1.1什么是Servlet
servlet:接收请求,处理,并响应
Filter:(过滤器)拦截请求
Lisenter:(监听器)监听某一行为,只要用户触发这一行为,自动执行
web项目:请求与响应的项目
Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
- 接收请求数据;
- 处理请求;
- 完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
请求:包含请求头,请求体(不一定
响应:
3.1.2:实现Servlet的方式
实现Servlet有三种方式:
- 实现javax.servlet.Servlet接口;
- 继承javax.servlet.GenericServlet类;
- 继承javax.servlet.http.HttpServlet类;
Servlet.java
public interface Servlet { public void init(ServletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; public String getServletInfo(); public void destroy(); }
Servlet中的方法大多数不由我们来调用,而是由Tomcat来调用。并且Servlet的对象也不由我们来创建,由Tomcat来创建!
3.1.3 创建helloservlet应用
我们开始第一个Servlet应用吧!首先我们使用idea创建一个web项目
接下来我们开始准备完成Servlet,完成Servlet需要分为两步:
-
编写Servlet类;
三种方式:
-
实现javax.servlet.Servlet接口;
javax.servlet包
-
继承javax.servlet.GenericServlet类;
-
继承javax.servlet.http.HttpServlet类;
Javaweb组件方法由tomcat调用
HelloServlet.java
public class HelloServlet implements Servlet { public void init(ServletConfig config) throws ServletException {} public ServletConfig getServletConfig() { return null ; } public void destroy() {} public String getServletInfo() { return null; } public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System. out .println("hello servlet!"); } }
-
4:Servlet接口
- 编写Servlet类, 编写处理请求的逻辑代码
让一个类变成Servlet类,三种方式:
- 实现javax.servlet.Servlet接口
- 继承javax.servlet.GenericServlet抽象类
- 继承javax.servlet.http.HttpServlet抽象类 实际开发中使用这种方式
- 在WEB-INF/web.xml文件中进行配置
<!--配置Servlet, 一个Servlet类绑定一个url(客户端访问入口)--> <servlet> <!-- 名称 随意取, 一般取名类名--> <servlet-name>AServlet</servlet-name> <!--对应的Servlet类, 全限定名(包.类名) --> <servlet-class>com.fs.web.AServlet</servlet-class> </servlet> <servlet-mapping> <!--名称, 与对应servlet的servlet-name一样 --> <servlet-name>AServlet</servlet-name> <!--绑定url: /路径 一般取名: /类名 --> <url-pattern>/AServlet</url-pattern> </servlet-mapping>
javaWeb中三大组件的方法,大部分 都不是程序员手动调用, 由Tomcat(其他web服务器)服务器调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yv9qxmeH-1666191656934)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1666168834568.png)]
4.1 Servlet的生命周期
描述Servelet的一生, 从生到死过程
与Servlet的生命周期相关的方法有:
- void init(ServletConfig);
- void service(ServletRequest,ServletResponse);
- void destroy();
- 默认情况: Servlet第一次请求的时候,由Tomcat创建
- 调用init()方法
- 用户每请求一次这个Servlet, tomcat调用一次service()方法
- 当Tomcat服务器关闭之前, 销毁它创建的所有对象,包含创建Servlet, 在Servlet销毁之前, 调用destroy()
Servlet中的其他对象
- ServletConfig 对象: 对应Servlet的配置, Tomcat创建,
- 获取Servlet的初始化参数 参数名,参数值 都是String类型
String getInitParameter(String name) 根据初始化参数名获取初始化参数值
Enumeration getInitParameterNames() 获取所有的初始化参数name
- ServletContext getServletContext() 得到ServletContext , 最大域对象(Application域)
- ServletRequest对象: 请求对象, 后面详细讲 核心 Tomcat创建
核心方法: 获取请求参数
String getParameter(String name) 根据请求参数name获取请求参数值
前端发送请求有哪些方式:
- form 的action 可以是get,post method: 默认值get, 设置post,发送post请求
- 超链接
<a href="">
只能get - 直接在浏览器地址栏输入url 只能get
- js发送ajax请求 可以是get,post
请求方式: GET请求/POST请求
get请求: 请求参数通过url传递, 请求参数 url: url?k1=v1&k2=v2&…
不安全, 传递字符串, 不能传递文件数据
post请求: 请求参数通过请求体传递,
安全性高, 传递字符串, 传递文件数据
- ServletResponse对象: 响应对象, 后面详细讲 核心 Tomcat创建
getWriter() 得到字符响应输出流, 服务器通过改输出流,把数据写到客户端的浏览器页面上
System.out.println(): 把数据打印到服务器的控制台
实现Servlet的第二种方式: 继承javax.servlet.GenericServlet抽象类
GenericServlet 实现Servlet接口, 把Servlet接口其他四个方法实现, service() 变成抽象方法
实现Servlet的第三种方式: 继承javax.servlet.http.HttpServlet抽象类
专门处理Http请求的
实际开发中使用方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CS2ueSL1-1666191656936)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1666169072023.png)]
实际开发: 继承HttpServlet, 重写doGet()或者doPost()
5.1:Servlet 细节
Servlet与线程安全:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtStxcT9-1666191656937)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1666169284737.png)]
判断线程是否安全依据:多个线程是否共享同一资源,是共享,不安全,不是共享,安全。
AServlet类在Tomcat只有一个对象, 多个请求,请求的同一个Servlet对象, 多个线程使用的同一个对象, Servlet对象共享, 线程不安全
一定不要再Servlet提供存放数据的属性
- Servlet的url-pattern: 给这个servlet绑定一个url
- 一个Servlet只能绑定一个Url?
可以绑定多个url, 但是实际开发一般只绑定一个
- url-pattern的写法
- /字符串 绑定确定的url
- 结合 * (通配符, 任意)
- /user/* 前缀匹配, 只要前面是/user开头,后面的任意 /user/a /user/b
- *.后缀名 后缀匹配, 只要url后面以 后缀名结尾的都匹配 *.do a.do c.do
注意: /*.后缀名 错误写法
- /* 匹配所有
url的匹配, 越精确,优先级越高,
没有*的url优先级高于有*的
- Servlet的默认创建时机: 第一次请求该Servlet才创建, 第一次惩罚, 第一次请求耗费时间多一点
修改Servlet的创建时机: 在web服务器启动的时候,创建Servlet
<servlet> <!--设置tomcat启动的时候,创建--> <load-on-startup>非负整数</load-on-startup> </servlet>
load-on-startup
中的数字越小,越先创建注解:
@WebServlet(value="/*",loadOnStartup=2)
idea 与tomcat
IDEA会为每一个tomcat部署的项目单独创建一份配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-deKkOgI8-1666191656937)(C:/Users/Administrator/Desktop/10-18/assets/image-20221018100705486.png)]
idea发布项目, 使用之前讲第三种发布方式
out目录下项目 tomcat发布项目
idea的项目: 工作项目
<servlet> <!--设置tomcat启动的时候,创建--> <load-on-startup>非负整数</load-on-startup> </servlet>
load-on-startup
中的数字越小,越先创建注解:
@WebServlet(value="/*",loadOnStartup=2)
idea 与tomcat
IDEA会为每一个tomcat部署的项目单独创建一份配置文件
[外链图片转存中…(img-deKkOgI8-1666191656937)]
idea发布项目, 使用之前讲第三种发布方式
out目录下项目 tomcat发布项目
idea的项目: 工作项目