Http
什么是HTTP
- HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上
- 文本:html,字符串...
- 超文本:用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本
- 80
- Https:安全的
- 443
两个时代
- http1.0
- HTTP/1.0:客户端可以与web服务器连接,只能获得一个web资源,断开连接
- http2.0
- HTTP/1.1:客户端可以与web服务器连接,可以获得多个web资源
Http请求
- 客户端--发请求(Request)--服务器
- 百度
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET get方法/post方法
Status Code: 200 OK 状态码:200
Remote(远程) Address: 220.181.38.149:443
请求行
- 请求行中的请求方式:GET
- 请求方式:Get,Post...
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效
消息头
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机
Http响应
- 服务器--响应(Response)--客户端
- 百度:
Cache-Control: private 缓存控制
Connection: keep-alive 连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
响应体
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机
Refresh:告诉客户端,多久刷新一次
Location:让网页重新定位
响应状态码
- 200:请求响应成功
- 3xx:请求重定向
- 重定向:你重新到我给你新位置去
- 4xx:找不到资源 404
- 资源不存在
- 5xx:服务器代码错误 500 502:网关错误
常见面试题:
- 当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
Maven
- 我为什么要学习这个技术?
- 1.在Javaweb开发中,需要使用大量的jar包,我们需要手动去导入
- 2.如何能够让一个东西自动帮我们导入和配置这个jar包
- 由此,Maven诞生了!
Maven架构管理工具
- 我们目前用来就是方便导入jar包的!
- Maven的核心思想:约定大于配置
- 有约束,不要去违反
- Maven会规定好你该如何去编写java代码,必须要按照这个规范来
下载安装Maven
- 官网:https://maven.apache.org/
- 下载完成后,解压即可
- 友情建议:电脑上的所有环境都放在一个文件夹下,方便管理
配置环境变量
- 在我们的系统环境变量中配置如下配置:
- M2_HOME:maven目录下的bin目录
- MAVEN_HOME:maven的目录
- 在系统的path中配置 %MAVEN_HOME%\bin
- 测试Maven是否安装成功,保证必须配置完毕!
阿里云镜像
- 镜像:mirrors
- 作用:加速我们的下载
- 国内建议使用阿里云的镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
本地仓库
- 在本地的仓库,远程仓库
- 建立一个仓库:localRepository
<localRepository>D:\Java\apache-maven-3.6.1\maven-repo</localRepository>
在IDEA中使用Maven
- 1.启动IDEA
- 2.创建一个MavenWeb项目
- 3.等待项目初始化完毕
- 4.观察maven仓库中多了什么东西?
- 5.IDEA中的Maven设置
- IDEA项目创建成功后,看一眼Maven配置
- 6.到这里,Maven在IDEA中的配置和使用就OK了!
创建一个普通的Maven项目
标记文件夹功能
在IDEA中配置Tomcat
- 解决警告问题
- 必须要的配置:为什么会有这个问题:我们访问一个网站,需要指定一个文件夹名字
pom文件
- pom.xml是Maven的核心配置文件
- maven由于他的约定大于配置,我们之后可能会遇到我们写的配置文件无法被导出或者生效的问题,解决方案:
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
IDEA操作
Maven仓库的使用
Servlet
Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- Sun在这些API中提供了一个接口叫做:Servlet,如果想开发一个Servlet程序,只需要完成两个步骤:
- 编写一个类,实现Servlet接口
- 把开发好的Java类部署到web服务器中
- 把实现了Servlet接口的Java程序叫做,Servlet
HelloServlet
- 1.构建一个Maven项目,删掉里面的src目录,以后就在这个项目里面建立Moduel,这个空的工程就是Maven的主工程
- 2.关于Maven父子工程的理解:
- 父项目中会有
<modules>
<module>servlet-01</module>
</modules>
- 子项目会有
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.xiaosong</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
- 父项目中的java子项目可以直接使用
son extends father
- 3.Maven环境优化
- 1.修改web.xml为最新的
- 2.将maven结构搭建完整
- 4.编写一个servlet程序
- 1.编写一个普通类
- 2.实现Servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 5.编写Servlet的映射
- 为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,
所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径
- 为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.xiaosong.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 6.配置Tomcat
- 注意:配置项目发布的路径就可以了
- 7.启动测试
Servlet运行原理
- Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:
Mapping问题
- 1.一个Servlet请求可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 2.一个Servlet请求可以指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello4</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello5</url-pattern>
</servlet-mapping>
- 3.一个Servlet请求可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
- 4.默认请求路径(少用)
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
- 5.指定一些后缀或者前缀等等...
- 6.优先级问题
- 指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.xiaosong.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
ServletContext
- web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext,它代表了当前的web应用
共享数据
- 我在这个Servlet中保存的数据,可以在另外一个servlet中拿到
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter() 初始化参数
//this.getServletConfig() Servlet配置
//this.getServletContext() Servlet上下文
ServletContext context = this.getServletContext();
String username = "小淞";//数据
context.setAttribute("username",username);//将一个数据保存在了ServletContext中,名字为:username,值username
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.xiaosong.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.xiaosong.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
- 测试访问结果
获取初始化参数
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
请求转发
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了ServletDemo04");
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径
requestDispatcher.forward(req,resp);//调用forward实现请求转发
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
读取资源文件
- Properties
- 在java目录下新建properties
- 在resources目录下新建properties
- 发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath
- 思路:需要一个文件流
username = root123
password = mkmkmlmllkl
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/xiaosong/servlet/aa.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 访问测试即可