JavaWeb创建、发布HelloWorld
一、Http
1.1什么是http?
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本:html、字符串、~...
- 超文本:图片、音乐、视频、定位、地图
- http端口:80、https端口:443
1.2两个时代
-
http1.0
- HTTP/1.0:客户端与服务器连接后只获得一个web资源
-
http2.0
- HTTP/1.1:客户端与服务器连接后可获得多个web资源
1.3Http请求
客户端-发请求-服务器
百度:
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET 在客户机和服务器之间进行请求-响应时两种最常被用到的方法:
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据。
Status Code: 200 OK 状态码 200
Remote Address: 39.156.66.18:443 远程地址
Referrer Policy: unsafe-url
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
1.3.1请求行
-
请求行中的请求方式:GET
-
请求方式:
- GET:从指定的资源请求数据,请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示内容不安全,但高效
- POST:向指定的资源提交要被处理的数据,请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示内容安全,但低效
1.3.2请求头
Accept 告诉浏览器,它所支持的数据类型
Accept-Encoding 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language 浏览器的语言环境
Cache-Control 缓存控制
Connection 告诉浏览器请求完成是断开还是保持
HOST 主机
1.4Http响应
Cache-Control: private 缓存控制
Connection: keep-alive 连接(保持连接)
Content-Encoding: gzip 编码
Content-Type: text/html; 类型
1.4.1响应体
Accept 告诉浏览器,它所支持的数据类型
Accept-Encoding 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language 浏览器的语言环境
Cache-Control 缓存控制
Connection 告诉浏览器请求完成是断开还是保持
HOST 主机
Refrush 告诉客户端多久刷新一次
Location 让网页重新定位
1.4.2响应状态码
200:请求响应成功
3xx:请求重定向
4xx:找不到资源 404
5xx:服务器代码错500 网关错误502
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
二、tomcat
bin-启动文件夹
conf->配置->sever(服务器核心配置文件)
2.1可以配置启动的端口号
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2.2可以配置主机的名称
- 默认主机名为:localhost:127.0.0.1
- 默认网站应用存放的位置为:webapps
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
- tomcat默认端口8080
- mysql-3306
- http-80
- https-443
2.3网站是如何访问的?
- 输入一个域名
- 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件中有无这个域名的映射
- 有,返回对应的ip地址,这个ip地址中有我们需要访问的web程序可以直接访问
- 没有,去DNS(全世界的域名)服务器,找到就返回
lib-使用的jar包
logs-日志
temp-缓存
webapps-tomcat服务器的目录
- ROOT
- gw:网站目录名
- text.html默认的首页
- WEB-INF
- classes:java程序
- lib:web应用所依赖的jar包
- web.xml网站配置文件
- static
- css
- style.css
- js
- img
- css
三、HelloServlet
Servlet是sun公司开发动态web的一种技术,Servlet在java中是一种接口,因此在使用时需要编写一个类实现Servlet接口,然后把开发好的java类部署到web服务器中
3.1创建项目
构建一个普通的Maven项目(本文省去了maven的安装和配置过程),删掉里面的src目录,以后就在该项目中建立module;这个空的工程就是Maven主工程,在父项目中加入jsp和jsp-api的dependency
3.2对Maven父子工程的理解
父项目中会有
<modules>
<module>servlet-01</module>
</modules>
子项目中会有
<parent>
<artifactId>HelloServlet</artifactId>
<groupId>com.Gw</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
父项目中的jar包子项目可以直接使用
3.3Maven环境优化
1.修改web.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"
metadata-complete="true">
</web-app>
2.将maven的结构搭建完整(java、resources)
3.4编写一个Servlet程序
-
编写一个普通类
-
实现Servlet接口,这里直接继承HttpServlet抽象类
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ServletOutputStream outputStream = resp.getOutputStream();
System.out.println("进入doGet方法");
PrintWriter writer = resp.getWriter();
writer.print("Hello, Servlet!!!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.5编写Servlet的映射
为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet
<!--注册servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.Gw.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.6配置tomcat
配置项目发布的路径, 配置Server和Deployment
3.7启动测试
控制台如上所示,并产生提前部署好的页面(放在webapp中)
3.8Servlet原理
按下回车后,浏览器将http请求发送给web容器(tomcat),接着由请求和相应调用servlet中的service方法(在service方法中request从service中拿到请求后把请求之后的响应交给response),servlet中还存在许多其他方法,由我们自己编写的实现类来重写需要的方法(接收处理请求、给出响应的信息等)
3.9Mapping问题
servlet-mapping项目映射的路径,Servlet的请求路径
1.一个servlet可以请求一个映射路径
2.一个servlet-name可以请求多个映射路径 url-pattern
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</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>*.Gw</url-pattern>
</servlet-mapping>
5.优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求(404页面)
public class ErrorServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>404<h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<!--注册error的servlet-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.Gw.servlet.ErrorServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>