1 servlet介绍
- Servlet(Java服务器小程序)是用Java编写的服务器程序
- 由服务器端调用和执行
- 用Java编写的
- 是jsp学习的基础
- 是B/S结构
servlet体系结构
- 界面层——IE浏览器等等
- 逻辑层——Tomcat(web服务器,容纳和管理servlet,可以接受IE浏览器的http请求,可以返回静态网页)
- 数据层——数据库
工作原理:
浏览器输入网址,发送http请求,这个请求会先被Tomcat的web服务器模块接受,然后转发给Tomcat的引擎(容器部分),会帮忙找到浏览器想要找到的访问的东西(两种可能:如果想访问数据库,就去访问数据库;如果不访问数据库,就返回静态html页面)
Servlet的生命周期:
- 装载servlet,由相应容器来完成
- 创建一个servlet实例
- 调用servlet的init()方法,只会在第一次访问该servlet的时候被调用一次
- 服务,调用servlet的service()方法,用于处理业务逻辑;只要访问servlet,该方法就会被调用
- 销毁,调用servlet的destroy()方法。在以下情况会被调用(a.Tomcat重启 b.reload该webapp时 c.重启电脑时)
2 开发servlet的三个方法
- 实现servlet接口
- 继承GenericServlet
- 继承HttpServlet
在上一篇实现servlet的第一个例程的文章中,我们采用的是第三种,继承HTTPServlet的方法。这种方法在当下比较常用。
1) 实现servlet接口的方法
实现servlet接口的时候会有destroy(),getServletConfig(),getServletInfo() ,init(ServletConfig arg0),service(ServletRequest arg0, ServletResponse arg1)这五个函数。
init(),service(),destroy()主要会体系servlet的生命周期
ServletDemo1.java文件
import javax.servlet.*;
import java.io.*;
public class ServletDemo1 implements Servlet
{
@Override
//该函数用于初始化该servlet(类似类的构造函数)
//该函数只会被调用一次(当用户第一次访问该servlet时被调用)
public void init(ServletConfig arg0) throws ServletException
{
// TODO Auto-generated method stub
System.out.println("init函数被调用");
}
@Override
//这个函数就是要得到配置信息,不是很重要
public ServletConfig getServletConfig()
{
// TODO Auto-generated method stub
return null;
}
@Override
//也不是很重要
public String getServletInfo()
{
// TODO Auto-generated method stub
return null;
}
@Override
//这个函数主要用于处理业务逻辑,主要用于写业务逻辑代码
//每当用户访问该servlet是,都会被调用
//req:用于获得客户端(浏览器)的信息
//res:用于向客户端(浏览器)返回信息
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
{
// TODO Auto-generated method stub
//要返回信息,所以用res,但是res没有可以直接返回的信息
//所以要从res处获得printwrite
PrintWriter out = res.getWriter();
out.println("hello,word");
}
@Override
//销毁servlet事例,即释放内存
//在以下情况会被调用(a. Tomcat重启; b.reload该webapp时; c.重启电脑时)
public void destroy()
{
// TODO Auto-generated method stub
System.out.println("destroy");
}
}
web.xml文件——用户部署servlet
在…中间添加以下代码段
<!-- 部署ServletDemo1 -->
<servlet>
<servlet-name>servletdemo1</servlet-name>
<servlet-class>ServletDemo1</servlet-class>
</servlet>
<!-- 部署ServletDemo1d的 servlet-mapping-->
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>/servletdemo1</url-pattern>
</servlet-mapping>
PS:这里的部署代码是加到上一篇文章的同一个web.xml文件中,和 要上下分开放。(不知道为什么要分开,我看到有些网上的说法并没有要求加,但是如果两端代码一起加入,eclipse中会报错)
2) 继承GenericServlet开发servlet
——重写service()方法
ServletDemo2.java文件
import javax.servlet.*;
import java.io.*;
public class ServletDemo2 extends GenericServlet
{
//重写service()方法
public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException
{
PrintWriter out = res.getWriter();
out.println("hello,ServletDemo2");
}
}
web.xml文件
<!-- 部署ServletDemo2 -->
<servlet>
<servlet-name>servletdemo2</servlet-name>
<servlet-class>ServletDemo2</servlet-class>
</servlet>
<!-- 部署ServletDemo2d的 servlet-mapping-->
<servlet-mapping>
<servlet-name>servletdemo2</servlet-name>
<url-pattern>/servletdemo2</url-pattern>
</servlet-mapping>
3)继承HttpServlet——目前用得最多的一种方法
需要重写doGet、doPost方法
见上一篇。
最后的文件夹如图:
最后的web.xml文件应该是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
'-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<!-- 部署MyTomcatTest -->
<servlet>
<!--给你的的servlet起的名字,随便取(一般可以是类名的小写) -->
<servlet-name>mytomcattest</servlet-name>
<!--指明servlet的路径,(包名+类名,如果没有包,就直接是类名)-->
<servlet-class>MyTomcatTest</servlet-class>
</servlet>
<!-- 部署ServletDemo1 -->
<servlet>
<servlet-name>servletdemo1</servlet-name>
<servlet-class>ServletDemo1</servlet-class>
</servlet>
<!-- 部署ServletDemo2 -->
<servlet>
<servlet-name>servletdemo2</servlet-name>
<servlet-class>ServletDemo2</servlet-class>
</servlet>
<!-- 部署MyTomcatTest的servlet-mapping -->
<servlet-mapping>
<!--给你的的servlet起的名字,随便取 -->
<servlet-name>mytomcattest</servlet-name>
<!-- 是在浏览器器输入的访问该servlet的URL -->
<url-pattern>/mytomcattest</url-pattern>
</servlet-mapping>
<!-- 部署ServletDemo1d的 servlet-mapping-->
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>/servletdemo1</url-pattern>
</servlet-mapping>
<!-- 部署ServletDemo2d的 servlet-mapping-->
<servlet-mapping>
<servlet-name>servletdemo2</servlet-name>
<url-pattern>/servletdemo2</url-pattern>
</servlet-mapping>
</web-app>