开发一个动态WEB资源(即开发一个java程序向浏览器输出数据),需要完成两步骤
1.编写java类实现servlet接口
2.把开发好得java类部署到web服务器中
HttpServlet在实现servlet接口时,重写了service()方法,该方法内部会自动判断请求方式,get请求调用doGet()方法,
post请求调用doPost()方法,编写servlet时,通常重写doGet()方法或doPost()方法,而不要重写service()方法。
同一个html可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素可以是同一个注册名
在Servlet的映射中可以使用*通配符,但只有两种固定格式:
1 *.do 2 /action/*
URL地址冲突时 2的优先级比1的优先级高,其余的最像哪个访问哪个。
服务器由Servlet引擎调用Servlet类,Servlet不能独立运行,它的运行完全由Servlet引擎控制和调度。
如果在<servlet>元素中配置了<load-on-startup>正整数</load-on-startup>,那么web应用在启动时,就会装载并
创建Servlet的实例对象,以及调用Servlet实例对象的init()方法,配置的正整数值越小,越先启动。
用途:为web应用写一个InitServlet(启动初始化类),这个servlet配置为启动装载,为整个web应用创建必要的数
据库表和数据。
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet是当前WEB应用的缺省Servlet。
在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都交给缺省Servlet处理,也就是缺省
Servlet处理其他Servlet不处理的请求。Tomcat服务器配置了缺省Servlet。
访问web应用url地址时,访问html等非servlet文件,都是由一个缺省servlet类调用请求的html等文件,然后把文件
返回给客户端。因此客户机向服务器发请求不管发什么请求都是找Servlet。缺省Servlet找不着文件回送404状态码。
当多个客户端访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用
service()方法,因此service()方法如果访问了同一个资源(成员变量或者调用的静态资源),就可能引发线程安全问
题。
静态(static)的数据在类装载的时候就有了,无论new 多少个对象访问这个数据都是访问的同一个静态资源。静态
成员会被类的所有对象所共享。静态成员不会被垃圾回收,静态的对象要慎用。或者创建一个方法在最后调用,在数
据没用时把静态对象释放掉。
解决线程安全问题,把整个线程代码套在sychronized(this)方法中,第一个线程解决完才能开始第二个线程。同一时
间只能一个线程访问,web应用不要布置,否则客户无法访问网页。可以用数据库控制同步问题。
标志接口,接口内容空,实现了标志接口就是打上一个标志,可以实现一些不被允许的功能。
<servlet>
ServletContext接口实现整个WEB应用所有Servlet资源的共享
ServletContext想要访问getAttribute()的类,需要先建立实现相应setAttribute()类的连接。
<context-param>
<param-name>xxx</param-name>
<param-value>yyy</param-value>
</context-param>
在web.xml中<web-app>元素中配置整个web应用的初始化参数。
<init-param>
<param-name>xxx</param-name>
<param-value>yyy<param-value>
</init-param>
在web.xml中<servlet>元素中配置这个servlet的初始化参数。
ServletContext.getRequestDispatcher()方法可转发请求,符合MVC设计模式
servlet处理完请求后转发给jsp显示(美化修饰数据)
RequestDispatcher rd = this.getServletContext().getRequestDispatcher("xxx.jsp");
//路径是相对映射路径 ("/ServletDemo10")
rd.forward(request,response);
配置文件配置有关联数据用.xml 配置无关联数据用.properties
需要读取文件的名字用 this.getServletContext().getRealPath("/db.properties");// 读取绝对路径
只需要读取文件中的数据用 this.getServletContext().getResourceAsStream("/db.properties");//映射路径
访问myeclipse.src中的文件在WEB-INF中的classes文件夹中
FileInputStream in = new FileInputStream("/classes/db.properties")
相对于Java虚拟机启动的目录,程序启动的目录。(传统方式不可取)
src目录中的文件用ServletContext读取
不是实现Sevlet的类调用web中的文件资源,用类装载器(ClassLoader),只能装载类目录下面的文件
,相对于classes文件夹的路径。
注意! 用类装载器getResourceAsStream()方法读取("db.properties")路径读取的是src根目录下的文件
ServletContext读取文件是更新的文件;类装载器读取文件开启服务器后,不会读取更新的文件。
只要虚拟机不停止,类装载器只会加载一次文件。
解决办法:想获取更新后的数据,用类装载器获取文件url路径,然后获取绝对路径,用传统方式读取数据。
类装载器读大文件,内存会溢出,类装载器适用开发当中配置文件不太大。
对于不经常变化的数据,在Servlet中可以为其设置合理的缓存时间值,以避免浏览器频繁向服务器发送数据,提升
服务器性能。大访问量的服务器必须要考虑。