Servlet基础学习笔记
之前记在文档里的Servlet基础笔记,发出来供大家一起交流学习。
一. Servlet概述
JavaWeb应用程序的所有请求的响应都是由Servlet完成的。Servlet是JavaWeb的核心程序,所有的网址最终都交给Servlet来处理,Servlet并没有main之类的方法,当用户访问服务器的时候,Tomcat是调用Servlet的某些方法来完成整个处理过程。
1.1.Servlet工作流程
浏览器提交的请求是遵循HTTP协议的文本。这段文本由服务器也就是Tomcat接收并解析,封装成了HttpServletRequest类型的request对象。所有的HTTP头数据都可以通过request相应的方法查询到。
Tomcat同时把输出流封装为HttpServletReponse类型的response对象,通过设置response属性就可以控制输出的内容。然后,Tomcat把request、response作为参数,调用Servlet的相应方法,例如doPost(request,response)、doGet(request,response)等。
Servlet中主要处理业务逻辑,例如读取数据库、权限检查、业务处理等。
1.2.Servlet接口
Servlet是一种实现了javax.servlet.Servlet接口的类。Servlet接口规定了特定的方法来处理特定的请求。开发者只需要实现Servlet的相关方法,用户访问Web程序的时候,Tomcat会调用这些方法完成业务处理。
1.3.Servlet生命周期
1.init方法:初始化Servlet,第一次加载Servlet会调用此方法,该方法只调用一次。
2.service方法:处理业务逻辑,程序员需要将代码写在该方法中,每加载servlet一次都会调用该方法。
3.destroy方法:销毁servlet,销毁方式:1)relaod或remove 2)关闭tomcat 3)关机
二. HttpServlet
2.1.HttpServlet概述
HttpServlet类是GenericServlet的直接继承子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。同时免去了从ServletRequest和ServletResponse到HttpServletRequest和HttpServletResponse的强转动作。
2.2.HttpServlet覆盖了service方法
2.3.HttpServlet的doGet方法和doPost方法
在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST。如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求,会去调用doPost()方法,所以我们在HttpServlet的子类去覆盖doGet()或doPost()方法即可。
三. HttpServletResponse
3.1.reponse概述
在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法,最终根据请求方式的不同会传给doGet()或doPost()方法中使用。
response对象可以完成对客户端的响应工作。
response对象的功能分为以下四种:
设置响应头信息;发送状态码;设置响应正文;重定向;
3.2.reponse响应正文
response中共封装了两个流,用于服务器向客户端写数据。response.getWriter()获得字符输出流,只能向请求者(浏览器)写字符。response.getOutputStream()获得字节输出流,只能向请求者(浏览器)写字节。
注意:在同一个请求中,不能同时使用两个流,只能使用其中一个,否则会抛异常。
3.2.2重定向
重定向是你访问A servelt的时候,A Servlet无法处理,然后告诉浏览器去重新访问B Servlet。在重定向的过程中,浏览器发送了至少两次请求。
表现在地址栏中的地址会发生变化。重定向的响应码是302。
完成重定向有两种方式:
1)通过设置响应码和响应头。
response.setStatus(302);
response.setHeader(“Location”,”http://www.baidu.com“);
2)调用response的重定向方法。
response.sendRedirect(“http://www.baidu.com“);
重定向总结:
重定向是两次(至少)请求;
重定向的URL可以是其他应用,不局限于当前应用;
重定向的响应头为302,并且必须要有Location响应头;
重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,否则可能会出现异常。
四. HttpServletRequest
在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据。
request的功能包括以下几种:
封装了请求头数据;
封装了请求正文数据,如果是GET请求,那么就没有正文;
request是一个域对象,可以把它当成Map来添加获取数据;
request提供了请求转发和请求包含功能。
4.1.request是域对象
4.2.获得请求头信息
4.3.获取请求参数
4.4.请求转发
当浏览器请求A,但是A没有处理,把请求直接在服务器内部转给B。对浏览器来说,并不知道有请求转发的存在,浏览器地址栏也不会有任何的变化。
注意与重定向的区别。
RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);//获得请求转发器
rd.forward(request,response);//转发出去
4.5.请求包含
在A中,把请求包含到B。
RequestDispatcher rd = request.getRequestDispatcher(“/BServlet”);
rd.include(request,response);
请求转发与包含比较
1. 如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用 response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;
2. 请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(“text/html;charset=utf-8”);
3. 请求包含大多是应用在JSP页面中,完成多页面的合并;
4. 请求转发大多是应用在Servlet中,转发目标大多是JSP页面;