servlet代码本质上是基于java虚拟机的一个处理页面请求的容器。在servlet包里提供了大量的实现显示逻辑的工具类,使用这些工具类可以方便地读取和设置HTTP协议里的内容、跟踪页面跳转等。
servlet的生命周期:
servlet运行在web服务器端的servlet容器里,这个容器从属于java虚拟机。在一个servlet的生命周期里,servlet容器针对每个基于servlet的http请求,会执行如下操作:如果这个servlet请求是第一次被调用,容器会加载这个servlet类的.class文件,同时执行定义在这个servlet里的init方法。如果这个servlet被多次调用,即在调用前已经被载入servlet容器,则不会执行init方法。在执行“响应servlet请求”的时候,servlet容器会根据http协议,构建一对javax.servlet.ServletRequest和avax.servlet.ServletResponse实例,同时执行servlet的service方法,完成定义在其中的业务逻辑,执行完成后,调用servlet的destory方法,卸载servlet类,终止其生命周期。
servlet的常用类:
HttpServlet类:该类实现了service方法,所以通过继承该类来实现servlet的代码,不需要再写service方法,可以根据http请求方式,把主要的业务逻辑写在doGet和doPost方法内。
HttpRequest类用来接收从客户端发送来的http协议细节,HttpResponse类用来描述向客户端回复信息所用到的Http协议细节,这两个类不常用。
实现jsp到servlet的跳转:jsp页面以表单的形式提交页面,通过设置action属性指定响应的servlet来处理页面,请求方式可以是get和post,分别对应servlet里面的doGet和doPost方法。<form name="form1" action="./servlet/Myservlet" method="POST">或者action="<%=request.getContextPath()%>/Myservlet"servlet类里面可以通过String username=request.getParameter("username");的方式获取jsp表单的输入信息,进行相应的处理。也可以通过response.sendRedirect("../welcome.jsp?username="+username);的方式跳转至指定的页面,并可以将参数(username)一起传过去,在指定的页面同样以equest.getParameter("username")的方式获取值。
在jsp应用程序中,变量按不同的存储方式有不同的生命周期,只要变量还在生命周期内,就可以通过getAttribute的方法获取。存储范围有四种:
page:即在整张jsp或者servlet页面中有效,一旦页面重定向到另一个页面,则无法访问。
request:当一个页面以request.getRequestDispatcher("/index/login.jsp").forward(request, response);的方式访问值另一页面时,则在另一页面也可以获取该页面中的request范围内的值。例如在该页面内设置request.setAttribute("error", "用户名或密码错误!");则在login.jsp页面可以通过request.getAttribute("error")访问该错误信息。
session:存储在客户端的特殊cookie,有效范围可以由客户自行设定,默认状态下,只要客户20分钟内不对网站作任何相应,则生命周期结束。一般需要长期保存的对象则用session生命周期,比如登录的用户名HttpSession session=request.getSession(true);
session.setAttribute("username", username);
application:在整个web应用程序中都有效,只要web服务器没有重新启动,则生命周期不结束。
jsp异常处理机制:
通过<%@ page isErrorPage="true" %>声明该jsp页面为异常处理页面,通过exception.getMessage()方法读取错误信息。
有可能出现异常的jsp页面通过<%@ page errorPage="" %>指定异常处理页面。