Servlet怎么理解

作者:郭无心
链接:https://www.zhihu.com/question/21416727/answer/65253540
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

最早支持Servlet标准的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

Servlet编程需要使用到javax.servlet 和 javax.servlet.http两个包下面的类和接口,在所有的类和接口中,javax.servlet.servlet 接口最为重要。所有的servlet程序都必须实现该接口或者继承实现了该接口的类。

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

javax.servlet.http.HttpSession;

javax.servlet.http.Cookie;

javax.servlet.ServletContext;

javax.servlet.GenericServlet;

以上是Servlet的主要类和接口


(1) javax.servlet.Servlet;//Servlet接口

拥有方法:

//该函数用于初始化该servlet 该函数只是会被调用一次, 当用户第一次访问该servlet的时候被调用

public void init(ServletConfig parm1) throws ServletException

// //用于得到servlet配置文件 与生命周期无关

public ServletConfig getServletConfig()

// service 函数用于处理业务逻辑

//程序员应当把业务逻辑代码写在这里

//该函数在用户每次访问servlet的时候都会被调用

//ServletRequest 对象用于获得客户端信息,ServletResponse 对象用于向客户端返回信息(客户端可以理解为浏览器)

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException

public String getServletInfo()

//销毁servlet实例(释放内存)

//1 reload 该servlet(webApp)

//2 关闭Tomcat 或者说 关机之后 都会调用这个函数

public void destroy()




--------------------------分割线 2015年11月8日------------------------------

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

对这句话再做点解释,比如HttpServlet类继承自Servlet类,可以利用继承HttpServlet来实现Http请求,当不是Http请求的时候,也可以定义其他形式的Servlet。



比如我之前工作过的一个公司的架构就是使用Servlet来处理自己的应用层协议。

-----------------------------------------------------------------------------------------------

下面是我曾经做过的Servlet笔记


Servlet体系结构

servlet首先是一个接口,GenerivServlet呢实现了这个接口。

他们都是属于javax.servlet.*;的这个包里面的

此外,在javax.servlet.http*;的这个包里面呢,其实也含有一个重要的servlet类叫httpServlet


首先我们看到ie浏览器,我们讲servlet也好,讲jsp也罢,首先我们要明确的是这是一个bs的体系结构,所以说他必然有浏览器的,那么浏览器要去访问Tomcat其中的某一个servlet或者说是jsp的时候呢,必须在ie浏览器当中输入

http://........

之类的命令敲了回车键之后浏览器就会向你指定的Tomcat发送http请求的,这个请求会被Tomcat的Web服务器的这个模块接收,web服务器处理之后呢会转发给Tomcat的容器部分进行处理,他会帮助ie浏览器找到这个请求想要找到的servlet,这时呢在容器里面的行为要么是在容器内再向数据库发送操作数据库的命令,要么呢直接返回结果 ,其实就是静态的html页面,当页面被web服务器模块接收到之后呢,他会将静态页面返回给那个发送请求的那个ie浏览器,ie浏览器得到这个结果之后呢,就会自己显示出来,然后用户就能看到结果,所以可以将我们的结果分成三个部分,第一个部分是ie浏览器,第二个呢是Tomcat模块,第三个呢就是数据库模块。


其实开发servlet有三种方法,一种是实现servlet接口,一种是继承GernericServlet 还有一种是继承HttpServlet。 为什么会有三种方法呢?因为这个servlet这个技术并不是说一出现之后就是成熟的,他经历过这三个发展的阶段,因此它具有这三种方式,其实在最先前是实现servlet接口方法来开发的,后面的时候技术人员发现这样写似乎不太方便,所以又发展出来一个叫做继承GenericServlet的方法来实现,后来又发现这个也不是很方便,所以呢又发展出来了继承 HttpServevlet方式来实现

为了使学习更加深刻,我会把三种方式都实现下。

Servlet开发是很简单的事情特别是用一些高级工具来开发的话,特别是像JBuilder来实现的话只要点一下就行了,但很遗憾的这样的高级工具他会隐藏太多的细节,这样的话就不利于我们的学习,特别是部署之类的他就给你全写了,那么你就不好学到他servlet的底层运行机制和原理,为了让大家理解的更为深刻,我还是先用JCreater来实现开发Servlet,后面当然会用到eclipse 或者JBuilder这些高级工具来开发。我们先过一点苦日子,然后再过一点好日子,这样的话知识更加扎实一点了。

下面我们就来真正的来开发Servlet,首先用什么方法呢?用实现接口的方法来实现

在这里呢会引入servlet的生命周期这个特点。这第一个servlet非常简单,就是写一个Hello World 在浏览器中输出。教程依照先简单,再难,再综合的顺序进行。

下面是Servlet的开发流程。

1:首先在Tomcat的主目录下的webapp下面建立一个WEB-INF文件夹

2:然后再WEB-INF文件夹下建立一个web.xml文件,记录网站的配置信息

建立classes子文件夹 存放你的servlet

当然这个操作你可以自己完成 也可以在root目录下拷贝一份

大家可以看到 这个地方传递过来了一个信息,什么信息呢?


对于Tomcat来讲,你所有的这些网站,页面对他来讲都是web应用,他看来就是web应用,就是在webapp下面建立我们的网站。


