您的位置:首页 > 运维架构 > Tomcat

Tomcat与Servelet的原理与使用(Java后端开发)

2020-06-05 06:47 435 查看

Tomcat:web服务器软件(使用Java语言编写)

1. 下载:http://tomcat.apache.org/
2. 安装:解压压缩包即可。
* 注意:安装目录建议不要有中文和空格
3. 卸载:删除目录就行了
4. 启动:
* bin/startup.bat ,双击运行该文件即可
* 访问:浏览器输入:http://localhost:8080 回车访问自己
http://别人的ip:8080 访问别人

* 可能遇到的问题:
1. 黑窗口一闪而过:
* 原因: 没有正确配置JAVA_HOME环境变量
* 解决方案:正确配置JAVA_HOME环境变量

2. 启动报错:
1. 暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
* netstat -ano
2. 温柔:修改自身的端口号
* conf/server.xml
* <Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8445" />
* 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。
* 好处:在访问时,就不用输入端口号
5. 关闭:
1. 正常关闭:
* bin/shutdown.bat
* ctrl+c
2. 强制关闭:
* 点击启动窗口的×
6. 配置:
将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目。在Run中打开Edit configurations,找到tomcat 进行配置(注意:要将虚拟目录先删掉)
* 部署项目的方式:
1. 直接将项目放到webapps目录下即可。
* /hello:项目的访问路径-->虚拟目录
* 简化部署:将项目打成一个war包,再将war包放置到webapps目录下。
* war包会自动解压缩

2. 配置conf/server.xml文件
在<Host>标签体中配置
<Context docBase="D:\hello" path="/hehe" />
* docBase:项目存放的路径
* path:虚拟目录

3. 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
<Context docBase="D:\hello" />
* 虚拟目录:xml文件的名称

* 静态项目和动态项目:
* 目录结构
* java动态项目的目录结构:
-- 项目的根目录
-- WEB-INF目录:
-- web.xml:web项目的核心配置文件
-- classes目录:放置字节码文件的目录
-- lib目录:放置依赖的jar包








Servlet: server applet

* 概念:运行在服务器端的小程序
* Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
* 将来我们自定义一个类,实现Servlet接口,复写方法。

* 快速入门(流程见上图):
1. 创建JavaEE项目
2. 定义一个类,实现Servlet接口
3. 实现接口中的抽象方法(自动生成)
4. 步骤:在src目录下新建一个包,并在其中新建一个类:

注意:创建该类时,一定要把tomcat和项目所使用的JDK版本修改一致,重启后进行创建
5. 配置Servlet(不好之处,每写一个项目都要重新编写配置文件)
在web.xml中配置:
代码:
package servlet;

import javax.servlet.*;
import java.io.IOException;

public class servletDemo1 implements Servlet {
@java.lang.Override
public void init(ServletConfig servletConfig) throws ServletException {

}

@java.lang.Override
public ServletConfig getServletConfig() {
return null;
}

//提供服务的方法
@java.lang.Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("分解成功,脚踏实地,今事今毕,坚持不懈");
}

@java.lang.Override
public java.lang.String getServletInfo() {
return null;
}

@java.lang.Override
public void destroy() {

}
}
<?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-name>demo1</servlet-name>
<servlet-class>servlet.servletDemo1</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
测试结果
启动项目并在浏览器地址栏中输入http://localhost:8080/demo1便可以在控制台看到结果输出,如下:





* 执行原理(见上图):
1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容。
3. 如果有,则在找到对应的<servlet-class>全类名
4. tomcat会将字节码文件加载进内存,并且创建其对象
5. 调用其方法(该接口复写了相应的方法)

* Servlet中的生命周期方法:
* 一共有五个方法,这里只介绍三个(其余可以参考上面的servletDemo1类程序)
1. 被创建:执行init方法,只执行一次
* Servlet什么时候被创建?
* 默认情况下,第一次被访问时,Servlet被创建
* 可以配置执行Servlet的创建时机。
*在配置文件中<servlet>标签下配置
1. 第一次被访问时,创建
* <load-on-startup>的值为负数
2. 在服务器启动时,创建
* <load-on-startup>的值为0或正整数

* Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
* 多个用户同时访问时,可能存在线程安全问题,而且不能加锁。
* 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值

2. 提供服务:执行service方法,执行多次
* 每次访问Servlet时,Service方法都会被调用一次。
3. 被销毁:执行destroy方法,只执行一次
* Servlet被销毁时执行。服务器关闭时,Servlet被销毁
* 只有服务器正常关闭时,才会执行destroy方法。
* destroy方法在Servlet被销毁之前执行,一般用于释放资源

Servlet3.0(不用每一个项目都写一个配置文件):
* 好处:
* 支持注解配置。可以不需要web.xml了。

* 步骤:
1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml(此时可以不勾选这个选项)
2. 重新创建一个tomcat项目,并改写其端口,然后定义一个类,实现Servlet接口
3. 复写方法
4. 在类上使用@WebServlet注解,进行配置(使用此方法后,只需要在对应的项目的类前加注解)
代码:
package servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

//这里是需要注意的地方(不同点)
@WebServlet(urlPatterns = "/demo2")
public class servletDemo2 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("是鸣而生,唯默不亡!");
}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}
测试结果:
在地址栏输入:http://localhost:8081/demo2,控制台的结果输出如下:



IDEA与tomcat的相关配置
1. IDEA会为每一个tomcat部署的当前项目单独建立一份配置文件
* 查看控制台的logUsing CATALINA_BASE:   "C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Tomcat_9_0_33_persisting"
2. 工作空间项目和tomcat部署的web项目
* tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源
* WEB-INF目录下的资源不能被浏览器直接访问(即暂时不要把项目创建在该目录下)。
3. 断点调试:使用"小虫子"启动 debug 启动


Servlet的体系结构
(该部分核心内容在于使用httpServlet抽象类继续介绍Serlet,目的减少上面程序中其他没必要方法的编写)
Servlet -- 接口
|
GenericServlet -- 抽象类
|
HttpServlet  -- 抽象类   (常用并推荐)'
* GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
* 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
代码:
package servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/demo3")
public class servletDemo3 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("摒弃侥幸之念,必取百炼成钢;厚积分秒之功,始得一鸣惊人!");
}
}
测试结果:
在地址栏中输入:http://localhost:8081/demo3,控制台输出的结果如下:

* HttpServlet:对http协议的一种封装,简化操作
* service方法内部基本原理:

* HttpServlet提供的简便用法:
1. 定义类继承HttpServlet
2. 复写doGet/doPost方法
代码:
package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/demo4")
public class servletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("与师");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("如约而至");
}
}
测试结果:
在地址栏中输入:	http://localhost:8081/demo4,控制台输出的结果如下所示:

从上面可以看出,从浏览器中直接请求是get方式
post方式的应用,见下面的案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action = "/demo4" method = "post">
<input name="username">
<input type = "submit" value="提交">
</form>
</body>
</html>
测试结果:
在地址栏中输入:http://localhost:8081/login.html,输入数据后,控制台的输出结果如下:


Servlet相关配置

**urlpartten:Servlet访问路径**
一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
即通过这些路径都可以访问到相应的项目
路径定义规则:
1. /xxx:路径匹配
2. /xxx/xxx:多层路径,目录结构
3. 3. *.do:扩展名匹配
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