struts2 学习笔记之二(初识servlet)

1、简介
        servlet通过一个框架扩展服务器的能力,采用请求-响应模式提供web服务,当客户机发送请求至服务器时,服务器将请求信息发送给servlet,servlet设概念车功能响应内容并将其传送给服务器,然后再由服务器将响应返回给客户端。
        生命周期:
            不存在servlet实例 --------> 服务器加载servlet ------> 创建servlet实例

        -------->初始化servlet对应init方法----->调用service方法处理请求

        -------->结束servlet调用destroy方法
    配置web.xml:
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
        <web-app>
          <servlet>
            <servlet-name>helloreader</servlet-name>
            <display-name>This is the display name of my J2EE component</display-name>
            <description>This is the description of my J2EE component</description>
            <servlet-class>com.book.web3.helloreader</servlet-class>
          </servlet>

          <servlet-mapping>
            <servlet-name>helloreader</servlet-name>
            <url-pattern>/helloreader</url-pattern>
          </servlet-mapping>

        </web-app>
    服务类helloreader.java
        package com.book.web3;
        public class helloreader extends HttpServlet {
            @Override
            public void service(ServletRequest req, ServletResponse res)
                    throws ServletException, IOException {
                // TODO Auto-generated method stub
                //super.service(req, res);
                String name = req.getParameter("name");
                res.setContentType("text/html");
                PrintWriter out = res.getWriter();
                out.println("<html>");

                out.println("<head>");
                out.println("<title>Hello Reader</title>");
                out.println("</head>");

                out.println("<body>");
                out.println("<h1>Hello " + name + "!</h1>");
                out.println("</body>");
                out.println("</html>");
            }
        }
    通过编写这个过程,我们大概可以知道servlet的调用过程。
        tomcat收到应用请求之后,读取解析应用中的配置文件web.xml,然后如果在<servlet-mapping>里发现了请求,则根据这个url对应的servlet-name找到其具体的实现类,然后创建一个实例,开始提供服务。
          <servlet>
            <servlet-name>helloreader</servlet-name>
            <servlet-class>com.book.web3.helloreader</servlet-class>
          </servlet>
          <servlet-mapping>
            <servlet-name>helloreader</servlet-name>
            <url-pattern>/helloreader</url-pattern>
          </servlet-mapping>
2、过滤器
    一个可以传送请求和修改请求的对象,但它并不是一个servlet,它们是请求到达servlet前的预处理程序,在响应离开servlet后的后处理程序。
    例:记录请求在服务器中的时间
        package com.book.web3;
        import java.io.*;
        import javax.servlet.*;
        import javax.servlet.http.*;
        public class TimeFilter implements Filter{
            private FilterConfig config = null;

            public void init(FilterConfig config) throws ServletException{
                    this.config = config;
            }
            @Override
            public void destroy(){
                config=null;
            }
            /*
             * filter必须实现的方法
             */
            public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
                long before = System.currentTimeMillis();
                chain.doFilter(request, response);
                long after = System.currentTimeMillis();
                String name = "";
                if(request instanceof HttpServletRequest){          
                    name = ((HttpServletRequest)request).getRequestURI();
                }
                config.getServletContext().log(name+":"+(after-before) + "ms");
            }
        }
    myeclipse里面没有找到new->filter这个选项,放佛的自己编写filter类
3、监听器
    监听客户端的请求,服务器端的操作。通过监听器,可以自动激发一些操作。如监听用户在线数量
    常见的监听器接口
        ServletContextAttributeListener
            监听对ServletContext属性的操作,比如增加,删除,修改
        ServletContextListener
            监听ServletContext,当创建ServletContext时,激发contextInitialized方法;当销毁servletcontext时,激发contextDestroyed方法
        HttpSessionListener
            监听HttpSession操作,创建一个session时,激发sessionCreated方法;当销毁一个session时,加法sessionDestroyed方法
        HttpSessionAttributeListener
            监听HttpSession中的属性操作。当在session中增加一个属性时,激发attributeAdded方法;当删除一个属性时,激发attributeRemove方法;属性重置时,激发attributeReplaced方法
    例:计算在线用户数量
          OnlineCounterListener.java

           public class OnlineCounterListener implements HttpSessionListener {

            /**
             * Default constructor. 
             */
            public OnlineCounterListener() {
            // TODO Auto-generated constructor stub
            }

            /**
             * @see HttpSessionListener#sessionCreated(HttpSessionEvent)
             */
            public void sessionCreated(HttpSessionEvent arg0) {
            // TODO Auto-generated method stub
                OnlineCounter.raise();
                System.out.println(OnlineCounter.getOnline());
            }

            /**
             * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
             */
            public void sessionDestroyed(HttpSessionEvent arg0) {
            // TODO Auto-generated method stub
                OnlineCounter.reduce();
                System.out.println(OnlineCounter.getOnline());
            }

        }
        OnlineCounter.java
        public class OnlineCounter {
            private static long online = 0;

            public static long getOnline(){
                return online;
            }
            public static void raise(){
                online++;
            }
            public static void reduce(){
                online--;
            }
        }
    监听器就是一个处理类,而它的调用是由容器自动调用。当容器访问web.xml时候,检测到listener时就将其注册到系统中,当容器检测事件发生,会通知listener进行处理。
