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
- JSP&Servlet--Servlet(1)
- servlet--1
- servlet(1)
- Servlet 1
- Servlet(1)
- Servlet(1)
- Servlet<1>
- Servlet(1)
- Servlet(1)
- Servlet-1
- Servlet(1)
- Servlet (1)
- servlet(1)
- servlet -1
- Servlet(1)
- servlet -> (1)
- Servlet介绍(1)-----接口Servlet
- Servlet与Servlet容器(1)
- 软件包 javax.servlet.http 不存在 import javax.servlet.http.*; 如果是用editplus
- The Scientist and Engineer's Guide to Digital Signal Processing
- FileUpload上传的基本步骤 2
- C++中使用Lambda演算
- 程序员面试宝典(三)P107
- Servlet 1
- eclipse svn配置 (感谢同事的辛勤劳动)
- 开源软件协议
- 一个基于Qt的用cvAdaptiveThreshold二值化图像的程序
- web中的路径问题
- GStreamer资料整理(包括摄像头采集,视频保存,远程监控,流媒体RTP传输)
- 关于GStreamer的一个牛X网页(字符叠加,画中画,屏墙)
- 肚子都笑疼的爆笑笑话有哪些?
- Ubuntu 11.1+ 安装sun-java7-jdk