文章目录
1.说说 jetty 与 tomcat 的区别。
-
先说说 Servlet:Servlet 就是一种用来处理网络请求的一套规范。
-
Jetty 是一个开源的 HTTP 服务器和 Servlet 容器,它可以为 JSP 和 Servlet 提供运行时环境。简单来说,Jetty Server就是由多个Connector(连接器)、多个Handler(处理器),以及一个线程池组成。整体结构请看下面这张图。
-
Tomcat 是 Servlet 容器,同时它也包括了 web 服务器的功能,在 tomcat 上部署应用程序时,我们是把应用程序放在 tomcat 根路径下的 webapps 文件夹下, 而这个文件下可以放置多个应用程序,我们可以通过请求来决定具体访问那个应用。
-
相同点:都是一种 Servlet 容器,他们都支持标准的 servlet 规范和 JavaEE 规范;
-
不同点:
- 由上边图可以看出,Jetty 的架构比 Tomcat 更为简单,Jetty 是基于 Handler 来实现的,主要的扩展功能都可以用 Handler 来实现,扩展简单;Tomcat 的架构是基于容器设计的,进行扩展时需要了解 Tomcat 的整体设计结构,不易扩展;
- Jetty 和 Tomcat 性能方面差异不大,Jetty 可以同时处理大量连接而且可以长时间保持连接,适合于 web 聊天应用等,Jetty 的架构简单,可以按需加载组件,减少不需要的组件,减少服务器内存开销,从而提高服务器性能,Jetty 默认采用 NIO 结束在处理 I/O 上更占优势,在处理静态资源时,性能较高;Tomcat适合处理少数非常繁忙的连接,也就是说如果生命周期短的话,Tomcat 性能更高,Tomcat 默认采用 BIO 处理 I/O 请求,在处理静态资源时,性能较差。
- Jetty 默认使用 utf-8 字符集,不存在中文乱码情况;Tomcat 默认使用 ISO_8859_1 字符集,经常有中文乱码。
- Jetty 更满足有云的分布式环境需求,而 Tomcat 更符合企业级环境。
2.如何修改 jetty 默认端口?如何修改 tomcat 默认端口?
-
Jetty:首先,下载安装 Jetty 之后,打开其安装文件夹,会看到 start.ini 配置文件,找到
jetty.http.port
这一配置项,将其去掉注释修改为自定义的端口,修改完之后,保存并退出,重启 Jetty 后生效;
-
Tomcat:首先,下载安装 Tomcat 之后,进入 conf 目录,打开 server.xml 文件,修改
port
这项,将 8080 修改为自己想要的端口号, 修改完记得保存重新启动 tomcat 服务器,打开浏览器在最上面的地址栏输入http://localhost:xxxx/ 出现 Tomcat 页面就修改成功;
3.如何启动 jetty 服务器?
- 在 DOS 窗口进入到安装 Jetty 的目录下,输入
java -jar start.jar
启动欧冠 Jetty:
4.简述 Servlet 的生命周期。
- 生命周期一般分为三个阶段:
- 初始化阶段:调用 init() 方法;
- 响应客户请求阶段:调用 service() 方法(doGet() 和doPost() );
- 终止阶段:调用 destroy() 方法;
- doGet() 是通过 http 和 header 来传输数据,doPost() 是通过 http 和 body 来传输数据;
5.Servlet如何处理用户的请求?
- 浏览器向 web 服务器发送了 HTTP 请求;
- web 服务器(Servlet 容器)接受浏览器的请求;
- web 服务器创建一个 HttpServletRequest 对象,将浏览器请求的信息封装到这个对象中;
- web 服务器创建一个 HttpServletResponse 对象;
- web 服务器调用 Servlet 对象的 service() 方法,把 HttpServletRequest 对象和 HttpServletResponse 作为参数传给 Servlet 对象;
- Servlet 调用 HttpServletRequest 对象的有关方法,获取 Http 的请求信息;
- Servlet 调用 HttpServletResponse 对象的有关方法,生成响应数据;
- web 服务器把 Servlet 响应结果传给浏览器。
6.说说 get 请求和 post 的请求的区别。
- get 用于获取数据,而 posy 一般用于提交数据;
- get 参数有长度限制(受限于 url 长度),而 post 无限制;
- get 产生一个 TCP 数据包,而 post 产生两个数据包;
- 后退页面时,get 没有影响, post 会再次提交请求;
7.说说相对地址与绝对地址的区别。
- 相对地址:就是被链接文件相对于当前页面的地址;
- 绝对地址:就是文件在网络或本地的绝对位置;
- 一般来说,比较少用绝对地址,绝对地址只针对自己的电脑有用,放到别的设备上就不起作用了,除非在别人的设备上相同路径下有相同的文件。大部分选择使用相对路径,即使换了一台设备,也是可以继续使用的。
8.说说请求重定向与请求转发的区别。
-
请求重定向:
客户端行为,response.sendRedirect() 从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的 URL 会变,客户端请求服务器,服务器返回重定向,客户端再自动请求重定向地址;
-
请求转发:
服务器行为,request.getRequestDispather().forward(req,resp) 是一次请求,转发后请求对象会保存,地址栏的 URL 地址不会变,客户端请求服务器,服务器内部请求其他地址。
9. jsp 有哪九大内置对象?servlet 如何获取 session 和application 对象?
-
九大内置对象:
Jsp 内置对象 功能 out 向客户端输出数据 request 向客户端请求数据 response 封装了 jsp 产生的响应,然后被发送到客户端以响应客户的请求 application 从servlet配置对象中获得servlet上下文 config 表示Servlet的配置,当一个Servlet初始化时,容器把某些信息通过此对象传递给这个Servlet page Jsp实现类的实例,它是jsp本身,通过这个可以对它进行访问 pagecontext 为JSP页面包装页面的上下文。管理对属于JSP中特殊可见部分中己经命名对象的该问 session 用来保存每个用户的信息,以便跟踪每个用户的操作状态 exception 反映运行的异常 -
获取 session 和 application 对象:
session 可以通过 request.getSession(); 来获取 application 可以通过 this.getServletContext() 来获取
10.什么是单例?单例有哪些设计模式?
-
单例:就是独一无二的意思,放到生活中比如太阳,进入程序中,就是在这个程序运行中,最多只能有一个实例化对象;
-
设计模式:
-
饿汉式:
public class Hungry{ private static Hungry hungry = new Hungry(); private Hungry(){ } public static Hungry instance(){ return hungry; } }
这种方式不会产生线程安全问题,因为在 JVM 中,对类的加载和类初始化,由虚拟机保证线程安全;
优点:没有枷锁,执行效率会提高;
缺点:浪费内存;
-
懒汉式:
public class Lazy { private static Lazy lazy; private Lazy() { } public static Lazy instance() { if (lazy == null) { lazy = new Lazy(); } return lazy; } }
可以在 instance() 时再创建对象,所以称为懒汉式。这种实现最大的问题就是不支持多线程,存在线程安全问题。
-