java基础--监听器

来源:互联网 发布:重庆网络整合推广 编辑:程序博客网 时间:2024/05/16 11:21

1、监听器

     (1)什么是监听器?

     servlet规范当中定义的一种特殊的组件,用来监听servlet容器产生的事件并进行处理。

     事件主要有两大类:

     a    生命周期相关的事件:容器创建或者销毁request,session,ServletContext三个对象时产生的事件。

     b    绑定相关的时间:调用了request,session,ServletContext的setAttribute产生的事件。

     (2)如何去写一个监听器?

         第一步:先写一个java类,实现相应的监听接口。要一句监听的事件类型来选择相应的监听器接口(比如,要监听Session的创建和销毁,要用httpSessionListener接口)。

         第二步:在接口所声明的方法里面,实现相应的处理逻辑。

         第三步:注册监听器(web.xml).

         在线人数

2.   ServletContext接口

     (1)容器在启动的时候,会为每一个应用创建唯一的一个符合ServletContext藉口的实例,称之为Servlet上下文。servlet上下文会一直存在,除非容器关闭或者应用被卸载。

     (2)如何获得ServletContext?

         a    GenericServlet.getServletContext();

         b    HttpSession.getServletContext();

         c    ServletConfig.getServletContext();

         d    FilterConfig.getServletContext();

     (3)作用

         a    依赖逻辑落井获得实际部署时的物理路径

              StringgetRealPath(String path);

         b    绑定数据

              setAttribute,getAttribute,removeAttribute

              request,session,servet上下文都有这三个方法,在满足需要的情况下应该优先使用声明周期短的。声明周期长短排序request<session<servlet          

         c    访问全局的初始化参数

              //全局初始化参数web.xml

              <context-param>

                   <param-name>abc</param-name>

                   <param-value>def</param-value>

              </context-param>

              用servlet上下文访问

              StringgetInitParameter("abc");

3、servlet线程安全问题

     (1)servlet为什么会有线程安全问题?

         默认情况下,servlet在容器内部只有一个实例;

     如果有多个请求同时访问某个servlet,容器会启动多个线程来调用这个servlet实例,就有可能发生线程安全问题:比如,多个线程同时去修改servlet实例的某个属性。

     (2)如何解决?

         a,使用synchronized关键字加锁

         b,让servlet实现SingleThreadModel接口(不建议使用)容器会为每一个线程创建一个对应的servlet实例来处理请求。因为会产生过多的servlet实例,所以,建议少用。

    

servlet小结

     1、servlet基础

         (1)什么是servlet?

         (2)什么是servlet容器?

         (3)servlet依不依赖某个特定的servlet容器?

         (4)如何开发一个servlet?

         (5)http协议(了解)

              http协议是什么?

              http协议的特点?

              状态码是什么?

              消息头是什么?常见的消息头有哪一些?

              请求数据包与响应数据包的格式?

         (6)get请求与post请求

              哪一些是get请求,哪一些是post请求,各自的特点。

     2、servlet核心

         (1)表单的处理

              a,获得请求参数值:

                   Stringrequest.getParameter(String paraname);

                   String[]request.getParameterValues(String paraname);

              b,中文参数值:

                   step1,要保证表单所在的页面按照指定的编码格式打开。

                    html: <meta http-equiv="content-type"

                    content="text/html;charset=utf-8">

                    jsp: <%@page pageEncoding="utf-8"

                    contentType="text/html;charset=utf-8"%>

                    step2,

                            方式一: request.setCharacterEncoding("utf-8");

                            方式二:  newString(str.getBytes("iso-8859-1"),

                            "utf-8");

         (2)容器如何处理请求资源路径?

         (3)如何让一个servlet处理多种请求?

         (4)转发与重定向

              a,什么是重定向?

              b,如何重定向  ?

                       response.sendRedirect(Stringurl);

              c,重定向的特点?

              d,编程需要注意的问题

              e,什么是转发?

              f,如何转发?

                   request.setAttribute(Stringname,Object obj);

                   RequestDispatcherrd =

                   request.getRequestDispatcher(Stringurl);

                   rd.forward(request,response);

                   Objectrequest.getAttribute(String name);

              g,   转发的特点

              h,转发与重定向的区别

              (5)servlet的生命周期

                   a,分成哪几个阶段

                   b,servlet在什么时候实例化?

                   c,load-on-startup参数

                   d,   如何override init方法?

                   e,初始化参数如何配置?

                   f,生命周期相关的几个接口与类?

                   Servlet接口,GenericServlet抽象类,

                   HttpServlet抽象类,ServletConfig接口,

                   ServletRequest/ServletResponse接口

     3、状态管理

         (1)什么是状态管理?

         (2)cookie

              a,什么是cookie?

              b,如何创建cookie?

                   Cookiec = new Cookie(String name,String value);

                   response.addCookie(c);

              c,查询

                   Cookie[]request.getCookies();

                   Stringcookie.getName();

                   Stringcookie.getValue();

              d,编码问题

                   StringURLEncoder.encode(String str,String code);   

                   StringURLDecoder.decode(String str,String code);

              e,生存时间

                    cookie.setMaxAge(int seconds);

              f,路径问题

                   cookie.setPath(Stringpath);

              g,cookie的限制   

         (3)session

              a,什么是session?

              b,如何获得一个session?

                   HttpSessions = request.getSession();

                   HttpSessions = request.getSession(boolean flag);

              c,常用方法

                   setAttribute,getAttribute,removeAttribute

                   StringgetId()

              d,超时

                   session.setMaxInactiveInterval(intseconds);

              e,删除

                   session.invalide(); 

              f,session的优点与缺点

              g,如果用户禁止cookie,如何继续使用session?

                   url重写(response.encodeURL,response.encodeRedirectURL)

     4、数据库访问

         (1)使用jdbc访问数据库

         (2)dao

      5、过滤器和监听器

          (1)什么是过滤器

          (2)如何写一个过滤器?

          (3)过滤器的初始化参数

          (4)过滤器的优先级

          (5)过滤器的优点

          (6)什么是监听器

          (7)如何写一个监听器

          (8)ServletContext接口

      6、典型案例和扩展

              员工管理

              session验证

              验证码

 

