课程内容:
- tomcat虚拟主机配置及使用
- tomcat配置https
- tomcat在我们开发中帮我们做了哪些事情
什么是服务器?
-
服务器软件: 其实就是一个软件 接收用户的请求,处理请求作出响应
- 作用:可以将我们开发好的静态资源或动态资源提供给外界(浏览器)访问。
-
服务器: 其实就是一台电脑,该电脑安装了软件服务器。
软件服务器分类
-
http 服务器:用于运行静态的网页(html)
-
Web服务器:实现了 JavaEE 部分规范(比如Servlet/JSP)、没有实现 JavaEE 中的 EJB 规范。
- 部署web应用,让用户通过浏览器来访问我们的项目
- 常用的 Web服务器有:Tomcat(Java代码写的,开源的服务器) , Jetty 等
-
应用服务器:实现了 JavaEE 全部的规范/支持 EJB 的:TomEE,GlassFish,JBoss,Weblogic,WebSphere
?Tomcat前置知识
-
什么是tomcat?
-
服务器是什么?
-
硬件服务器和软件服务器
- 硬件服务器 就是一台电脑
- 软件服务器 就是一个程序 每个程序都有特定的作用与价值
-
-
为什么要学习tomcat?
B/S架构 我们的javaweb程序要基于软件服务器来运行 tomcat的优势 轻量级 运行速度快
-
tomcat学习之后能帮我们做什么?
让我们的代码运行
?Tomcat安装
官网:
apache官网。www.apache.org
tomcat的产品页面: tomcat.apache.org/
我们要知道tomcat是java语言开发的 所以我们想要使用tomcat就必须配置jdk环境
?windows环境下的配置
Tomcat 是使用 Java 语言编写的一个服务器(程序),要运行Tomcat必须得有 jre。必须先配置 JAVA_HOME 或者 JRE_HOME 的环境变量 一般的我们只配置 JAVA_HOME。
上面是设置 JAVA_HOME 环境变量,启动 Tomcat 需要执行安装目录下的 bin 目录下面的 startup.bat 可执行文件
Tomcat 启动和关闭
1.启动:双击 bin/startup.bat
2.测试是否可以访问
3.关闭 运行的是 bin/shutdown.bat
4.再次访问
?修改 Tomcat 端口号
-
Tomcat 的默认端口是 8080。但是 HTTP 协议的默认访问的端口是 80。所以在访问 8080 端口的 Tomcat 中的资源时,必须要加上端口号 http://localhost:8080/index.jsp
-
如果想在访问的时候不加端口号,我们可以将 tomcat 的端口号修改为80。
-
修改 Tomcat 安装目录下 /conf/server.xml 文件中默认第 69 行,将 8080 修改为 80
?配置JDK环境
1.将 压缩包上传到虚拟机
2.将jdk的压缩包解压
tar -zxvf jdk-8u241-linux-x64.tar.gztar -zxvf jdk-8u241-linux-x64.tar.gztar -zxvf jdk-8u241-linux-x64.tar.gz
3.配置环境变量
vim /etc/profilevim /etc/profilevim /etc/profile
在文件尾部添加
export JAVA_HOME=/home/usr/jdk/jdk1.8.0_241export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/export PATH=$PATH:$JAVA_HOME/binexport JAVA_HOME=/home/usr/jdk/jdk1.8.0_241 export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/ export PATH=$PATH:$JAVA_HOME/binexport JAVA_HOME=/home/usr/jdk/jdk1.8.0_241 export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/ export PATH=$PATH:$JAVA_HOME/bin
4.使用java -version命令 验证
?tomcat环境
1.将tomcat压缩包上传到服务器
2.解压
tar -zxvf apache-tomcat-8.5.24.tar.gztar -zxvf apache-tomcat-8.5.24.tar.gztar -zxvf apache-tomcat-8.5.24.tar.gz
3.去到bin目录
4.启动tomcat
./startup.sh./startup.sh./startup.sh
5.关闭tomcat
./shutdown.sh./shutdown.sh./shutdown.sh
启动tomcat后,我们去访问 tomcat的默认端口是8080
在访问之前我们需要知道自己的主机是否可以ping通虚拟机
1.通过ifconfig 查找到虚拟机的ip地址
2.在主机去ping
ping 虚拟机地址ping 虚拟机地址ping 虚拟机地址
如果可以ping通 那么我们就可以去访问,访问后我们可以看到tomcat的欢迎页
那么这个欢迎页是怎么来的呢?
欢迎页是在 webapps下的ROOT目录中
它是在哪里配置的呢?
在conf的web.xml中配置,这里的配置是否还有其他玄机呢?
接下来我们来介绍一下 各个文件夹是干嘛用的
文件目录介绍:
目录名 | 作用 |
---|---|
bin | 启动和关闭Tomcat可执行文件 |
conf | 配置文件夹,有些重要配置文件在这下面。如:server.xml, web.xml等 不建议乱修改,可能导致Tomcat不能启动 |
lib | Tomcat使用时依赖的一些第三方jar包 |
logs | 日志记录文件,记录服务器运行过程中一些事件。包括运行过程中出现异常 |
temp | 临时文件夹,保存服务器运行过程中生成的一些垃圾文件 |
webapps | 我们做好的项目发布的目录,可以通过浏览器来直接访问 |
ROOT目录:在浏览器上看到的欢迎页面,在这个目录下 | |
work | Tomcat 工作目录,存储 Tomcat 运行过程中产生的文件,比如 jsp 翻译后的class文件 |
部署静态资源:
这里我们演示一下 怎么去部署,我就使用hello.html来做演示了
1.我们先将html放入到ROOT目录中
2.启动tomcat 访问 localhost:8080/hello.html
接下来我们来演示我们刚才在配置文件中看到的那样 我将hello.html名字改为 index.html
接下来我们来访问 localhost:8080 来看一下首页 已经变成了我们自定义的网页了
?Tomcat内置
随着架构不断的演化,传统的方式是将搭建Tomcat 并将代码放在tomcat容器中运行,而现在我们日常的开发都是使用SpringBoot开发再也不用配置tomcat了,那么SpringBoot是如何做到的呢?
在Servlet4.0已经为我们提供了一些简单的方式来简化我们的开发了,不用再去手动过配置tomcat
public class App {public static void main(String[] args) throws LifecycleException {Tomcat tomcat = new Tomcat();//指定端口tomcat.setPort(Integer.getInteger("port",8082));tomcat.getConnector();//创建上下文Context ctx = tomcat.addWebapp("/", new File("src/main/web").getAbsolutePath());//指定web资源目录WebResourceRoot resources = new StandardRoot(ctx);//设置编译路径resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/"));ctx.setResources(resources);// 启动Tomcat服务tomcat.start();tomcat.getServer().await();}}public class App { public static void main(String[] args) throws LifecycleException { Tomcat tomcat = new Tomcat(); //指定端口 tomcat.setPort(Integer.getInteger("port",8082)); tomcat.getConnector(); //创建上下文 Context ctx = tomcat.addWebapp("/", new File("src/main/web").getAbsolutePath()); //指定web资源目录 WebResourceRoot resources = new StandardRoot(ctx); //设置编译路径 resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/")); ctx.setResources(resources); // 启动Tomcat服务 tomcat.start(); tomcat.getServer().await(); } } public class App { public static void main(String[] args) throws LifecycleException { Tomcat tomcat = new Tomcat(); //指定端口 tomcat.setPort(Integer.getInteger("port",8082)); tomcat.getConnector(); //创建上下文 Context ctx = tomcat.addWebapp("/", new File("src/main/web").getAbsolutePath()); //指定web资源目录 WebResourceRoot resources = new StandardRoot(ctx); //设置编译路径 resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/")); ctx.setResources(resources); // 启动Tomcat服务 tomcat.start(); tomcat.getServer().await(); } }
上述代码在启动时会报错java.lang.NoClassDefFoundError: org/apache/catalina/WebResourceRoot
做如下设置即可
其他版本idea做如下设置
业务代码
@WebServlet("/login")public class loginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 1: 解决用户传递参数进来的乱码request.setCharacterEncoding("UTF-8");// 2: 解决服务器往浏览器输出中文的乱码问题response.setCharacterEncoding("UTF-8");//3: 告诉浏览器,后面用writer输出的内容,浏览器全部用html方式进行解析和渲染response.setContentType("text/html;charset=UTF-8");// 4: 跳转到login.jsprequest.getRequestDispatcher("/WEB-INF/login.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}}@WebServlet("/login") public class loginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1: 解决用户传递参数进来的乱码 request.setCharacterEncoding("UTF-8"); // 2: 解决服务器往浏览器输出中文的乱码问题 response.setCharacterEncoding("UTF-8"); //3: 告诉浏览器,后面用writer输出的内容,浏览器全部用html方式进行解析和渲染 response.setContentType("text/html;charset=UTF-8"); // 4: 跳转到login.jsp request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request,response); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }@WebServlet("/login") public class loginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1: 解决用户传递参数进来的乱码 request.setCharacterEncoding("UTF-8"); // 2: 解决服务器往浏览器输出中文的乱码问题 response.setCharacterEncoding("UTF-8"); //3: 告诉浏览器,后面用writer输出的内容,浏览器全部用html方式进行解析和渲染 response.setContentType("text/html;charset=UTF-8"); // 4: 跳转到login.jsp request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request,response); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
通过浏览器来访问一下http://localhost:8082/login 看到了login.jsp的内容