Servlet (动态web资源)

开发一个动态web资源(即开发一个Java程序向浏览器输出数据) 需完成以下两个步骤

  1.编写一个Java类,实现servelet接口

  2.把开发好的Java类部署到web服务器中

servlet入门(用servlet 在一个网页中显示 helloworld)(动态)(不使用IDE的情况下)

  1.在tomcat中新建一个web应用,然后在web应用中新建一个 web-inf/classes目录
  2.在classes目录中新建一个FirstServlet

 

 public class FirstServlet extends GenericServlet {
public void service(ServletRequest req,ServletResponse res) throws ServletException,java.io.IOException {
OutputStream out = res.getOutputStream(); //字节流
out.write("hello world!!".getBytes()); //"hello world!!" 是字符 需变成字节
}
}

  3.set classpath=%classpath% .............servlet.jar 编译servlet

  (因为servlet属于j2ee,不是j2se,所以,需要配置一下classpath)(在dos命令行中)

  4.在web-inf目录中新建一个web.xml文件,配置servlet对外访问路径

  5.启动tomcat 访问

Servlet调用过程:
  1.连上web服务器

  2.发送http请求

  3.解析出想访问的主机名

  4.解析出想访问的web应用

  5.解析出想访问的web资源

  6.第一次创建servlet实例对象

  7.调用servlet对象的init方法完成初始化

  8.创建代表请求的request和代表响应的response调用servlet的service方法响应客户端请求

  9.service方法执行,向代表客户端响应的response对象写入了向客户机输出的数据

  10.service方法返回

  11.从response中取出数据,构建出HTTP响应,回写给客户机

  12.回写HTTP响应

  13.浏览器解析HTTP响应 显示数据

注:HttpServlet在实现了Servlet接口时,覆写了service方法,当继承了HttpServlet后  就不需要再写service方法,只需要写doGet  或者 doPost方法里面处理

