把资源部署在服务器软件上,就可以让其它人通过网络访问到,从而成为web资源
官网地址:https://tomcat.apache.org/
免安装,直接解压即可
tomcat
|- bin:可执行命令的文件夹。比如:启动和关闭
|- conf:配置文件夹
| |- server.xml:是Tomcat本身的配置,比如端口号
| |- web.xml:主要是部署的web项目的默认配置
|- lib:Tomcat的核心程序jar包
|- logs:日志文件夹
|- temp:临时文件夹
|- webapps:用于部署web项目的文件夹
|- work:工作目录,主要给JSP使用的
tomcat/bin/startup.bat
tomcat/bin/shutdown.bat
java
命令,输出的有提示信息,说明是正确的javac
命令,输出的有提示信息,说明是正确的JAVA_HOME
Path
现象:通过查看日志,确定是否是端口冲突。日志文件:tomcat/logs/catalina*
Caused by: java.net.BindException: Address already in use: bind
解决方案:
方案一:杀掉占用端口的进程,然后再启动Tomcat
netstat -ano | findstr ":8080"
,找最后一列值,是进程的pid[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYk6k8Wv-1581677314685)(img/image-20200115094824923.png)]
方案二:更改Tomcat配置文件,使用其它端口
tomcat/conf/server.xml
搜索port=
,修改值startup.bat
shutdown.bat
或者 直接关闭Tomcat的黑窗口logs/catalina开头的文件
,找Address already in use
方案一:把web项目文件夹直接放到tomcat\webapps
里
webapps
文件夹里方案二:修改server.xml(不建议)
server.xml
的Host
标签中增加:<Context docBase="项目文件所在位置" path="项目访问路径">Context>
<Context docBase="E:\heima\travel" path="travel">Context>
http://ip:port/项目访问路径/资源路径
方案三:虚拟路径方式(idea使用的,了解)
在Tomcat的conf\Catalina\localhost
中创建xml文件项目访问路径.xml
(如果文件夹不存在,就创建)
例如:travel.xml
,内容如下
<Context docBase="E:\heima\travel">Context>
http://ip:port/xml文件名称/资源路径
http://ip:port/项目访问路径/资源路径
http://192.168.65.67:80/day05/traval/index.html
webapps
里webapps
里http://ip:port/项目路径/资源路径
用来抓取HTTP请求和HTTP响应数据的工具。只能看,不能拦截,不能修改
HttpWatch,浏览器自带的F12->Network(网络),发请求就能自动抓到这次请求和响应
POST /day16/req HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 25
Cache-Control: max-age=0
Origin: http://localhost
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://localhost/day16/index.jsp
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,cs;q=0.7
Cookie: JSESSIONID=844ABB8A9F63FA147D8194E47C4BB1AF
username=tom&password=tom
请求方式 请求资源 协议版本
POST /day16/req HTTP/1.1
Referer:http://www.jd.com
name=value&name=value&...
username=123&password=123
请求方式 请求资源 协议版本
POST /day07/success.html HTTP/1.1
Host: localhost
name=value&name=value&...
username=tom&password=123
抓取的HTTP响应数据示例
HTTP/1.1 200
Content-Length: 12
Date: Fri, 30 Aug 2019 01:55:45 GMT
hello, kitty
本次响应的基本信息
格式:协议版本 响应状态码 [响应状态描述]
比如:HTTP/1.1 200 [Ok]
常见的响应状态码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zyiN3is6-1581677314686)(img/tu_20.png)]
Content-Length: 12
协议版本 响应状态码
HTTP/1.1 200
Content-Type: text/html
和客户端交互的:
实现的步骤:
创建一个Java类,实现javax.servlet.Servlet
接口
重写接口里的方法(共有5个,了解3个,重点关注1个:service
)
使用@WebServlet
注解配置Servlet类(配置Servlet的虚拟访问路径)
客户端不能通过类名称访问Servlet
必须要通过Servlet配置的虚拟访问路径,才可以访问到
@WebServlet(urlPatterns = "/demo01")
public class Demo01Servlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("Demo01Servlet.service 运行了");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
创建一个Java类,实现Servlet
接口
重写接口的方法:重点关注service方法
使用注解@WebServlet配置虚拟访问路径
把web应用部署到Tomcat里,启动Tomcat,客户端可以通过浏览器访问Servlet
http://ip:port/项目路径/资源路径
方法 | 参数 | 说明 |
---|---|---|
init(ServletConfig) |
Servlet配置信息对象 | 初始化方法 |
service(ServletRequest, ServletResponse) |
请求对象,响应对象 | 业务方法 |
destroy() |
销毁方法 |
ServletConfig
:是Servlet的配置信息对象。作用是了解的:
config.getServletName()
: 获取Servlet的名称config.getInitParameter("参数名称")
:获取初始化参数值config.getServletContext()
:获取ServletContext对象ServletRequest
:用于接收客户端提交的数据
request.getParameter("表单项的name")
:接收客户端提交的表单数据ServletResponse
:用于给客户端返回数据的
response.getWriter().print("会显示到浏览器页面上的内容")
在web3.0以前,用web.xml配置
在web3.0以后,用注解配置 或者 用web.xml配置
如果一个Servlet要想被客户端访问,就必须使用注解@WebServlet
,提供一个虚拟访问路径
@WebServlet(
urlPatterns/value=虚拟路径,
name="Servlet名称",
loadOnStartup=整数,表示Servlet创建的时机
)
/
开头的路径,比如:/demo01
, /login
, /admin/manager
@WebServlet
配置@WebServlet(value="/demo01")
@WebServlet(urlPatterns="/demo01")
@WebServlet("/demo01")
Servlet
接口GenericServlet
父类GenericServlet
实现Servlet
接口,实现接口的方法GenericServlet
,重写业务方法service
@WebServlet(urlPatterns = "/demo02")
public class Demo02GenericServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("Demo02GenericServlet.service 运行了");
}
}
HttpServlet
父类HttpServlet
继承GenericServlet
父类,重写service
方法:
get
方式的请求,就调用doGet
post
方式的请求,就调用doPost
HttpServlet
,重写doGet
和doPost
方法@WebServlet(urlPatterns = "/demo03")
public class Demo03HttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get和post请求,共同的功能代码");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}