4、自定义JSP标签
    使用标签可以处理定向请求,简化JSP页面的开发和维护。
    自定义标签,封装了其他动态类型的机制。
    自定义标签通常发布在标签库中,该库定义了一个标签集并包含实现标签的对象。
    a、简介
        标签
            一种xml元素,名称和属性都是大小写敏感
        标签库
            由一系列功能相似,逻辑上相互联系的标签构成的集合
        标签库描述文件
            一个xml文件,简称TLD文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系,是一个配置文件,和web.xml类似。
        标签处理类
            java类,继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能
        开发一个自定义标签,主要工作就是创建TLD文件和编写标签处理类
    b、创建标签处理类
        必须实现Tag接口的doStartTag和doEndTag方法。
        当JSP引擎配到tag标签的开头时,调用doStartTag;碰到tag结尾时,doEndTag被调用。
        例:打印字符串“Hello World!”
            public class SimpleTag extends TagSupport {

                /**
                 * 
                 */
                private static final long serialVersionUID = 1L;

                @Override
                public int doEndTag() throws JspException {
                    // TODO Auto-generated method stub
                    try{
                            pageContext.getOut().print("Hello Reader!");
                            pageContext.getOut().print("<br>");
                            pageContext.getOut().print("I'm from custom Tag");
                    }catch(Exception e){
                        throw new JspTagException("SimpleTag" + e.getMessage());
                    }
                    return SKIP_BODY;//简单的tag没有body,所以返回SKIP_BODY
                }

                @Override
                public int doStartTag() throws JspException {
                    // TODO Auto-generated method stub
                    return EVAL_PAGE;//余下的页面还要被计算,如果余下页面不被计算,则返回SKIP_PAGE
                }

            }
    c、创建标签库描述文件
        标签库描述文件简称TLD文件,用xml语言描述。TLD包括标签库中所有标签的描述,一般被JSP服务器用来校验标签的语法正确性,或者备用来开发新的标签。TLD文件的扩展名必须是.tld,而且必须放在当前WEB应用的WEB-INF目录或子目录中。
        例:为上一节的处理类配合形成一个完整的标签
            <?xml version="1.0" encoding="UTF-8"?>
            <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
                        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
            <taglib>
             <tlib-version>1.0</tlib-version>
             <jsp-version>1.2</jsp-version>
             <short-name>hellodemo</short-name>
             <tag>
                <name>hello</name>
                <tag-class>com.book.web3.SimpleTag</tag-class>
                <body-content>emtpty</body-content>
             </tag>
            </taglib>   
    d、使用自定义标签
        配置web.xml,使用自定义标签<taglib>
            <?xml version="1.0" encoding="UTF-8"?>
            <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
            <web-app>

                <filter>
                <filter-name>timefilter</filter-name>
                <filter-class>com.book.web3.TimeFilter</filter-class>
                </filter>
                <listener>
                <listener-class>com.book.web3.OnlineCounterListener</listener-class>
                </listener>
                <servlet>
                <servlet-name>helloreader</servlet-name>
                <servlet-class>com.book.web3.helloreader</servlet-class>
                </servlet>
                <servlet-mapping>
                <servlet-name>helloreader</servlet-name>
                <url-pattern>/helloreader</url-pattern>
                </servlet-mapping>
                <taglib>
                    <taglib-uri> /WEB-INF/helloreader.tld </taglib-uri>
                    <taglib-location>/WEB-INF/helloreader.tld</taglib-location>
                </taglib>
            </web-app>
            注意:web.xml是有一定的顺序的,<taglib>不要放在web.xml的前面
        测试:
            <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
            <%@ taglib uri="/WEB-INF/helloreader.tld" prefix="demo"%>

            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
            <html>
              <head>
                <title>My JSP 'tagTest.jsp' starting page</title>
              </head>

              <body>
                    <demo:hello/>
              </body>
            </html> 
        通过上述例子的演示,发现创建一个tag之后,jsp页面会很简洁,重点是写好两个配置文件。

你可能感兴趣的:(java,Web,servlet)