JAVAWEB-NOTE07-HTTP、TOMCAT、SERVELET
javaweb技术栈简介
- BS架构
BS架构就是浏览器服务器架构模式,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,服务器就会将WEB资源发送给浏览器。
好处:易于维护升级。只需服务器端做升级和维护,客户端无需任何部署。 - 服务器资源中分为静态资源和动态资源
1 静态资源:包括HTML、CSS、JS、图片等,主要负责页面的展示
2 动态资源:包括JAVA按照一定规则写成的代码:Servlet、JSP等,负责逻辑处理 - 数据库:负责数据存储
- HTTP协议:通信规则
- WEB服务器:负责解析HTTP协议,解析请求数据并返回响应数据
HTTP
概念
超文本传输协议,规定了浏览器和服务器之间传输数据的规则
HTTP特点:
- 基于TCP协议
- 基于请求-响应模型:一次请求对应一次响应
- HTTP是无状态的协议:对事务处理没有记忆能力,每次响应和请求都是独立的
1 优点:速度块
2 缺点:多次请求不能共享数据(JAVA通过会话技术来解决这个问题)
请求数据的格式
请求数据分为3部分:
1.请求行:请求数据的第一行。其中GET表示请求方式, /表示请求资源路径,HTTP/1.1表示协议版本
2.请求头:第二行开始,格式为key: value形式。
3.请求体: POST请求的最后一部分,存放请求参数
- GET和POST区别
uploading-image-892204.png
响应数据的格式
响应数据分为3部分:
1.响应行:响应数据的第一 行。其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述
2.响应头:第二行开始,格式为key: value形式
3.响应体: 最后一部分。存放响应数据
Tomcat
简介
Web服务器是一一个应该程序(软件), 对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务”
概念: Tomcat是Apache 软件基金会-一个核心项目, 是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。
JavaEE: Java Enterprise Edition, Java企业版。 指Java企业级开发的技术规范总和。包含13项技术规范: JDBC、JNDI、EJB、 RMI、JSP、 Servlet、XML、 JMS、Java IDL、JTS、 JTA、 JavaMail、JAF
Tomcat也被称为Web容器、Servlet容器。 Servlet 需要依赖于Tomcat才能运行
官网: https://tomcat.apache.org/
基本使用
安装好后可以看到webapps的这个目录,这个目录很重要,就是之后我们需要部署的项目所要放置到的文件夹

启动:

启动成功的标志:

启动的时候命令控制台中文乱码?
这是以为windows的cmd是GBK编码,解决方式如图所示

配置

部署

IDEA中创建Maven Web项目
项目结构

创建项目
在IDEA中创建Maven Web项目有两种情况,第一个是使用骨架,第二种是不使用骨架
使用骨架



创建完成后可以看到项目结构IDEA都帮助我们生成好了

但是缺少了src目录下的java和resources,我们需要手工补齐:

IDEA很智能,提示出了我们想要补全的java文件和resources文件,我们选择添加即可

不使用骨架
不使用骨架也很简单,只不过需要我们手动去配置文件夹:
第一步即不要在创建项目的页面去选择骨架:

然后我们需要在pom.xml中手动地添加打包的方式为war包,如何不设置,那么打包默认是jar包

随后我们发现这个项目结构中缺少最重要的webapp相关的内容,我们可以通过自动的方式将它补齐,进入到project structure当中


在IDEA中使用Tomcat
两种方式:本地集成和添加插件。由于本地集成需要IDEA旗舰版,这里只讲添加插件的方式
在pom.xml中alt+insert新建一个插件的模板,输入以下依赖:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
之后我们在项目运行的时候选择run maven当中的tomcat运行即可:

运行后的效果:

可以看到

在插件配置中,我们可以修改配置来达到更改默认端口号和路径的目的:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<port>80</port><!--修改默认端口为80-->
<path>/</path><!--修改默认路径为/-->
</plugin>
</plugins>
</build>
servlet
简介
Servlet是Java提供的一门动态web资源开发技术
Servlet是JavaEE规范之一, 其实就是一个接口, 将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
快速入门
1.创建web项目,导入Servlet依赖坐标
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
2.创建一个类,实现Servlet接口,并重写接口中的所有方法
public class servletdemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello,world");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3.配置:在类上使用@WebServlet注解,作用:配置该Servlet的访问路径:
@WebServlet("/demo1")
public class servletdemo1 implements Servlet
4.访问:启动tomcat,浏览器输入URL进行访问该servlet


执行流程
我们现在来思考一个问题,在刚刚快速入门的代码中,我们并没有创建servletdemo1的对象,也没有调用service这个方法,那为什么控制台还能打印我们service中的helloworld呢?我们需要来了解一下servlet的执行流程
其实servlet的对象是由web服务器创建,也就是这里的tomcat,同时service()也是tomcat去调用执行的。
生命周期
对象的生命周期指一个对象从被创建到被销毁的整个过程。servlet其实也是一个对象,只不过不是由我们创建的,而是由tomcat帮我们创建的。
Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理,分为4个阶段:
1.加载和实例化: 默认情况下,当Servlet第一次被访问时, 由容器创建Servlet对象。可以修改以下参数来修改创建的时机:
@WebServlet(value = "/demo1",loadOnStartup = 1)
默认是负整数(-1),也就是当第一次被访问的时候再创建
当为正整数或者是0的时候,就是在服务器启动的时候进行创建和加载,这样的话对于一些加载servlet比较耗时的情况时,能够在启动时就创建对象,节约用户的时间。
2.初始化: 在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次。
3.请求处理: 每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。
4.服务终止: 当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后, 容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。
体系结构

我们一般会使用继承HttpServlet来创建我们的servlet类:
@WebServlet(value = "/demo2")
public class servletdemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
其中有两个方法,第一个时doGet,是浏览器用Get方法来访问服务器时的响应操作
那么我们可以测试一下,我们浏览器在Url位置输入访问资源的时候用到的方法就是get方法,所以当我们启动服务,直接在浏览器中访问demo2时,会打印doGet中的语句:


而表单的提交方式是用的post,我们写一个简单的表单的html:
<form action="/demo1" method="post">
<input type="text" >
<input type="submit">
</form>
这个时候我们再去执行会发现打印的消息是this is doPost
urlPattern



浙公网安备 33010602011771号