Servlet

发布于:2024-05-10 ⋅ 阅读:(27) ⋅ 点赞:(0)

1 Servlet简介

        在20世纪90年代初的时候,随着Internet技术和浏览器的飞速发展,传统的基于HTML、CSS等技术编写的静态网页已经不能满足现实需求了。试想一下,我们在登录个人博客的时候,看到的都是自己的个人信息,难道博客中心会为我们每个人编写一个静态的网页吗?这显然是不现实的,我们都知道,数据是保存在数据库中的,当我们去访问数据的时候,服务器会把数据从数据库中取出来显示在界面中,这样就需要编写专门的程序来实现网络的动态化。

        熟悉Java语言历史的朋友可能会知道,Java语言诞生的时候就是为动态网页服务的,当时SUN公司开发了一种将小程序嵌入到网页中进行执行的技术,并命名为Applet。由于Applet是执行在浏览器中的,因此要求客户端机器必须安装JRE,并且有些浏览器并不支持。既然Applet程序嵌入在网页中有很多局限性,能不能考虑编写一种程序,运行在服务器端,返回给浏览器就是HTML文件,这样就解决了客户端的环境问题,同时也实现了网页的动态化,因此,Servlet就这么诞生了。

        Servlet是用Java语言编写的服务器端程序,其全称是Java Servlet,因此又被称为Java服务器连接器。Servlet从其字面意思来看,并没有什么太多的含义,当初SUN公司在命名的时候是根据Service Applet进行组合成的名字,并一直沿用至今。Servlet其实就是一个普通的Java类,运行在服务器端,运行结果是往客户端(浏览器)返回一个HTML文件。其运行原理是,客户端向服务器发送一个请求,服务器在收到请求之后,去寻找能够解决问题的Servlet(资源)并运行,最后把运行的结果返回给客户端,Servlet运行过程如图所示。

        在具体的应用中,广义的Servlet是利用Java技术编写的网络组件,被Servlet容器(服务器应用,如Tomcat)托管,用来动态生成HTML内容。狭义的Servlet是JavaEE API中的一个接口,即javax.servlet.Servlet,因此,我们今后在编写Servlet程序的时候都是直接或间接实现了这个接口。在学习Servlet的时候,就把Servlet当做一个资源看待就可以了,这个资源是运行在服务器端的,客户端在向服务器端发送请求的时候,服务器端会根据客户端的请求去自动寻找这个资源,程序运行结束后会往客户端返回一个文件,这个文件可以是HTML文件,也可以是别的什么数据。

2 创建第一个Servlet

        一个类之所以被称为Servlet,是因为这个类直接或间接的实现了javax.servlet.Servlet接口。因此创建Servlet并不复杂,只需要创建一个普通的Java类,让这个类实现javax.servlet.Servlet接口,或者继承javax.servlet.http.HttpServlet类,然后在web.xml文件进行相应的配置就可以了,接下来通过一个简单的案例介绍创建和使用Servlet的过程。

2.1 创建Servlet类

        创建一个Dynamic Web Project,命名为javaweb01,在这个项目中创建一个普通的Java类HelloServlet,让这个类继承javax.servlet.HttpServlet类,并重写父类的doGet方法,具体代码如下。

import java.io.IOException;

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

public class HelloServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
	}
}

        在doGet方法中有两个参数,分别是HttpServletRequest和HttpServletResponse,这两个参数分别对应着客户的请求和给客户端的响应。在doGet方法中做相应的处理,目的是往客户端返回一个HTML文件,具体的操作方法如下。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
		throws ServletException, IOException {
	//设置响应的文件类型及编码格式
	resp.setContentType("text/html; charset=utf-8"); 
	//获取文件输出流
	PrintWriter out = resp.getWriter();
	//编写文件内容
	out.println("<html>");
	out.println("<head>");
	out.println("<title>HelloServlet</title>");
	out.println("</head>");
	out.println("<body>");
	out.println("<h1>Hello Servlet!</h1>");
	out.println("</body>");
	out.println("</html>");
}

        既然要给客户端响应,那么就需要通过响应对象HttpServletResponse对象来处理,代码中的“resp.setContentType("text/html; charset=utf-8");”一句,是用来设置响应的格式,其中的参数text/html表示响应的内容类型是文本格式的HTML文件,charset=utf-8表示在响应的页面中可以编写中文等字符。由于网络之间都是以字节数据流的形式进行数据传输的,因此需要创建文件输出流,用以往响应的HTML文件中写入文本信息。

2.2 配置Servlet

        Servlet编写完成之后,是不能直接运行的,必须通过服务器的调用才能起作用。要想让服务器可以调用Servlet,必须在项目的web.xml文件中进行相应的配置才能使用,具体的配置代码如下所示。

<servlet>
	<servlet-name>HelloServlet</servlet-name>
	<servlet-class>com.tedu.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>HelloServlet</servlet-name>
	<url-pattern>/hello</url-pattern>
</servlet-mapping>

        在配置文件web.xml中添加的内容共有两部分,分别是servlet和servlet-mapping。

        <servlet>标签主要是为该Servlet命名,其中的<servlet-name>子标签中的内容就是该Servlet的名字,这部门的内容是可以随便命名的,不过一般情况习惯用类名来作为该部分的内容。其中的<servlet-class>子标签中的内容是Servlet类的全名,指定了该Servlet在项目中的位置,让服务器能够找到该Servlet资源。

        <servlet-mapping>标签是为该Servlet资源指定一个唯一的URL地址,其中的<servlet-name>子标签中的内容是和<servlet>标签中的<servlet-name>标签中的内容一致,让<servlet>标签和<servlet-mapping>标签成为一一对应的关系。其中的<url-pattern>子标签中的内容就是该Servlet资源的URL地址,这个地址就可以被客户端直接访问。

        接下来就可以部署项目,然后访问项目的资源了,具体访问的URL地址是:http://localhost:8080/javaweb01/hello,访问结果如图所示。

2.3 Servlet运行分析总结

        当我们通过浏览器输入一个地址之后,其实这就是客户端往服务器端发送了一个请求,在这个请求中包括了请求的项目名和项目中的资源名,在上一节中访问的路径后面的“/javaweb01”就是项目名,“/hello”就是资源名。请求到达服务器端之后,服务会根据客户端请求中的项目名找到相应的项目,然后根据资源名到项目中去寻找相应的资源,如果项目中直接有相应的资源(比如HTML等文件),就会直接返回给客户端,如果项目中没有直接的资源,就会到项目的web.xml文件中寻找相应的<servlet-mapping>标签中的<url-pattern>子标签中的内容,再根据<url-pattern>子标签对应的<servlet-name>子标签中的内容,去寻找对应的<servlet>标签,进而获取到其中的<servlet-class>子标签中的内容,寻找到相应的Servlet类。关于Servlet运行过程,如图所示。

        在之前曾提到,创建Servlet必须直接或间接实现Servlet接口。在创建第一个Servlet程序的时候,是采用继承HttpServlet类,其实HttpServlet类也是相当于实现了Servlet接口,


网站公告

今日签到

点亮在社区的每一天
去签到