Servlet

1.回顾:

对于EE阶段,两个知识点是前置技能要求:

http协议、

tomcat(

对于tomcat的组成部分要有一个认识、

部署应用的几种方式:

  1. 直接部署-----webapps目录下新建一个目录,那么该目录就是一个应用,目录的名称就是应用名;打成war包丢到webapps目录下,tomcat会自动解压)
  2. 虚拟映射------非常非常重要。Server.xml文件中再host节点下新增一个Context节点;conf/Catalina/localhost目录下,新增应用名.xml文件。

静态资源和动态资源

静态资源:一成不变的内容。每个人看到的都是一样的。Html、css、js、图片等。

动态资源:内容是丰富多彩的。你们刷抖音。兴趣爱好不同,刷到的视频都是不同的。登录一个网站,每个人看到的都是自己的用户名。更多的交互性。Servlet。刷新一个页面,时刻显示最新的时间。

动态资源会转成静态资源,再传输回客户端。

2.Servlet:

学习官方文档。

http://tomcat.apache.org/tomcat-8.5-doc/servletapi/overview-summary.html

2.1如何开发Servlet

问题:包不存在?
为什么SE阶段没有遇到过这个问题呢?
SE阶段用的各种API都是位于jdk中的,但是servlet属于EE,ee的包肯定不在SE的jdk中。
导入该包到内存中。
类加载的机制。
类加载器三类:
1.Bootstrap:主要用于加载jdk中的一些核心类库
2.Extension:主要用来加载jre/ext目录下的类库
3.System:将-classpath后面的jar包加载到内存中

编译通过。
一个class文件如何放入到tomcat中?
tomcat里面只可以放置应用。
需要在tomcat中新建一个应用,然后将class文件放入应用中。

EE项目的目录结构:
webapps目录:
一个一个的应用,比如servlet
-----静态资源文件,html、css、js、图片等
-----WEB-INF
----------------classes
----------------lib
----------------web.xml

为什么需要这么设置?
假设如果直接将class文件放在servlet应用根目录下,会怎么样?
直接会将你的源代码暴露出来。
WEB-INF目录就是为了屏蔽浏览器直接访问的。

不能放在root里面,得放在外面

然后绑定

总结servlet执行流程:

比如访问http://localhost:8080/app/servlet.
1.地址栏打出该地址,浏览器首先帮助你构建一个请求报文
2.传输到目标机器,到达指定端口8080的connector,然后connector接收到该请求,将请求报文转成request对象
3.connector将request对象,同时还会生成一个空的response对象,然后将这两个对象传给engine
4.engine接着选择host,将这两个对象传给host
5.host选择Context(/app),将这两个对象传给Context
6.Context在当前应用下去寻找/servlet,如果找到,则往response对象里面写入对应的数据
7.这两个对象依次返回,给connector
connector读取response对象里面的数据,然后生成一个响应报文,发送出去

 

 

开发servlet的第三种方式:

开发servlet的第四种方式:

之前我们声明servlet都是采用web.xml方式,那么也可以使用注解的方式。

IDEA如何与tomcat关联:

部署应用的方式?两种。直接部署、虚拟映射。

接下来,IDEA会使用复制的这些配置文件,重新开启一个新的tomcat。利用这个新的tomcat来部署应用。

在左边这个目录下conf/Catalina/localhost下,找到了虚拟映射的配置文件。

那么docBase指向的位置就是当前app应用的根目录。打开该docBase

标准的java web项目目录结构。

但是到此还没有结束

红线框出来的路径不是我们最终的部署路径????

IDEA项目设置

上面已经提到转换的规则,那么规则是在哪里配置的呢?

右键选择module,选择open module setting

 

servlet的生命周期

servlet的init、service、destroy三个阶段。

servlet被创建的时候,会调用init方法

servlet发挥功能,会调用service方法

servlet将要被销毁,会调用destroy方法

Web.xml方式同理

那么这么做有什么意义呢?

假如某个servlet需要在初始化时需要做一些操作,比如访问数据库等

Url-pattern细节

一个servlet可以设置多个url-pattern吗?

可以

多个servlet可以设置同一个url-pattern吗?

不可以.

Caused by: java.lang.IllegalArgumentException: 名为 [com.cskaoyan.servlet.urlPattern.UrlPatternServlet2]和 [com.cskaoyan.servlet.urlPattern.UrlPatternServlet1] 的servlet不能映射为一个url模式(url-pattern) [/url2]

URL-parttern优先级

两个特殊的url-pattern

ServletConfig

做一个简单的了解即可,重要性不是非常的重要。

可以获取某一个servlet的初始化参数。

ServletContext:

非常核心的一个对象。

获取全局性初始化参数:

可以作为一个全局性共享数据的场所

假如在某个servlet中处理了一个逻辑,保存了一些数据,接下来,在其他servlet中需要把该数据取出来,继续处理,应该怎么做?

某网站的历史访问次数。

数据库。

Context.setAttribute(key,value)/getAttribute(key)/removeAttribute(key)

@WebServlet("/domain1")
public class DomainServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //getServletContext().setAttribute("count","one");
        ServletContext servletContext = getServletContext();
        synchronized (servletContext){
            Integer count = (Integer) servletContext.getAttribute("count");
            if(count == null){
                count = 0;
            }
            servletContext.setAttribute("count", ++count);
        }
        response.getWriter().println("history total count: " + servletContext.getAttribute("count"));
    }
}
@WebServlet("/domain2")
public class DomainServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        synchronized (servletContext){
            Integer count = (Integer) servletContext.getAttribute("count");
            if(count == null){
                count = 0;
            }
            servletContext.setAttribute("count", ++count);
        }
        response.getWriter().println("history total count: " + servletContext.getAttribute("count"));
    }
}

获取EE项目的绝对路径

关于file的相对路径,其实jdk描述的是相对jvm调用目录,哪个目录下调用jvm,那么相对路径相对的就是该目录。

想获取项目部署根目录里面的一个文件,所以这种方法不可行。

request域

域:共享数据的场所。context域。

如何共享呢?

context域,只要拿到的是同一个context对象,那么就可以共享同一个context域

request域,只要拿到的是同一个request对象,那么就可以共享同一个request域

哪些是同一个request?频繁刷新浏览器的地址,每次请求时一个request对象吗?

转发包含的源组件和目标组件之间是同一个request对象。频繁刷新一个地址,会每次都创建一个新的request和response,没有任何关系

@WebServlet("/domain1")
public class DomainServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //request域
        request.setAttribute("name","zhangsan");
        RequestDispatcher dispatcher = request.getRequestDispatcher("domain2");
        dispatcher.forward(request, response);
    }
}
@WebServlet("/domain2")
public class DomainServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = (String) request.getAttribute("name");
        System.out.println(name);
    }
}

这些知识点,比如转发、request域、jsp等,这些在前后端还未分离的时代是比较有用的,但是现在前后端分离,使用比较有限。

在jsp时代,可以这么做:

首先先访问到servlet,servlet去查询数据库,得到List<Site>集合信息,接下来,将list数据放入request域中,同时转发给jsp页面(本质来说就是servlet),jsp拿到数据以后,取出里面的数据,然后渲染出来

 

前后端分离时代:

用户去请求前端的页面,然后又发起了一个请求,去请求数据,拿到list集合信息返回,接下来,前端页面完成数据的渲染。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值