一、jsp基础

1、什么是jsp?

2、怎样写一个jsp?

     step1,写一个以.jsp为后缀的文件

     step2,添加如下的内容:

         (1)html (css,js) : 直接写

         (2)java代码:

              1)java代码片断:  <% java代码   %>

              2)jsp表达式  <%=  java表达式%>

              3)jsp声明 <%!  %>

         (3)jsp指令

              1)什么是jsp指令?  通知容器,当容器将.jsp文件转换成.java文件时,做一些处理,比如导包。

              2)page指令

                       import属性

                       pageEncoding属性

                       contentType属性

                       session属性:true(缺省值)/false,当值为false时,容器不再添加获得session的语句,也就是说,不能够直接使用session隐含对象了。

                       isELIgnored属性:true(缺省值)/false,当值为false,容器不会忽略el表达式。

                       errorPage属性:值是一个jsp,用这个jsp来处理当前页面运行时产生的异常。

                       isErrorPage属性:true/false(缺省值),当值为true,表示这是一个错误处理页面。

              3)include

                   file属性

              4)taglib

                       用来导入标签

         (4)隐含对象

              out

              request

              response

              session

              application:ServletContext

              exception:只有当isErrorPage属性值为true时,才能使用,可以通过该隐含对象获得错误信息(getMessage())。

              config:ServletConfig实例。

              pageContext:页面上下文,容器会为每一个

              jsp实例创建唯一的一个符合PageContext接口要求的实例,称之为页面上下文。页面上下文会一直存在,除非容器销毁jsp实例。

                   作用1:绑订数据setAttribute,getAttribute,removeAttribute注意:绑订的数据,只有对应的jsp实例才能访问。

                   作用2:找到其它八个隐含对象。

              page:表示jsp实例。

         (5)注释

              1)  <!-- 注释的内容 --> : 允许注释的内容是java代码,如果是java代码,会执行,但是,执行的结果,浏览器并不会输出。

              2)<%--注释的内容--%> :不允许注释的内容是java代码,如果有java代码,会被忽略。浏览器不会输出注释的内容。

         (6)活动元素

              jsp已经运行了,通知容器做一些处理。

                   a,<jsp:forwardpage=""/> : 转发    ,其中,page   属性指定转发的目的地。

                   b,<jsp:includepage=""/> : 包含某个页面的运行结果。

                       page属性指定被包含的页面的地址。

                       include指令是将某个文件的内容插入到指令所在的位置,容器并不会调用被插入的文件。

                   c,<jsp:param name="" value="">: 添加参数,name属性指定参数名,value属性指定参数值。

                   d,<jsp:useBeanid="user" class="bean.User" scope="request"/>

                       容器会先从request对象中查找绑订名称为"user"的对象(request.getAttribute),如果找不到,则创建该对象,然后绑订(request.setAttribute);如果找到了,则什么也不做。

                       scope属性可以是page,request,session,application

                   e,<jsp:setPropertyname="user" property="name" value="tom"/>

                       先找到绑订名为user的对象,然后给name属性赋值为tom。

                   f,<jsp:getPropertyname="user" property="name"/>

                       先找到绑订名为user的对象,然后输出name属性值。

                   g,<jsp:setPropertyname="user" property="*"/>

                       依据请求参数名称将请求参数值赋给对应的属性。

3、jsp是如何运行的?

     step1,jsp转换成对应的servlet类

         a,html     ------>  service方法里,使用out.write输出

         b,  <% %>   ------> service方法里,照搬。

         c,<%=  %> ------->service方法里,使用out.print输出。   

         d,<%!  %> ------->在对应的servlet类里面,添加新的属性或者新的方法。

     step2,调用servlet。

         


