Servlet基本概念Servlet,服务器端的小程序,它是相对于Applet而言的,Applet是客户端小程序。Servlet,是接受来自网络的请求(form表单,以及其他的请求),并对不同请求作出不同的响应Servlet,是基于Http协议的,是运行在web服务器中的程序。servlet是运行在web容器中,这个web容器可以控制Servlet对象的生命周期,控制请求由Servlet对象处理。web服务器,这里的服务器不是硬件概念,而是软件,常用的web服务器有Tomcat,Jboss等,我们所用到的Tomcat是一个开源的服务器,Tomcat是一个用java语言编写的web服务器,所以需要有相应的java运行环境,也就是JVM,还要配置tomcat的具体路径。Servlet环境配置JAVA_HOME=/XXX/XXX/(JDK路径,bin的上一层目录)CATALINA_HOME=/XXXX/XXX(tomcat的绝对路径windows中X:\xxx\xxx)Tomcat使用在启动Tomcat时,是运行Tomcat的bin目录下的startup.sh(windows中使用startup.bat)Linux中要显示后台的具体信息,则不能使用startup.sh而要使用catalina.shrun判断Tomcat是否启动成功,可以在浏览器的地址栏中使用或可以访问到tomcat的主页就是启动成功了。要想停止tomcat服务器要使用shutdown.sh(windows中使用shutdown.bat),如果直接关闭启动窗口,就会造成8080端口占用错误,这时可以在使用shutdown.sh关闭一下服务器。Servlet开发步骤编写servlet源代码,注意servlet的结构编译servlet,需要servlet-api.jar文件(位于$Tomcat\common\lib\目录下;配classpath环境变量中)部署servlet编写配置文件web.xml:其中包括servletburl与servletname的映射,以及servletname与servletclassname的映射构造web应用程序目录结构如下:└─MyWebApp└─WEB-INF└─classes└─lib└─*.html/*.jsp配置文件web.xml放在WEB-INF目录下servlet类文件放在classes目录下将整个应用程序目录拷贝到$Tomcat\webapps\目录下web.xml文件的写法?xmlversion=1.0encoding=ISO-8859-1?web-appxmlns=:xsi=:schemaLocation=://java.sun.com/xml/ns/j2ee/web-app_2_4.xsdversion=2.4servletservlet-nameIpLogServlet/servlet-nameservlet-classalan.servlet.lc.IpLogServlet/servlet-classinit-paramparam-namefilename/param-name//getServletConfig().getInitParameter();param-valuec:/iplog.txt/param-value/init-paramload-on-startup2/load-on-startup//在服务器启动的时候就创建该servlet实例,/servlet必须是正数,小的数先创建servlet-mappingservlet-nameIpLogServlet/servlet-name//要和servlet标签中的相同url-pattern/lc/iplog/url-pattern//指定servlet相对于应用目录的虚拟路径/servlet-mapping/xxx/xxx(绝对路径),xxx(相对路径)/web-app测试应用在tomcat服务器中,访问应用下的资源可以在端口号后加上web应用文件夹得名字就可以看到资源应用文件夹名/url-pattern,静态页面只能放在web应用的文件夹下,不能够放在WEB-INF文件夹下,WEB-INF文件夹中的资源是受保护的,不能够通过网络访问到。Servlet的调用过程用户通过浏览器向web服务器发送请求服务器为用户定位资源静态资源:/a.html/a/b.html(这里的路径是针对web应用文件夹目录)读文件并把内容发送到客户端动态资源:解析web.xml定位Servlet类的名字装载类(WEB-INF/classes|WEB-INF/lib/*.jar)创建该对象的实例Servletser=(Servlet)(Class.forName(“servle的类名)).newInstance();//我们写的Servlet一定要实现Servlet接口或者继承实现了Servlet接口的类ser.service(request,response);用Servlet处理表单数据FORM元素的属性action:用来指定要处理FORM数据的Servlet的URLmethod:指定数据传送给HTTP服务器的方法解析请求getParameterNames:可以获得一个迭代器Enumeration,通过这个迭代器,来获得form表单中参数的名字。getParameter:返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null;没有任何值,返回空String);多参数同名时,只取一个。getParametervalues:返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组);get&post在浏览器的地址栏操作按回车键,或者是热连接,都是get请求,form的method属性如果不指定,默认为get请求。get请求,会将参数显示在浏览器的地址栏上,其显示格式,在地址之后会以?开始,以'&'分隔参数,可以通过HttpServletRequest()对象的getQueryString()方法来获得get请求的参数值。post请求:ServletRequest对象的getInputStream()方法可以获得一个由Socket得来的输入流,可以使用这个流来实现文件的上传。getReader()方法可以直接获取post请求的参数Servlet的生命周期创建Servlet对象,通过服务器反射机制创建Servlet实例,默认第一次请求时才会创建。调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。init方法当首次创建Servlet时就会调用init方法,而不是每个用户请求都会调用该方法。除非被destroy方法移除,否则不能被重载;init方法一结束,servlet即可接受客户端请求;init方法实例覆盖init(ServletConfigconf)方法时,应该总是在首行调用super.init();或者直接覆盖init();init方法接受ServletConfig作为参数,用以下方法获得参数值:getInitParameter:返回指定参数名称对应的值,如果参数不存在,返回null;getInitParameter:返回指定参数名称对应的值,如果参数不存在,返回null;service方法每当服务器接收到对Servlet的请求时,服务器就会产生一个新线程,并调用service。service方法检查HTTP请求类型,请相应地调用doGet、doPost、doPut、doDelete。被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest);Servlets的多线程安全多线程占用资源少,处理速度快,提高了效率。一些编码建议:对变量和方法定义适当的访问方式,例如单纯取值操作不会有多线程安全问题;同步化所有访问重要数据的实例变量;多线程下所操作的变量,如果操作的是一个变量,且兼有读写操作,就要考虑加上同步,但同步不能乱加,否则会造成死锁问题。并发需要注意的并发的环境:资源处于一个并发的环境共享资源:多个线程共享一个临界资源全面同步:如有n个变量访问同一个资源,这n个变量都得同步。即多个锁一把钥匙,钥匙放在一个共享区域内sychronized(this):粗粒度的锁。是将所有的路都加锁;sychronized(objecto1):细粒度的锁。只对对象中的变量加锁。效率较前面的高,但是较难控制。读写需要互斥sychronized(this):this不能是基本数据类型,必须是Object.不锁对象的引用,而是对象的内存空间servlet中需要同步的:成员变量、文件、静态变量、数据库连接destroy方法服务器决定删除已经加载的Servlet实例之前将调用Servlet的destroy方法;该方法允许Servlet:关闭数据库连接;中止后台线程;将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。**在Servlet终止时处理Service线程在destroy()方法中:如有服务(通过一个同步化的实例方法取得当前线程数大于0),则置关闭状态为false(通过一个同步化的实例方法实现)。然后循环等待服务线程数为0,则置关闭状态为true.在Service()方法中:如见关闭状态为true,便不执行具体逻辑方法,直接退出。HTTPservlet类的基本结构继承HttpServlet实现至少一个service方法,如:doGet(...)和doPost(...)service方法有两个参数,HttpServletRequest和HttpServletResponse:HttpServletRequest代表经过容器加工的用户的请求HttpServletResponse代表需要容器进一步加工的对用户的响应我们写的servlet需要引入javax.servlet.*和javax.servlet.http.*两个命名空间servlet继承关系servlet主要数据结构:Servlet接口:主要定义了servlet的生命周期方法ServletConfig接口:为servlet提供了使用容器服务的若干重要对象和方法。ServletContext接口:是Servlet的上下文对象,这个对象是在服务器启动时创建的,为servlet提供了使用容器服务的若干重要方法。GenericServlet抽象类:为servlet提供了一般的实现(包括实现了servlet和ServletConfig两个接口),保存了容器通过init方法传递给servlet的一个ServletConfig类型的重要对象。HttpServlet抽象类:为处理http请求的servlet提供了一般实现,主要是定义和实现了若干service方法。继承关系:GenericServlet继承了