服务器: 就是安装了服务器软件的计算机
服务器软件: 接受用户的请求,处理请求,做出响应
web服务器软件: 用户通过浏览器来发送请求给我们服务器,我们处理请求,做出响应
在web服务器软件中,可以部署web项目,让用户通过历览器来访问这些项目
可以说他是作为一种web容器,装载动态资源
常见的java相关的web服务器软件
我们可以将端口号改为80,因为80端口是http协议的默认端口号 ,用户访问我们的网站的时候就不用输入端口了
现在所有的网站默认端口号都是80
关于我们如何关闭网络服务
bin/shutdown.bat
文件来关闭首先看看tomcat的文件目录结构 (了解了解就行了)
部署项目的方式
http://10.4.235.173:8080/register/denglu.html
.war
的文件,解压后的项目文件也会被自动删掉server.xml
配置文件中部署项目
host
标签
这是一个自闭合标签
那么我们要访问的时候就输入Localhost:8080/hehe/denglu.html
conf\Catalina\localhost
目录下创建一个任意名称的xml文件 (最推荐的一种部署方式,这是一种热部署的方式,同时也不怕丢失了一个文件而导致所有部署的项目都失效)
, 注意,这里没有虚拟目录动态项目和静态项目
web-inf
Servlet(server applet): 运行在服务器上的小应用程序
本质上就是一个接口,定义了一个java类被浏览器访问到(Tomcat识别)的规则
将来我们自定义一个类,实现servlet接口,复写方法
步骤如下
初始化方法: 在Servlet方法被创建的时候执行, 只会执行一次
public void init(ServletConfig servletConfig) throws ServletException {
}
我们可以通过web.xml文件来规定Servlet的创建时机
在标签里面添加 标签,让其里面的值为负数,不配置的默认值就是-1
说明servlet在内存中只存在一个对象,servlet是单例的
提供服务方法: 每一次Servlet被访问时执行
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
销毁方法: 在Servlet正常关闭时执行
public void destroy() {
}
注意,正常关闭时才会执行
方法是执行在,销毁之前的
从servlet3.0 版本之后,支持注解配置,我们可以不需要web.xml了
步骤
创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
定义Servlet类,实现Servlet接口
复写接口的方法
在类上使用注解@webServlet
package example;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//@WebServlet( urlPatterns = "/hehe")
//下面是简便写法,里面就是虚拟路径
@WebServlet("/hehe")
public class ServletDemo 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("aaa");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
运行服务器的时候,我们发现有下面这一行字Using CATALINA_BASE: "C:\Users\CUMT_CJY\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\a7a45e64-9f44-4a4c-b00a-bfe866c6e75b"
进入目录,我们就会发现,文件夹中有着和tomcat文件目录很相似的东西
点进去conf/Catalina/localhost/JavaWeb_war_exploded.xml
,我们会发现文件里面的内容是
,我们发现了一个大秘密,tomacat真正访问的不是我们写代码的src的那个目录,而是其他地方(这个地方就是tomcat部署的web项目的地方)
4
所说, tomcat真正访问的是tomcat部署的web项目
,tomcat部署的web项目
对应着工作空间项目
的webapp目录下的所有资源小虫子
那个debug的图标在之前,我们每次要写一个Servlet的实例对象,都要重写接口的所有方法,但是有些我们又不用,很麻烦,那么有没有什么方法来解决呢?
我们来看看接口的儿子孙子们
GenericServlet
– 抽象类
HttpServlet
– 抽象类该类的定义: Defines a generic, protocol-independent servlet. To write an HTTP servlet for use on the Web, extend HttpServlet instead.
中文翻译: 定义一个通用的、与协议无关的servlet。要编写一个供Web使用的HttpServlet,请改用扩展HttpServlet。
观察他的源码,我们发现除了service方法之外的所有Servlet接口的方法都被重写了(尽管有些只不过是空实现)
因此,我们在继承这个类写Servlet的时候,我们只用重写service方法就行了
package servlet.JavaWeb;
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("/hehe")
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我是你爹!");
}
}
尽管它很方便,但是我们不用他,因为这个类存在的目的不是为了创建适用于http的servlet
类的定义: 提供一个要子类化的抽象类,以创建适用于网站的HTTPservlet。
HttpServlet的子类必须重写至少一个方法,通常是以下方法之一:
doGet
() ,如果servlet支持HTTP GET请求
doPost()
,用于HTTP POST请求
doPut()
,用于HTTP PUT请求
doDelete()
,用于HTTP删除请求
init()和destroy()
,以管理在servlet生命周期内保留的资源
getServletInfo()
,servlet使用它来提供关于自身的信息
代码实现
package servlet.JavaWeb;
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("/haha")
public class ServletDemo3 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("就这?");
}
}
通过浏览器请求,是get的方式
所以我们在访问上面这个页面的时候,输出的是我是你爹
我们可以用表单提交的方式来触发post
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<form action="/JavaWeb_war_exploded/haha" method="post">
<input type="submit" value="提交">
form>
body>
html>
观察@WebServlet
注解,我们发现,下面这两个东西
/**
* The URL patterns of the servlet
*
* @return the URL patterns of the servlet
*/
String[] value() default {
};
/**
* The URL patterns of the servlet
*
* @return the URL patterns of the servlet
*/
String[] urlPatterns() default {
};
我们会发现,这两个用来写网页访问路径的属性,都是数组的形式,那么就意味着,一个servlet类可以有多个可以访问的路径
@WebServlet( {
"/qwq","/qwq1","/qwq2"} )
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是一个傻逼!");
}
}
上面这段代码,我们访问下面三个网址,都是有效的
localhost:8080/JavaWeb_war_exploded/qwq
localhost:8080/JavaWeb_war_exploded/qwq1
localhost:8080/JavaWeb_war_exploded/qwq2
路径的定义规则
/xxx
/xx/xx
/xx/*
: * 就是通配符,所有的意思*.do
: 意思就是在所有路径后面加上一个.do
都可以访问到这个Servlet
localhost:8080/JavaWeb_war_exploded/qwq2.do
localhost:8080/JavaWeb_war_exploded.do
注意: 通配符的优先级是最低的,当有其他网址存在的时候,优先显示其他的用的不是通配符的网址
面三个网址,都是有效的
localhost:8080/JavaWeb_war_exploded/qwq
localhost:8080/JavaWeb_war_exploded/qwq1
localhost:8080/JavaWeb_war_exploded/qwq2
路径的定义规则
/xxx
/xx/xx
/xx/*
: * 就是通配符,所有的意思*.do
: 意思就是在所有路径后面加上一个.do
都可以访问到这个Servlet
localhost:8080/JavaWeb_war_exploded/qwq2.do
localhost:8080/JavaWeb_war_exploded.do
注意: 通配符的优先级是最低的,当有其他网址存在的时候,优先显示其他的用的不是通配符的网址