Servlet 1

来源:互联网 发布:淘宝买药货到付款骗局 编辑:程序博客网 时间:2024/06/04 18:35


Servlet 简介

一,

1、Servlet (服务器端小程序) 是使用Java语言编程的服务器端程序,可以像JSP一样,生成动态的WEB页,Servlet主要运行在服务器但,并由服务器调用执行,是一种按照Servlet标准开发的类

2、Servlet 程序是Java对CGI程序的实现,但是与传统CGI的多进程处理操作不同的是,Servlet采用了多线程的处理方式,这样就使得Servlet程序的运行效率比传统的CGI更高,而且Servlet还保留有Java的可移植性的特点,

    这 样使得Servlet更易使用,功能也更加强大。

3、Applet很相似:应用小程序。

4、之前所编写的JSP程序,基本上还是为了Servlet进行服务,如果说句更专业的话,从JSP发展来看,是先产生了Servlet,之后再产生了JSP,因为Servlet的开发较困难,所以为了JAVA技术可以走得更好,SUN公司向微软学 

      习了ASP技术的特点,这才有了JSP程序,但是JSP在执行的时候依然是靠*.class 文件执行的,所以JSP骨子里面还是Servlet。

5、 CGI:公共的网管接口,是一组标准,但是传统的CGI采用的是多进程的处理方式,所以性能很差的,而Servlet采用多线程的处理方式,那么性能上是有很大提高的。

二、Servlet处理的基本流程

Servlet程序安装如下步骤进行:

1、客户端(很可能是WEB浏览器) 通过HTTP提出请求

2、WEB服务器接收该请求并将其发送给servlet,如果这个servlet尚未被加载,web服务器将把它加载到java 虚拟机并且执行它。

3、servlet程序接收该HTTP请求并执行某种处理

4、web服务器从servlet收到的应答发回客户端


不管是使用JSP 还是使用servlet所有的程序都是允许在服务器的端上的,所以必须了解一下servlet 的处理流程

servlet 与jsp 一样,需要通过HTTP协议,并且使用web server进行数据的回应。

三、 Servlet程序实现

在整个Servlet程序之中最重要的就是Servlet接口,在此接口下定义一个GenericServlet的子类,但是一般不会直接继承此类,而是根据所使用的协议选择GenericServlet 的子类继承,例如: 现在是采用HTTP 协议处理的,

所以一般而言当需要使用HTTP 协议操作时用户自定义的Servlet 类都要继承HttpServlet类

《Interface》 Servlet  <-----  GenericServlet  <---- HttpServlet < ----- 自定义 Servlet


     要想在程序中实现一个Servlet 的话,则必须继承 HttpServlet类,这个类主要是这对于Http 协议而产生的


四、实现要求

1、如果要开发一个处理HTTP 请求的Servlet 程序,肯定是要继承HttpServlet 类, 而且在自定义的Servlet 类中至少还要覆写HttpServlet类中提供的doGet()  方法。

可以在此方法中使用request 和 response 对象

既然是一个类,则肯定需要在WEB-INF/classes 文件夹中进行保存

第一个servlet

