一。javaweb的三大组件
*servlet
*fileter
*listener
二。servlet处理模式
·接受请求的数据
·处理请求
·完成响应
三。Servlet单例对象注意事项
*实现servlet
·实现servlet的接口
·集成httpServlet类
·servlet由tomcat调用
·servlet对象由服务器创建
·servlet是单例的,一个类只有一个对象
·servlet线程不是安全的。(为什么Servlet是不安全的)
servlet的是单例模式,当出现并发性访问时,调用的是同一个servlet的,若servlet中存在成员变量,那么在相互调用成员变量是会出现相互影响。所以初学者在使用servlet事不要声明成员变量,可以使用局部变量
·使用 <load-on-startup></load-on-startup>控servlet中什么时候加载(讲解)
·默认是在首次访问时servlet时创建单例servlet的对象
四。servlet简单demo
(1)demo的目录结构
(2)直接上代码
package com.demo.test; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * @urlPatterns 访问的路径 http://lcoalhost:8080/Study/BServlet * @initparams 初始化参数 调用的是init(ServletConfig config) 方法。 * @WebInitParam 参数 key - value的形式 * */ @WebServlet( urlPatterns = { "/BServlet" }, initParams = { @WebInitParam(name = "ignor", value = "a,b,c") }) public class BServlet extends HttpServlet { //这里主要是模拟一下初始化参数问题,存在并发性问题。 private String [] ignor; private static final long serialVersionUID = 1L; //初始化参数 public void init(ServletConfig config) throws ServletException { ignor = config.getInitParameter("ignor").split(","); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(ignor[0]+"\t"+ignor[1]); response.getWriter().append("Served at: ").append(request.getContextPath()); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
访问:http://lcoalhost:8080/Study/BServlet
结果:
eclipse打印台输出的结果是由于本人还做了Filter的测试。从控制台我们可以看出,我们通过url地址访问后,能够打印出我们的赋值,就说我们赋值是成功。那么servlet是通过什么方法给成员变量赋值的呢?下面我们做另一个测试。
package com.demo.test; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * @urlPatterns 访问的路径 http://lcoalhost:8080/Study/BServlet * @initparams 初始化参数 调用的是init(ServletConfig config) 方法。 * @WebInitParam 参数 key - value的形式 * */ @WebServlet( urlPatterns = { "/BServlet" }, initParams = { @WebInitParam(name = "ignor", value = "a,b,c") }) public class BServlet extends HttpServlet { //这里主要是模拟一下初始化参数问题,存在并发性问题。 private String [] ignor; private static final long serialVersionUID = 1L; //初始化参数 // public void init(ServletConfig config) throws ServletException { // ignor = config.getInitParameter("ignor").split(","); // } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(ignor!=null) { for (String string : ignor) { System.out.println(string); } } response.getWriter().append("Served at: ").append(request.getContextPath()); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
我们将init(......)方法注释掉访问:http://lcoalhost:8080/Study/BServlet
结果
很明显,eclipse并没有打印出ignor的参数。那么我们就可以得出结论,初始化参数的地方在init(.....)方法内
五。servlet加载问题。
(1)
package com.demo.test; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /* * @urlPatterns 访问的路径 http://lcoalhost:8080/Study/BServlet * @initparams 初始化参数 调用的是init(ServletConfig config) 方法。 * @WebInitParam 参数 key - value的形式 * */ @WebServlet( urlPatterns = { "/BServlet" }, initParams = { @WebInitParam(name = "ignor", value = "a,b,c") }) public class BServlet extends HttpServlet { //这里主要是模拟一下初始化参数问题,存在并发性问题。 private String [] ignor; private static final long serialVersionUID = 1L; //初始化参数 public void init(ServletConfig config) throws ServletException { System.out.println("B开始加载了。。。。。"); ignor = config.getInitParameter("ignor").split(","); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(ignor!=null) { for (String string : ignor) { System.out.println(string); } } response.getWriter().append("Served at: ").append(request.getContextPath()); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
(2)
package com.demo.test; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class EServlet */ @WebServlet(loadOnStartup = 1, urlPatterns = { "/EServlet" } ) public class EServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see Servlet#init(ServletConfig) */ public void init(ServletConfig config) throws ServletException { } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
结论:由(1)和(2)比较可知,servlet加载默认为首次访问servlet对象时创建,可以通过loadOnStartup来改变加载的时刻。