分享

java servlet简介

 武神将 2010-11-16
Servlet 技术用于在服务器端创建响应用户请求的对象,被创建的对象称为一个servlet对象。JSP技术以servlet为基础,提供了servlet的几乎所有好处:.Java文件的生成、编译以及servlet对象的创建都由JSP引擎自动完成。
但jsp技术并非servlet技术的全部。
使用servlet的一般步骤:
1.编写创建servlet对象的类。
2.在服务器上保存字节码文件。
3.编写部署文件。
4.请求服务器创建servlet对象。
 
HttpServlet类
   创建servlet对象的类是一个特殊类的子类,该特殊类是:javax.servlet.http.HttpServlet
HttpServlet的子类习惯上称为一个Servlet类。
注:要使用javax.servlet.http包中的类,需要把Tomcat的lib目录下的servlet-api.jar拷贝至java安装目录下jre/lib/ext下。
 
 
 
例:用Servlet输出一句话
package serv;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello extends HttpServlet
{
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
out.println("Hello,servlet !");
}
}
 
字节码的保存
Servlet类编译后生成.class文件的保存于Bean的存放位置相同,即:
Web服务目录\WEB-INF\classes这个目录中。
注:
要将Web服务目录\WEB-INF\classes设到环境变量classpath中。
编写部署文件
为了能让Tomcat服务器用字节码文件创建对象,必须编写一个部署文件——web.xml
web.xml存放在Web服务目录\WEB-INF下。
web.xml的一般格式为:
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>serv.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/lookHello</url-pattern>
</servlet-mapping>
</web-app>
说明:
必须以xml声明,即<?xml......?>,作为文件的第一行。
必须有根标记<web-app>
每一个Servlet对应一个<servlet>标记和一个<servlet-mapping>标记。如果web服务目录下有多个Servlet,可添加这些标记。
<servlet-name>子标记表示Tomcat服务器创建的Servlet对象的名字。
<url-pattern>子标记表示通过url怎样访问该servlet。
 
运行servlet
当用户请求服务器运行一个servlet对象时,需根据web.xml中<servlet-mapping>标记指定的格式输入请求。
对于上例,请求的url为:
http://localhost:8080/chapter8/lookHello
servlet对象创建后,如果修改了Java源文件,需重启tomcat才能创建新的servlet对象
如果不想重启可修改server.xml文件,方法是:
在</host>前加如下代码:
 
<Context path="/chapter8" docBase="C:/Tomcat6/webapps/chapter8" debug="0" reloadable="true">
</Context>
一个servlet类在第一次使用前需重启Tomcat服务器。
 
servlet的工作原理
当多个客户请求同一个servlet时,服务器为每个客户启动一个线程,这些线程由Tomcat服务器管理。
 
servlet的生命周期
一个servlet的生命周期主要有三个过程:
调用init()方法初始化servlet
调用service()方法响应客户请求。
调用destroy()方法消灭servlet对象。
当某个servlet第一次被请求时,服务器会生成该servlet并调用其init()方法初始化,在调用service()方法处理用户请求。
处理结束后该servlet会常驻内存,新的用户请求直接调用当前servlet对象的service()方法处理。服务器关闭时,调用调用destroy()方法。
在servlet的一个生命周期中,init()和destroy()被调用一次,而service()则会被调用多次。
每个客户的每次请求都导致service()方法被调用,由于运行不在不同的线程中,service()方法中的局部变量互不干扰。
 
通过JSP页面调用servlet
可以通过地址栏来运行一个servlet,但更多的是通过超链接请求。
当增加新的servlet时,都需要为web.xml文件添加<servlet>标记和<servlet-mapping>标记。
可以通过超链接访问servlet,也可以通过表单向servlet提交数据。
 
例:
通过超链接访问hello
JSP文件的内容为:
 
<%@page contentType="text/html;Charset=gb2312"%>
<body>
<A HREF="lookHello">链接到hello这个Servlet</A>
</body>
例:
 通过表单项servlet提交数据
 
package serv;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ShowStr extends HttpServlet
{ public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
// request.setCharacterEncoding("gb2312");
String s=request.getParameter("txt");
out.println("You input: "+s);
}
}
 
例:
通过表单向servlet提交数据
 
<%@page contentType="text/html;Charset=gb2312"%>
<body>
请输入一个字符串:<p>
<FORM METHOD=POST ACTION="ShowStr">
<INPUT TYPE="text" NAME="txt">
<INPUT TYPE="submit" value="提交">
</FORM>
</body>
 
servlet的共享变量
servlet类的成员变量被所有线程共享。
下面的例子利用成员变量被所有用户共享这一特性,让用户帮助计算PI值。
  
例:帮助计算PI
 
public class CalculatePI extends HttpServlet
{ double sum=0,i=1,j=1;
int count=0;
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
count++;
sum+=i/j;
j+=2;
i=-i;
out.println("你是第 "+count+" <p>");
out.println("目前的PI值是:"+4*sum);
}
}
 
例:帮助计算PI
 
JSP文件:
<%@page contentType="text/html;Charset=gb2312"%>
<body>
<A HREF="calculatePI">帮助计算PI</A>
</body>
 
doGet()与doPost()方法
每当服务器收到一个servlet请求,就产生一个新线程,在这个线程中调用service()方法检查HTTP请求类型(GET或POST),根据请求方式决定调用doGet()还是doPost()
通常我们不重写service()方法来响应客户,而是重写doGet()和doPost()方法。
浏览器默认的请求方式是GET类型。
如果不论请求类型是什么,服务器的处理过程完全相同,那么可以在doPost()中编写处理过程,在doGet()中调用doPost(),反之也可。
如果重写了service()方法就不再处理doGet()和doPost()方法了。
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约