javaWeb-Servlet(一)
一:什么是Servlet:
Servlet是javaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
1.接收请求数据
2.处理请求
3.完成响应
例如客户端发来登陆请求,获取输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己编写,每个Servlet必须实现 javax.servlet.Servlet接口
二:实现Servlet的方式
实现Servlet有三种方式:
1.实现javax.servlet.Servlet接口
2.继承javax.servlet.GenericServlet类
3.继承javax.servlet.http.HttpServlet类
通常我们会继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从java.servlet.Servlet接口开始学习。
实现Servlet.java
/** *查看Servlet接口中的方法 */ public class AServlet implements Servlet { /* *它也是生命周期方法 *它会在Servlet被销毁之前调用,并且它只会被调用一次! */ @Override public void destroy() { System.out.println("destory()....."); } /* * 可以用来获取Servlet的配置信息 */ @Override public ServletConfig getServletConfig() { System.out.println("getServletConfig()........."); return null; } /* *获取Servlet信息 */ @Override public String getServletInfo() { System.out.println("getServletInfo()......"); return null; } /* * 它是生命周期方法 * 它会在Servlet对象创建之后马上执行,并只执行一次!(出声之后调用) */ @Override public void init(ServletConfig arg0) throws ServletException { System.out.println("init()...."); } /* * 它是生命周期方法 * 它会被调用多次! * 每次处理请求都是在调用这个方法 */ @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("service()......"); }
编写完Servlet类需要在web.xml文件中配置Servlet;
<servlet> <servlet-name>AServlet</servlet-name> <servlet-class>cn.itcast.web.servlet.AServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/AServlet</url-pattern> </servlet-mapping>
三:Servlet的生命周期
所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期有关的方法有:
1. public void init(ServletConfig config) throws ServletException 2. public abstract void service(ServletRequest req,ServletResponse res) throws ServletException, java.io.IOException 3. public void destroy()
1.Servlet的出生
服务器会在Servlet第一次被访问是创建Servlet,或者是在服务器启东市创建Servlet。如果服务器启动时创建Servlet,那么需要在web.xm文件中配置。也就是说默认情况下,Servlet是在第一次被访问时有服务器创建的。
而已一个Servlet类型,服务器只创建一个实例对象,例如在我们首次访问http://localhost:8080/AServlet时,服务器通过“/AServlet”找到了绑定的Servlet名称为cn.itcast.servlet.AServlet,然后服务器查看这个类型的Servlet是否已经创建过,如果没有创建过,那么服务器才会通过反射来创建AServlt的实例。当我们再次访问
cn.itcast.servlet.AServlet时,服务器不会再次创建AServlet实例了,而是直接使用上次创建的实例。
在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig config)方法。请记得,Servlet实例化对象创建后马上就会调用init()方法,而且一个Servlt的
一生只会调用一次这个方法。这个方法只会被调用一次。
我们可以爸一些对Servlet的初始化工作放在init()方法中!
2.Servlet服务
当服务器每次接收到请求时,都会调用Servlet的service()方法来处理请求。服务器接收到一次请求,就会调用seviet()方法一次,所用service()方法是会被调用多次的。
正是因为如此,所以我们才需要把处理请求的代码写在service()方法中!
3.Servlet的销毁
通常在服务器关闭时Servlet才会销毁。在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前会调用Servlet的destroy()方法,我们可以把Servlet的临终遗言
放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。
@Override public void destroy() { // NOOP by default } /** * Returns a <code>String</code> containing the value of the named * initialization parameter, or <code>null</code> if the parameter does not * exist. See {@link ServletConfig#getInitParameter}. * <p> * This method is supplied for convenience. It gets the value of the named * parameter from the servlet's <code>ServletConfig</code> object. * * @param name * a <code>String</code> specifying the name of the * initialization parameter * @return String a <code>String</code> containing the value of the * initialization parameter */ @Override public String getInitParameter(String name) { return getServletConfig().getInitParameter(name); } /** * Returns the names of the servlet's initialization parameters as an * <code>Enumeration</code> of <code>String</code> objects, or an empty * <code>Enumeration</code> if the servlet has no initialization parameters. * See {@link ServletConfig#getInitParameterNames}. * <p> * This method is supplied for convenience. It gets the parameter names from * the servlet's <code>ServletConfig</code> object. * * @return Enumeration an enumeration of <code>String</code> objects * containing the names of the servlet's initialization parameters */ @Override public Enumeration<String> getInitParameterNames() { return getServletConfig().getInitParameterNames(); } /** * Returns this servlet's {@link ServletConfig} object. * * @return ServletConfig the <code>ServletConfig</code> object that * initialized this servlet */ @Override public ServletConfig getServletConfig() { return config; } /** * Returns a reference to the {@link ServletContext} in which this servlet * is running. See {@link ServletConfig#getServletContext}. * <p> * This method is supplied for convenience. It gets the context from the * servlet's <code>ServletConfig</code> object. * * @return ServletContext the <code>ServletContext</code> object passed to * this servlet by the <code>init</code> method */ @Override public ServletContext getServletContext() { return getServletConfig().getServletContext(); } /** * Returns information about the servlet, such as author, version, and * copyright. By default, this method returns an empty string. Override this * method to have it return a meaningful value. See * {@link Servlet#getServletInfo}. * * @return String information about this servlet, by default an empty string */ @Override public String getServletInfo() { return ""; }