package org.gz.servlet;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;/*    java是基本包在扩展包之前    子包写在父包之后*/public class HelloServlet extends HttpServlet {     public void doGet(HttpServletRequest req,HttpServletResponse resp)         throws ServletException, IOException {         PrintWriter out = resp.getWriter();         out.println("<html>");         out.println("<head><title></title></head>");         out.println("<body>");         out.println("<h1>HelloWorld</h1>");         out.println("</body>");         out.println("</html>");         out.close();         http://write.blog.csdn.net/postedit/6926949     }http://write.blog.csdn.net/postedit/6926949}
第一个servlet 程序现在已经开发完成了,那么下面就需要进行程序的编译了

现在希望可以一次性编译成功,但是现在的成功完全依赖于之前的FileUpload 配置的那个开发包

此时一个Servlet 就已经正常的开发完成了,但是,现在此Servlet并不能被外部所访问。因为还缺少了一个配置,这个配置就是映射的配置。即每一个servlet 都必须通过 web.xml 文件进行映射的路径指定。

<servlet>http://write.blog.csdn.net/postedit/6926949<servlet-name>hello</servlet-name><servlet-class>org.gz.servlet.HelloServlet</servlet-class></servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/helloServlet</url-pattern></servlet-mapping>

以后直接在浏览器中输入helloServlet 就可以进行Servlet程序的访问了

但是,需要注意的是,此时的Tomcat 必须重新启动加载新的配置

http://localhost:8080/demo/helloServlet

 现在的程序注意功能是让servlet 作为一个显示层的操作,但是现在的发展势头来看,Servlet基本上不会作为输出页面使用,因为太不方便了,而servlet 以后作为一些中间的控件逻辑层使用

当然,对于servlet 本身还有一个最有意思的特点,即: 可以为一个servlet 配置映射名称,只需要配置多个<servlet-mapping> 即可

<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/world/*</url-pattern></servlet-mapping>

     一个servlet 可以映射多个名称,尤其是 "*"  这个路径一定要重点理解,表示任意的名称均可,以后讲解struts的时候肯定要发现 * 作用。

Servlet 属于JAVA EE的范畴,而java和javac属于java se的范畴,要想进行编译,必须配合i帧java ee包

——————————————————————————————————————————————


深入了解HttpServlet类中的请求处理方法

掌握表单提交的路径问题处理方法

package org.gz.servlet;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class InputServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp)              throws ServletException,IOException {String info = req.getParameter("info");//假设参数名称PrintWriter out = resp.getWriter();out.println("<html>");out.println("<head><title>欢迎光临</title></head>");out.println("<body>");out.println("<h1>" +info+ "</h1>");out.println("</body>");out.println("</html>");out.close();}                     }
    当一个Servlet 编写完成之后下面就需要在web.xml  文件之中进行 servlet 的映射配置

<servlet><servlet-name>input</servlet-name><servlet-class>org.gz.servlet.InputServlet</servlet-class></servlet><servlet-mapping><servlet-name>input</servlet-name><url-pattern>/servletdemo/doGet</url-pattern></servlet-mapping>

<html><head> <title>欢迎光临</title></head><body><form action="/servletdemo/doGet" method="get">请输入内容: <input type="text" name="info"><input type="submit" value="提交"></form></body></html>
运行上面的程序时候是这样的:

     http://localhost:8080/demo/servletdemo/  找到表单当前的目录 ——> 再点击表单 ----> 输入内容 即可得到    (表单当前目录名称和配置url-pattern重名 例外)

HTTP Status 405 - HTTP method POST is not supported by this URL  出现40开头的一般是客户端错误  此错误是Servlet只覆写了duGe()t方法,没有覆写doPost() 方法

所以只可以在表单中出现 method="get"  请求 不能出现method="post" 请求


Servlet 生命周期

掌握Servlet 生命周期及其对应方法

掌握web.xml  文件对生命周期的控制

生命周期: 是一个程序的存在周期,Servlet 由于是受容器的管理,所以容器来决定其生命周期

1、Servlet 程序是运行在服务器端的一段java 程序,其生命周期将受到web  容器的控制,生命周期包括: 加载程序、初始化、服务、销毁、卸载五个部分

Servlet 生命周期对应的方法

1、public void init() throws ServletException      类型--> 普通      描述----> Servlet 初始化调用

2、public void init(ServletConfig config) throws ServletException    类型——> 普通    描述—>  Servlet初始化时调用,可以通过ServletConfig读取配置信息

3、public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException  类型 ---> 普通   描述 ---> Servlet服务,一般不会直接覆写此方法, 

          而 是使用doGet() 或 doPost()  方法

4、public void destroy()     描述 ---> Servlet 销毁时调用

下面是一个基本生命周期编写程序

package org.gz.servlet;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class LifeCycleServlet extends HttpServlet {    public void init() throws ServletException {        System.out.println("***1、Servlet 初始化--->init()");    }              public void doGet(HttpServletRequest req, HttpServletResponse resp)              throws ServletException,IOException {        System.out.println("***2、Servlet 服务--->doGet()和doPost()");    }    public void doPost(HttpServletRequest req, HttpServletResponse resp)              throws ServletException,IOException {         this.doGet(req,resp);    }    public void destroy() {        System.out.println("***3、Servlet的销毁 --->destroy()");  //ctrl +C 快捷键 进行关闭        try        {            Thread.sleep(3000);        }        catch (Exception e)        {                    }    }/*    public void service(ServletRequest req,ServletResponse res)                      throws ServletException,IOException {   //   运行此程序doGet()、doPost()方法 就没有作用了        System.out.println("********  service服务  *******");    }  */                                                }

<servlet><servlet-name>Life</servlet-name><servlet-class>org.gz.servlet.LifeCycleServlet</servlet-class></servlet><servlet-mapping><servlet-name>Life</servlet-name><url-pattern>/LifeServlet</url-pattern></servlet-mapping

对于HttpServlet 类而言,里面的services() 方法主要功能是区分get 请求还是post 请求,如果get请求则调用doGet()方法,如果是post 请求,则调用doPost()方法,但是一旦在子类中覆写之后,则没了此种区分能力,所以doGet和doPost方法都失效了。

     实际上,这种做法更像是一种设计的模板操作,因为只需要按照它的要求将方法覆写完成了,那么就可以失效相应的功能

     当然,还有一点需要注意的是,在正常情况下初始化方法是在servlet 第一次使用的时候才调用,如果现在希望容器启动的时候servlet 直接进行初始化操作的话,则可以在 web.xml 中增加一个相应的配置参数,表示的是当容器启动的时候进行加载

<servlet><servlet-name>Life</servlet-name><servlet-class>org.gz.servlet.LifeCycleServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>
1 表示按照什么等级运行

信息: Starting service Catalina2011-11-3 0:23:28 org.apache.catalina.core.StandardEngine start信息: Starting Servlet Engine: Apache Tomcat/6.0.18***1、Servlet 初始化--->init()2011-11-3 0:23:29 org.apache.coyote.http11.Http11Protocol start信息: Starting Coyote HTTP/1.1 on http-8080

原创粉丝点击