对于EE阶段,两个知识点是前置技能要求:
http协议、
tomcat(
对于tomcat的组成部分要有一个认识、
部署应用的几种方式:
静态资源和动态资源
静态资源:一成不变的内容。每个人看到的都是一样的。Html、css、js、图片等。
动态资源:内容是丰富多彩的。你们刷抖音。兴趣爱好不同,刷到的视频都是不同的。登录一个网站,每个人看到的都是自己的用户名。更多的交互性。Servlet。刷新一个页面,时刻显示最新的时间。
动态资源会转成静态资源,再传输回客户端。
学习官方文档。
http://tomcat.apache.org/tomcat-8.5-doc/servletapi/overview-summary.html
问题:包不存在?
为什么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里面,得放在外面
然后绑定
比如访问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都是采用web.xml方式,那么也可以使用注解的方式。
部署应用的方式?两种。直接部署、虚拟映射。
接下来,IDEA会使用复制的这些配置文件,重新开启一个新的tomcat。利用这个新的tomcat来部署应用。
在左边这个目录下conf/Catalina/localhost下,找到了虚拟映射的配置文件。
那么docBase指向的位置就是当前app应用的根目录。打开该docBase
标准的java web项目目录结构。
但是到此还没有结束
红线框出来的路径不是我们最终的部署路径????
上面已经提到转换的规则,那么规则是在哪里配置的呢?
右键选择module,选择open module setting
servlet的init、service、destroy三个阶段。
servlet被创建的时候,会调用init方法
servlet发挥功能,会调用service方法
servlet将要被销毁,会调用destroy方法
Web.xml方式同理
那么这么做有什么意义呢?
假如某个servlet需要在初始化时需要做一些操作,比如访问数据库等
一个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]
做一个简单的了解即可,重要性不是非常的重要。
可以获取某一个servlet的初始化参数。
非常核心的一个对象。
假如在某个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"));
}
}
关于file的相对路径,其实jdk描述的是相对jvm调用目录,哪个目录下调用jvm,那么相对路径相对的就是该目录。
想获取项目部署根目录里面的一个文件,所以这种方法不可行。
域:共享数据的场所。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
前后端分离时代:
用户去请求前端的页面,然后又发起了一个请求,去请求数据,拿到list集合信息返回,接下来,前端页面完成数据的渲染。