Servlet编程
1 认识Servlet
1.1 Servlet是什么
Servlet 是一种运行在服务器端(一般指的是Web 服务器)的Java应用程序,可以生成动态的web 页面,它是属于客户与服务器响应的中间层。因此,可以说JSP就是Servlet。两者可以实现同样的页面效果,不过,编写JSP和编写Servlet相比,前者成本低得多
1.2 学习Servlet价值
Serlet属于JSP的底层,学习它有助于了解底层细节;另外,Servlet毕竟是一个Java类,适合纯编程,如果是纯编程的话,比将Java 代码混合在HTML中的JSP要好得多,使代码结构更加清晰
2 建立Servlet
2.1 建立过程
1.让这个类继承javax.servlet.http.HttpServlet
public class MyServlet extends HttpServlet{}
2.重写 HttpServlet 的 doGet()方法、doPost()方法
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html;charset=gbk");//设置response对象响应类型
PrintWriter out=response.getWriter();//输出文字
out.println("我是Servlet类实现的网页,我是get方法");
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html;charset=gbk");
PrintWriter out=response.getWriter();
out.println("我是Servlet类实现的网页,我是post方法");
}
3.配置Servet:通过web.xml文件来实现
<servlet>
<servlet-name>aaa</servlet-name><!-- 对象名 -->
<servlet-class>com.my.MyServlet</servlet-class><!-- 类名 -->
</servlet>
<servlet-mapping>
<servlet-name>aaa</servlet-name>
<url-pattern>/myservlet.bin</url-pattern>
</servlet-mapping>
4.测试Servet: index.jsp页面中的form表单的action地址
<form action="myservlet.bin"method="post">
2.2 注意
1.根标记/web-app必须且只有一个根标记
2.servlet标识及子标记:可以有若干个servlet标记,该标记的内容由tomcat服务器负责处理,servlet标记有两个子标记
servlet-name标记的内容是tomcat服务器创建的servlet对象的名字
servlet-class标记的内容指定tomcat服务器用哪个类来创建servlet对象
3.servlet-mapping标记:具有两个子标记
servlet-name标记的内容是tomcat创建的servlet对象的名字(改名字必需和servlet子标签servlet-name标记的内容相同
url-pattern标记用来指定用户用怎么样的模式来请求servlet对象。
3 Servlet运行机制及生命周期
3.1 servlet运行机制
1 、初次运行,系统会实例化 Servlet
2 、Servlet采用的是多线程机制,每一次请求,系统就分配一个线程来运行 doGet函数。但是这样也会带来安全问题,一般说来,不要在Serlet内定义成员变量,除非这些成员变量是所有的用户共用的
public class MyServlet extends HttpServlet {//throws处理异常,还可以使用try{}catch(){}
public MyServlet(){
System.out.println("我是构造函数");
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html;charset=gbk");//设置response对象响应类型
PrintWriter out=response.getWriter();//输出文字
out.println("我是Servlet类实现的网页,我是get方法");
System.out.println("我是doGet类");
}
}
3.2 servlet生命周期
当客户端向 Web 服务器提出第一次Servlet请求时Web 服务器会实例化一个Servlet,并且调用init()方法;如果Web 服务器中已经存在了一个 Servlet 实例将直接使用此实例;然后调用 service()方法,service()方法将根据客户端的请求方式来决定调用对应的.doXXX()方法;当Servlet 从Web 服务器中消亡时,Web 服务器将会调用 Servlet的destroy()方法
Servlet 内的方法有以下几个
(1)init()方法
public void init(ServletConfig config)throws ServletException
一个Servlet在服务器上最多只会驻留一个实例,所以说第一次调用servlet时将会创建一个实例
在实例化的过程中,HtpServlet中的 init()方法会被调用,因此可以将一些初始化代码放在该函数中.
这个ServletConfg对象负责向servlet传递服务设置信息,如果传递失败就会发生ServletException。
(2)doGet()doPost()service()方法
public void service(HttpServletRequestreqest,HttpServletResponse response)
throws lOException,ServletException
doGet()在以get 方式请求 Servlet时运行、常见的 get请求方式有:链接、get方式表单提交,直接访问 Servlet
doPost()在以 post方式请求 Servet时运行。常见的post请求为pos方式表单提交
事实上,客户端对Servlet发送一个请求过来,服务器端将会开启一个线程,该线程会调用service方法,service方法会根据收到的请求类型来决定是调用doGet还是doPost。但是一般情况下,不用覆盖service方法。使用doGet和doPost一样可以达到处理的目的
(3)destroy()方法
publicdestory()
destroy()方法在Servlet实例消亡自动调用。当服务器终止服务时,比如关闭服务器等,destroy()方法会被执行,消灭servlet对象。如果在此Servlet消亡之前,还必须进行某些操作,比如释放数据库连接以节省资源等,这时就可以重写 destroy()方法
注:service方法可以被调用多次,init方法只被调用一次,调用过程运行在不同线程中,互不干扰。