javaweb部分要点
1.jetty和tomcat的区别
相同点
Jetty和Tomcat为目前全球范围内最著名的两款开源的webserver/servlet容器。 它们的实现都遵循Java Servlet规范,一个java Web应用部署于两款容器的任意一个皆可。
差异点
Jetty与Tomcat比较,有哪差异呢?
- Jetty更轻量级。这是相对Tomcat而言的。
由于Tomcat除了遵循Java Servlet规范之外,自身还扩展了大量JEE特性以满足企业级应用的需求,所以Tomcat是较重量级的,而且配置较Jetty亦复杂许多。但对于大量普通互联网应用而言,并不需要用到Tomcat其他高级特性,所以在这种情况下,使用Tomcat是很浪费资源的。这种劣势放在分布式环境下,更是明显。换成Jetty,每个应用服务器省下那几兆内存,对于大的分布式环境则是节省大量资源。而且,Jetty的轻量级也使其在处理高并发细粒度请求的场景下显得更快速高效。 - jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的Web Server。相比之下,重量级的Tomcat原本便支持过多特性,要对其瘦身的成本远大于丰富Jetty的成本。用自己的理解,即增肥容易减肥难。
- 然而,当支持大规模企业级应用时,Jetty也许便需要扩展,在这场景下Tomcat便是更优的。
2.如何修改jetty和tomcat的默认端口
2.1修改jetty的默认端口号
答:要修改jetty的默认端口号 找到jetty文件所在目录下的 start.ini配置文件,打开文件 在里面找到这一行代码 jetty.http.port=8080 修改8080 就是修改他的端口号
2.2修改tomcat的默认端口号
与jetty的端口号修改大致相同
找到tomcat文件目录下的server.xml 文件,打开文件 找到 Connector port= 8080 这行代码 修改即可
3.如何启动jetty服务器
进入CMD命令行
在jetty目录下 输入 java -jar start.jar 就可以启动jetty服务器
4.简述Servlet的生命周期
4.1实例化
加载 Servlet后 服务器会创建一个 Servlet 实例 调用它的 构造方法
4.2初始化
调用 Servlet的 init()方法进行初始化,在初始化阶段 init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
4.3请求处理
对于到达服务器的客户机请求,服务器创建针对此次请求的一个“请求”对象和一个“响应”对象。服务器调用 Servlet 的 service() 方法,该方法用于传递“请求”和“响应”对象。service() 方法从“请求”对象获得请求信息、处理该请求并用“响应”对象的方法以将响应传回客户机。service() 方法可以调用其它方法来处理请求,例如 doGet()、doPost() 或其它的方法。(每次请求都执行该步骤)
4.4 销毁
当服务器不再需要 Servlet, 或重新装入 Servlet 的新实例时,服务器会调用 Servlet 的 destroy() 方法。(只执行一次)。
5.Servlet 是如何处理用户的请求的?
首先浏览器向 Web 服务器发送了一个 HTTP 请求,Web 服务器根据收到的请求,会先创建一个 HttpServletRequest 和 HttpServletResponse 对象,然后再调用相应的 Servlet 程序。 在 Servlet 程序运行时,它首先会从 HttpServletRequest 对象中读取数据信息,然后通过 service() 方法处理请求消息,并将处理后的响应数据写入到 HttpServletResponse 对象中。最后,Web 服务器会从 HttpServletResponse 对象中读取到响应数据,并发送给浏览器。 需要注意的是,在 Web 服务器运行阶段,每个 Servlet 都只会创建一个实例对象,针对每次 HTTP 请求,Web 服务器都会调用所请求 Servlet 实例的 service(HttpServletRequest request,HttpServletResponse response)方法,并重新创建一个 request 对象和一个 response 对象。
6.说说get请求和post的请求的区别。
Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求。
-
Get是获取信息,而不是修改信息,类似数据库查询功能一样,数据不会被修改。
-
Get传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的。
-
GET请求的数据会被浏览器缓存起来,用户名和密码将明文出现在URL上,其他人可以查到历史浏览记录,数据不太安全。Request.QueryString来获取Get方式提交来的数据。
-
Post请求则作为http消息的实际内容发送给web服务器,数据放置在HTML Header内提交,Post没有限制提交的数据。
-
Post比Get安全,当数据是中文或者不敏感的数据,则用get,因为使用get,参数会显示在地址,对于敏感数据和不是中文字符的数据,则用post
-
POST表示可能修改变服务器上的资源的请求,在服务器端,用Post方式提交的数据Request.Form来获取。
7.绝对地址和相对地址
绝对地址:资源文件的完整储存路径 如:E:\javaweb\jetty-distribution-9.4.18.v20190429.zip\jetty-distribution-9.4.18.v20190429
相对地址:资源文件相对于项目来说 在项目里的存储地址
8.说说请求重定向与请求转发的区别
请求重定向
客户端行为,response.sendRedirect() 从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL会变
客户端请求服务器,服务器返回重定向,客户端再自动请求重定向的地址。
请求转发
服务器行为,request.getRequestDispather().forward(req,resp) 是一次请求,转发后请求对象会保存,地址栏的URL地址不会变
客户端请求服务器,服务器内部请求其他地址
9.jsp有哪九大内置对象?servlet如何获取session和application对象?
Request常用的方法:getParameter(String strTextName) 获取表单提交的信息.
getProtocol() 获取客户使用的协议。
String strProtocol=request.getProtocol();
getServletPath() 获取客户提交信息的页面。String strServlet=request.getServletPath();
getMethod() 获取客户提交信息的方式 String strMethod=request.getMethod();
getHeader() 获取HTTP头文件中的accept,accept-encoding和Host的值,String strHeader=request.getHeader();
getRermoteAddr() 获取客户的IP地址。String strIP=request.getRemoteAddr();
getRemoteHost() 获取客户机的名称。String clientName=request.getRemoteHost();
getServerName() 获取服务器名称。 String serverName=request.getServerName();
getServerPort() 获取服务器的端口号。 int serverPort=request.getServerPort();
getParameterNames() 获取客户端提交的所有参数的名字。
获取:session对象:调用 request对象中的 getsession()方法
获取:application 对象:调用 getServletContext(); 方法
10.什么是单例? 单例有哪些设计模式?
单例:顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。下面我们来看下有哪几种实现方式吧。
懒汉式,顾名思义就是实例在用到的时候才去创建,“比较懒”,用的时候才去检查有没有实例,如果有则返回,没有则新建。有线程安全和线程不安全两种写法,区别就是synchronized关键字。
package aa.bb.cc;
public class LANHAN {
private static LANHAN xxx;//懒汉式 还没有创建实例
private LANHAN (){}//私有构造方法
public static LANHAN getInstance(){
if ( xxx==null){
xxx=new LANHAN();
} return xxx;
}
}
饿汉式:从名字上也很好理解,就是“比较勤”,实例在初始化的时候就已经建好了,不管你有没有用到,都先建好了再说。好处是没有线程安全的问题,坏处是浪费内存空间。
package aa.bb.cc;
public class EHAN {
private static EHAN instance = new EHAN(); //饿汉式 先创建对象
private EHAN(){}//私有化构造方法
public static EHAN getInstance(){
return instance;
}
}//用的时候直接调用示实例