JAVA WEB从入门到精通day10 Servlet详解
来源:互联网 发布:真牛皮包淘宝网 编辑:程序博客网 时间:2024/05/16 18:47
Servlet
简介
java Servlet 是运行在 Web 服务器或应用服务器上的程序 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。 一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能。
实现Servlet的方式
Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建。 实现Servlet的三种方式: --实现javax.servlet.Servlet接口 --实现javax.servlet.GenericServlet类 --实现javax.servlet.http.HttpServlet类
Servlet生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。--Servlet 通过调用 init () 方法进行初始化。会在Servlet对象创建之后马上执行并且只执行一次--Servlet 调用 service() 方法来处理客户端的请求。每次请求都会调用这个方法并且可以调用多次。--Servlet 通过调用 destroy() 方法终止(结束)。会在Servlet销毁之前执行并且只执行一次。最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
Servlet部署
在WEB-INF/lib/web.xml进行部署<web-app> <servlet> <servlet-name>xxx</servlet-name> //随便取名字 <servlet-class>cn.cad.servlet.ServletDemo1</servlet-class>//servlet类的路径 </servlet> <servlet-mapping> <servlet-name>xxx</servlet-name> //和上面的名字保持一致 <url-pattern>/Aservlet</url-pattern> //通过这个url地址找到名字然后找到servlet类 </servlet-mapping></web-app>然后通过浏览器访问servlet http://localhost:8080/项目名/Aservlet
Servlet的特性
--单例,一个类只有一个对象,有多个servlet类--线程不安全,效率高
ServletConfig类
ServletConfig对象对应web.xml中的Servlet配置信息。 方法 **String getServletName():获取<Servlet-name>里的内容 **ServletContext getServletContext():获取Servlet上下文 **String getInitParameter(String name):获取初始化参数 **Enumeration getInitParameterNames():获取所有初始化参数名字
例子: web.xml <servlet> <servlet-name>xxx</servlet-name> <servlet-class>cn.cad.servlet.ServletDemo1</servlet-class> <init-param> <param-name>p1</param-name> <param-value>v1</param-value> </init-param> <init-param> <param-name>p2</param-name> <param-value>v2</param-value> </init-param> </servlet> Servlet类 public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub System.out.println("初始化"); System.out.println(arg0.getInitParameter("p1"));//获取初始化参数p1的值 System.out.println(arg0.getServletName());//获取<servlet-name>里的值 Enumeration e=arg0.getInitParameterNames();//获取所有初始化参数名字 while(e.hasMoreElements()) { System.out.println(e.nextElement()); } }
GenericServlet类
GenericServlet类是实现了servlet接口的一个类,里面帮我们实现了很多方法原理还是通过ServletConfig类实现的。
例子:自己实现GenericServlet类。 public class ServletDemo2 implements Servlet { private ServletConfig config; //先创建一个成员变量,用来保存tomcat传入的ServletConfig对象 public void destroy() { // TODO Auto-generated method stub } //获得ServletConfig对象 public ServletConfig getServletConfig() { // TODO Auto-generated method stub return this.config; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } //在初始化时,将ServletConfig对象保存下来,以方便其他方法使用 public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub this.config=config; } public void init() { } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub } //GenericServlet类中的方法底层都是通过Servletconfig类实现的 public String getInitParameter(String name) { return config.getInitParameter(name); } public ServletContext getServletContext() { return config.getServletContext(); } public String getServletName() { return config.getServletName(); } }
HttpServlet类
继承自GenericServlet类,HttpServlet是采用Http协议进行通信的,所以它也实现Http协议中的多种方法,每种方法可以处理相应类型的请求 HttpServlet类中有两个service方法 void service(ServletRequest req, ServletResponse res) service(HttpServletRequest req, HttpServletResponse resp) --流程是当客户端发送请求时,调用void service(ServletRequest req, ServletResponse res)方法 --然后将参数进行强制转换,转换为HttpServletRequest和HttpServletResponse --然后调用service(HttpServletRequest req, HttpServletResponse resp)方法 --该方法根据请求的类型发送到doGet(),doPost()等方法中。 所以开发自己的Servlet时,不需要覆盖HttpServlet的service()方法 因为该方法最终将请求转发相相应的doXXX方法中,只需要覆盖相应的doXXX方法进行请求处理即可。
Servlet需要注意的一些地方
当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet,当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例。 JSP/Servlet容器默认是采用单实例多线程(这是造成线程安全的主因)方式处理多个请求的,这种默认以多线程方式执行的设计可大大降低对系统的资源需求,提高系统的并发量及响应时间。 所以Servlet是线程不安全的。
小知识:让服务器在启动时就创建Servlet实例
默认情况下,服务器会在某个Servlet第一次收到请求时创建Servlet实例不过我们可以配置web.xml文件,使服务器启动时就创建Servlet实例。 我们需要在web.xml文件中对应的servlet的<Servlet></Servlet>标签中添加 <load-on-startup>非负整数</load-on-startup> 就可以在服务器启动时创建该Servlet实例 如果有多个Servlet,服务器启动时,将根据<load-on-startup>里的值进行先后创建,值越小,越先创建。
ServletContext学习
服务器会为每个项目创建一个ServletContext对象,服务器开始,它就存在,服务器关闭,该对象死亡。每个项目只有一个ServletContext对象作用:ServletConntext对象的作用是在web应用多个servlet之间共享数据。获取ServletContext对象的方法 *在Servlet中的void init(ServletConfig config)方法中:ServletContext context=config.getServletContext() 通过ServletConfig类中的getServletContext方法可以用来获取ServletContext对象 *在GenericServlet或者HttpServlet类中可以直接用getServletContext()方法获取对象。java web共有四大域对象。 *ServletContext *PageContext *HttpSession *ServletRequest 这里简单而不确切的说域对象就是在不同的Servlet之间传递数据。域对象都有数据存储功能。 域对象内部都有一个Map存储数据为键值对的形式。 ServletContext对象操作数据的方法。 *void setAttribute(String name,Object value):存储一个域属性,如果多次调用该方法并且存储多个相同的name,那么会覆盖上一次的值,和Map集合一样。 *Object getAttribute(String name):用来获取ServletContext中的数据通过名字。 *void removeAttribute(String name):用来移除域属性。 *Enumeration getAttributeNames():获取所有域属性的名称
例子: 在AServlet中存储数据 public class AServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub ServletContext context=this.getServletContext(); context.setAttribute("name", "张三"); } } 在BServlet中获取数据并打印。 public class BServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub ServletContext context=this.getServletContext(); String name=(String)context.getAttribute("name"); System.out.println(name); } }
ServletContext获取初始化参数。
Servlet也可以获取初始化参数,但它只能获取自己的初始化参数,而不能获取其他的Servlet的初始化参数,而ServletContext的初始化参数是公共的。
第一步:在web.xml配置初始化参数 <web-app> ... ... ... <context-param> <param-name>name</param-name> <param-value>value</param-value> </context-param> </web-app> 第二步:在Servlet中获取初始化参数 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context=this.getServletContext();//获取ServletContext对象 String value=context.getInitParameter("name");//通过名字获取初始化参数 System.out.println(value); }
ServletContext获取项目资源的相关方法
--获取资源的真实路径 通过getRealPath(String name)方法获取 String path=this.getServletContext().getRealPath("/web.xml"); --获取资源流,即把资源以输入流的方式获取 InputStream in=ServletContext.getResourceAsStream("/a.txt"); --获取指定目录下所有资源路径 Set paths=ServletContext.getResourcePaths("路径名称");
案例:网站访问量统计
思路: 所有Servlet被访问时都应该总访问量+1,所以应该把值存在ServletContext中。可以共享。 当网站第一次被访问时,创建一个属性,用来保存访问量 不是第一次访问时,则在原值+1再写入 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext context=this.getServletContext();//获取ServletContext对象 Integer i=(Integer)context.getAttribute("count");//先查看有没有count这个属性 if(i==null) //如果没有,就添加,如果有,就在原值上+1 { context.setAttribute("count", 1); }else { context.setAttribute("count", i+1); } PrintWriter pw=response.getWriter();//在屏幕上打印 pw.print(i); }
获取类路径下的资源
对于javaweb,类路径资源就是/WEB-INF/classes下的资源(就是src目录下的资源) 和/WEB-INF/lib下的每个jar包第一种方法: 通过ClassLoader 获取src目录下的a.txt文件 ClassLoader cl=this.getClass().getClassLoader();//获取类加载器 InputStream in=cl.getResourceAsStream("a.txt");//获取输入流 然后就可以对资源进行操作。
1 0
- JAVA WEB从入门到精通day10 Servlet详解
- 《Java Web从入门到精通》-笔记
- Servlet从入门到精通
- JAVA WEB从入门到精通day13 Jsp详解和EL,JSTL详解
- JAVA从入门到精通(18)-- Servlet
- ASP.NET WEB窗体从入门到精通详解
- JAVA WEB从入门到精通day12 Cookie和Session详解
- Servlet从入门到精通二
- Servlet从入门到精通三
- Servlet从入门到精通五
- Java Web从入门到精通 谁买谁后悔
- java web从入门到精通1~3笔记
- Java Web 从入门到精通(明日科技)
- 《Java Web 从入门到精通 》 第一章 DAY1
- JAVA WEB从入门到精通day05 javascript学习(3)
- JAVA WEB从入门到精通 day15 MYSQL简单学习
- JAVA WEB从入门到精通 day18 JDBC学习(三)
- JAVA WEB从入门到精通 day19 Listener监听器
- 每日学习20170221-分布式事务
- jq 点编辑出现input框可进行编辑,出现保存和取消
- 深入分析 Java Web 中的中文编码问题
- 3分钟了解深度学习跟量化交易是什么关系
- OJ单词翻转
- JAVA WEB从入门到精通day10 Servlet详解
- angularjs上传多张图片并预览
- Odoo Windows系统下部署方法
- sql sever增删查改之--------------查询
- mysql学习笔记(2)
- Mac下静态库和动态库的创建和使用
- Android开发之动画
- spring基础与重点学习小结
- Android 对一个View进行缩放处理(放大或缩小View)案例