JAVAWEB
HTML
- HTML是解释型的文本标记语言,不区分大小写
- html,head,title,meta,body,br,p,hr,div,table,form,u,i,b,sup,sub, ,span,ul,ol,li,tr,td,th,h1-h6,a,input,select,textarea,img
2-1. html , head , title , meta , body , br , ul , ol , h1-h6 , a , img ,  , p , div , span
2-2. table tr , th , td
2-3. form(action=’’ , method=’post’) input type=’text,pasword,radio,checkbox,submit,button,reset” select , textarea
2-4. frameset表示页面框架、frame表示框架中的具体页面引用;iframe在一个页面嵌入一个子页面。
CSS
简介
层叠式样式表
被style标签包围的环境为CSS环境,可以写CSS代码,值 “text/css” 指示内容是标准的 CSS。
1 | <style type="text/css"> |
CSS的分类:标签样式表、类样式表、ID样式表、组合样式表
CSS从位置上的分类:嵌入样式表、内部样式表、外部样式表
盒子模型
- border(-top/-left…)
- margin 和 padding 注意浏览器的兼容问题!
tips:1
2
3
4
5
6
7
8
9
10
11
12
13body{
margin:0;
padding:0;
}
```
### CSS布局
position: absolute -- 绝对定位 , 需要配合使用 left , top
relative -- 相对定位 , 一般会和 float , margin , padding .... 一起使用
## JavaScript
Javascript : 客户端的一个脚本语言
js是一门弱类型的语言 , 变量的数据类型由后面赋的值的类型决定<script language="javascript"> /* var str = "hello world"; alert(typeof str); str = 9999 ; alert(typeof str); */ /* var person = new Object(); person.pid = "p001"; person.pname="鸠摩智"; alert(person.pid+"_"+person.pname); */ //java 方法 public String hello(String name){ return "hello to " + name ; } //js 方法 function hello(num1 , num2 , name){ if(num1>num2){ return "hello to" + name ; }else{ alert("HELLO"); } } </script>
## WEB
1. C/S:客户端服务器架构模式
优点:充分利用客户端机器的资源,减轻服务器的负荷(一部分安全要求不高的计算任务存储任务放在客户端执行,不需要把所有的计算和存储都在服务器端执行,从而能够减轻服务器的压力,也能够减轻网络负荷)
缺点:需要安装客户端;升级维护成本较高
2. B/S:浏览器服务器架构模式
优点:客户端不需要安装;维护成本较低
缺点:所有的计算和存储任务都是放在服务器端,服务器的负荷较重;在服务端计算完成之后把结果再传输给客户端,因此客户端和服务端会进行非常频繁的数据通信,从而网络负荷较重
### Tomcat
Web容器:
1. Tomcat的安装和配置
* 解压:不要有中文不要有空格
* 目录结构说明 :
bin 可执行文件目录
conf 配置文件目录
lib 存放lib的目录
logs 日志文件目录
webapps 项目部署的目录
work 工作目录
temp 临时目录
deploy :部署
baidu> context root
* 配置环境变量,让tomcat能够运行因为tomcat也是用java和C来写的,因此需要JRE,所以需要配置JAVA HOME
* 启动tomcat,然后访问主页
2. 新建Web项目,并在tomcat中部署最后再访问
### Servlet
#### 使用场景
1. 用户在html的表单添加请求,action="add",method="post"
2. 新建AddServlet文件,继承HttpServlet,重写doPost或doGet方法,通过request.getParameter根据name值获取表单中的属性,以及添加其他有关数据库的代码。
3. WEB-INFO目录下的web.xml文件中添加映射配置:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>AddServlet</servlet-name>
<servlet-class>com.atguigu.servlets.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddServlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
<!--
1. 用户发请求,action=add
2. 项目中,web.xml中找到url-pattern = /add -> 第12行
3. 找第11行的servlet-name = AddServlet
4. 找和servlet-mapping中servlet-name一致的servlet , 找到第7行
5. 找第8行的servlet-class -> com.atguigu.servlets.AddServlet
6. 用户发送的是post请求(method=post) , 因此 tomcat会执行AddServlet中的doPost方法
-->
</web-app>
可以通过welcome-file-list标签进行设置欢迎页(在tomcat的web.xml中设置,或者在自己项目的web.xml中设置)。
设置编码
post方式下,doPost开头设置编码,在所有获取参数动作之前,防止中文乱码
request.setCharacterEncoding("UTF-8");
get方式目前不需要设置编码(基于tomcat8),tomcat8之前,设置编码,.getBytes(“xxx”),再重新组装成格式
Servlet的继承关系
继承关系
javax.servlet.Servlet接口
javax.servlet.GenericServlet抽象类
javax.servlet.http.HttpServlet抽象子类相关方法
javax.servlet.Servlet接口:
void init(config) - 初始化方法
void service(request,response) - 服务方法
void destory() - 销毁方法javax.servlet.GenericServlet抽象类:
void service(request,response) - 仍然是抽象的javax.servlet.http.HttpServlet 抽象子类:
void service(request,response) - 不是抽象的- String method = req.getMethod(); 获取请求的方式
- 各种if判断,根据请求方式不同,决定去调用不同的do方法
if (method.equals(“GET”)) {
this.doGet(req,resp);
} else if (method.equals(“HEAD”)) {
this.doHead(req, resp);
} else if (method.equals(“POST”)) {
this.doPost(req, resp);
} else if (method.equals(“PUT”)) {}… - 在HttpServlet这个抽象类中,do方法都差不多:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_get_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(405, msg); } else { resp.sendError(400, msg); } }
Servlet的生命周期
- 生命周期:从出生到死亡的过程就是生命周期。对应Servlet中的三个方法:init(),service(),destroy()
- 默认情况下:
- 第一次接收请求时,这个Servlet会进行实例化(调用构造方法)、初始化(调用init())、然后服务(调用service())
- 从第二次请求开始,每一次都是服务
- 当容器关闭时,其中的所有的servlet实例会被销毁,调用销毁方法
- 通过案例我们发现:
- Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应。
- 默认情况下,第一次请求时,tomcat才会去实例化,初始化,然后再服务.这样的好处是什么? 提高系统的启动速度 。 这样的缺点是什么? 第一次请求时,耗时较长。
- 因此得出结论: 如果需要提高系统的启动速度,当前默认情况就是这样。如果需要提高响应速度,我们应该设置Servlet的初始化时机。
- Servlet的初始化时机:
- 默认是第一次接收请求时,实例化,初始化
- 我们可以通过load-on-startup来设置servlet启动的先后顺序,数字越小,启动越靠前,最小值0
- Servlet在容器中是:单例的、线程不安全的
- 单例:所有的请求都是同一个实例去响应
- 线程不安全:一个线程需要根据这个实例中的某个成员变量值去做逻辑判断。但是在中间某个时机,另一个线程改变了这个成员变量的值,从而导致第一个线程的执行路径发生了变化
- 我们已经知道了servlet是线程不安全的,给我们的启发是: 尽量的不要在servlet中定义成员变量。如果不得不定义成员变量,那么不要去:①不要去修改成员变量的值 ②不要去根据成员变量的值做一些逻辑判断
Http协议
- HTTP:Hyper Text Transfer Protocol 超文本传输协议
- Http是无状态的,包含 请求和响应 两个部分
- Http请求报文包含三个部分:请求行、请求消息头、请求主题
- 请求行:请求方式、访问地址URL、请求的协议(一般是http1.1)
- 请求消息头:通过具体的参数对本次请求进行具体的说明,包含许多键值对
- 请求体:① get方式,没有请求体,但有queryString ② post方式,有请求体 form data ③ json格式,有请求体,request payload
- Http响应报文也包含三个部分:响应行、响应消息头、响应体
- 响应行:协议、响应状态码、响应状态
- 响应消息头:包含了服务器的信息;服务器发送给浏览器的信息(内容的媒体类型、编码、内容长度等)
- 响应体:响应的实际内容(比如请求xxx.html页面时,响应的内容就是<html><head><body><form>)
会话Session
- Http是无状态的:服务器无法判断这两次请求时同一个客户端发过来的,还是不同的客户端发过来的。
- 带的问题:无法区分同一个用户,导致混乱
- 通过会话跟踪技术来解决无状态问题
- 客户端第一次发请求给服务器,服务器获取session,获取不到,则创建新的,然后响应给客户端
- 下次客户端给服务器发请求时,会把sessionID带给服务器,那么服务器就能获取到了,那么服务器就判断这一次请求和上次某次请求是同一个客户端,从而能够区分开客户端
- 常用的API:
request.getSession() -> 获取当前的会话,没有则创建一个新的会话
request.getSession(true) -> 效果和不带参数相同
request.getSession(false) -> 获取当前会话,没有则返回null,不会创建新的
session.getId() -> 获取sessionID
session.isNew() -> 判断当前session是否是新的
session.getMaxInactiveInterval() -> session的非激活间隔时长,默认1800秒
session.setMaxInactiveInterval()
session.invalidate() -> 强制性让会话立即失效
session.getAttribute()/setAttribute(key,value),removeAttribute()
….
- session保存作用域时和具体的某一个session对应的
服务器内部转发以及客户端重定向
- 服务器内部转发:request.getRequestDispatcher(“…”).forward(request,response);
- 一次请求响应的过程,对于客户端而言,内部经过了多少次转发,客户端是不知道的
- 地址栏没有变化
- 客户端重定向:response.sendRedirect(“…”);
- 两次请求响应的过程。客户端肯定知道请求URL有变化
- 地址栏有变化
Thymeleaf
Original link: http://example.com/2023/07/06/offer-javaweb/
Copyright Notice: 转载请注明出处.