1.   jsp标签和el表达式

     1)jsp标签是什么?

     因为直接在jsp文件里面写java代码,不方便代码的维护(比如,美工就不方便直接修改jsp),所以,sun制定了jsp标签技术规范,即使用类似与html标签的jsp标签来代替java代码,这样jsp文件里面就不再有java代码了,jsp会变得 更简洁,也更利于维护。

     2)jstl(javastandard taglib java标准标签库) jstl.jar standard.jar

     是一套简单的计算规则,用于给jsp标签的属性赋值,也可以直接使用(即也可以脱离jsp标签,单独使用)。

     3)el表达式的用法

         1)访问bean的属性:

              方式一:

              ${user.name}:一次从pageContext,request,session,application中查找绑定名称为"user"的对象,然后调用getName方法并输出相应的值。

              注意:a 依次指的是:先从pageContext中查找,如果找不到,再查找request,以此类推,

              b    如果找到则不再向下查找。如果找不到,会输出空字符串“”。

              c    属性名不能写错,否则会出错

              d    如果要制定查找范围,可以使用pageScope,rquestScope,sessionScope,applicationScope来制定,比如:${sessionScope.user.name}           

             

              方式二:

              ${user["name"]},允许[]里面变量(即绑定名称),此外,还允许[]里面出现从0开始的下标,用来访问数组的某个元素。

         2)获取请求参数值

         ${param.age}

         等价于request.getParameter("age");

         ${paramValues.city}

         request.getParameterValues("city");

         3)进行一些简单的计算,并且将计算结果直接输出,或者也可以给jsp标签的属性赋值。

         a    算术运算:"+" "-" "*""/" "%"需要注意,“+”只能进行值的相加,不能够连接字符串

         b    逻辑运算:"&&" "||""!"

         c    关系运算: ">" "< ""==" "!=" ">=" "<="

         d    empty字符串:判断集合是否为空,或者是否是一个空字符串。

         一下四种情况,结果为true:

              字符串

              空的集合

              null

              值不存在

         4)jstl

              a    jstl:java standard taglib

              b    编程步骤

                   1:将jstl相关的.jar文件拷贝到web-inf\lib下。

                   2:使用taglib指令引入标签

                       <%@tagliburi="" prefix=""%>

                       uri属性:指定命名空间,参考对应的.tld文件。

                       prefix属性:命名空间的前缀。

                   3:核心标签

                       a:if标签

                       <c:if test=""var="" scope="">

                       标签体:可以是html,<%  %>,<%=  %>,<%! %>

                       </c:if>

                       test属性:当值为true,执行标签体的内容,为false则不执行。test属性可以使用el表达式来赋值。

                       var属性:指定一个绑定名。

                       scope属性:指定一个绑定范围,可以是"page" "request""session" "application".

                      

                       b:choose标签

                       <c:choose>

                            <c:when>

                            </c:when>

                            ....

                            <c:otherwise>

                            </c:otherwise>                       

                       </c:choose>

                       when标签可以出现一次或者多次,otherwise只能出现一次或者0次,表示例外。

                      

                       c:forEach标签     用来对集合进行遍历

                       <c:forEachitmes="" var="" varStatus="">

                       </c:forEach>

                       items属性用来指定要遍历的集合,一般使用el表达式来赋值。

                       var属性:用来指定一个绑定名,绑定范围是pageContext。

                       forEach标签每次从指定的集合中取一个对象,然后绑定到pageContext对象上,绑定名由var属性来指定。

                       varStatus属性:指定一个绑定名称,绑定范围是pageContext,绑定值是容器创建的一个对象,该对象提供了获取当前遍历状态的信息的方法。比如,提供了getIndex方法(当前遍历的对象的下标,从0开始),getCount方法(返回当前是第几次访问,下标从1开始)

                      

                   4:jsp标签是如何运行的?

                       容器根据标签的命名空间找到相应的标签的描述文件(.tld文件),接下来,依据标签的描述文件找到标签类,然后实例化,最后调用标签对象的相应的方法。                 

                  

     练习:

              将员工管理应用中的两个页面(emplist.jsp,updateEmp.jsp)中的java代码使用jstl中的标签与el表达式来代替。

     (5)自定义标签(简单标签技术)

         step1,写一个java类,继承SimpleTagSupport类。

         step2,override doTag方法,在该方法里面,编写相应的处理逻辑。

         step3,在.tld文件当中,描述标签。可以参考 c.tld文件,并且,描述文件要放到WEB-INF下。

              <body-content>empty</body-content>: 该标签没有标签体。

              <body-content>scriptless</body-content>:该标签可以有标签体,但是,标签体不能够出现java代码(<%  %> <%=  %>  <%! %>)。

              <body-content>JSP</body-content>:该标签可以有标签体,并且,标签体的内容也可以是java代码。只有复杂标签技术才支持"JSP"。简单标签技术只支持"empty"和"scriptless"。

    

     练习: 写一个DateTag标签,用来输出当前的系统日期:

         <c1:datepattern="yyyy-MM-dd"/>,其中,pattern

         用来指定日期输出的格式。


0 0
原创粉丝点击