是为动态web开发提供的一种技术,至关对http协议,请求的数据,响应的数据作了封装。
不属于j2SE,须要看j2EE的文档,servlet只是其中一种技术。
1.实现servlet的接口(须要tomcat的lib中servlet-api.jar包的支持) 2.配置项目中web.xml的servlet的映射,部署到web服务器中
service():请求一个servlet,服务器会自动调用这个方法。
servlet的生命周期通常是从第一次访问开始建立到服务器关闭。
实际项目目录:html
而是在response中,而后tomcat将response的数据写给客户端浏览器。java
response.getOutputStream().write("test servlet demo".getBytes());
右击选择refactor->rename(或者快捷键alt+shift+r),修改变量名这能够用这个快捷键,会将关联的也会改变,但xml中关联的不会改变,好比修改
servlet的名字,web.xml中的名字须要手动去更改。
若是新的项目和已有的项目原来是重名的,只是改变项目文件夹的名字是不够的。还须要修改映射的路径。web
对于test2_web项目名字确实已经改变,eclipse能够经过修改配置属性修改映射。数据库
可是其contex即映射并没被修改仍是映射原来的web项目apache
修改成:windows
并且能够泛指但只能是“*.某某”或“/*”;分别表示以某某结尾或者任何访问都执行该servlet。api
首先选择匹配最高的,对于直接以*开头的优先级最低(没有斜杠)。浏览器
对于web访问,首先都是去查找servlet配置:即便是访问静态html页面tomcat
好比:1.html时候,实际是执行缺省的servlet(这个servlet指向的项目中的静态网页),只是这个被默认配置在tomcat的conf/web.xml中配置,而后它会去找同名的静态页面。安全
若是在项目WEB-INF/web.xml配置这个缺省的“/”路径,那么就只会执行本身配置的servlet。而且项目下的那些静态页面都不能访问到了。(所以通常不会在项目中再如此配置)
servlet的init方法只执行一次,
每次访问,service方法执行一次,
而且每次生成新的request和response对象(只是这两个对象生命周期极短,不用考虑多个对象占用系统空间)。
多个这样servlet配置,load-on-startup的参数正数,数值越小优先级越高,即建立在前。(struts框架就是一个服务器启动建立的特殊servlet)
在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet。当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。
(补充:对于共享对象方法内部的局部变量是线程安全。
servlet曾提供实现singleThreadModel(servlet2.4过期)标记接口(接口里没有任何东西。如:序列号接口,克隆接口)的方式,
原理是:当原来的servlet响应没有完成,又有新的访问,tomcat会建立一个新的servlet来处理,这会存在一个问题,就是两次的结果会是同样。
单个参数获取
多个参数获取:
1.字符集类型 2.链接数据库类型 3.数据库密码 4.指定配置文件。
获取servletContex的方式:从类中获取,或者从config获取
不一样servlet读写的例子:
写入contex:
读:
获取:
能够用于配置共享的数据链接须要的参数,适用于多个servlet来访问。
经常使用于将servlet处理的结果转发给jsp作好布局后返回浏览器。
(补充:经常使用的配置有xml和properties。对于存在关系配置用xml,如父子或兄弟关系)
利用读取资源文件的方式加载配置:
注意两个东西:
1.放在src(src目录只是eclipse为显示而存在的,项目文件并不会存在)目录中的db.properties,eclipse会自动复制放在WEB-INF/classes/中,获取路径注意! (放在eclipse的webContent目录中的db.properties实际就是项目的目录下即:/db.properties) 2.对于properties文件流,有专门的properties对象来加载和获取配置。
特别注意一个问题:
1.若是用文件流读取:new file("/WEB-INF")的/表明的路径并非项目的根目录!而是启动该项目应用程序的路径,能够是eclipse也多是tomcat的安装路径
File file = new File(""); System.out.println(file.getAbsolutePath());//路径是相对eclipse安装路径的(绝对路径:F:\eclipse-jee-juno-win32\eclipse)
new Properties().load(new FileInputStream(file));
而且java项目和web经过文件流读取的相对路径也是不一样的!
2.若是要用文件流的方式读取:能够经过下面方法得到项目的绝对路径再用:
String realPath = getServletContext().getRealPath("WEB-INF/classes/db.proterties"); System.out.println(realPath);//E:\apache-tomcat-6.0.48-windows-x86\apache-tomcat-6.0.48\webapps\test_web new Properties().load(new FileInputStream(realPath));
这种方式一个好处是可以直接得到文件所在的具体路径,若是要作上传下载颇有用。前面那种方式只能读取配置中的信息。
1.补充:非web项目读取配置:
(db.properties在src目录下)
从java项目中获取配置文件的方式:(经过类加载器的方式)
void f(){
InputStream resource = TestOut.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties2 = new Properties(); properties2.load(resource);
}
(服务器不重启)这种方式的一个弊端是资源文件只会加载一次(加载器加载文件首先判断文件名字是否已经加载),那么修改配置文件调用上面的代码读取到的仍是原来的配置内容。
能够先经过加载器得到具体的路径,而后经过文件读取得到:
void getProperties() throws IOException, FileNotFoundException { String path = TestOut.class.getClassLoader().getResource("db.properties").getPath();//获得文件路径 Properties properties2 = new Properties(); properties2.load(new FileInputStream(path)); }
2.补充: 配置读取乱码的问题。java流读取properties输出乱码的问题
主要是由于程序默认流读取是用iso-8859-1