01_Tomcat&Servlet
软件架构
BS:Browser Server

浏览器-服务器模式。客户端使用浏览器来访问服务器。
特点:必须在本地电脑安装每一种客户端软件
特点:
- 客户端使用的是浏览器,只要有浏览器就可以执行我们程序。
- 服务器升级,客户端可以无缝升级,就可以直接使用最新的功能。
CS:Client Server

客户端-服务器模式。用户需要在本地电脑上安装客户端软件,再来访问服务器。
特点:
必须在本地电脑安装每一种客户端软件
如果服务器器升级,每个客户端也需要升级。服务器会经常升级,导致客户端会经常进⾏升级并且安装。
web资源
web资源——
浏览器能看到的资源都是web资源
资源分类——
静态资源:
浏览器访问的资源是服务器上的物理文件(html,jpg,png,js,css)
动态资源:
浏览器访问的资源是服务器运行的代码(java代码)产生的数据
动态资源技术:
servlet,JSP,asp.net,PHP,Python
web服务器
介绍:
web服务器就是运行在高性能计算机上的一个软件,软件对外提供服务。那么这台电脑统称服务器
作用:
有能力将本地的资源(静态和动态)提供给外界用户使用浏览器访问。
常见web服务器软件的介绍
1.weblogic,oracle公司
2.websphere,ibm公司
3.其他

4.Tomcat,apache开源组织,免费

tips:
浏览器与服务器的底层通信原理技术是socket网络编程
tomcat下载与安装
tomcat启动命令:startup.bat
tomcat服务器占用端口号:8080
Tomcat安装常见问题:
1.没有设置环境变量JAVA_HOME
2.tomcat端口8080被占用
tomcat目录结构介绍

bin:命令目录
conf:配置目录
webapps:发布资源目录
logs:日志
tomcat发布资源方式1-webapps发布
webapps目录发布资源,这个目录也叫服务器资源根目录
webapps是发布资源目录,资源文件必须放在资源目录下,如果希望不写资源目录访问资源,那么必须将资源文件放到ROOT目录下, 否则其他资源文件必须使用资源目录名字才可以访问
tomcat发布资源方式2-server.xml虚拟目录发布
虚拟目录资源发布方式可以将资源发布服务器的外部(不在webapps里面)
步骤——
修改配置文件server.xml,在host标签里面增加Context标签节点
<Context path="虚拟资源目录" docBase="真实发布资源目录"/>
浏览器访问路径:http://localhost:8080/虚拟资源目录/资源路径

这种方式改了配置文件,需要重启服务器才有效果
tips:
tomcat服务器全局web.xml文件(tomcat/conf/web.xml)默认欢迎页面的设置
tomcat发布资源方式3-独立xml虚拟目录发布
实现步骤
-
准备一个独立xml文件,里面需要配置Context标签节点
image.png
- 将这个配置文件放到apache-tomcat-8.5.27\conf\Catalina\localhost目录下,服务器自动加载配置文件
将这个配置文件放到apache-tomcat-8.5.27\conf\Catalina\localhost目录下,服务器自动加载配置文件
3.观察服务器是否加载了配置,如果加载了,再进行浏览器访问

tips:独立xml虚拟目录发布的好处:
不用重启服务器
IDEA绑定tomcat
使用idea操作tomcat启动、关闭、部署项目
Servlet开发体验1-Servlet2.5配置文件方式
servlet介绍
一个 服务端Java的小应用程序,全称server applet ,运行在Web 容器中,处理用户的请求并且做出响应数据给浏览器。
作用分析

