Servlet介绍

55 篇文章 0 订阅
47 篇文章 0 订阅

一、什么是Servlet

       Servlet是一种服务器端的Java应用程序,Server + Applet =Servlet 意为服务器端的小程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

        我们在网上浏览网页,需要一个web服务器,浏览网页的过程就是浏览器通过HTTP协议与WEB服务器交互的过程。在过去,大多是静态网页,因此只须把资源放在WEB服务器上即可。如今随着应用的发展,客户与服务器需要动态的交互,为了实现这一目标,就需要开发一个遵循HTTP协议的服务器端应用软件,来处理各种请求。那么Servlet是一个基于java技术的WEB组件,运行在服务器端,我们利用 Sevlet可以很轻松的扩展WEB服务器的功能,使它满足特定的应用需要。Servlet由Servlet容器管理,Servlet容器也叫 Servlet引擎,是Servlet的运行环境,给发送的请求和响应之上提供网络服务。比如tomcat就是我们常用的一个Servlet容器,其接受客户端并做出响应的步骤如下:

1、客户端发送HTTP请求访问WEB服务器
2、WEB服务器接收到请求后,传递给Servlet容器;
3、Servlet容器加载Servlet,产生Servlet实例,并向其传递表示请求和响应的对象;
4、Servlet得到客户端的请求信息,并进行相应的处理;

5、Servlet实例把处理结果发送回客户端,容器负责确保响应正确送出,同时将控制返回给WEB服务器。

二、Servlet有什么作用

            Servlet主要是驻留在 Web 服务器上,处理用户的请求和输出的响应,处理Web页面和业务逻辑层的数据交流。当使用交互式 Web 站点时,您所看到的所有内容都是在浏览器中显示的。当用户访问页面时,产生一个请求发送到web服务器,在这些场景背后,有一个 Web 服务器接收来自于客户端的请求会话,可能要切换到其他代码(可能位于其他服务器上)来处理该请求和访问数据,并生成在浏览器中显示的结果。Servlet 就是用于该过程的网守(gatekeeper)。

       当用户通过 URL 发出一个请求时,这些 Java Servlet 类就将之转换成一个 HttpServletRequest,并发送给 URL 所指向的目标。当服务器端完成其工作时,Java 运行时环境(Java Runtime Environment)就将结果包装在一个 HttpServletResponse中,然后将原HTTP响应送回给发出该请求的客户机。在与 Web 应用程序进行交互时,通常会发出多个请求并获得多个响应。所有这些都是在一个会话语境中,Java 语言将之包装在一个 HttpSession 对象中。在处理响应时,您可以访问该对象,并在创建响应时向其添加事件。

三、Servlet容器

            负责处理客户端请求、把请求传送给Servlet并把结果返回给客户端,不同程序的容器实际实现可能有所变化,但容器与Servlet之间的接口是由 Servlet API定义好的,这个接口定义了Servlet容器在Servlet上要调用的方法及传递给Servlet的对象类。

       Tomcat 的容器模型中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。


       Tomcat启动时,实例化并初始化web.xml配置文件中servlet的参数“load-on-startup”是正数的Servlet。"load-on-startup"元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。它的值必须是一个整数,表示servlet应该被载入的顺序。当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet,当值小于0或者没有指定时,则表示容器在该servlet被调用时才会去加载。正数的值越小,该servlet的优先级越高,应用启动时就越先加载。当值相同时,容器就会自己选择顺序来加载。

四、web应用的初始化工作

            应用的初始化主要是要解析web.xml文件,这个文件描述了一个Web 应用的关键信息,也是一个Web应用的入口。接下去将会将 WebXml 对象中的属性设置到 Context 容器中,这里包括创建 Servlet 对象、filter、listener 等等

       之后就是Servlet包装成 Context 容器中的StandardWrapper,为什么要将 Servlet 包装成 StandardWrapper 而不直接是 Servlet 对象。这里 StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 为了一个独立的 web 开发标准,不应该强耦合在Tomcat 中。

       所有web.xml 属性都被解析到Context中,所以说Context容器才是真正运行Servlet的Servlet 容器。一个Web应用对应一个Context容器,容器的配置属性由应用的 web.xml 决定。

