Servlet入门
Servlet(服务端小程序),由applet和Server结合而成;是一种新型的CGI(通用网关接口)技术,允许客户端请求服务端并通过服务端向客户端发送动态数据(来自数据库);是动态网页技术(JSP)的核心实现,Servlet基于服务端运行,可以处理客户端请求(表单数据),并向客户端响应必要的数据或者动态网页。
Servlet最初的版本比如常用2.0/2.5版本需要使用web.xml进行配置;但是自从进入servlet3.0版本后,所有的servlet无需配置,只需要在相关的servlet类中使用@WebServlet
注解即可,新版本的Servlet创建步骤如下:
- 创建一个普通java类继承HttpServlet
- 重写doGet/doPost或者service方法
- 为创建的类添加注解(
@WebServlet
)
@WebServlet("/hello")
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello servlet-->"+this);
System.out.println("执行doGet方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello servlet-->"+this);
System.out.println("执行doPost方法");
}
}
对servlet发起请求:
http://127.0.0.1/javaweb01/hello
Servlet生命周期
Servlet是一种资源,凡是资源都会有各自的生命周期,servlet的生命周期从init 到destroy也有一个过程:
- 当服务器启动(容器启动),会加载检查配置信息(web.xml)对所有的servlet,filter等资源进行检查
- 当客户端请求第一次到到servlet时,此时容器会将servlet执行init方法完成初始化(创建),在整个应用运行期间只会初始化一次
- 然后在根据客户端发送的请求(get、post)来决定调用doGet或者doPost方法
- 当服务器实例被终止(停止)时,servlet执行destroy方法完成销毁
servlet在服务器中是一个单例,意味着所有的客户端请求同一个servlet时都是通过唯一的一个实例完成请求和响应操作,因此不要在servlet定义全局变量,因为,在大量线程并发时都是访问同一个实例,因此会导致多个线程修改同一个全局变量时造成结果不一致。
servlet中提供了两种跳转方式,用于实现页面或者资源的跳转,主要包含:
- 请求转发
- 重定向
### 请求转发(forward)
请求转发称之为服务端跳转,除第一次请求外,后续的请求是由服务端发起的,可以传递request范围内的数据到下一个servlet中,并且地址栏只会显示第一次请求的地址,请求转发由request对象完成。
request.getRequestDispatcher(资源).forward(request, response);
重定向(redirect)
重定向称之为客户端跳转,所有的跳转都是由客户端发起,地址栏会显示最后一次请求的资源地址,并且重新定向无法将request返回内的数据传递下一个servlet中,重定向由response对象完成。
response.sendRedirect(资源);