Servlet调用过程详解
2013-06-06 21:27
302 查看
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)客户端代码
注意上面代码中的红色部分,这就是我们进行servlet定位的url,配置文件也就是通过这个url来从众多的servlet中找到我们所需要的servlet的。这个url并没有固定的书写,只要与配置文件中的url-pattern对应就没有问题。
(2)配置文件代码
配置文件所起的作用更像是是一个调度站,他负责将不同的页面与不同的servlet进行对接,以便于servlet可以对客户端提交过来的数据进行处理。
(3)servlet代码
通过对service方法进行重写进一步验证了,当请求被提交给servlet的时候首先调用的是java类对象的service方法,如果该方法不被重写则会根据页面的提交方式调用doGet或doPost方法,但是当service被重写后则会执行service方法体中的内容,不再调用doGet或doPost方法。
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方法。
相关文章推荐
- Java调用SQL Server的存储过程详解
- SQL Server 12存储过程及在VS2015 C#调用自己的存储过程调用过程(详解)
- Deferred Procedure Call Details(延迟过程调用详解)
- JNI技术2---本地代码反调用java类方法过程详解
- javaWeb02-servlet的调用过程和生命周期
- jsp页面的执行过程与servlet的生命周期详解
- Java调用SQL Server的存储过程详解
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
- Java调用SQL Server的存储过程详解
- Qt实现zip压缩和解压,编译、调用zlib和QuaZip动态库过程详解
- JNI技术2---本地代码反调用java类方法过程详解
- python3 中双递归函数的调用过程详解与print()函数在程序调试过程中的作用
- 函数栈帧(函数调用过程详解)
- 详解汇编系统调用过程(以printf为例)
- 【转载】详解CreateProcess调用内核创建进程的过程
- 【Struts1配置及调用过程实例详解】
- C++函数调用过程和内置函数详解
- JAVA调用SQL存储过程详解.
- 详解java调用存储过程并封装成map