浏览器提交url请求,tomcat服务器根据url路径调用指定的servlet程序处理请求与响应。
作用:处理请求与响应
Servlet开发体验1-Servlet2.5配置文件方式
创建一个新类继承HttpServlet,重写doGet处理请求方法进行处理请求与响应
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class Demo1Servlet extends HttpServlet {
/**
* 用来处理get请求与响应
* request是请求对象,用来获取所有请求数据的
* response是响应对象,用来输出数据给浏览器的
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给浏览器输出一句“hello servlet2.5”
//1.获取输出流可以输出数据给浏览器
PrintWriter out = response.getWriter();
//2.输出数据
out.write("hello servlet2.5");
}
/*
* 用来处理post请求与响应
* */
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
配置web.xml让用户访问的路径找到servlet去执行处理请求与响应
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--目标:配置用户访问的url与DemoServlet映射关系,目的是访问url就找到DemoServlet处理请求与响应
1.定义DemoServlet类全名
2.定义url关联DemoServlet
url定义格式:/资源名字, /代表当前项目内,必须有
浏览器访问:http://localhost:8080/资源目录/资源名字
例子:http://localhost:8080/资源目录/demo
-->
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>com.itheima.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
步骤——
配置文件方式:需要手动进行web.xml配置用户访问的路径与servlet进行映射
开发servlet的步骤:
- 创建类继承HttpServlet
- 重写doGet方法
- 配置web.xml
- 部署项目
Servlet开发体验2-Servlet3.0注解配置方式
实现步骤
- 使用idea创建web应用程序
- 创建一个类Demo1Servlet继承HttpServlet重写doGet方法(我们自己的类就是Servlet),处理用户的请求与响应数据给浏览器
- 在Demo1Servlet类上面配置注解(配置url路径)
- 部署资源到服务器上.(使用idea工具部署项目)
创建Servlet并重写doGet方法——
配置注解进行用户访问的url映射到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;
import java.io.PrintWriter;
/*
* 注解方式给servlet绑定url
* @WebServlet 注解
* name = "Demo1Servlet", 功能与web.xml中的<servlet-name>一样,这个属性可有可无
* urlPatterns = "/demo",功能与web.xml中的<url-pattern>一样,这个属性必须有
* */
@WebServlet(name = "Demo1Servlet",urlPatterns = "/demo")
public class Demo1Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给浏览器输出一句“hello servlet3.0”
//1.获取输出流可以输出数据给浏览器
PrintWriter out = response.getWriter();
//2.输出数据
out.write("hello servlet3.0");
}
}
配置模板操作:

添加的代码:
,urlPatterns="/${Entity_Name}"
doGet(request,response);
Servlet3.0新特性
-
新增了一些注解,简化的 javaweb 代码开发,可以省略 web.xml 配置文件。
-
支持异步处理:多线程技术。
-
支持可插性特性:书写的代码编译后生成的 class 文件可以直接部署到其他项目自动加载执行。
servlet2.5写的java代码编译后放到服务器上,需要重启服务器
servlet3.0不需要,直接服务器识别
tips:
1.servlet2.5与servlet3.0区别——
2.5需要手动配置web.xml
3.0只需要配置注解
2.servlet程序与普通java类的区别
普通java类型需要main方法才能运行
servlet程序是有tomcat服务器调用的运行
Servlet体系结构
体系结构关系
查看某一个类的体系结构,光标放到类的上面使用Ctrl+Alt+U

Servlet接口都有什么方法

