当值为 0 或者大于 0 时,表示容器在应用启动时就加载这个 servlet;
当是一个负数时或者没有指定时,则指示容器在该 servlet 被选择时才加载。
正数的值越小,启动该 servlet 的优先级越高。
如果我们在 webxml 中设置了多个 servlet 的时候,可以使用 load-on-startup 来指定 servlet 的加载顺序,服务器会根据 load-on-startup 的大小依次对 servlet 进行初始化。不过即使我们将 load-on-startup 设置重复也不会出现异常,服务器会自己决定初始化顺序。
配置 load-on-startup 后,servlet 在 startup 后立即加载,但只是调用 servlet 的 init()方法,用以初始化该 servlet 相关的资源。初始化成功后,该 servlet 可响应 web 请求;如未配置 load-on-startup,容器一般在第一次响应 web 请求时,会先检测该 servlet 是否初始化,如未初始化,则调用 servlet 的 init()先初始化,初始化成功后,再响应请求。
PS:一般我们在开发 web 应用时,都会配置这个参数,有两个好处:1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;2、配置该参数相当于将初始化 servlet 的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应 web 请求。Servlet如何处理多个请求访问?
Servlet容器默认是采用单实例多线程的方式处理多个请求的:
1当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);
2容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servletxml的<Connector>设置线程池中线程数目,初始化线程池通过webxml,初始化每个参数值等等。
3当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者;
4线程执行Servlet的service方法;
5请求结束,放回线程池,等待被调用;
(注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来 *** 作它,照成数据的不一致,因此产生线程安全问题)
从上面可以看出:
第一:Servlet单实例,减少了产生servlet的开销;
第二:通过线程池来响应多个请求,提高了请求的响应时间;
第三:Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;如果是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
第四:每一个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求。
Servlet容器如何同时来处理多个请求
Java的内存模型JMM(Java Memory Model) ,JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。
Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程。
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。
Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,对于Tomcat可以在serverxml中通过<Connector>元素设置线程池中线程的数目。
注意:服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。 SingleThreadModel接口在servlet规范中已经被废弃了一、概念:
1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
2、filter:filter是一个可以复用的代码片段,可以用来转换>第一步:首先要下载i-jetty源码(或者直接下载i-jetty APP安装也可以)。
第二步:i-jetty安装成功后就可以开发servlet程序。
第三步:保存并编译上面自己写的源码
第四步:找到Android SDK下面的dxbat批处理文件(如果对SDK进行过环境变量的配置可以直接在DOS页面中使用dxbat命令),比如位置为:F:\办工具软件\adt-bundle-windows-x86-20130917467161976\adt-bundle-windows-x86-20130917\sdk\build-tools\android-43;然后执行下面的命令。
dxbat --dex --output=F:\JAVAWEB\PrintInfo\WebRoot\classeszip F:\JAVAWEB\PrintInfo\WebRoot\WEB-INF\classes F:\JAVAWEB\PrintInfo\WebRoot\WEB-INF\lib
第五步:把生成的classeszip放在WEB-INF目录下面的lib目录下,把原先的classeszip文件删除。
第六步:打包程序。在MyEclipse中找到项目刷新后可以在lib下看到classeszip文件,这时右击项目名选择Export --> Java EE --> WAR file 点击保存位置和完成就可以了,然后把war文件拷贝到手机或者ARM下面i-jetty安装目录下的webapps下即可,重启程序即可访问了。
第七步:测试
Servlet(Server Applet),全称Java Servlet,本质上就是一个java类。
servlet工作原理:
1、创建servlet(继承>
2、部署servlet(servlet是组件,必须放在容器中,使用容器访问),第一:把class文件放在WEB-INF下的classes文件夹里,第二:配置webxml文件。
3、启动服务器,url直接在浏览器地址栏中访问servlet,调用doGet方法。
没现成代码。 你研究试试
你自己写一个servlet,在init方法中进行监听即可,在部署文件webxml中,将这个servlet设置为load-on-startup即可。如:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>commyservletmyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet/</url-pattern>
</servlet-mapping>
这样,tomcat启动时便加载这个servlet,其init方法会自动被调用
相当于server socket 写在servlet里
具体可以百度"WEB服务器启动时加载一个ServerSocket服务"SpringMVC中添加的Servlet是用来干什么的?最近在看SpringMVC部分,MVC通过java配置类重载onStartup方法来添加的Servlet,这个Servlet在实际开发中是做什么的? 我知道还能添加filter和listener,但是controller层和service层不是已经对数据进行处理了吗?那Servlet还能用来干嘛呢?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)