http://www.ibm.com/developerworks/cn/java/j-lo-servlet/
Servlet
是一门用于开发动态Web资源的技术
ServletAPI 基于Request-Response模型,Http也是基于Request-Response模型的,所以Serlvet可以用用来开发基于HTTP web应用程序。
在JavaEE的API中有个Servlet接口,开发一个动态web资源即开发一个java程序向浏览器输出数据,需要完成两个步骤
1,编写一个java类,实现servlet接口
2,将开发好的java类部署到web服务器中
在eclipse中的演示
1,创建web project
2,编写class继承HttpServlet//HttpServlet类是Servlet接口的一个子类的子类,是抽象类,是专用于Http协议的Servlet技术
3,在web.xml中配置Servlet程序的虚拟访问路径,让用户在浏览器上可以通过该路径访问管理动态资源的Serlvet程序
,在web.xml中添加<servlet>标签,为其命名<servlet-name>,将程序的全类名写入<servlet-class>标签中,最后再添加<servlet-mapping>为其设置虚拟路径
<servlet>//注册servlet程序 <servlet-name>HelloServlet</servlet-name> <servlet-class>HelloServlet</servlet-class> <load-on-startup>1</load-on-startup>//这个标签来确定servlet服务时是否是在服务器启动时加载,数字为服务器加载优先级。常应用于服务器启动时加载一些框架。 </servlet> <servlet-mapping>//注册程序路径 <servlet-name>HelloServlet</servlet-name>//与上面注册的servlet名称要对应 <url-pattern>/hello</url-pattern>//访问路径/开头 </servlet-mapping>
4,在class中覆盖doGet和doPost方法
public class HelloServlet extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("get请求。。。"); resp.setContentType("text/html;charset=utf-8");//设置文件类型以及编码表 PrintWriter out = resp.getWriter();// 获得像浏览器输出的流 out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<meta charset="UTF-8">"); out.println("<title>Insert title here</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello 看看请求是什么</h1>"); out.println("</body>"); out.println("</html>"); }
Servlet动态的去生成一个网页html文件过程
用户在客户端发起url请求访问servlet虚拟路径,执行servlet程序,如果是get方式提交会执行doGet方法,如果是post方式请求会执行doPost方法,将html文件通过流动态的打印到浏览器上,浏览器对文件进行解析显示。
Servlet接口生命周期
主要表现在下面的三个方法上。
init(ServletConfig config)初始化
service(ServletRequest req, ServletResponse res)提供服务方法
destroy()销毁
在web服务器中提供了servlet服务的容器,类似对外暴露的接口用来接收servlet服务,当客户端访问服务器时,服务器在servlet容器中构造了一个servlet实例服务,并调用了init初始化方法和service服务方法,之后只要没有调用destory()方法,容器中一直存在serlvet服务的实例,接下来的访问都是只调用service方法,当WEB应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet新实例时,Servlet容器会先调用Servlet的destroy()方法,在destroy()方法中可以释放掉Servlet所占用的资源。
从以上可以看出,Servlet是一个供其他java程序(Servlet引擎)调用的java类,他不能独立运行,他的运行完全Servlet引擎控制,针对客户端的多次Servlet请求通常情况下,服务器只会创建一个Servlet实例对象,也会是说Servlet一旦创建,他就会驻留在内存中,为后续的其他请求服务,直至web容器退出Servlet实例对象才会销毁,在Servlet的整个生命周期内,Servlet的init方法只被调用一次,而对一个Servlet的每次请求都导致Servlet引擎调用一次Servlet的service方法,对于每次访问请求,Servlet引擎都会创建一个新的Http创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象(这些是在服务器中完成的,也就是说由服务器提供其实现方法)然后将这两个对象作为参数传递给他调用的servoce方法,service方法再根据请求方式分别调用其他方法,此行为是从HttpServlet中继承过来的所以一般也不需要复写。另外对于init方法如果需要复写的话只需要复写无参的init方法即可,重载的有参init方法内部都会调用init()方法,且doget与dopost方法也可以互相调用简化开发,但是注意死循环。
Servlet路径映射
客户端是通过路径访问Servlet类的,Servlet的路径映射是通过web.xml中的<url pattern>标签元素完成的,一个Servlet是可以配置多个访问路径
URL配置格式三种
1,完全路径匹配以/开始,/代表根目录
2,目录匹配以/*结尾,目录下的所有路径都会访问
3,扩展名匹配(不能以/开始,以*.开头)*.do表示以do为扩展名的路径都会访问
当客户端存在多个访问路径同时访问时同一个Servlet时,优先级1》2》3。
相对路径与绝对路径的区别,相对路径是相对于当前页面的路径,相当于在当前路径下+相对路径,而绝对路径就是从根目录开始的全路径。当页面form表单提交时,action属性设置访问路径时,可以设置为相对路径也可以设置为绝对路径,但是要注意相对路径下是否是服务器端所要访问资源的路径。