五、Servlet生命周期

           1、完成了Servlet的解析工作,并且把其包装成 StandardWrapper 添加在 Context 容器中,但是它仍然不能为我们工作,它还没有被实例化。下面我们将介绍 Servlet 对象是如何创建的,以及如何被初始化的。如果Servlet的load-on-startup 配置项大于0,那么在Context容器启动的时候就会被实例化。

       2、

         (1).用户在浏览器中输入一个 URL。Web 服务器配置文件确定该 URL 是否指向一个由运行于服务器上的 servlet 容器所管理的 servlet。

         (2).如果还没有创建该 servlet 的一个实例(一个应用程序只有一个 servlet 实例),那么该容器就加载该类,并将之实例化。该容器调用 servlet 上的 init()。

         (3).该容器调用 servlet 上的 service(),并在包装的 HttpServletRequest 和 HttpServletResponse 中进行传递。

         (4).该 servlet 通常访问请求中的元素,代表服务器端类来执行所请求的服务并访问诸如数据库之类的资源,然后使用该信息填充响应。

         (5).如果有必要,在 servlet 的有用生命结束时,该容器会调用 servlet 上的 destroy() 来清除它。

六、Servlet接口

     当编写一个Servlet时,必须直接或间接实现javax.servlet.Servlet接口。接口中定义了五种方法:

       public void init (ServletConfig config) throws ServletException;

       public void service(ServletRequest req,ServletRespone res) throws ServletException,java.io.IOException;

       public void destroy();

       public ServletConfig getServletConfig();

       public java.lang.String getServletInfo();

      最常用的实现的方式就是扩展抽象类javax.servlet.http.HttpServlet或扩展抽象类javax.servlet.GenericServlet。Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。其中在Servlet被成功初始化后才能调用service()方法。

     1)GenericServlet抽象类提供了Servlet接口中除service()方法外的其他方法的具体实现,所以其子类都必须实现service()方法;

     2)HttpServlet抽象类继承了GenericServlet类并且提供了Servlet接口中具体于http的实现,其中它定义了两种形式的service()方法:

            1>protected void service(ServletRequest req,ServletResponse resp) 

                     throws ServletException,java.io.IOException

            此方法是GenericServlet的service()抽象方法的具体实现,它把Resquest、Response对象分别转化为HttpServletRequest和HttpServletResponse对象后调用下面重载的service()方法。

            2>protected void service(HttpServletRequest req,HttpServletResponse resp) 

                     throws ServletException,java.io.IOException

           HttpServlet实现这个方法后就成为一个http请求的分发者,他把请求代理给doget()、dopost()、doPut()、doDelete()、doHead()、doOptions()、doTrace()、doLastModified()方法。根据实际需要重写这些方法。

          doget()方法是当得到一个get类型的请求时调用,dopost()方法是当得到一个post类型的请求时调用。get方法   和post方法的主要区别在于:post方法的数据传递方式比较安全,不会将传递的信息显示在浏览器的网址后,而get方法则会将传递的信息显示在浏览器的网址后,例如用get方法的浏览器网址:http://127.0.0.1:8080/index.jsp?password=123;而用post方法则为:http://127.0.0.1:8080/response.jsp;这种区别当用在密码传输时就显的更为重要。

七、示例

login.jsp

<%@ page contentType="text/html;charset=utf-8" %>
<html>
<head><%@ include file="head.txt" %></head>
<body bgcolor="pink"><font size="2">
<center>
<br>
<br>
<br>
<form action="login" method="post">
<table border="2">
    <tr>
    	<th>请您登录</th>
    </tr>
    <tr>
    	<td>登录用户<input type="text" name="logName"></td>
    </tr>
    <tr>
    	<td>登录密码<input type="password" name="psWord"></td>
    </tr>
