Web学习历程记录(七)——Tomcat

tech2022-07-06  179

Web学习历程记录——Tomcat

Web

静态Web资源 指Web页面中供人们浏览的数据始终是不变的

动态Web资源 指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同

软件架构 C/S架构 Client/Server 客户端和服务器端,用户需要安装专门的客户端程序

B/S架构 Browser/Server 浏览器和服务器端,不需要安装专门的客户端程序,浏览器是操作系统内置

B/S和C/S交互模型的比较 相同点: 都是基于请求,相应交互模型。且必须先有请求,再有响应 请求和相应成对出现。 不同点: 实现C/S模型需要用户在自己的操作系统安装各种客户端软件 实现B/S模型,只需要用户安装浏览器即可。

Web服务器

Servlet 容器 Web 容器 Web 服务器

常见的web服务器

Weblogic WebSphere Tomcat

Tomcat基本概念

虚拟主机 将一个网站交给tomcat区管理的过程称为为tomcat配置一台虚拟主机

web应用 一个虚拟主机包含着许多web资源,但这些web资源不能直接交给虚拟主机管理,需要按照功能将web资源按照一定的目录结构组织成web应用再交给虚拟主机区管理

虚拟路径映射 将web应用交给虚拟主机管理,为web应用真实路径配置一个对外访问的虚拟的路径的过程叫做web应用的虚拟路径映射

http协议

HyperText Transfer Protoco(超文本传输协议)

作用:用于定义WEB浏览器与WEB服务器之间交换数据的过程和数据本身的内容

请求

请求行 请求方式,八种 get:明文传输,不安全,参数跟在请求路径后面,对请求参数大小有限制 post:暗文传输,安全一些,请求参数在请求体里面,对请求参数大小没有限制 url:统一资源码

请求头 以键值对的形式存在,但存在一个key对应多个值的请求头

作用: 浏览器告诉服务器自己相关的设置 User-Agent:浏览器信息 Referrer:从哪里来的,防盗链 Content-type:内容类型,告诉服务器,浏览器传输数据的MIME类型,文件传输的类型 Cookie:最重要的请求头信息之一,会话技术

请求体 只有请求方式是post的时候,才有请求体,请求参数所在的位置

响应

响应行 响应状态码

响应头 服务器指示浏览器去干什么,去配置什么 响应头以key-value存在 Location:通常和请求码302一起使用,完成请求重定向 Content-Type:设置服务器发送的内容的MIME类型 Refresh:指示客户端刷新频率 Content-Disposition:指示客户端下载文件

响应体 页面展示内容

Servlet

运行在服务端(tomcat)的Java小程序,动态资源

作用:用来处理客户端请求,相应给浏览器的动态资源 通过Java的api向客户端输出内容

必须实现servlet接口 必须在servlet容器中运行 servlet程序可以接受用户请求的参数以及向浏览器输出数据

Servlet生命周期

出生:用户第一次访问时执行 活着:应用活着,每次访问都会执行 死亡:应用卸载

对应方法 init(ServletConfig config) service(ServletRequest req,ServletResponse res) destroy()

描述 常规 默认情况下,来了第一次请求,会调用init()方法进行初始化【调用一次】 任何一次请求,都会调用service()方法处理这个请求 服务器正常关闭或者项目从服务器移除,调用destory()方法进行销毁【调用一次】

扩展 servlet是单例多线程,所以尽量不要在servlet里面使用全局变量,可能会导致线程不安全

ServletConfig Servlet配置对象,可以使用ServletConfig来获得Servlet的初始化参数

启动项 如果要让Servlet提前创建,可以使用启动项

Servlet体系结构

使用GenericServlet 简化了servlet开发 已经提供好了一些servlet接口所需的方法

HttpServlet 继承HttpServlet,需要重写doGet/doPost方法中的一个

HttpServlet是GenericServlet的子类,它增强了父类的一些功能

Servlet体系源码 以get方式访问页面时执行getLastModified()函数,执行doGet(request,rsponse)前会先执行getLastModified,果果浏览器发现其返回值与上次文章的返回值相同,则认为文档没有更新,浏览器估用缓存而不执行doGet()若返回-1,则认为时刻更新,总是执行该函数

ServletContext

是一个全局对象,上下文对象 服务器为每个应用都创建了一个ServletContext对象,ServletContext属于整个应用的,不局限于某个Servlet

作用 作用域对象存取数据,让Servlet共享 获得文件MIME类型(文件下载) 获得全局初始化参数 获取web资源路径

常用API getAttribute(String name):向ServletContext对象的map取对象 setAttribute(String name , Object obj):向ServletContext对象的map中添加数据 removeAttribute(String name):根据name删除数据

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = getServletContext(); servletContext.setAttribute("111","222"); servletContext.removeAttribute("111"); String str = (String) servletContext.getAttribute("111"); resp.getWriter().print(str); }

获得文件mime类型

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String file01 = "a.mp3"; String file02 = "b.txt"; String file03 = "c.jip"; String mime01 = getServletContext().getMimeType(file01); String mime02 = getServletContext().getMimeType(file02); String mime03 = getServletContext().getMimeType(file03); response.getWriter().println(mime01); response.getWriter().println(mime02); response.getWriter().println(mime03); response.getWriter().println(value); }

获得全局初始化参数 在web.xml中配置 所有的servlet都可以获取这个参数 跟init的不同是init只能由一个servlet获取

获取web资源路径 API:

根据资源名称得到资源的绝对路径 String getRealPath(String path);

返回指定路径文件的流 getResourceAsStream(String path);

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String realPath = getServletContext().getRealPath("a.txt"); System.out.println(realPath); InputStream is = getServletContext().getResourceAsStream("a.txt"); System.out.println(is); }

练习

统计网站被访问的次数

package count; 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; @WebServlet("/count") public class CountServlet 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 { int count = (int) getServletContext().getAttribute("count"); count++; getServletContext().setAttribute("count",count); response.getWriter().print("welcome"); } @Override public void init(ServletConfig config) throws ServletException { super.init(config); getServletContext().setAttribute("count", 0); } } package count; 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; @WebServlet("/count") public class CountServlet 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 { int count = (int) getServletContext().getAttribute("count"); count++; getServletContext().setAttribute("count",count); response.getWriter().print("welcome"); } @Override public void init(ServletConfig config) throws ServletException { super.init(config); getServletContext().setAttribute("count", 0); } }
最新回复(0)