Servlet(服务器端小程序)是使用Java语言编写的服务器端程序,可以像JSP一样,生成动态的web页面,Servlet主要运行在服务器端,并且由服务器调用执行。
JSP和Servlet的所有程序都是运行在服务器端的。Servlet的处理流程如下:
- 客户端(可能是web浏览器)通过http提出请求
- web服务器接收该请求并将其发送给Servlet,如果Servlet尚未被加载,web服务器将把它加载到java虚拟机并且执行它
- Servlet程序将接收该http请求并处理
- Servlet将处理后的结果向web服务器返回应答
- web服务器将从Servlet收到的应答发给客户端。
可以看出,Servlet和JSP一样,需要通过http协议,并且使用web server进行数据的回应
Servlet的实现必须继承HttpServlet类
Servlet还有一个特点,就是可以为一个Servlet配置多个映射路径
在所有方法中
doGet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException和
doPost
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException是两个最常用的方法。
Servlet的生命周期
Servlet程序是运行在服务器上的一段java程序,其生命周期收到web容器的控制,生命周期包括:加载程序,初始化,服务,销毁,卸载五个过程
- 加载:Web容器负责加载Servlet,当web容器启动时或者第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置(Servlet所在的包.类名称),加载成功后,web容器会通过反射的方式对Servlet进行实例化
- 初始化:当一个Servlet被实例化后,容器调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求钱完成一些初始化的工作,如建立数据库连接,读取资源文件信息。如果初始化失败,则此Servlet将被直接卸载
- 处理服务:导尿管有请求提交时,Servlet将调用service方法(通常是doGet()或doPost())进行处理 ,在service方法中,Servlet可以通过ServletRequest接收客户的请求,也可以利用ServletResponse设置相应信息。
- 销毁: 当web容器关闭或检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便释放掉所占用的资源
- 卸载:当一个Servlet调用玩destroy()后,此实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化
关于销毁,有两种情况:
- 容器关闭
- 一个Servlet长时间不用
还有一种开发中的可能性:执行了reload
还有要注意的是,如果程序中覆写了service方法是,doGet和doPost不再使用
初始化配置信息
public void init(ServletConfig config) throws ServletException如果覆写两个init方法,只有取得配置参数的初始化方法起作用
private String initParam = null;
public void init(ServletConfig config) throws ServletException {
// Put your code here
this.initParam = config.getInitParameter("ref");
}
取得其他内置对象
Servlet本身只提供request和response对象,要想取得session对象,只能依靠request对象。
在Servlet中要想取得一个session对象,则可以通过HttpServletRequest接口完成
用
public ServletConfig getServletConfig()
取得ServletContext对象
Servlet跳转
客户端跳转:地址栏跳转之后改变,无法传递request对象,是在所有操作执行完成之后才发生的操作。语法:response.sendRedirect()
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().setAttribute("name", "tttttt");
request.setAttribute("info","thystar");
response.sendRedirect("get_info.jsp");
}
服务器端跳转:地址栏不改变,而且可以传递request范围的属性,属于无条件跳转,只要执行到了,则立刻执行跳转。语法<jsp:forward>
在Servlet中没有<jsp:foward>这样的命令,必须依靠
Interface RequestDispatcher完成
其提供的方法有
void forward(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException | 页面跳转 |
void include(ServletRequest request,ServletResponse response) throws ServletException, java.io.IOException | 页面包含 |
实例化接口对象使用ServletRequest接口中提供的RequestDispatcher getRequestDispatcher(java.lang.String path) | 取得RequestDispatcher接口实例 |
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getSession().setAttribute("name", "tttttt");
request.setAttribute("info","thystar");
RequestDispatcher rd = request.getRequestDispatcher("get_info.jsp");
rd.forward(request, response);
}
《Java Web开发实战经典--基础篇》笔记