Servlet技术

Servlet技术

  Servlet是用Java编写的运行在Web服务器中的程序,因此它可以调用服务器端的类,也可以被调用,它本身也就是一个类。

PS:要注意区分Servlet、JavaScript以及Java Applet。JavaScript是运行在客户端浏览器中的脚本程序;Java Applet是运行在客户端的Java小程序;而Servlet是运行在服务器端的程序。

  JSP页面编写完毕后,在Web引擎中运行前也会被编译器先转换为Servlet,在编译成字节码文件,因此JSP页面与Servlet是一一对应的。

Servlet的工作原理

  Servlet由Web服务器引擎复杂编译执行,当客户端浏览器访问Servlet时,服务器将启动一个线程来响应,而并非CGI技术的进程。因此相对CGI方式占用的系统资源(特别是内存)比较少,具有较高的运行效率。

  当Web服务器中的Servlet被请求访问时,此Servlet被加载到Java虚拟机中,在Servlet中要接受HTTP请求并作出相应处理。由于Servlet是在服务器运行的,对客户完全透明,因此比Java Applet具有更好的安全性,当服务器有防火墙的保护时,Servlet也受到防火墙的保护。

Servlet相关的类和方法

  要开发Servlet重点要掌握javax.servlet.http.HttpServlet类。javax.servlet.http.HttpServlet类的声明情况如下:

1
public abstract class HttpServlet extends GenericServlet implements java.io.Serializable

  可见在HttpServlet类中实现了Serializable接口,也就是说已经作了串行化处理,开发人员在继承HttpServlet类后不必再作串行化处理,简化了编程。

  HttpServlet类是一个抽象的类,用于创建一个基于HTTP协议的Servlet,在继承它的类中必须实现以下方法中的至少一个:

  1. doGet()

      此方法通过service()方法被调用,用于在Servlet中处理一个GET请求。在此方法中,开发人员常编写代码来读取请求(request)中的数据,完成响应(response)头中的设置,取得回应的输出流对象,再通过这个输出流对象来输出数据。

    1
    protected void deGet(HttpServlet req,HttpServlet resp) throws ServletException,Java.io.IOException

  2. doPost()

      此方法通过service()方法被调用,用于在Servlet中处理一个POST请求。方法的其他说明同doGet()方法。

    1
    protected void dePost(HttpServlet req,HttpServlet resp) throws ServletException,Java.io.IOException

  3. service()

      servide()方法接收客户端的请求,并将请求转发给已定义的doXxxx()方法

    1
    protected void service(HttpServlet req,HttpServlet resp) throws ServletException,Java.io.IOException

  4. init()

      此方法继承自GenericServlet类,用于对Servlet容器中的当前Servlet作初始化处理

    1
    public void init(ServletConfig config) throws ServletException

  5. destory()

      当前Servlet在生命周期结束时调用此方法

    1
    public void destory()