比如建立一个文件夹叫做mywebsite,接下来文件夹中放什么东西呢,我们要放的就是WEB-INF文件夹,在里面放置web.xml文件以及classes文件夹和lib文件夹。


WEB-INF这个要注意大小写,要注意大小写要一模一样才行的,名字都要一样才行的。


在这个文件夹下进行上述两种操作,你可能会去问,为什么要这样做呢?这个倒是没有办法的事情 因为这就是规范。


classes当然是存servlet用的 ,那个lib文件夹用来做什么呢?


用来存放这个应用汇用到的一些jar包,比如数据库啦之类的,文件的下载要用的包都放在lib里面去,就是lib库。

//这是我的第一个Servlet 使用实现Servlet接口的方式来开发

package com.tsinghua;

 
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Hello implements Servlet
{

	// 该函数用于初始化该servlet, 类似于我们的类的构造函数
	// 该函数只是会被调用一次, 当用户第一次访问该servlet的时候被调用
	public void init(ServletConfig parm1) throws ServletException
	{
		System.out.println("init it !");
	}

	// 用于得到servlet配置文件 与生命周期无关
	public ServletConfig getServletConfig()
	{
		return null;
	}

	// service 函数用于处理业务逻辑
	// 程序员应当把业务逻辑代码写在这里
	// 该函数在用户每次访问servlet的时候都会被调用
	// ServletRequest 对象用于获得客户端信息,ServletResponse 对象用于向客户端返回信息(客户端可以理解为浏览器)
	// servelt jsp b/s
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
	{
		System.out.println("service it");
		PrintWriter pw = res.getWriter();
		pw.println("hello world");
	}

	public String getServletInfo()
	{
		return " ";
	}

	// 销毁servlet实例(释放内存)
	// 1 reload 该servlet(webApp)
	// 2 关闭Tomcat 或者说 关机之后 都会调用这个函数
	public void destroy()
	{
		System.out.println("destory it");
	}

}

以上就是实现servlet接口的方式来开发servlet方式来代码实现

其实以上方法都是回调函数 都是会在特定的时候特定的环境下自动调用的

其中iinit() 和 destroy() 都是只会调用一次的 但是 service 会在每一次都会被调用的


到现在还没有完成 因为如果你想让别人访问到你的wervlet 的话 你就要部署你servlet

下面讲授关于部署servlet的步骤(在web.xml 进行配置设置)

如果你要问为什么进行部署,那么还是一句话,规范。

<servlet>
	<!--给你的servlet起名字,任意的-->
        <servlet-name>hello_servlet</servlet-name>
        <!--指明servlet的路径,包名+类名 注意类名后不能加上java-->
        <servlet-class>com.tsinghua.Hello</servlet-class>
</servlet>
 
<servlet-mapping>
	<!--mapping  自然就是映射了  于是乎 这个同上,一致-->
        <servlet-name>hello_servlet</servlet-name>
        <!--这是浏览器中输入的访问该servlet的url 任意的-->
	<url-pattern>/sp</url-pattern>
</servlet-mapping>
用下面的控制台命令编译Hello.java之后,我们就可以启动Tomcat来进行访问了
&amp;lt;img src=&quot;https://pic3.zhimg.com/50/130b7fa5855a62f6d94bdf75f23805fd_hd.jpg&quot; data-rawwidth=&quot;1122&quot; data-rawheight=&quot;57&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;1122&quot; data-original=&quot;https://pic3.zhimg.com/130b7fa5855a62f6d94bdf75f23805fd_r.jpg&quot;&amp;gt; &amp;lt;img src=&quot;https://pic4.zhimg.com/50/d0e645791c1ea573a4b52d41b3e2306d_hd.jpg&quot; data-rawwidth=&quot;642&quot; data-rawheight=&quot;352&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;642&quot; data-original=&quot;https://pic4.zhimg.com/d0e645791c1ea573a4b52d41b3e2306d_r.jpg&quot;&amp;gt; 启动Tomcat的bin目录下的startup.bat之后,
输入
http://127.0.0.1:8080/guowuxin/sp

&amp;lt;img src=&quot;https://pic1.zhimg.com/50/cb4b4a3f9b870d57a09312c4ca90e8e0_hd.jpg&quot; data-rawwidth=&quot;405&quot; data-rawheight=&quot;61&quot; class=&quot;content_image&quot; width=&quot;405&quot;&amp;gt;
多次访问之后就能体会到Servlet的生命周期
&amp;lt;img src=&quot;https://pic4.zhimg.com/50/6d401fb2506e09ae6c2b17451ad713f5_hd.jpg&quot; data-rawwidth=&quot;462&quot; data-rawheight=&quot;128&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;462&quot; data-original=&quot;https://pic4.zhimg.com/6d401fb2506e09ae6c2b17451ad713f5_r.jpg&quot;&amp;gt;
访问结果
&amp;lt;img src=&quot;https://pic2.zhimg.com/50/c6994aaf18d56f9e1bc87fa9c7ff500e_hd.jpg&quot; data-rawwidth=&quot;487&quot; data-rawheight=&quot;86&quot; class=&quot;origin_image zh-lightbox-thumb&quot; width=&quot;487&quot; data-original=&quot;https://pic2.zhimg.com/c6994aaf18d56f9e1bc87fa9c7ff500e_r.jpg&quot;&amp;gt;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值