Servlet调用过程详解

本文详细介绍了Servlet的工作原理,特别是客户端请求如何通过Tomcat服务器传递并由Servlet处理的过程。包括客户端与服务器的交互、配置文件的作用及Servlet的实例化与方法调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet是java编程中的核心内容,对于初学者而言清晰的了解servlet的调用过程,明白从客户端到服务器的交互过程是至关重要的。下面通过一个简单的登陆实例的代码与图的结合详述一下servlet是怎样被调用的。在介绍这个过程之前我们先来简单了解下java开发相关的相关信息。servlet的调用过程是由客户端,容器(以Tomcat为例),xml文件,java类,html文件几者合作参与完成,我们所要说的servlet的调用过程其实也就是这几者之间的关系,他们之间的顺序作用关系如下:

1.客户端通过发送请求给Tomcat,Tomcat发送客户端的请求页面给客户端。

2.用户对请求页面进行相关操作后将页面提交给Tomcat,Tomcat将其封装成一个HttpRequest对象,然后对请求进行处理,。

3.Tomcat截获请求,根据action属性值查询xml文件中对应的servlet-name,再根据servlet-name查询到对应的java类(如果是第一次,Tomcat则会将servlet编译成java类文件,所以如果servlet有很多的话第一次运行的时候程序会比较慢)。

4.Tomcat实例化查询到的java类,注意该类只实例化一次。

5.调用java类对象的service()方法(如果不对service()方法进行重写则根据提交的方式来决定执行doPost()方法还是doGet()方法)。

6.通过request对象取得客户端传过来的数据,对数据进行处理后通过response对象将处理结果写回客户端。

 

下面是我们的代码示例:

(1)客户端代码

<!DOCTYPE html>
<html>
  <head>
    <title>Login.html</title>
	<script language="javascript" type="text/javascript">
	      function CheckEmpty (){

			var username = document.getElementById("username1").value;
			var password = document.getElementById("password1").value;
						
			if(username == ""){
				alert("用户名不能为空");
				return;
			} else if(password == "")
			{
				alert("密码不能为空");
				return;
			}
			formSub();
		}
		
		function formSub(){
			LoginForm.submit();
		}

	</script>
  </head>
  
  <body >
  	<form action="LoginServlet" method="post" name="LoginForm"> 
  	    用户名:<input tyep="text" id="username1" name="username"><p>
            密  码:<input type="password" id="password1" name="password"><br>
            <input type="button" value="登陆" onClick="return CheckEmpty()"> 
  	</form>	
  </body>
</html>

注意上面代码中的红色部分,这就是我们进行servlet定位的url,配置文件也就是通过这个url来从众多的servlet中找到我们所需要的servlet的。这个url并没有固定的书写,只要与配置文件中的url-pattern对应就没有问题。

(2)配置文件代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	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">
  
  <welcome-file-list>
    <welcome-file>Login.html</welcome-file>
  </welcome-file-list>
  
  <servlet>
    <servlet-name>MyLoginServlet</servlet-name>
    <servlet-class>LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>MyLoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
    </servlet-mapping>	
</web-app>

配置文件所起的作用更像是是一个调度站,他负责将不同的页面与不同的servlet进行对接,以便于servlet可以对客户端提交过来的数据进行处理。

(3)servlet代码

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 LoginServlet extends HttpServlet {

	//构造函数
	public LoginServlet() {
		super();
	}

	//析构函数
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}
	//重写doGet方法
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			
		actionFuc(request,response,"Get");
		
	}

	// 重写doPost方法
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		actionFuc(request,response,"Post");
	}
	//重写service方法
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException{
		
		actionFuc(request,response,"Service");
	}
	
	//重写初始化方法
	public void init() throws ServletException {
		// Put your code here
	}
	/**
	 * 我们自己定义的测试函数,该函数用来测试不同的提交方法(get提交还是post提交),
	 * 以及验证service方法被重写后就不会再调用doGet和doPost方法
	 */
	private void actionFuc(HttpServletRequest request, HttpServletResponse response,String method)
				throws IOException{
		
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		System.out.println("username=" + username);
		System.out.println("password=" + password);
		
		response.setContentType("text/html");
		
		response.getWriter().println(method + "Login Success!");
		
	}
}

通过对service方法进行重写进一步验证了,当请求被提交给servlet的时候首先调用的是java类对象的service方法,如果该方法不被重写则会根据页面的提交方式调用doGet或doPost方法,但是当service被重写后则会执行service方法体中的内容,不再调用doGet或doPost方法。




 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值