1 Javaweb的基础知识
- Javase是Javaweb、Javaee的基础;
- Javaweb是开发网站的相关技术,主要包括了Servlet、Tomcat、JDBC、Cookie/Session;
- JavaEE 的全称是 JAVA Platform Enterprise Eitdit 面向企业开发的框架
- 2015 SSH(Struts + Hibernate + Spring)
- 2015-2018 SSM(SpringMVC + Spring + Mybatis SSM)
- 2018-至今 Spring Boot (SpringBoot + Spring + Myabtis)
- 其他的一些框架:
- 微服务框架 SpringCloud/alibaba Cloud
- 无服务框架 ServerLess
- 服务网格 ServerMesh
- 静态网页
- 由JS+HTML+CSS组成,无论何时请求网页都不会变化
- 动态网页
- 前端:HTTP+HTML+CSS+JS;
- 后端:Servlet+Tomcat+Request+Repone+Session/Coookie;
- 数据库:Mysql;
- 浏览器和服务器的交互根据浏览器不同的请求生成不同的的网页;
- 统一资源定位符
- 协议://公网ip:端口/路径1/路径2?key=value
- 不同的协议用不同的解析方式;
- 网络中由很多的主机,为了访问不同的主机,使用公网IP做区分;
- 主机中由很多进程,每一个端口都代表一个进程;
- 路径:进一步区分主机中的资源;
- 协议://公网ip:端口/路径1/路径2?key=value
2 Http的基础协议和解析
2.1 CS/BS
- CS 是客户端-服务器模式(Client-Server)即CS结构;
- 优点 :用户体验好、界面流畅;
- 缺点:客户端升级和维护需要重新设计和开发,需要兼容不同的系统;
- BS 浏览器和服务器架构模式(Brower-Server) 系统的功能实现集中在服务器;
- 优点:发布快,用户可以很快体验新的功能 ,不用兼容各种系统;
- 缺点:依赖网络,必须在网络好的情况下才能加载很快;
2.2 超文本传输协议
- 协议:一种信息交换的格式,请求方以什么样方式加密数据,接收方就会用什么样的方式解密数据;
- 超文本传输协议:Hyter text transfer protocol 是web的联网基础,也是手机PC联网的基础,http协议是tcp协议的一种应用;
- http协议的特点:客户端的每一次请求都要求服务器响应,一次请求和响应被成为“一次连接”;
- HTTP响应码
响应码 | 说明 |
---|---|
1xx | 信息被接收,等待处理 |
2xx | 服务器响应成功 |
3xx | 重定向 |
4xx | 客户端语法错误或者语义不清 |
5xx | 服务器处理请求出现了问题 |
- HTTP和HTTPS的区别
- HTTPS(Hytertext Transfer Protocol over SecrueSockt Layer)
- 组合:HTTP+SSL/TLS
- 优点:保证了数据在传输的过程不被修改,泄露,保证了数据的完整性。
- 缺点:在相同的网速情况加载HTTPS比HTTP的网页多耗时50%,耗电多耗10%-20%;但是利大于弊,HTTPS是趋势;
2.3 HTTP请求和响应拆分详解
- 请求
- 请求行:请求方法、请求路径、协议的版本;
- 请求头:“属性:属性值”的格式进行展示,服务器获取客户端信息的数据
- 请求体:可以是json对象也是可以表单key1=value&key2=value
- 响应
- 响应行:报文协议以及版本号,状态码;
- 响应头:“属性:属性值”;
- 响应体:可以是json对象,图像、视频等
2.4 常用的请求方法
- HTTP 1.0 协议
- GET:向服务器获取资源,
- POST: 向服务器提交资源;
- HEDA: 和get请求类似,获取的是请求的数据;
- HTTP 1.1 协议
- PUT:更新数据请求,例如:更新商品信息,个人信息;
- PATCH:是put方法的补充,更新指定资源部分数据;
- DELETE : 删除指定资源;
- OPTIONS: 获取服务器支持的方法、性能、是否支持跨域;
- CONNECT :让服务器代替用户访问其他网址,然后把数据返回给用户;
- TRACE:回显服务器的请求;
2.5 HTTP常用的响应码
- 1xx :服务器收到了请求,等待下一步操作;
- 2xx:请求成功;
- 3xx:请求成功,浏览器拿到了这个状态码会自动跳转到新的地址;
- 301 永久性跳转;
- 302 临时跳转;
- 4xx:客户端出错
- 400 请求的协议不对;
- 403 请求被拒绝了;
- 404 不存在这个地址或者 语义错误;
- 405 使用的请求方法不正确;
- 5xx: 服务器出错;
- 500 服务器内部错误了;
- 503 服务器宕机了;
2.6 HTTP 常用的请求头和响应头
2.6.1 请求头
- accept 浏览器支持的mime媒体类型;
- accept-language 浏览器支持的语言格式;
- accept-Encoding 浏览器支持的编码格式;
- connction:keep-alive 持久连接;
- orgin:告诉服务器是从那里请求的(只有域名和协议);
- refer:告诉服务器请求的完整的uri,包括域名+协议+请求参数(在一些抢购服务器里面使用,比如抢购一个优惠券,必须从某个网页进入)
- transfer-Encoding 服务器长度响应不确定,静态网页没有这种情况;
- content-type:服务请求的提交的内容;
- cookie:服务端会判断http请求的状态,比如说登录的token;
- user-agent :服务器可以根据请求头判断软件应用类型,开发商,开发商版本号,浏览器的内核版本;
2.6.2 响应头
- allow 服务器支持的方法;
- content-type 响应返回的mime类型;
- content-Encoding 响应的编码格式;
- content-length 服务器响应的长度;
- DATE:服务器请求的时间;
- expires:响应的有效时间,一个GMT时间;
- cahe-control:和expires一样的作用,控制浏览器向缓存获取数据还是向服务器获取数据,比expires更加的精细,使用方法:max-age=360;
- location:用户在那个地址获取的数据 一般和状态码30x配合使用;
- transform-Encoding:chunked 服务器响应长度不确定,静态网页就不会出现这个页面;
- acess-control-allow-origin:跨域资源共享的站点;
- server:服务器名称;
- content-type的常用类型:
- text/plain 文本格式;
- text/html html格式;
- text/xml xml格式;
- image/gif gif格式;
- image/png png格式;
- image/gpeg gpg格式;
- application/json json格式;
- application/pdf pdf 格式;
- application/octet -stream 二进制数据;
- application/www-form-urlencoded 表单格式;
- mulpart/form-data:上传的文件类型;
提升:https://developer.mozilla.org/zh-CN/docs/Web/HTTP;
3 apache tomcat基本知识
3.1 基础知识
- 什么是服务器:远程的一台电脑,安装了服务器程序监听对应端口,提供对外服务,可以根据服务器请求(web服务器和应用服务器都是电脑上安装的软件);
- web服务器和应用服务器有很大的交集,并没有明确的区分;web服务器处理http协议,tomcat处理其他协议;
- apache tomcat apache 是html的容器,不能处理jsp,java,tomcat是servlet的容器 是apache的一个拓展;
3.2 tomcat下载安装
- 环境准备:
- 安装JDK8以上;
- 下载地址:https://tomcat.apache.org/
- 启动/关闭:
#启动
linux: bin/startup.sh (需要增加执⾏行行权限:chmod 777 ./*)
windows:bin/startup.bat;
#关闭
linux:bin/shutdown.sh;
windows;shutdown.bat;
*启动乱码报错
原因:控制台展示编码问题
编辑 conf/logging.properties ⽂文件
java.util.logging.ConsoleHandler.encoding = UTF-8
改为
java.util.logging.ConsoleHandler.encoding = GBK
3.3 tomcat目录
- bin 存放启动脚本的目录;
#启动
startup.sh/startup.bat
关闭
shutdown.sh/shutdown.bat
- lib 存放着tomcat运行需要的第三方的包,第三方jar包对多有的项目共享;
- conf 存放配置文件的目录,server.xml可以修改端口,虚拟ip;
- log tomcat 启动关闭日志,catalina.out 标准错误输出,也会输出tomcat运行和console打印的日志;
- work 存放编译class文件的目录;
- wepapps 发布项目的主要目录,每一个目录都是一个项目,如果没有给出项目时候,ROOT就是主项目;
- temp:存放tomcat运⾏行行时的临时性数据;
4 servlet 4.0
4.1 基础知识
- Servlet又叫 JAVAServlet 是安装在web服务器和应用服务器上面的程序,独立于平台和协议的特性;
- 作用:用户通过浏览器向服务器提交表单,用户向数据库获取信息返回给浏览器;
- 常用的两个子类:HttpServlet GenericServlet;
4.2 第一个Servlet
- java代码
package net.lizheng.web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain;charset=utf-8");
PrintWriter printWriter=resp.getWriter();
printWriter.write("今天不学习明天变垃圾");
}
}
xml配置
<servlet>
<servlet-name>FirstDEMO</servlet-name>
<servlet-class>net.lizheng.web.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstDEMO</servlet-name>
<url-pattern>/FirstDEMO</url-pattern>
</servlet-mapping>
4.3 Servlet的生命周期
- Servlet共有5个方法,3个生命周期方法,2个普通方法;
- init() 方法,在servlet声明周期中只会执行一次,用于资源的初始化,在调用servlet第一次执行;
- service() 是servlet生命周期的核心,会根据不同请求方式调用不同的方法,且httpservlet实现了service方法所有只要重写doget。。。。方法即可;(XXXServlet->HttpServlet->GenericServlet->implements Servlet)
- destroy()只会执行一次,就是服务关闭时候;
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package javax.servlet;
import java.io.IOException;
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
4.4 新版Servlet3.0~5.0和旧版配置的区别
- 新版的servlet的配置不需要配置web.xml,而是通过注解的方式进行配置(注解不了解的同学可以看下另一篇文档注解);
- 示例
package net.lizheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name="FirstDemo",value = "/test")
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/plain;charset=utf-8");
PrintWriter printWriter=resp.getWriter();
printWriter.write("今天不学习明天变垃圾");
}
}
注解示例
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package javax.servlet.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
//servlet的名称
String name() default "";
//servlet的路径
String[] value() default {};
//可以这是servlet地址的多个映射类使用方法{”/test“,"test1"}
String[] urlPatterns() default {};
//是否在服务器启动时候加载默认-1 不加载 0加载
int loadOnStartup() default -1;
WebInitParam[] initParams() default {};
//是否支持异步通知
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
5 JSP
5.1 基础知识
- JSP 的全称是JAVA Service pages JAVA页面服务器;
- JSP的作用是代替servlet回传HTML文件(使用servlet回传文件工作量大,维护成本高);
- JSP的本质就是一个servlet程序,第一次访问jsp文件,tomcat会把jsp转化为JAVA的源文件,然后编译成.class的字节码文件;
- jsp转化为java源文件会继承HttpJspBase,而HttpJspBase又继承了Httpservlet;
- JSP就是再html中写java代码,servlet就是在java写html代码;
5.2 page 指令
- language jsp转化什么语言,目前支持Java;
- contentType jsp的响应是什么类型,等同于resp.setContentType();
- pageEncoding 页面使用的字符集;
- import 导入包 <%@import=“java.until.*” %>;
- errorPage jsp页面运行报错,自动跳转的页面 <%@errorPage =“/error.jsp.*” %>;
- isErrorPage 是否为jsp的错误页面,默认为fasle;
- session 访问jsp时,是否创建HttpSession对象;
- extend jsp转化为java源文件,默认继承的类;
- autoFlush 缓冲区满了是否自动刷新默认为true;
- bufer 设置缓冲区的大小;
5.3 jsp脚本
- 声明脚本
<%! %>
- 声明属性、方法…
<%!
public String name="";
public void test(){
}
%>
- 表达式脚本
<%= %>
- 数据和运算符组成的表达式;
<%=12+13%>
<%="今天不学习明天变垃圾"%>
- 代码脚本
<% %>
<%
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
%>
5.4 JSP九大内置对象
方法 | 描述 |
---|---|
request | 请求对象 HttpServletRequest |
respone | 响应对象 HttpServletRespone |
pageContent | Pgae上下文对象 pageContent |
session | Httpsession对象 |
application | ServletContent上下文对象 |
config | ServletConfig配置对象 |
out | JSPwriter对象 |
page | 当前对象 |
expriession | Expriession对象 |
- 其中request 、pageContent、session、application是四大域对象,可以像hashmap一样存储值;
- request 一次请求;
- pageContent 一个jsp页面;
- session一次会话(浏览器打开开始,浏览器关闭结束);
- application web工程关闭结束;
- 取值从小到大;
- pageContent-> request -> session-> application
6 HttpServletRequset与 HttpServletRepone的常用方法
6.1 HttpServletRequset
- HttpServletRequset的代表的是客户端发送的http请求。客户端通过http协议请求到服务器,HttpServletRequset对象封装了所有请求数据,可以通过HttpServletRequset的方法获取数据;
package net.lizheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name="name",value = "/RequestServletMethod")
public class RequestServletMethod extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("获取应用上下文路径"+req.getContextPath());
System.out.println("获取请求地址url"+req.getRequestURL());
System.out.println("获取请求地址uri"+req.getRequestURI());
System.out.println("获取客户端的请求ip"+req.getRemoteAddr());
System.out.println("获取客户端的请求port"+req.getRemotePort());
System.out.println("获取请求头信息"+req.getHeader("User-Agent"));
System.out.println("获取客户端的请求参数"+req.getParameter("username"));
System.out.println("获取客户端的请求参数列表"+req.getParameterValues("lesson").toString());
System.out.println("获取客户端的请求参数map"+req.getParameterMap().toString());
System.out.println("获取客户端的查询参数"+req.getQueryString());
}
}
6.2 HttpServletRepone
- HttpServletRepone代表的是服务器向客户端的响应,里面包含了方法设置响应头响应状态的方法;
- 使用字节流的方式
package net.lizheng.web;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "test2",value = "/RepsoneServletMethod")
public class RepsoneServletMethod extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应数据mime类型
resp.setContentType("text/html;charset=utf-8");
//设置响应头第一种方式
resp.addHeader("Content-Type","text/html;charset=utf-8");
//设置响应头第二种方式
resp.setHeader("transform","chunked");
//设置状态码
resp.setStatus(1000);
//设置编码格式
resp.setCharacterEncoding("utf-8");
//使用字节输出来流打印一段话
String data="今天不学习明天变垃圾";
ServletOutputStream outputStream = resp.getOutputStream();
byte[] bytes = data.getBytes("UTF-8");
outputStream.write(bytes);
}
}
- 使用字符流的方式
package net.lizheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "test2",value = "/RepsoneServletMethod")
public class RepsoneServletMethod extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应头第一种方式
resp.addHeader("Content-Type","text/html;charset=utf-8");
//设置状态码
resp.setStatus(200);
//设置编码格式
resp.setCharacterEncoding("utf-8");
//使用字节输出来流打印一段话
String data="今天不学习明天变垃圾";
PrintWriter writer = resp.getWriter();
writer.write(data);
}
}
6.3 编写一个form表单登录
<form action="/testdemo/login" method="post">
<div>用户名: <input type="text" name="username" /> </div>
<div>密码: <input type="password" name="password"/> </div>
<div> <input type="submit" value="登录"> </div>
</form>
package net.lizheng.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name="login",value = "/login")
public class login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
if (username.equals("zhangsan")&&password.equals("123456")){
writer.write("登录成功");
}else {
writer.write("登录失败");
}
}
}