Servlet的小细节:

  1.同一个Servlet可以被映射到多个URL上,即可以写多个<servlet-mapping>,也可以使用*通配符,但是只能有两种固定格式:

  一种格式是: " *.扩展名 ",  另外一种格式是(/*)

  2.web.xml文件的更改,不需要重新发布工程,会自动更新

  3.使用 * 通配符可能出现地址冲突的问题,都匹配某个请求的情况:遵循: 1.选长得最像的响应 2.通配符在前优先级最低

  4.Servlet不能独立运行,它的运行完全由Servlet引擎(web服务器用来调Servlet的java程序)来控制和调度

  5./*针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,

  也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其他请求服务,直至web容器退出(Tomcat关闭),servlet实例对象才会销毁*/

  6.在servlet的整个生命周期内,这个servlet的init方法只被调用一次,而对一个servlet的每次访问请求都导致servlet引擎调用一次service方法,

  对于每次访问请求,servlet请求都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,

  然后将这两个对象作为参数传递给它调用的servlet的service()方法,service方法再根据请求方式分别调用doXXX()方法

  7.如果在<servlet>元素中配置了一个<load-on-startup>(里面可以写正整数,数字越小,优先级越高)元素,

  那么WEB应用程序在启动时,就会装载并创建servlet的实例对象,以及调用servlet实例对象的init()方法 用途:在特定时刻,为web应用创建必要的数据库表和数据

  8.如果某个servlet的映射路径仅仅为一个 (/),那么这个servlet就成为当前web应用程序的缺省servlet 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,

  它们的访问请求都交给缺省servlet处理,也就是说,缺省servlet用于处理所有其他servlet都不处理的访问请求

  在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个servlet设置为可缺省servlet

  由上: /*当访问tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet*/

  9.servlet的线程安全问题:service方法如果操作共享资源,则有可能出现线程安全问题

  如果某个servlet实现了SingleThreadModel接口(标记接口,无方法),那么servlet引擎将以单线程模式来调用其service方法

  (如果多个线程同时访问某个资源,则产生对应的多个servlet实例对象,并发的每个线程分别调用一个独立的servlet实例对象)

  实现SingleThreadModel接口并不能真正解决servlet的线程安全问题,因为servlet引擎会创建多个servlet实例对象,

  而 /*真正意义上解决多线程安全问题是指一个servlet实例对象被多个线程同时调用的问题*/ 故 SingleThreadModel接口(过时的)

web服务器在调用servlet的时候,会传递给servlet很多对象:前面讲到了ServletRequest , ServletSponse 还有一些其他的对象:如ServletConfig ServletContext session cookie 等

1./*ServletConfig对象(用于封装servlet的配置信息)*/

在Servlet的配置文件中,可以使用一个或者多个<init-param>标签为servlet配置一些初始化参数

在servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,

将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息

该对象的作用: 1.获得字符集编码 2.获得数据库连接信息 3.获得配置文件,查看struts案例的web.xml文件

2./*ServletContext对象 (代表当前web应用)*/

  WEB容器在启动时,它会为每个web应用程序都创建出一个对应的ServletContext对象

  ServletConfig对象中维护了ServletContext对象的引用(即可以通过ServletConfig.getServletContext方法获得 (因为继承了HttpServlet也可以直接this.getServletContext ))

  ServletContext方法的应用

    1.多个Servlet通过ServletContext对象实现数据共享 ServletContext对象通常被称之为context/*域*/对象 (ServletContext域这个容器的作用范围:应用程序范围)

    2.获取web应用的初始化参数 <context-param>标签定义的参数为web应用的初始化参数 (会自动封装到ServletContext中)

    (ServletContext出生:web服务器启动(为每个web应用配一个ServletContext),死亡:web服务器关闭,或者web应用被删除)

    3.实现Servlet的转发(与重定向有所区别:Servlet的转发:别人找我借钱,我帮他向别人借 重定向:别人找我借钱,我让他找别人借)

    Servlet不适合用作数据的输出(网页要弄美观很麻烦),所以需要转给JSP(JSP可以看作一种特殊的Html,里面可以写java代码的Html)(用来专门显示数据)

    4.ServletContext读取web应用中的资源文件

    5.web应用中的普通Java程序如何读取资源文件 (servlet文件通过ServletContext,非servlet文件通过类装载器)

最新文章

  1. 《DOM Scripting》 - 阅读笔记
  2. NOR Flash擦写和原理分析
  3. 开发者必知的几款App快速开发工具
  4. 金士顿U盘,群联PS2251-60主控,量产CDROM教程
  5. Python命令 (if __name__==&quot;__main__&quot;:)
  6. 山东理工大学第七届ACM校赛-飞花的线代 分类: 比赛 2015-06-26 10:29 10人阅读 评论(0) 收藏
  7. PhP访问mysql数据库的基本方式
  8. 通过新浪ip地址库获得用户的省份、城市等信息
  9. T—SQL用法剪辑,方便以后查看
  10. Encryption
  11. GemFire
  12. delphi 程序是否为控制台编译选项
  13. jQuery对下拉框、单选框、多选框的处理
  14. How do JavaScript closures work?
  15. cookie创建,删除
  16. C#学习之设计模式:工厂模式
  17. Qt551.窗口滚动条
  18. 微信企业付款获取RSA
  19. SQL Server 2008 安装(lpt亲测)
  20. mysql 下 计算 两点 经纬度 之间的距离(转)

热门文章

  1. 解决 Windows启动时要求验证
  2. fatal error: nvcuvid.h: No such file
  3. 分布式消息通信之RabbitMQ_01
  4. 《精通并发与Netty》学习笔记(09 - Java中流的概念)
  5. python 3 获取本机公网ip的几种方法
  6. Design HashSet
  7. kafka2.10集群搭建(一)
  8. [转帖]Linux日期和时间的那些事儿
  9. Photon Server初识(六) --- 客户端与服务端消息传递
  10. php中的访问类型(public,private,protected)