1、技术栈
2、HTTP请求数据格式
请求分为两种:GET和POST
3、HTTP响应数据格式
这里需要记住:200、404和500.
4、Web服务器软件 Tomcat
4.1Tomcat简介
4.2 tomcat安装
这里我改成了8081端口,然后启动tomcat,在浏览器窗口输入url:localhost:8081,即可访问tomcat服务器软件自带的web页面,非常滴帅
4.3 IDEA中创建Maven Web项目
4.3.1 IDEA中创建Maven Web项目(使用骨架)
- 下面我们使用骨架创建一个Maven Web项目
1、创建maven模块,选中create from archetype,找到web-app选项
2、起名字,使用默认的配置
3、最后确认一下
4、配置一下项目,先打开pom.xml配置文件,删除一些无用的插件
5、看一下骨架结构,缺少啥东西,就添加啥东西,缺少java目录和resources目录
那么补齐这两个目录,在src下右键选中Directory,会有提示如下图所示,那么我们挨个创建好java目录和resources目录。
4.3.2 IDEA中创建Maven Web项目(不使用骨架)
1、选择web项目,不使用骨架创建
2、pom.xml中手动添加打包方式war
然后点右上角的刷新maven项目,表示我这个项目是web项目,不然在后面添加webapp目录的时候不会显示这个项目名字。
3、补齐缺失的目录,打开Project Structure,选择Facets,选中红框,双击
一路yes,就可以创建好
创建好了长这样
4、往web目录下添加WEB-INF和index.jsp,点击web.xml
自动补齐的目录不对,请手动添加\src\main\webapp,后选择ok
最后apply,ok就创建好了。最后的目录长这样
4.4 IDEA集成到本地tomcat
方式1:
1、点击右上角 edit configurations
选择配置到本地。
2、选择server的配置,选到tomcat的安装路径。
3、tomcat部署到项目
最终配置效果注意红框都是要配置的
4、 apply 然后ok就好了
5、写个测试页面,测试一下
运行后出现404找不到,没关系,我们后面追加url:a.html
大功告成~
方式2:Maven-tomcat插件
注意修改端口号,最后运行一下
拿着这个url去网页复制打开,并添加/a.html出现我们想要访问的html
5、Servlet动态资源开发技术
前端三剑客HTML、CSS、JS是静态资源,也就是说 每个用户访问到的效果都是一样的。而Servlet是动态资源,根据输入参数不同给予不同的局部效果
5.1 Servlet快速入门
我们在之前创建好的Maven web 项目(tomcat-demo2)中实现上述servlet的快速入门
1、导入Servlet依赖坐标
2、定义一个类,实现Servlet接口,重写接口的所有方法,并在service方法中添加打印信息
3、注解配置: 在类上使用@WebServlet("/demo1")
配置该Servlet的访问路径
4、启动tomcat,浏览器输入URL,访问该网页,并返回IDEA查看结果
服务端显示打印结果,表示我们的项目成功了,只要访问了网页就会在服务端有显示。
5.2 Servlet执行流程
- 两个事必须非常清楚:
- 1、servlet由谁创建?Servlet方法由谁调用?
- servlet由web服务器tomcat创建并由web服务器调用
- 2、 服务器怎么知道Servlet中一定有service方法?
- 因为我们自定义的servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法。
- 1、servlet由谁创建?Servlet方法由谁调用?
5.3 Servlet生命周期
-
第一个阶段:加载和实例化
- 如下图所示,在上面的注解写一个loadOnStartup=1,0或正整数,即表示服务器启动时创建Servlet对象,数字越小优先级越高
- 当为负整数时,表示第一次访问时创建Servlet对象,当然,默认情况下就是第一次。
-
2、初始化,在Servlet实例化之后,容器将调用servlet的init()方法来完成一些加载配置文件、连接处理等相关工作,注意该方法只会调用一次。
- 我们到IEAD演示一下,首先在原来的项目上,重写写一个servlet实现类。如下图所示,并填写init方法中的代码,然后我们使用tomcat run这个实现类。
我们接着到这个url去访问一下。如下图所示
成功打开网页表示访问成功,这也是我们第一次访问了Servlet、
相对应的,我们的init方法会被触发,那么信息会打印到控制台,我们回到控制台看一下。
意料之中,默认情况下,第一次访问Servlet时,会先调用Init()方法且只调用一次,接着调用service()方法。我们多访问几次看看,是否init()只会调用一次。
多刷新几遍页面,代表多次访问。再回到控制台看结果。不出意外,会出现多条servlet hello~。
init()方法就先介绍到这里。
- 我们到IEAD演示一下,首先在原来的项目上,重写写一个servlet实现类。如下图所示,并填写init方法中的代码,然后我们使用tomcat run这个实现类。
-
3、 请求处理,这个service方法,不用多解释了,很直观,当网页访问servlet时,会调用service方法做出回应给页面,这个时候还没有学respone方法,所以先搁置。后面还会回到这里。
-
4、服务终止
destory方法:
1、调用时机:内存释放或者服务器关闭的时候,Servlet对象被销毁,调用此方法。
2、调用次数:1次
试一下:模拟一下服务器关闭的场景:注意不要在IDEA点终止,这样相当于拔电源
而是 在命令行中 用 ctrl+c的方法关闭服务器。
先写一个提示代码
然后关闭服务器。
首先来到命令行,再cd到当前路径,输入 mvn tomcat7:run,运行tomcat服务器
然后按ctrl C,运行destroy()方法。
5.4 Servlet方法介绍&体系结构
-
1、getServletinfo()方法,用来返回Servlet的作者,信息,还有版权,不常用
-
Returns information about the servlet, such as author, version, and copyright.
-
2、getServletConfig() 方法,返回一个ServletConfig的对象,包含了Servlet的初始化和启动项的参数。下面我们来讲讲如何获得ServletConfig的对象
-
Returns a ServletConfig object, which contains initialization and startup parameters for this servlet.
请砍下图。
体系结构:用来简化以上这5个方法的写作。
通过上面的学习,我们知道要想编写一个Servlet就必须要实现Servlet接口,重写接口中的5个方法,虽然已经能完成要求,但是编写起来还是比较麻烦的,因为我们更关注的其实只有service方法,那有没有更简单方式来创建Servlet呢?
要想解决上面的问题,我们需要先对Servlet的体系结构进行下了解:
因为我们将来开发B/S架构的web项目,都是针对HTTP协议,所以我们自定义Servlet,会通过继承HttpServlet
具体的编写格式如下:
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//TODO GET 请求方式处理逻辑
System.out.println("get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//TODO Post 请求方式处理逻辑
System.out.println("post...");
}
}
- 要想发送一个GET请求,请求该Servlet,只需要通过浏览器发送
http://localhost:8081/tomcat-demo2/demo4
,就能看到doGet方法被执行了 - 要想发送一个POST请求,请求该Servlet,单单通过浏览器是无法实现的,这个时候就需要编写一个form表单来发送请求,在webapp下创建一个
a.html
页面,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/web-demo/demo4" method="post">
<input name="username"/><input type="submit"/>
</form>
</body>
</html>
启动测试,即可看到doPost方法被执行了。
Servlet的简化编写就介绍完了,接着需要思考两个问题:
- HttpServlet中为什么要根据请求方式的不同,调用不同的方法?
- 如何调用?
针对问题一,我们需要回顾之前的知识点前端发送GET和POST请求的时候,参数的位置不一致,GET请求参数在请求行中,POST请求参数在请求体中,为了能处理不同的请求方式,我们得在service方法中进行判断,然后写不同的业务处理.
小结
通过这一节的学习,要掌握:
- HttpServlet的使用步骤
继承HttpServlet
重写doGet和doPost方法
- HttpServlet原理
获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
5.5 urlPattern配置
Servlet类编写好后,要想被访问到,就需要配置其访问路径(urlPattern)
- 1、 一个Servlet,可以配置多个urlPattern
- 2、 urlPattern配置规则
很简单,一看看就行,注意一下 *.do,前面不要加/。
-
-
注意:
/
和/*
的区别?-
当我们的项目中的Servlet配置了 “/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet
-
当我们的项目中配置了"/*",意味着匹配任意访问路径
-
DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问
-
-
小结
-
urlPattern总共有四种配置方式,分别是精确匹配、目录匹配、扩展名匹配、任意匹配
-
五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > / ,无需记,以最终运行结果为准。
5.6 XML配置
前面对应Servlet的配置,我们都使用的是@WebServlet,这个是Servlet从3.0版本后开始支持注解配置,3.0版本前只支持XML配置文件的配置方法。
对于XML的配置步骤有两步:
- 编写Servlet类
package com.itheima.web;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
public class ServletDemo13 extends MyHttpServlet {
@Override
protected void doGet(ServletRequest req, ServletResponse res) {
System.out.println("demo13 get...");
}
@Override
protected void doPost(ServletRequest req, ServletResponse res) {
}
}
- 在web.xml中配置该Servlet
<?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>
<!-- servlet的名称,名字任意-->
<servlet-name>demo13</servlet-name>
<!--servlet的类全名-->
<servlet-class>com.itheima.web.ServletDemo13</servlet-class>
</servlet>
<!--
Servlet 访问路径
-->
<servlet-mapping>
<!-- servlet的名称,要和上面的名称一致-->
<servlet-name>demo13</servlet-name>
<!-- servlet的访问路径-->
<url-pattern>/demo13</url-pattern>
</servlet-mapping>
</web-app>
这种配置方式和注解比起来,确认麻烦很多,所以建议大家使用注解来开发。但是大家要认识上面这种配置方式,因为并不是所有的项目都是基于注解开发的。