GenericServlet 类
实现了Servlet接口,重写很多方法
HttpServlet类(重要)
HttpServlet类继承GenericServlet接口,重写service方法,判断是什么请求类型,如果是get请求走子类的doGet方法,如果是post请求,都子类doPost方法。
Servlet映射路径1—配置多个路径
个servlet可以通过多个不同路径访问吗?
可以,给servlet配置多个路径
映射路径匹配方式
-
精确匹配
上面讲的都是属于精确匹配,配置的url与用户访问的url要一模一样才可以访问到对应的servlet. -
模糊匹配
模糊匹配使用一个通配符“”号,只有这一个通配符。
通配符匹配使用只有2种方式:
1.前缀匹配,必须以“/”开头,以“”结尾(前面必须有/)
例子,/abc/,只要用户访问时/abc/开头都可以匹配到
2.后缀匹配,必须以“”开头,以“.”扩展名方式结束使用
例子,.do,只要用户访问时以.do结尾都可以匹配到
tips:
注意:/abc/*/abc
既不属于前缀也不属于后缀,属于精确匹配
注解方式实现
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;
/*
* 模糊匹配使用一个通配符“*”号,代表0到多个任意字符,只有这一个通配符。
通配符匹配使用只有2种方式:
1.前缀匹配,必须以“/”开头,以“/*”结尾
例子,/abc/*,只要用户访问时/abc/开头都可以匹配到
2.后缀匹配,必须以“*”开头,以“.”扩展名方式结束使用
例子,*.do,只要用户访问时以.do结尾都可以匹配到
urlPatterns属性设置有2种方式
设置一个url:urlPatterns = "/UrlPatternServlet"
设置多个url:urlPatterns = {"/UrlPatternServlet","xxx","xxx",...}
*/
@WebServlet(name = "UrlPatternServlet", urlPatterns = {
//精确匹配
"/UrlPatternServlet","/123/*/123",
//模糊匹配-前缀匹配
"/abc/*",
//模糊匹配-后缀匹配
"*.do"
})
public class UrlPatternServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hello UrlPatternServlet");
}
}
xml配置文件方式实现
1.可以配置多个url-pattern
<servlet-mapping>
<servlet-name>Demo1Servlet</servlet-name>
<url-pattern>/demo1</url-pattern>
<!-- 可以配置多个url-pattern -->
<url-pattern>/hello</url-pattern>
<url-pattern>/hello.html</url-pattern>
</servlet-mapping>
2.可以配置多个servlet-mapping
<servlet-mapping>
<servlet-name>Demo1Servlet</servlet-name>
<url-pattern>/demo1</url-pattern>
<!-- 可以配置多个url-pattern -->
<url-pattern>/hello</url-pattern>
<url-pattern>/hello.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Demo1Servlet</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
tips:
面试题:

Servlet映射路径2—缺省路径
servlet映射路径配置为“/”和“/*”
,会处理什么路径资源的请求?
可以匹配任何资源路径的访问,这个路径会导致静态资源无法访问
缺省路径介绍——
“/”和“/*”`就是缺省路径,缺省路径可以匹配一切资源。该映射路径已经被全局tomcat/conf/web.xml使用了,其中DefaultServlet配置了缺省路径。DefaultServlet是用于处理静态资源响应的。
静态资源访问流程——

tips:
-
1.访问静态资源走的是哪个servlet处理请求?
DefaultServlet -
2.在给servlet配置映射路径注意什么?
不能使用缺省路径
Servlet生命周期
就是一个对象从创建到销毁的过程
servlet是由服务器创建的
在用户第一次访问servlet的时候服务器创建的servlet对象,只创建了一次,全局唯一。
ServletConfig配置参数
作用:
可以读取web.xml中或注解对当前servlet配置的参数数据
api

注解方式实现
@WebServlet(name = "UserServlet", urlPatterns = "/UserServlet",
initParams = {
@WebInitParam(name = "参数名1",value = "参数值1"),
@WebInitParam(name = "参数名2",value = "参数值1"),
}
)
xml配置文件方式实现【重点】
<!--配置ServletConfigServlet的参数数据-->
<servlet>
<servlet-name>ServletConfigServlet</servlet-name>
<servlet-class>_04ServletConfig读取配置参数数据.ServletConfigServlet</servlet-class>
<!--配置参数数据-->
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>20</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfigServlet</servlet-name>
<url-pattern>/ServletConfigServlet</url-pattern>
</servlet-mapping>
读取数代码:
import javax.servlet.ServletConfig;
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;
import java.util.Enumeration;
public class ServletConfigServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//1.获取参数名称列表,Enumeration是一个古老的迭代器
Enumeration<String> enumeration = config.getInitParameterNames();
//2.遍历列表,循环读取每一个参数数据
while(enumeration.hasMoreElements()){
//获取当前元素为参数名字
String paramName = enumeration.nextElement();
//根据参数名字获取参数值
String paramValue = config.getInitParameter(paramName);
System.out.println(paramName+"="+paramValue);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Servlet运行原理
(时序图)

服务器根据url找到类全名,通过反射Class.forName(servlet类全名)创建了servlet对象,服务器将所有请求数据封装到request对象中,所有响应数据封装到response中,将request和response传入service方法,是使用反射调用service方法。