javac编译打包java文件命令:javac -d . java文件名
1、Web容器:
Web容器是Servlet/JSP唯一认得的HTTP服务器。
何谓web容器:
对于java程序而言,jvm是其操作系统,.java文件会编译为.class文件,.class对于jvm而言,就是其可执行文
件。java
程序基本上只认得一种操作系统,就是jvm。就如同jvm介于java程序与实体操作系统之间,web容器是介于实体http
服务
器与
servlet之间,也正如编写java程序必须了解jvm与应用程序之间如何互动,编写servlet/jsp也必须知道web容器如何servlet
/jsp互动,如何管理servlet等事实(jsp最后也是转译、编译、加载为servlet,在容器的世界中,真正负责请求、响应的是
servlet)。
2、开发servlet有三种方法:
1)、实现servlet接口
2)、继承GenericServlet
3)、继承HttpServlet
1)、实现servlet接口
2)、继承GenericServlet
3)、继承HttpServlet
3、请求/响应流程:
1)、客户端(大部分情况下是浏览器)对Web服 务器 发出HTTP请求;
2)、HTTP服务器收到HTTP请求,将请求转由Web容器处理,Web容器会剖析HTTP请求内容,创建各种对象(如HttpServletRequest、 HttpServletResponse、HttpSession等);
3)、Web容器由请求的URL决定要使用哪个Servlet来处理请求(事先由开发人员定义);
4)、Servlet根据请求对象(HttpServletRequest)的信息决定如何处理,通过响应对象(HttpServletResponse)来创建响应;
5)、Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP响应并传回客户端。
注意:如果有多次请求进来,就只是启动多个线程来进行处理,而不是重复启动多次JVM。
1)、客户端(大部分情况下是浏览器)对Web服 务器 发出HTTP请求;
2)、HTTP服务器收到HTTP请求,将请求转由Web容器处理,Web容器会剖析HTTP请求内容,创建各种对象(如HttpServletRequest、 HttpServletResponse、HttpSession等);
3)、Web容器由请求的URL决定要使用哪个Servlet来处理请求(事先由开发人员定义);
4)、Servlet根据请求对象(HttpServletRequest)的信息决定如何处理,通过响应对象(HttpServletResponse)来创建响应;
5)、Web容器与HTTP服务器沟通,Web服务器将响应转换为HTTP响应并传回客户端。
注意:如果有多次请求进来,就只是启动多个线程来进行处理,而不是重复启动多次JVM。
4、servlet的运行过程
servlet程序是由web服务器调用,web服务器收到客户端的servlet请求后:
1)、web服务器首先检查是否已经装载并创建了该servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步;
2)、装载并创建该servlet的一个实例对象;
3)、调用servlet实例对象的init()方法;
4)、创建一个用于封装http请求消息的HttpServletRequest对象和一个代表http响应消息的HttpServletResponse对象,然后调
servlet程序是由web服务器调用,web服务器收到客户端的servlet请求后:
1)、web服务器首先检查是否已经装载并创建了该servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步;
2)、装载并创建该servlet的一个实例对象;
3)、调用servlet实例对象的init()方法;
4)、创建一个用于封装http请求消息的HttpServletRequest对象和一个代表http响应消息的HttpServletResponse对象,然后调
用
Servlet的service()方法并将请求和响应对象作为参数传递进去;
5)、web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
5)、web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
注意:以下情况会导致destory()方法调用:
1)、tomcat重新启动
2)、reload该webapp
3)、重新启动电脑
1)、tomcat重新启动
2)、reload该webapp
3)、重新启动电脑
5、servlet开发的缺点:
1)、在web.xml文件中需要配置很多行代码,维护起来很不方便,不利于团队合作;
2)、一个servlet的入口只有一个doPost或者doGet方法,如果在一个servlet中写好几个方法,怎么办?
2)、一个servlet的入口只有一个doPost或者doGet方法,如果在一个servlet中写好几个方法,怎么办?
public class UserServlet extends HttpServlet{
doPost(){
this.doGet();
}
doGet(){
if(request.getParameter("method").equals("save")){
this.save();
}else{
this.update();
}
}
private void save(){
}
private void update(){
}
}
这样会导致代码结构很乱;
3)、servlet类与web容器高度耦合,每个方法中都有两个参数request、response,如果服务器不启动,这两个参数没有办法
初始化;
4)、如果在servlet中的一个方法中有很多功能,这个时候会导致该方法比较复杂,不利于维护
doGet(){
用户注册
//用户头像上传
//验证表单
//权限的验证
//注册
}
用户注册完成了4件事情,所以整个方法比较杂乱;
4)、如果在servlet中的一个方法中有很多功能,这个时候会导致该方法比较复杂,不利于维护
doGet(){
用户注册
//用户头像上传
//验证表单
//权限的验证
//注册
}
用户注册完成了4件事情,所以整个方法比较杂乱;
5)、如果一个servlet类中有很多方法,浏览器对这些方法进行请求,url写起来很麻烦;
http://localhost:8080/servlet/userServlet?method=save/update
6)、在servlet中如果要获取页面上表单中的数据,那么在方法中会写很多行。
http://localhost:8080/servlet/userServlet?method=save/update
6)、在servlet中如果要获取页面上表单中的数据,那么在方法中会写很多行。
6、servlet工作的时序图:
这个图只截了一部分,前面还有浏览器请求过程和服务器拿到请求后进行解析的过程。