文章目录
- Tomcat的部署和启动
- Tomcat扮演的角色
- ①对外:Web服务器
- ②对内:Servlet容器
- 深入理解为什么需要TomCat
- 从目的开始出发
- 遇到的问题
- 总过程
- 部署
- 前提
- 解压
- TomCat的目录文件
- 启动Tomcat并访问首页
- 如何部署一个项目
- 访问对应的web资源
- 专业版IDEA创建一个JavaWeb项目
- 先创建一个普通的项目
- 添加文件夹结构
- web项目的结构
- 配置TomCat
- 添加我们相关的Servlet依赖
- 测试我们IDEA下是否关联成功TomCat
- Web工程中的资源
- 静态资源
- 动态资源
- 访问资源的地址
- #[1]静态资源
- #[2]动态资源
- 关于设置编码
- 路径问题
- 为什么要写路径
- 为什么写路径这事有点复杂
- 路径的各个组成部分
- 关于使用浏览器来访问资源
- 具体文件
- Servlet
- 动态获取上下文路径
Tomcat的部署和启动
Tomcat扮演的角色
①对外:Web服务器
②对内:Servlet容器
深入理解为什么需要TomCat
从目的开始出发
- 我们是为了做web服务,也就是将我们的后端和我们前端连接在一起(网络连接,应用层来说就是运用我们的HTTP协议,往深了说就是我们的TCP/IP五层结构),前端是我们客户端(浏览器+前端三剑客为基础的),而后端是我们用高级语言代码写的服务器,从而实现前端进行展示和与用户交互,后端为前端提供数据和服务
遇到的问题
第一个问题
我们的浏览器发起了HTTP请求之后,我们如何在后端读取到这个请求,根据我们的业务需要,进行处理,发送给回浏览器- 第一步:我们需要回应HTTP请求,完成一次标准的HTTP协议通信——一个标准的HTTP的服务器(Web服务器)的功能
- 第一步:我们需要回应HTTP请求,完成一次标准的HTTP协议通信——一个标准的HTTP的服务器(Web服务器)的功能
第二个问题
我们需要将一次HTTP请求-响应,对应到Java的语句(Java的语句一定放在方法中)——将请求-响应的处理过程对应到某个类下的方法对应起来——Servelet容器的功能
总过程
部署
前提
Tomcat本身是一个Java程序,所以当前系统中必须正确配置了JAVA_HOME环境变量,需要对应的JVM来运行Java程序
解压
将Tomcat压缩包解压到一个非中文无空格的目录下。
TomCat的目录文件
启动Tomcat并访问首页
启动Tomcat:运行Tomcat解压后根目录下\bin\startup.bat即可,
如果需要停止Tomcat,则运行shutdown.bat程序
小提示:将来我们在IDEA中启动Tomcat,如果IDEA卡死强关,Tomcat不会正常退出。下次再启动Tomcat会因为残留进程仍然占用8080端口,导致新的进程无法启动。此时可以使用shutdown.bat结束残留进程。
如何部署一个项目
- 我们把我们的项目在webapps下建立一个文件夹
- 在对应的文件下建立一个WEB-INF文件夹,必须要一模一样
访问对应的web资源
专业版IDEA创建一个JavaWeb项目
先创建一个普通的项目
添加文件夹结构
- 进去添加对应web框架
web项目的结构
配置TomCat
配置的相关信息
- 注意应该选中TomCat Server 而不是TomCatEE
添加我们相关的Servlet依赖
- 去我们本地安装的TomCat找到对应servlet的jar包进行导入
测试我们IDEA下是否关联成功TomCat
web.xml文件
<?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-name>Addservlet</servlet-name>
<servlet-class>com.lsc.servlets.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Addservlet</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
</web-app>
- 将对应的/add映射到我们的com.lsc.servlets.AddServlet这个类
对应的AddServlet这个类
public class AddServlet extends HttpServlet {
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String fname=request.getParameter("fname");
String priceStr=request.getParameter("price");
int price=Integer.parseInt(priceStr);
String fcountStr=request.getParameter("fcount");
int fcount=Integer.parseInt(fcountStr);
String remark=request.getParameter("remark");
System.out.println(fname);
System.out.println(price);
System.out.println(fcount);
System.out.println(remark);
}
}
- 我们这个类中重写的是doPost方法()
我们的index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="add" method="post">
名称:<input type="text" name="fname"/><br/>
价格:<input type="text" name="price"/><br/>
数量<input type="text" name="fcount"/><br/>
备注<input type="text" name="remark"/><br/>
<input type="submit" value="添加"/>
</form>
</body>
</html>
- 我们主要是看我们的form表单的
- action属性是add,通过我们web.xml文件将其与com.lsc.servlets.AddServlet连接,我们的数据也会提交到这,
- method属性是post,说明我们对应的http是post请求,对应也就是执行到我们的doPost方法
结果
Web工程中的资源
静态资源
- HTML文件
- CSS文件
- JavaScript文件
- 图片文件
动态资源
- Servlet
访问资源的地址
#[1]静态资源
/Web应用名称/静态资源本身的路径
#[2]动态资源
/Web应用名称/虚拟路径
关于设置编码
tomcat8之前,设置编码:
get请求方式:
- get方式目前不需要设置编码(基于tomcat8)
- 如果是get请求发送的中文数据,转码稍微有点麻烦(tomcat8之前)
String fname = request.getParameter("fname");
//1.将字符串打散成字节数组
byte[] bytes = fname.getBytes("ISO-8859-1");
//2.将字节数组按照设定的编码重新组装成字符串
fname = new String(bytes,"UTF-8");
post请求方式:
request.setCharacterEncoding("UTF-8");
tomcat8开始,设置编码,只需要针对post方式
request.setCharacterEncoding("UTF-8");
注意:
需要注意的是,设置编码(post)这一句代码必须在所有的获取参数动作之前
路径问题
为什么要写路径
- 整个系统要根据功能拆分成许许多多独立的资源
- 资源之间既要完成自身的功能又要和其他资源配合
- 写路径就是为了从一个资源跳转到下一个资源
为什么写路径这事有点复杂
- 工程目录:我们写代码的地方,但是在服务器上运行的不是这个。
- 部署目录:经过Java源文件编译和目录重组后,IDEA就替我们准备好了可以在服务器上运行的部署目录。
- 区别:因为从工程目录到部署目录经过了目录重组,所以它们的目录结构是不同的。
- 基准:用户通过浏览器访问服务器,而服务器上运行的是部署目录,所以写路径的时候参考部署目录而不是工程目录。
- 对应关系:工程目录下的web目录对应部署目录的根目录,同时部署目录的根目录也是路径中的Web应用根目录。
路径的各个组成部分
从最前面一直到Web应用名称这里都是固定写法,到资源名这里要看具体是什么资源。
- 我们的web应用名可以在我们的TomCat配置中设置Application context来设置
关于使用浏览器来访问资源
具体文件
我们写代码的时候都是在工程目录下操作,所以参照工程目录来说最方便。按照工程目录的目录结构来说,从web目录开始按照实际目录结构写就好了(不包括web目录本身)。
Servlet
访问Servlet的路径是我们在web.xml中配置的,大家可能注意到了,url-pattern里面的路径我们也是斜杠开头的,但是这个开头的斜杠代表Web应用根目录。
同样是开头的斜杠,超链接路径中的开头斜杠代表服务器根目录,Servlet地址开头的斜杠,代表Web应用根目录,怎么记呢?请看下面的准则
路径类型 | 解析方式 |
---|---|
由浏览器解析的路径 | 开头斜杠代表服务器根目录 |
由服务器解析的路径 | 开头斜杠代表Web应用根目录 |
那么具体来说,哪些路径是浏览器解析的,哪些路径是服务器解析的呢?
- 浏览器解析的路径举例:
- 所有HTML标签中的路径
- 重定向过程中指定的路径
- 服务器解析的路径举例:
- 所有web.xml中配置的路径
- 请求转发过程中指定的路径
动态获取上下文路径
①上下文路径的概念
上下文路径(context path)=/Web应用名称
②动态获取
由于项目部署的时候,上下文路径是可以变化的,所以写死有可能发生错误。此时我们通过request对象动态获取上下文路径就不用担心这个问题了。调用下面这个方法,每一次获取的都是当前环境下实际的上下文路径的值。
request.getContextPath()