JavaWeb(1) - HTTP/Tomcat/Servlet
HTTP
-
概念:超文本传输协议, 规定了浏览器和服务器之间数据传输的规则
-
HTTP协议特点:
(1)基于TCP协议:面向连接,安全
(2)基于请求-响应模型的:一次请求对应一次响应
(3)HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求-响应都是独立的(缺点:多次请求不能共享数据 – 解决方案:Java种使用会话技术Cookie,Session来解决这个问题;优点:速度快)
Tomcat(Web服务器)
简介
- 概念:Tomcat即Web容器/Servlet容器,Servlet需要依赖于Tomcat才能运行
- 作用:封装HTTP协议操作,简化开发;同时可以将web项目部署到服务器中,对外提供网上浏览服务
基本使用
-
进入Tomcat官网:https://tomcat.apache.org/,在导航栏左侧选择项目开发需求的版本
-
将下载好的安装包解压并放在没有中文命名的目录下,找到/bin目录随后点击startup.bat文件即可启动tomcat服务器
-
基本配置:在conf/server.xml配置文件修改启动端口号 (特别注意:HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号)
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
-
Tomcat部署项目:将项目放置到webapps目录下,即部署完成 (通常JavaWeb项目会被打成war包,然后将war包放到webapps目录下,Tomcat会自动解压war文件)
IDEA创建Maven Web项目 与 IDEA中使用Tomcat
Web项目结构
打包方式:在IDEA右侧点击Maven菜单栏,选择Lifecycle下的package即可将项目打包
IDEA中创建Maven Web项目
方法1:使用骨架(项目模板)
-
选择web骨架创建项目:进入IDEA,选择【新建项目】,选择Maven项目
-
删除多余的依赖坐标:点击pom.xml配置文件将如下展示的代码要全部删去
<name>tomcat_demo_01 Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>tomcat_demo_01</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build>
-
补齐缺失的目录结构:在/src/main目录下添加两个文件夹:一个是java文件夹(必须设置为sources root),另一个为resources文件夹(必须设置为resources root)
方法2:不使用骨架
-
创建项目:进入IDEA点击创建项目,选择Maven项目,不要选择web项目骨架
-
在pom.xml中添加打包方式为war
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <artifactId>tomcat_demo_02</artifactId> <version>1.0-SNAPSHOT</version> <!-- 选择打包的方式: * jar:默认的打包方式 * war:web项目打包的方式 --> <packaging>war</packaging> <properties> <maven.complier.source>8</maven.complier.source> <maven.complier.target>8</maven.complier.target> </properties> </project>
-
补齐缺失目录结构webapp
在IDEA中使用Tomcat
方法1:将本地Tomcat集成到IDEA中,然后进行项目部署即可
- 在IDEA开发界面的上侧找到 Add Configuration,进入该界面后点击左上角的 ⚙
- 选择Deployment菜单栏,点击 +,选择Artifact导入的需要的war包
方法2:IDEA中使用 Tomcat Maven插件
-
在pom.xml配置文件中,添加tomcat maven插件,具体操作是alt+insert选择plugin template并将对应的配置如下
<build> <plugins> <plugin> <!-- tomcat 插件 --> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> </plugin> </plugins> </build>
-
在IDEA右侧点击maven在plugins菜单栏下选择tomcat7下的run,即可运行;
-
必要时可以在下面添加默认启动的默认端口以及默认路径
<configuration> <port>80</port> <path>/</path> </configuration>
Servlet
Servlet是Java提供的一门动态web资源开发技术,实质上是一个接口,在开发的过程中需要定义Servlet类实现Servlet接口,并由web服务器运行
Servlet两问
-
Servlet由谁创建?Servlet方法由谁调用?
Servlet由web服务器创建,Servlet方法由web服务器调用 -
服务器怎么知道Servlet中一定由service方法?
因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法
Servlet生命周期
Servlet运行在Servlet容器(web服务器)中,其生命周期由容器来管理
- 加载和实例化: 默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象;
- 初始化: 在Servlet实例化之后,容器将调用Servlet的 init() 方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作,该方法只调用一次
- 请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service() 方法对请求进行处理
- 服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet的destroy() 方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java垃圾收集器所回收
快速入门
-
创建web项目,导入Servlet依赖坐标
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
-
定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话,随后在类上使用@WebServlet注解,配置该Servlet的访问路径
@WebServlet(urlPatterns = "/demo2",loadOnStartup = 1) public class ServletDemo2 implements Servlet { /** * 初始化方法 * 1. 调用时机:默认情况下,Servlet被第一次访问时,调用 * * loadOnStartup * 2. 调用次数:1次 * @param servletConfig * @throws ServletException */ public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init..."); } public ServletConfig getServletConfig() { return null; } /** * 提供服务 * 1.调用时机:每一次Servlet被运行时,调用 * 2.调用次数:多次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("servlet hello world"); } public String getServletInfo() { return null; } /** * 销毁方法 * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象被销毁,调用 * 2.调用次数:1次 */ public void destroy() { System.out.println("destroy..."); } }
-
访问:启动Tomcat,浏览器输入URL访问该Servlet
http://localhost:8080/tomcat_demo_02/demo1
Servlet体系结构
在基于B/S架构的web项目中,我们通常需要用HTTP协议,因此我们在自定义Servlet的时候,会继承HttpServlet
HttpServlet 使用步骤
-
继承HttpServlet
public class MyHttpServlet implements Servlet { /*其余的函数省去,方便阅读*/ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //根据请求方式的不同,进行分类的处理 HttpServletRequest request = (HttpServletRequest) req; //1.获取请求方式 String method = request.getMethod(); //2.判断 if("GET".equals(method)){ //get方式的处理逻辑 doGet(req,res); }else if("POST".equals(method)){ //post方式的处理逻辑 doPost(req,res); } } protected void doPost(ServletRequest req, ServletResponse res) { } protected void doGet(ServletRequest req, ServletResponse res) { } }
-
重写doGet和doPost方法
@WebServlet("/demo5") public class ServletDemo5 extends MyHttpServlet { @Override protected void doGet(ServletRequest req, ServletResponse res) { System.out.println("get!!!!"); } @Override protected void doPost(ServletRequest req, ServletResponse res) { System.out.println("post!!!"); } }
-
HttpServlet原理:获取请求方式,并根据不同的请求方式,调用不同的doXXX方法
Servlet urlPattern配置
Servlet要想被访问,必须配置其访问的路径(urlPattern)
-
一个Servlet,可以配置多个urlPattern
@WebService(urlPatterns = {"/demo1","/demo2"})
-
urlPattern 配置规则
精准匹配//配置路径 /* 访问路径:localhost:8080/[Java_demo_name]/user/select */ @WebServlet(urlPattern="user/select")
目录匹配(注意:当一个路径同时满足精准匹配和目录匹配时,精准匹配的优先级更高优先级)
//配置路径 /* 访问路径:localhost:8080/[Java_demo_name]/user/* */ @WebServlet(urlPattern="user/*")
扩展名匹配
//配置路径 /* 访问路径:localhost:8080/[Java_demo_name]/[任意命名].do */ @WebServlet(urlPattern= "*.do")
任意匹配(特别注意:/和/*区别–当我们的项目中配置了“/”,会覆盖掉tomcat中的DefaultServlet,当其它的urlPattern都匹配不上时都会走这个Servlet;当我们的项目配置了“/”,意味着匹配任意访问路径)
XML配置方式编写Servlet
基本步骤:
-
编写Servlet类
-
在web.xml
<!-- Servlet 全类名 --> <servlet> <servlet-name>demo13</servlet-name> <servlet-class>com.itheima.web.ServletDemo13</servlet-class> </servlet> <!-- Servlet 当前路径 --> <servlet-mapping> <servlet-name>demo13</servlet-name> <url-pattern>/demo13</url-pattern> </servlet-mapping>