Servlet
Servlet 是一个运行于 Web 服务器中的特殊 Java 程序,它接收和响应每个客户端的请求,双方遵循 HTTP 协议。
Servlet 的作用
动态向客户端输出 Web 页面的内容,是创建动态资源的常用技术之一。
如果新建了Servlet或者修改了Servlet代码,都需要重启服务器
如果新建或修改静态资源,不需要重启服务器
Servlet 的应用场景
1. 用户注册/用户登录/用户退出
2. 显示新闻内容
Servlet 与普通的 Java 程序的区别
1. 必须实现 Servlet 接口
2. 必须在 Servlet 容器(服务器)中运行
3. Servlet 程序可以接收用户请求参数以及向浏览器输出数据
创建Servlet的方式
Servlet结构
Servlet接口
GenericServlet实现类
HttpServlet实现类
方式一:
//根据Servlet接口创建Servlet
1.实现Servlet接口创建Servlet
2.重写了service方法
方式二:
//根据GenericServlet类创建Servlet
1. 继承GenericServlet创建Servlet
2.重写了service方法
//实现Servlet接口与继承GenericServlet创建Servlet的区别
1.实现Servlet接口需要重写很多方法
2.继承GenericServlet只需要重写services方法
Generice特点
客户端提交get请求或post提交的请求统一都有service方法处理
方式三:
//根据HttpServlet创建Servlet(推荐使用)
1.继承HttpServlet创建Servlet
2.重写了doGet/doPost方法
//httpServlet处理请求的特点
会根据客户端的请求方式处理请求
如果是get请求,就调用doGet处理get请求
如果是post请求,就调用doPost处理post请求
//继承httpServlet与继承GenericServlet创建Servlet区别
继承GenericServlet所有的请求都有service方法处理,不能区分get或post请求类型,
继承httpServlet可以根据不同的请求类型分别处理请求。
httpServlet依然重写父类的service方法处理请求,但是进行了进一步的加工,
在service重写的方法里面判断请求的类型,
如果是get请求就调用子类的doGet方法,如果是post请求就调用子类的doPost方法。
开发 Servlet
1. 创建一个普通 Java 类,继承 HttpServlet 类。
直接创建Servlet文件 类名为MyServlet
2. 添加当前工程对 Tomcat 的依赖 JAR 包
3. 重写 doGet 和 doPost 这二个方法。
4. 在 doGet 方法中调用 doPost 方法。
this.doPost(request,response);
5. 在 doPost 方法中,向浏览器输出当前时间。
PrintWriter writer = response.getWriter();
writer.write(new Date().toLocaleString());
writer.flush();
writer.close();
6. 在这个普通 Java 类前,用@注解配置这个 Servlet 的映射路径
@WebServlet(name="MyServlet",urlPatterns = "/first")
public class MyServlet extends HttpServlet {
}
@WebServlet(name="类名",urlPatterns = "/Servlet访问名称")
public class 类名 extends HttpServlet {
}
//默认路径/Servlet访问名称 可以访问该Servlet文件
7. 将这个Web项目发布到Tomcat中
Servlet生命周期
一个对象从创建到销毁的过程,就是生命周期。
//servlet生命周期:
1.先构造servlet,然后使用init方法使其初始化。
2.处理来自客户端对service方法的所有调用。
3.从服务中取出servlet,然后使用destroy方法销毁它,最后进行垃圾回收处理
public void init(ServletConfig servletConfig)
throws ServletException
初始化Servlet的方法,执行一次,由服务器调用。
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
throws ServletException, IOException
处理客户端请求的方法,执行多次,由服务器调用。
public void destroy() 销毁Servlet的方法,执行一次,由服务器调用。
Servlet生命周期流程
1_浏览器通过http来访问我的tomcat,
http://localhost:8080/myweb(工程名)/first(访问名)
2_服务器获取/myweb这个工程/项目/模块/应用名,去tomcat中,查看一下,
去tomcat/webapps目录中找是否有这个名字,
如果有myweb的话,就继续进行一下步操作
如果无myweb的话,返回空白页面
3_服务器获取/first这个名字,
去tomcat中每个Servlet的@WebServlet(urlPatterns)中查找有没有这个路径,
如果有/first的,就继续进行一下步操作
如果无/first的话,返回404错误页面
4_服务器查询这个Servlet对象是否已经存在,
如果已经存在,直接使用
如果不存在,则创建这个Servlet,执行无参构造器
5_如果不存在,服务器调用Servlet的构造器方法创建并同时调用init方法,为这个Servlet进行初始化操作,
如果存在,构造器和init()方法不会执行
6_服务器会创建request和response这二个对象,调用Servlet对象的service()方法,
将刚刚创建好的request和reponse对象传入到service()方法中。
7_Servlet在service()方法中向浏览器的所有输出内容,都封装在response对象中。
8_response对象中的数据,会发送Web服务器,Web服务器会将结果以HTML的形式响应给浏览器。
9_浏览器解析这个由Web服务器响应过来的html文件,从而显示出漂亮的效果。
10_如果服务器停止,那么先会调用服务器内部所有Servlet的destory()方法,
这时Servlet对象从服务器中销毁,GC会在适当的时候回收。
结论:
servlet在初始化一次之后,就不再创建,因此servlet是一个单例对象。
servlet 服务器创建的,服务器调用的。
什么时候使用doPost,什么时候使用doGet,doPost和doGet有什么区别?
什么时候在doPost里面写,什么时候在doGet里面写?
前端浏览器提交请求
Get请求,明文的,请求数据在url上,url?get请求数据,提交数据大小是有限制1kb~18kb
Post请求,非明文的,在请求体上。post提交数据大小没有限制(建议使用)
默认所有的请求都是get,只有表单明确指明了是post才是post请求
Servelt,处理请求与响应
DoGet,处理get请求
DoPost,处理post请求
一般情况,不需要区分,无论get还是post统一在一个方法处理,另一个方法调用这个方法就可以了
特殊请求,请求一定要分开处理,才需要在doGet和doPost单独处理
流程
1.浏览器根据url寻找ip地址,浏览器获取到url后,先在搜寻本地的hosts,如果本地没有就会搜寻远程的dns.
2.找到ip地址后,就会根据url上的端口来寻找对应网络电脑主机上的服务器.
3.服务器可以获取传过来的资源目录,然后再进入服务器中的webapps找到对应的资源目录
注意:
1.Servlet的实例是由服务器创建的
2.所有的请求信息都在request对象里面
3.所有的响应信息都在response对象里面