</table>
<br><input type="submit" value="登录">
</form>
</center>
</body>
</html>
LoginBean.java

package com.mybean;
public class LoginBean
{
	String logName,psWord,backNews="";
	boolean success=false;
	public void setLogName(String name)
	{
		logName=name;
	}
	public String getLogName()
	{
		return logName;
	}
	public void setPsWord(String pw)
	{
		psWord=pw;
	}
	public String getPsWord()
	{
		return psWord;
	}
	public void setBackNews(String news)
	{
		backNews=news;
	}
	public String getBackNews()
	{
		return backNews;
	}
	public void setSuccess(boolean b)
	{
		success=b;
	}
	public boolean getSuccess()
	{
		return success;
	}
}
Login.java

package sun.myservlet;
import com.mybean.*;
import java.sql.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Login extends HttpServlet
{
	public void init(ServletConfig config) throws ServletException
	{
		super.init(config);
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
		}
		catch(Exception e)
		{
			System.out.print(e);
		}
	}
	public String loginHandle(String s)
	{
		try
		{
			byte bb[]=s.getBytes("UTF-8");
			s=new String(bb);
		}
		catch(Exception ee)
		{
			System.out.print(ee);
		}
		return s;
	}
	public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
	{
		Connection con;
		PreparedStatement sql;
		LoginBean login=null;
		String backNews="";
		HttpSession session=request.getSession(true);
		try
		{
			login=(LoginBean)session.getAttribute("login");
			if(login==null)
			{
				login=new LoginBean();
			    session.setAttribute("login",login);
			}			
		}
		catch(Exception ee)
		{
			login=new LoginBean();
			session.setAttribute("login",login);
		}
		String logName=request.getParameter("logName").trim(),
		       psWord=request.getParameter("psWord").trim();
		       boolean ok=login.getSuccess();
		       logName=loginHandle(logName);
		       psWord=loginHandle(psWord);
		if(ok==true&&logName.equals(login.getLogName()))
		{
		    backNews=logName+"已经登录了";
		    login.setBackNews(backNews);
		}
		else
		{
		    String uri="jdbc:mysql://127.0.0.1/client";
		    boolean boo=(logName.length()>0)&&(psWord.length()>0);
		    try
		    {
			    con=DriverManager.getConnection(uri,"root","root");
			    String loginCondition="select * from info where logName=? and psWord=?";
			    sql=con.prepareStatement(loginCondition);
			    if(boo)
			    {
			        sql.setString(1,logName);
			        sql.setString(2,psWord);
			        ResultSet rs=sql.executeQuery();
			        boolean m=rs.next();
			        if(m==true)
			        {
			            backNews="登录成功!";
			            login.setBackNews(backNews);
			            login.setSuccess(true);
			            login.setLogName(logName);
			        }
			        else
			        {
			             backNews="您输入的用户名不存在或密码不匹配";
			             login.setBackNews(backNews);
			             login.setSuccess(false);
			             login.setLogName(null);	
			        }
			    }
			    else
			    {
			        backNews="您输入的用户名不存在或密码不匹配";
			        login.setBackNews(backNews);
			        login.setSuccess(false);
			        login.setLogName(null);		     
			    }
			    con.close();
			}
			catch(SQLException exp)
			{
			    backNews=" "+exp;
			    login.setBackNews(backNews);
			    login.setSuccess(false);
			    login.setLogName(null);	
			}                    		
		}
		RequestDispatcher dispatcher=request.getRequestDispatcher("showLoginMessage.jsp");
		dispatcher.forward(request,response);
	}
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
	{
	    doPost(request,response);
	}
}
web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

    <display-name>Welcome to Tomcat</display-name>
    <description>
     Welcome to Tomcat
    </description>

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>sun.myservlet.Login</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

</web-app><span style="font-size:18px;">
</span>

参考:http://www.open-open.com/lib/view/open1331598718140.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值