从Java程序设计人员的角度来看,Servlet其实就是一个Java类,它实现 javax.servlet.Servlet接口,通常会继承实现该接口的javax.servlet.GenericServlet类或javax.servlet.http.HttpServlet类,前者用于与协定无关的Servlet,后者专门适于处理HTTP请求与回应的Servlet。 继承GenericServlet类的Servlet通常会改写service()方法,而继承HttpServlet类的 service()会处理request并传送给doXXX()方法,例如doGet()或doPost()方法,通常很少会去改写service(),而是改写doGet()或doPost()方法,下面就仍以一个简单的Hello!Servlet!来示范如何撰写与设定Servlet,让其可以传回一个 HTML网页显示Hello!Servlet!文字:
package onlyfun.caterpillar; 为了要能编译上面这个类,您需要将servlet-api.jar加至CLASSPATH中,在Tomcat的话servlet-api.jar是放在 common/lib目录下。 doGet()处理客户端请求的GET方法,只要是客户端请求资源时是使用GET方法,就会调用它来处理,它获得两个参数,分别表示用户端的请求与回应,您可以回忆一下JSP的隐含对象request与response,其对应的就是HttpServletRequest与 HttpServletResponse对象,您由HttpServletResponse对象取得写出至用户端的PrintWriter对象,并写出一个HTML网页至用户端,PrintWriter对象可以使用println()方法将数据写出。 假设您的Web应用程序位于webapps/myServlet/下,则编译完成的Servlet类必须放置在WEB-INF/classes/之下,为了要让容器能知道这个Servlet的存在并实例化,您必须在WEB-INF/web.xml中告知:
<?xml version="1.0" encoding="ISO-8859-1"?> 在容器实例化并初始化Servlet并给予相关环境对象之前,Servlet只不过是个普通的Java类,并不具备有Servlet的该有的功能,容器 会为每一个注册的<servlet-name>实例化一个<servlet-class>指定的类,而<url- pattern>用于指定与<servlet-name>对应的Servlet实例,经由这么指定,在启动 Tomcat之后,您可以透过这样的网址来执行Servlet: http://localhost:8080/myServlet/helloServlet
当然,如果您想要的话,也可以在<url-pattern>中伪装Servlet,例如伪装为PHP网页,就设定为 /helloworld.php。 下面是Servlet的传回结果: <html>
<head> <title>Hello!Servlet!</title> </head> <body> <h1><b>Hello!Servlet!</b></h1> </body> </html> 事实上,上面的程序只是为了示范而已,在MVC架构中,Servlet中是不会出现out.println()这样的陈述句的,在Servlet中撰写 HTML或视图相关的逻辑基本上是不被鼓励的,Servlet在 Model 2 架构中主要是担任控制者(Controller)的角色。 PS. 广义的来说,容器藉由使用者的请求网址决定该由哪一个Servlet来处理请求,本身也是控制器的角色,但实际上很少将容器用于控制器角色上,而是设计一个Servlet来处理请求转发,将控制器的角色由该Servlet担任。 |