web.xml

  1. < web-app > < /web-app >标签

      < web-app>< /web-app>是部署描述的根元素,该元素含23个子元素。在Servlet2.3中,子元素必须按照DTD文件描述中指定的顺序出现。比如:如果部署描述符中的< web-app>元素有< servlet>和< servlet-mapping>两个子元素,则< servlet>子元素必须出现在< servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要。


  2. < display-name>< /display-name>标签

      < display-name>< /display-name>定义web应用的名称。如

    1
    <display-name>trk-order-rest</display-name>

  3. < distributable/>

      < distributable/>可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。

  4. < session-config>< /session-config>标签

      < session-config> 用于设置容器的session参数,比如:< session-timeout>用于指定http session的失效时间。默认时间设置(30minutes)。< session-timeout>用来指定默认的会话超时时间间隔,以分钟为单位。该元素值为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。

    1
    2
    3
    <session-config>
    <session-timeout>30<ession-timeout>
    </session-config>
  5. < filter>< /filter>标签

      Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletResponse)进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

    详细了解可以去看看这位大佬的博客:http://www.cnblogs.com/vanl/p/5742501.html

  6. < listener>< /listener>标签

      监听器Listener就是在application,session,request三个对象创建,销毁,或者往其中添加修改删除属性时自动执行代码的功能组件。Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

    详细了解可以去看看这位大佬的博客:http://www.cnblogs.com/vanl/p/5753722.html

  7. < servlet>< /servlet>标签

      Servlet通常称为服务端小程序,是服务端的程序,用于处理及响应客户的请求。Servlet是一个特殊的Java类,创建Servlet类自动继承HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。另外HttpServlet有两个方法:

      init(ServletConfig config):创建Servlet实例时,调用该方法初始化Servlet资源。

      destory():销毁Servlet实例时,自动调用该方法回收资源。

      通常无需重写init()和destory()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法。如果重写了init()方法,应该在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完先完成某些资源的回收,比如关闭数据库链接,才需要重写destory()方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <servlet>
    <servlet-name>passwordServer</servlet-name> //服务器名字
    <servlet-class>org.password.server.PasswordServer</servlet-class>//类
    </servlet>
    <servlet>
    <servlet-name>personServer</servlet-name>
    <servlet-class>org.password.server.PersonServer</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>personServer</servlet-name>//名字 与上面对应
    <url-pattern>/personServer</url-pattern>//Web访问Servlet时相对路径
    </servlet-mapping>

    <servlet-mapping>
    <servlet-name>passwordServer</servlet-name>
    <url-pattern>/passwordServer</url-pattern>
    </servlet-mapping>

  8. < welcome-file-list> < /welcome-file-list>标签

      < welcome-file>用来指定首页文件名称。< welcome-file-list>元素可以包含一个或多个< welcome-file>子元素。如果在第一个< welcome-file>元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。

    1
    2
    3
    <welcome-file-list>
    <welcome-file>view/login.jsp</welcome-file>
    </welcome-file-list>

简单应用

  用Servlet获取表单数据

  1. JSP

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>用户注册</title>
    </head>

    <body>
    <form mathod="post" action="${pageContext.request.contextPath}/user" name="form1">//${pageContext.request.contextPath}是获取绝对路径
    用户注册<br>
    用户名:<input type="text" name="username" size="20"><br>
    密&nbsp;码<input type="password" name="password" size="20"><br>
    性别:<input type="radio" value="男" name="sex">男<input type="radio" name="sex" value="女">女<br>
    电子邮箱:<input name="email" maxlength=28><br>
    家庭住址:<input type="text" name="address" size="20"><br>
    <input type="submit" value="提交" name="b1" ><input type="reset" value="全部重写" name="b2"><br>

    </form>
    </body>
    </html>

  2. web.xml配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name></display-name>

    <servlet>
    <servlet-name>UserRegist</servlet-name>
    <servlet-class>test.UserRegist</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>UserRegist</servlet-name>
    <url-pattern>/user</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>

  3. Servlet

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    import java.io.IOException;
    import java.io.PrintWriter;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class UserRegist extends HttpServlet{
    public String codeToString(String str){
    String s=str;
    try{
    byte temp[]=s.getBytes("ISO-8859-1");
    s=new String(temp);
    return s;
    }catch (Exception e){
    return s;
    }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    this.doPost(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException{
    response.setContentType("text/html;charset=GB2312");
    PrintWriter out=response.getWriter();
    out.println("<html><head><title>用户注册</title></head><body>");
    out.println("这是新用户注册所提交的数据<br>");
    out.println("用户名是:"+codeToString(request.getParameter("username"))+"<br>");
    out.println("密码是:"+codeToString(request.getParameter("password"))+"<br>");
    out.println("性别是:"+codeToString(request.getParameter("sex"))+"<br>");
    out.println("电子邮箱是:"+codeToString(request.getParameter("email"))+"<br>");
    out.println("家庭住址是:"+codeToString(request.getParameter("address"))+"<br>");
    out.println("</body></html>");
    }

    }
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×