前言:上篇中简单记录了tomcat,weblogic的区别,他们主要实现了不同的标准规范,因此他们的作用不同,weblogic实现J2EE的所有规范,包含EJB所以功能更加强大,tomcat只是实现了servlet/jsp规范。
一:Servlet简介
上篇说到,在Java中规范即接口,tomcat实现servelt/jsp规范,也就是实现了相关接口,在我们web项目中也实现相对应接口,然后发布到tomcat中,这样就可以用访问他们了。
Servlet是运行在服务端的Java小程序,是Sun公司提供的一套规范,用来处理客户端请求,响应给浏览器的动态资源。Servlet是JavaWeb三大组件之一。(Servlet,Filter,Listener).且最为重要。
Servlet有狭义和广义的定义
狭义的servlet:指的就是servlet接口规范
广义的servlet:指的是实现了Sevlet接口的所有的实现类
二:Servlet的作用
Servlet用来处理从客户端发送过来的请求,并对该请求做出响应。Servlet的任务有:
1)获取请求数据
2)处理请求
3)完成响应
无论我们用SpringMvc框架还是其他 框架,底层都是由Servlet来接收请求的。
Servlet规范要求:Servlet程序需要编写实现类,并在web.xml中配置。实现类通常是继承javax.servlet.http.HttpServlet类,并重写doget,dopost方法。doget是处理get请求,dopost是处理post请求。
三:编写Servlet
手动实现一个Servlet类
public class SelfServlet implements Servlet{
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("servlet running.......");
res.getWriter().print("servlet running.......");
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
在Web.xml配置如下:
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>*.SelfServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
从上面可以看出,Servlet接口中有一些方法需要我们重写,这些方法对应着Servlet的生命周期的执行过程。
生命周期对应如下三个方法:
- init(ServletConfig config)
创建servlet时会调用的方法,用来初始化一些配置信息,仅在创建servlet时执行一次。
2. service(ServletRequest request,ServletResponse response)
每次请求Servlet都会执行的方法
3.destroy()
servlet在销毁之前会执行的方法,仅在销毁servlet时执行一次。
- 运行阶段-service
在这个阶段,tomcat服务器会为这个请求 创建 代表HTTP请求的ServletRequest对象 和 代表HTTP响应的 ServletResponse对象,然后将他们作为参数传递给service() 方法。
servcie() 方法从ServletRequest对象获取请求的信息并做出处理;通过ServletResponse 对象生成响应的结果。
在servlet的整个生命周期内,对于servlet的每一次访问请求,tomcat都会调用servlet的service方法,也就意味着service() 方法会在servlet的生命周期内会被调用多次。
2 销毁阶段-destroy
当服务器正常关闭或者Web应用被移出服务器时,servlet会随着Web应用的销毁而销毁。
在销毁serlvet之前,tomcat 会调用Servlet的destory方法,以便让Servlet对象释放他所占用的资源。
注意:如果对servlet中的代码进行了任何修改,一旦保存,会重新加载servlet,而这个过程就等于是将servlet先卸载,然后重新加载,因此也会执行destroy方法
四:Servlet生命周期
- Servlet何时创建
当我们第一次去访问一个servlet的时候,服务器会去创建这个servlet对象。并且只会创建一次。
而当服务器创建一个serlvet的时候,会去调用init方法。
2 .Servlet何时销毁
当服务器正常关闭或者Web应用被移出服务器时,servlet会随着Web应用的销毁而销毁。
在销毁serlvet之前,tomcat 会调用Servlet的destory方法,以便让Servlet对象释放他所占用的资源。
3. 每次访问必然执行的方法
service(ServletRequest request,ServletResponse response)
每次请求Servlet都会执行的方法
五:ServletRequest、ServletResponse,ServletConfig的介绍
ServletRequest和ServletResponse由tomcat创建,在调用service方法的时候传递。
1:ServletRequest:封装了请求发送的数据,可以从该对象中获取数据,因此get方法比较多
2:ServletResponse:用来响应数据,比如把数据响应给浏览器并且显示在页面上
3.ServletConfig
每一个servlet都有一个与之对应的servletConfig对象,它是servlet 的配置对象,封装了servlet的初始化配置信息。
tomcat在创建Servlet的时候会调用init方法将ServletConfig对象传递过来。不重要,但是起码知道它是干什么的(放置初始化信息的)。
在web.xml中可以配置servlet的初始化配置信息:
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>cn.itcast.servlet.DemoServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>张三</param-value>
</init-param>
</servlet>
通过如下方式获取:
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet 被初始化了。。。");
//作用一:获取serlvet名称
String servletName = config.getServletName();
System.out.println(servletName);
//作用二:获取初始化信息
String name = config.getInitParameter("name");
System.out.println(name);
//作用三:获取ServletContext对象
ServletContext servletContext = config.getServletContext();
System.out.println(servletContext);
}
六:HttpServlet的使用
要获取请求和响应数据更多信息,就需要实现servlet接口并且支持http协议,而Servlet其中的一个子类javax.servlet.http.HttpServlet就支持http协议。因此在开发中我们一般会编写一个类来继承HttpServlet来接收和响应来自客户端的请求。
编写的Servlet如下:
public class TestServelet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet方法执行了");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost方法执行了");
}
}
xml配置如下:
<servlet>
<!--自定义的Servlet名字-->
<servlet-name>testServle</servlet-name>
<servlet-class>com.ebao.test.servlet.TestServelet</servlet-class>
</servlet>
<servlet-mapping>
<!--自定义的Servlet名字和上面的相对应-->
<servlet-name>testServle</servlet-name>
<!--请求地址-->
<url-pattern>/test</url-pattern>
</servlet-mapping>
- doGet和doPost方法与service方法联系
在描述doGet和doPost以及service方法之间的关系之前,先来看一下Servlet和GenericServlet以及httpServlet之间的关系:
我们在编写servlet的时候一般不会去实现Servlet接口,而是继承HttpServlet,并且也不会复写service方法,而是复写doGet或者doPost方法。
原因如下:
在HttpServlet类中有一个service方法,在该方法中对请求的方法进行了判断,如果是get方法就执行doGet()方法,如果是post方法就执行doPost方法: