您的位置:首页 > 其它

servlet工作原理及实例演示

2014-07-22 21:58 357 查看

servlet简介

当我们在地址栏里面输入www.baidu.com,最终呈现在我们面前的是百度搜索的页面。在这些访问过程中,都会有一个web服务器来处理这些请求以及访问处理后的结果。而servlet就是这样一个用来处理前端请求并处理数据来返回相关数据到界面显示的工具。用下面一张图来表示这样一个过程。

原理简介



对于servlet,它的工作原理也是可以去了解一下的。浏览器根据ip地址,向指定的服务器发送一个请求。在请求的过程中,根据http协议将请求数据封装成一个数据包。服务器端在接受到发送过来的数据包后,解析,再次封装成request对象和response对象。如果是tomcat服务器的话,这里根据sun定义的规范。会找到指定webapps找到建立好的文件夹,先读取web.xml.在xml中我们找到这样一个xml的节点<url-pattern>.这里存放的是servlet。也就是你编译好的那个class文件的路径,找到这个路径后。通过反射生成servlet对象。再调用这个对象的service方法,将之前解析封装好的两个对象作为这个service方法的参数传进来。拿到从客户端传过来的数据后,想怎么办就怎么办了。连接数据库还是直接通过一系列的逻辑处理都可以。处理完成之后,封装好http协议数据包返回到客户端。整个servlet就是这样一个过程了。

与CGI的比较

和servlet相比,CGI也是一种用来使网页具有交互功能的接口。但是由于其移植性、性能、编写难度上和线程访问上的劣势导致越来越多的人开始使用servlet。换个角度看,servlet是一种相比CGI更加灵活和先进的替代品。

servlet生命周期

1.init()初始化方法

2.service()方法

3.destroy()方法

总的来讲也就是这三个方法的调用了。在servlet容器启动的时候,也就是tomcat服务器启动的时候,通过读取配置文件的配置信息来初始化servlet对象。当客户端向服务器发出请求的时候,就调用servlet对象的service方法,而destroy方法的执行可以手动,也可以自动的销毁。手动就是直接将tomcat服务器停了就可以了,自动的根据网上的资料,在长时间不动就会自动销毁或者写一个监听就可以。这里相比于之前的CGI,servlet在实例化后如果没有销毁的话,会一直存在。并且可以服务给多个浏览器的请求,而CGI每次访问时会生成一个线程,当服务器终止后就销毁指定的线程,这也是servlet比CGI效率高的原因。

servlet和cookie、session的关系

Cookie

之前也接触过cookie,这里再次了解一下相应的原理。cookie在客户端存放有两种方式,a.存放在cache中,浏览器关闭自动消失。b.存放在指定的文件夹中,经常看到的哪些小的浏览器中icon等,会自动消失。

在与服务器交互过程中是,服务器将返回的数据以键值对的方式发送到客户端。这样在浏览器第二次访问时,向服务器发送这个键就可以了,服务器接受后,相同的键值就认为是一个用户。

Session

一个用户对应一个session对象,session到期自动消失。浏览器请求服务器时,会调用resquest对象的getsession()。从而产生一个session对象,并给session配一个键值。将每个用户的对象存放在map集合中。服务器就是根据这些sessionid跟踪这个session的。而session和cookie都是用来存放用户数据,不同的是session仅限于用户的单个会话,而cookie是存放在客户端的;而session和cookie又有什么关系,用户和应用程序打交道的过程中,建立session的同时会产生一个UUID存在cookie当中,当用户再次请求时,读取这个UUID来服务器查询相应的session最后得到对应ID的session。

Filter

简单了解一下这个filter,从字面上就知道这个是过滤器的作用。举个例子,这个就和进北京火车站似得。进入到北京火车站相当于servlet,而filter就是那些安检过程。如果带个管制刀具,汽油易燃物品是需要过滤掉的。filter就是干这个事的,在你在访问服务器创建resquest对象之前把一些信息过滤掉,为了让你更好的进火车站。

常见的filter有这些用户辨认filter,日志filter,审核filter,加密filter,符号filter。可以为多个servlet配置一个filter。

实例用户登录

Loginservlet

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class LoginServlet extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,
IOException{
String username=req.getParameter("username");
String password=req.getParameter("password");
System.out.println("username="+ username);
System.out.println("password="+ password);

resp.setContentType("text/html;charset=GB18030");
resp.getWriter().println();
resp.getWriter().println("loginsuccess");

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException,
IOException{
doGet(request,response);
}
}


Html

<html>
<head>
<title>登录</title>
</head>
<body>

<form action="LoginServlet" method="get">

用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">

</form>
</body>

</html>


Web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app 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_3_0.xsd" version="3.0"
metadata-complete="true">

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>

</web-app>


总结

简单来说,servlet就是一个桥梁。一个将客户端连接和数据库等业务逻辑后台处理连接的桥梁,有了这个桥将界面的显示和后台的逻辑处理分开,也是一个解耦的体现。说白了也是两个jar包和一些接口的定义和实现,更深次的涉及到一些协议的传输和工作原理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: