软件体系结构:
B/S 架构: 浏览器/服务器架构, 客户端使用浏览器访问服务器, 用户不需要安装客户端,只有电脑有浏览器就可以访问,
C/S架构: 客户端/服务器架构: 客户端使用软件提供商提供的客户端程序访问, 用户需要下载客户端程序,并且安装
C/S
- C/S结构即客户端/服务器(Client/Server),例如QQ;
- 需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户端程序;
- 缺点:软件更新时需要同时更新客户端和服务器端两端,比较麻烦;
- 优点:安全性比较好。
B/S
- B/S结构即浏览器/服务器(Browser/Server);
- 优点:只需要编写服务器端程序;
- 缺点:安全性较差。
访问web资源:
访问动态资源: 需要服务器运行动态资源, 把运行之后的结果(静态资源) 响应给客户端
访问的静态资源: 服务器直接把静态资源响应给客户端
服务器
服务器: 表示硬件服务器,也表示软件服务器
硬件服务器: 电脑
软件服务器: 软件 javaWeb使用软件服务器
- Tomcat(Apache):Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的 (开发)
- JBoss(JBOSS):大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- Weblogic(Orcale):大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- Websphere(IBM):IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
web项目的结构
-
静态的web项目结构 了解
创建一个目录, 在该目录下存放静态资源
- bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe、tomcat6w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口启动Tomcat;如果是解压版,那么会有startup.bat和shutdown.bat文件,startup.bat用来启动Tomcat,但需要先配置JAVA_HOME环境变量才能启动,shutdawn.bat用来停止Tomcat;
- conf:这是一个非常非常重要的目录,这个目录下有四个最为重要的文件:
- server.xml:配置整个服务器信息。例如修改端口号,添加虚拟主机等; tomcat-users.xml:存储tomcat用户的文件,这里保存的是tomcat的用户名及密码,以及用户的角色信息。可以按着该文件中的注释信息添加tomcat用户,然后就可以在Tomcat主页中进入Tomcat Manager页面了;
- web.xml:部署描述符文件,这个文件中注册了很多MIME类型,即文档类型。这些MIME类型是客户端与服务器之间说明文档类型的,如用户请求一个html网页,那么服务器还会告诉客户端浏览器响应的文档是text/html类型的,这就是一个MIME类型。客户端浏览器通过这个MIME类型就知道如何处理它了。当然是在浏览器中显示这个html文件了。但如果服务器响应的是一个exe文件,那么浏览器就不可能显示它,而是应该弹出下载窗口才对。MIME就是用来说明文档的内容是什么类型的!
- context.xml:对所有应用的统一配置,通常我们不会去配置它。
- lib:Tomcat的类库,里面是一大堆jar文件。如果需要添加Tomcat依赖的jar文件,可以把它放到这个目录中,当然也可以把应用依赖的jar文件放到这个目录中,这个目录中的jar所有项目都可以共享之,但这样你的应用放到其他Tomcat下时就不能再共享这个目录下的Jar包了,所以建议只把Tomcat需要的Jar包放到这个目录下;
- logs:这个目录中都是日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,那么异常也会记录在日志文件中。
- temp:存放Tomcat的临时文件,这个目录下的东西可以在停止Tomcat后删除!
- webapps:存放web项目的目录,其中每个文件夹都是一个项目;如果这个目录下已经存在了目录,那么都是tomcat自带的。项目。其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。http://localhost:8080/examples,进入示例项目。其中examples就是项目名,即文件夹的名字。
- work:运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!可以把这个目录下的内容删除,再次运行时会生再次生成work目录。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。
- LICENSE:许可证。
- NOTICE:说明文件。
项目的部署: 运维
-
把项目目录(打成war包)拷贝tomcat安装目录/webapps目录
jar: java项目打成jar
war: web项目打成war, 拷贝到tomcat的webapps目录, tomcat启动的时候,自动把war解压
- 在tomcat安装目录/conf/server.xml文件中,
<Host>
标签添加一个<context>
, 发布项目
<Context docBase="项目路径" path="/访问项目名" />
- 在conf/Catalina/localhost创建任意名称的xml文件。在文件中编写
访问的项目名: xml文件名
取消发布: 在xml文件后名加.backup
这个方式: idea发布项目方式
javaWeb动态项目结构
-
项目根目录
|–WEB-INF
|–lib 第三方jar
|–classes 类路径 src目录中类编译之后的字节码文件存放路径,配置文件
|–web.xml 文件 当前web项目的配置文件
|–静态资源
WEB-INF下资源,浏览器无法直接访问
Servlet
javaWeb三组件:
Servlet: 接收用户请求,处理请求,响应结果
Filter: 过滤器,用于拦截请求
Listener: 监听器,监听某一行为,只要用户触发了这一行为,就执行代码
请求:
包含请求头、请求体(get没有请求体)
响应:
包含响应头、响应体(也称响应正文)
实现Servlet有三种方式:
-
实现javax.servlet.Servlet接口;
-
继承javax.servlet.GenericServlet类;
-
继承javax.servlet.http.HttpServlet类;开发常用
HttpServlet是一个抽象类,是GenericServlet类的子类,用于处理HTTP请求
javaweb中三大组件中的方法大多数都不需要我们调用,一般由服务器调用。并且Servlet的对象也不由我们来创建,由服务器来创建!
Servlet的生命周期(面试常见)
出生:默认情况下,Servlet在第一次被访问时,由服务器创建且只创建一次,在Servlet创建后调用一次init()方法
服务: 用户每请求一次就调用一次service()方法
死亡:服务器关闭前,调用destroy()方法,销毁所有创建的对象
Servlet中的其他对象
-
ServletConfig 对象: 对应Servlet的配置, Tomcat创建,
- 获取Servlet的初始化参数 参数名,参数值 都是String类型
String getInitParameter(String name) 根据初始化参数名获取初始化参数值
Enumeration getInitParameterNames() 获取所有的初始化参数name
jdk早起的集合: Enumeration
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoNZxysk-1667533413184)(D:/%E9%A3%9E%E6%80%9D%E5%AE%9E%E8%AE%AD%E4%B8%89/6.JavaWeb/%E8%AF%BE%E4%BB%B6/%E8%80%81%E5%B8%88%E7%AC%94%E8%AE%B0/10-17%E7%AC%94%E8%AE%B0/assets/image-20221017112339511.png)]
在Servlet的配置中,
<servlet> <!-- 名称 随意取, 一般取名类名--> <servlet-name>AServlet</servlet-name> <!--对应的Servlet类, 全限定名(包.类名) --> <servlet-class>com.fs.web.AServlet</servlet-class> <!--配置初始化参数--> <init-param> <param-name>name</param-name> <param-value>张三</param-value> </init-param> <init-param> <param-name>age</param-name> <param-value>21</param-value> </init-param> </servlet>
- ServletContext getServletContext() 得到ServletContext , 最大域对象(Application域)
-
ServletRequest对象: 请求对象, 后面详细讲 核心 Tomcat创建
核心方法: 获取请求参数
String getParameter(String name) 根据请求参数name获取请求参数值
3.ServletResponse对象: 响应对象, 后面详细讲 核心 Tomcat创建
getWriter() 得到字符响应输出流, 服务器通过改输出流,把数据写到客户端的浏览器页面上
System.out.println(): 把数据打印到服务器的控制台
前端发送请求有哪些方式:
- 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请求: 请求参数通过请求体传递,
安全性高, 传递字符串, 传递文件数据
Servlet 细节
注解servlet
注解: 特殊的接口, 在方法,类,属性… 上使用 @注解名 (创建注解类的对象)
类类型: class interface enum @interface
注解作用: 替换配置文件
@WebServlet注解 替换servlet的配置文件
// name 忽略: //@WebServlet(name="DServlet",urlPatterns="/DServlet") //@WebServlet(urlPatterns="/DServlet") //urlPatterns 与value 等同 //@WebServlet(value="/DServlet") // 如果只给value赋值, 省略 value= @WebServlet("/DServlet")
Servlet是否是线程安全的?
判断依据:多个线程是否共享统一资源,不共享:安全;共享:不安全
Servlet类在Tomcat只有一个对象, 多个请求时,请求的同一个Servlet对象, 多个线程使用的同一个对象, Servlet对象被共享, 线程不安全
因为Servlet是 线程不安全的,所以不要在Servlet提供存放数据的属性
Servlet的url-pattern
url-pattern作用:给这个servlet绑定访问这个servlet的url
一个Servlet只能绑定一个url?
可以绑定多个url, 但是实际开发一般只绑定一个
url-pattern的写法
/字符串 绑定确定的url
结合 * (通配符, 任意)
- /user/* 前缀匹配, 只要前面是/user开头,后面的任意 例如 /user/a /user/b
- *.do 后缀匹配, 只要url后面以 后缀名结尾的都匹配 例如 a.do c.do
注意: /*.后缀名 是错误写法
- /* 匹配所有
url的匹配, 越精确,优先级越高, 没有星号的url优先级高于有星号的
修改Servlet的创建时机
Servlet的默认创建时机是第一次请求该Servlet才创建, 也叫第一次惩罚, 第一次请求耗费时间多一点
修改Servlet的创建时机: 在web服务器启动的时候,创建Servlet
<servlet>
<!--设置tomcat启动的时候,创建-->
<load-on-startup>非负整数</load-on-startup>
</servlet>
load-on-startup` 中的数字越小,越先创建
ServletContext(上下文)
ServletContext对象 与天(tomcat)同寿
ServletContext 在Tomcat启动的时候创建, 在tomcat关闭的时候销毁, 在整个web项目中只有一个
在Web项目中任何一个用户任何一个地方都可以访问
作用: 作为全局共享数据容器 也称为域对象 ServletContext 称为application域
域对象作用: 存取数据, 数据为key/value结构 key: String类型 value:Object类型
javaWeb中有四大域:
1.application域 整个项目有效
- session域 常用 在同一次会话内有效
- request域 常用 在同一次请求内有效
- page域 在同一个页面/Servlet有效: 等同于this
域对象都有下列方法
void setAttribute(String name,Object object) 往域中存数据, 如果name不存在,就添加,如果name存在,覆盖object
Object getAttribute(String name) 从域中获取数据, 如果name不存在, 返回null
removeAttribute(String name) 从域中删除数据
Enumeration getAttributeNames() 获取域中所有的name
page域 在同一个页面/Servlet有效: 等同于this
域对象都有下列方法
void setAttribute(String name,Object object) 往域中存数据, 如果name不存在,就添加,如果name存在,覆盖object
Object getAttribute(String name) 从域中获取数据, 如果name不存在, 返回null
removeAttribute(String name) 从域中删除数据
Enumeration getAttributeNames() 获取域中所有的name