标签:
1.servlet(重点) 2.ServletConfig(次重点) 3.ServletContext(重点) 1.Servlet:服务器端小应用程序 它运行在Servlet容器中,它是由服务器直接解析运行。 2.创建一个servlet步骤: 1.创建一个类,去继承HttpServlet(实现Servlet接口 或继承 GenericServlet) 2.重写方法 doPost doGet (接口中需要将所有方法重写,但是service方法是处理请求) 3.在web.xml文件中配置 3.servlet生命周期 1.创建servlet,并调用init方法 2.通过service方法来处理请求。 3.通过destroy来销毁servlet。 当我们创建一个servlet时,第一次访问,会创建servlet对象,并调用init方法,init方法只调用一次。 开启一个线程来调用service方法。 当下一次在访问时,又开启一个线程来调用service方法。 servlet对象,一般情况只创建一次,它常驻内存。 当服务停止,或servlet对象销毁时会调用destroy方法。 注意:如果在servlet中创建了成员变量,就可以出现线程安全问题 在开发中,尽量避免在servlet中创建成员变量。 如果创建了,就需要同步。 4.关于Servlet接口中service方法与HttpServlet中的doPost,doGet什么关系? 一个servlet被访问时,它默认处理请求的是service方法,这个方法是在Servlet接口中定义的。 根据请求的url,在web.xml文件中查找到具体的servlet, 会默认调用service方法。 对于我们来说,它在HttpServlet中对service方法进行了重写,执行其内容 在HttpServlet的service方法中,会根据请求方式的不同,分别调用不同的方法。 根据java中的多态,在调用doPost,doGet时,会调用的是我们自己的servlet中的方法。 这里面涉及到一个java模式:模板方法模式 --------------------------------------------------------- 5.模板方法模式: 6.关于servlet自动加载. 我们可以通过设置让servlet跟随服务器启动而创建. 只需要在servlet配置中<servlet>这个标签中加上 <load-on-startup>2</load-on-startup> 问题1:servlet跟随tomcat启动有什么作用? 就是用来加载资源。 问题2:load-on-startup它的值可以取什么? 优先级有10个,是从1-10,1已经被占用了,我们在使用时,一般情况下是从2开始。 数值越小优先级越高。 优先级相同情况下根据配置的顺序加载。 ---------------------------------------------------------------------- 7.关于servlet配置中的url-pattern问题 问题1:一个servlet是否可以被映射到多个路径? 可以的,一个servlet允许被不同的路径映射. 问题2:url-pattern它的写法是什么样的? 1.完全匹配 要求必须以 /开始。 以下两种可以使用通配符. * 2.目录匹配 必须以/开始,以*结束。 3.扩展名匹配 不能以/开始,以*.xxx结束. 最经典错误 *.do 以上三种配置有优先级: 完全匹配>目录匹配>扩展名匹配 ---------------------------------------------------------------------- 8.web开发中的路径问题 问题是:浏览器访问服务器有几种访问方式? 1.直接在浏览器地址栏上输入url 2.超链接. 3.表单 4.javascript 请求的方式最常用的是post get 除了表单可以post请求,其它的都是get请求。 访问servlet路径问题 1.绝对路径 1.带协议 <a href="http://localhost:8080/day7_2/demo1">demo1Servlet</a> 这种方式在开发不常用,如果使用这种方式,一般是用于访问站外资源。 2.不带协议 在浏览器端写一个"/"相当于是服务器的根路径. <a href="/day7_2/demo1">demo1Servlet</a> 对于"/"它相当于是 http://localhost:8080也就是说,我们直接在"/"后面加上我们的工程名,在加上我们的资源名称就可以。 这种方式在开发中应用比较多,因为它一般用于访问站内资源。 2.相对路径 http://localhost:8080/day7_2/demo1 servlet路径 http://localhost:8080/day7_2/admin.html html路径 通过它们的路径,我们发现它们是一个级别,那么我们在访问时,就可以写成以下效果. <a href="./demo1">demo1Servlet</a> 这个路径可以简化成 <a href="demo1">demo1Servlet</a> 在WebRoot下创建一个jsps目录,将admin.html放置到其中。那么在访问时,绝对路径不会出问题。 相对路径失效。怎样修改它? http://localhost:8080/day7_2/demo1 http://localhost:8080/day7_2/jsps/admin.html 路径: <a href="../demo1">demo1Servlet</a> ----------------------------------------------------------------- 结论:在开发中,推荐使用不带协议绝对路径。 写法: /工程名/servlet的url-pattern的值. ------------------------------------------------------------------------------------------ 9.关于Servlet接口中的init方法 问题1:在Servlet接口中定义的init方法是有参数的,它的参数类型是ServletConfig,而我们重写的init方法没有参数,为什么? 原因:父类中已经将init(ServletConfig config)这个方法进行了重写,而我们在自己的Servlet中就不需要在重写了, 我们重写的init()它不是接口中定义的,而是在父类中定义的。 细节:在GenericServlet中对Servlet接口中的init(ServletConfig config)进行了重写,并且调用了自己定义的一个 init()方法。那么我们在自己的Servlet类中重写了init()方法,根据多态就会调用我们自己的init()方法。 问题2:ServletConfig是什么?它有什么作用? 在GenricServlet中将ServletConfig对象保存到了GenericServlet中。 public void init(ServletConfig config) throws ServletException { this.config = config; this.init(); } ServletConfig对象,代表的是Servlet的配置对象。 当去访问一个servlet时,就会实例化这个servlet对象,并且会创建一个servletConfig对象,将这个对象通过init方法传递到servlet中。 那么我们就可以在自己的servlet中获取Servlet的配置信息. 获取ServletConfig对象: this.getServletConfig(); ---------------------------------------------------------------- 10. ServletConfig对象 功能: 1.可以获取Servlet的name。 2.可以获取初始化参数 是我们可以在Servlet的配置中通过<init-param>来进行配置, 对于这些配置,我们可以通过ServletConfig来获取. 通过初始化参数,我们可以进行预定义信息的加载,这种操作一般情况是在框架中应用。 3.可以获取ServletContext对象 常用API总结: public String getServletName(); 用于获取Servlet名称 public String getInitParameter(String name); 用于获取init-param中指定名称的value值. public Enumeration getInitParameterNames(); 用于获取所有的init-param中的name名称. public ServletContext getServletContext(); 用于获取一个ServletContext对象。 ServletConfig要求掌握内容: 1.它是由服务器创建,通过init方法传递到我们的Servlet中。 我们在Servlet中通过 this.getServletConfig()获取ServletConfig对象. 2.ServletConfig对象是用于获取当前Servlet的配置信息. 1.Servlet的名称 2.Servlet的初始化参数。 每一个Servlet都具有自己的ServletConfig对象。它们之间是不能共享的。 ------------------------------------------------------------------------------------- 11.关于ServletContext对象. ServletContext它代表的是一个web应用。 怎样获取一个ServletContext对象? 可以通过ServletConfig对象获取. ServletConfig.getServletContext(); 作用: 1.它可以获取全局初始化参数 String getInitParameter(String name) Enumeration getInitParameterNames() 在web.xml文件中可以配置我们的全局初始化参数 <!-- 配置全局初始化参数 --> <context-param> <param-name>name</param-name> <param-value>tom</param-value> </context-param> 它的配置是针对于整个web应用. 2.它可以帮助我们让servlet实现信息共享. ServletContext是一个域对象,提到域对象想到两件事,一个是它相当于是一个Map,另一个它有作用域,对于 ServletContext它的作用域是整个web应用。 示例:统计站点访问次数 问题:怎样判断是第一次访问 setAttribute(String name,Object value); getAttribute(String name); removeAttribute(String name); 3.可以获取路径(资源)*********************** 在web开发中,如果要想获取资源,必须使用绝对的磁盘路径。 怎样可以得到在服务器上的文件的绝对磁盘路径? 1.String getRealPath(String s); ServletContext.getRealPath("/"); 得到当前工程在磁盘上的绝对路径。 2.URL gerResource(String s); 得到一个URL路径,它也是指向我们的web工程下的资源。 3.InputStream getResourceAsStream(String s); 得到一个指向资源的输入流. 扩展:对于classes目录下的文件,它有其它的方式可以获取到. Class.getResource("/").getPath(); 获取的就是class文件所有的目录的绝对磁盘路径。 对于存在于classes目录下的文件,我们可以通过classpath的方式去获取其绝对磁盘路径。 4.其它功能(了解) 1.获取MIME类型 String getMimeType(String file) 文件下载时会用到. 2.分发请求 RequestDispatcher getRequestDispatcher(String path) 在开发中不常使用,如果使用通过request对象来操作。 3.日志 log方法是用来处理日志.
标签:
原文地址:http://www.cnblogs.com/jsnan/p/4449381.html