• Servlet技术栈要点


    上次说道tomcat就是一个成品web服务器,他的底层应该是用socket接口实现了连接,然后绑定网址\监听,然后又读取数据.

    再看tomcat的体会_数字公民某杨的博客-CSDN博客

    然后又把数据包装成request对象以及response对象

    这让tomcat看上去更像一台机器,里面装什么具体内容由开发者来决定.也像一个饭店,卖什么风格的菜由开饭店的人来决定.

    具体什么菜,其实就是你开发什么样的servlet.

    作为一个web应用来说,有很多sevlet\jsp等等的材料,其中servlet是核心的服务内容体现.

    当一个开发者开发了很多servlet,要安装到tomcat中,首先需要编译成class文件,然后把这些文件放到webapps文件夹.这样启动tomcat的时候,这些servlet才会投入使用.

    这有点像c语言中程序的运行.很多时候运行的程序不仅仅包括你刚写的代码,也包括系统中已经有二进制格式的程序,例如printf函数,c语言中把这个叫做链接.应该说所有程序应该都叫链接,有这么一步.

    所以把servlet的class文件放在webapps,就好像c语言中的链接一样.

    在c语言中是有个命令叫做link ,那么在tomcat中,servlet代码与tomcat容器的"link"接口,就是告诉tomcat,这里有servlet,方式是两种,一个是在web.xml文件中写上servlet标签(servlet class ,mapping),或者用注解方式,在servlet的类上面加上@Webservlet.

    每个servlet都有个ServletConfig对象,在这个对象里面可以配置一些要求tomcat对servlet采取一些预先的配置措施,例如启动顺序,loadonstartup,initpm等等.

    //获取ServletConfig
            ServletConfig servletConfig = this.getServletConfig();
            String value1 = servletConfig.getInitParameter("key1");
            String value2 = servletConfig.getInitParameter("key2");
            System.out.println(value1);
            System.out.println(value2);

    除了servletconfig对象,还有对每个web应用(所有servlet\jsp,listener等等)都有个ServetContext,这是一个全局唯一的配置.可以对所有servlet作一些统一的配置.

    @WebServlet("/attr.do")
    public class ServletContextAttrServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext servletContext = this.getServletContext();
            servletContext.setAttribute("key","BJ");
            servletContext.setAttribute("key","IT");
            servletContext.removeAttribute("key");
        }
    }

    filter,过滤器,在请求到达servlet之前可以预先作一些处理和筛选(例如判断是否登陆),设置一些请求的中文编码格式的等等.filter像servlet一样可以在web.xml中作配置,或者用@WebFilter方式。

    @WebFilter("/*")
    public class AnnotationFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {

        }

        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println(" Annotation Filter....");
            filterChain.doFilter(servletRequest, servletResponse);
        }

        @Override
        public void destroy() {

        }
    }

    Listener对象,可以实现对ServletContext, HttpRequest, 还有HttpSession三个对象的监听。这三个对象的产生、修改、销毁等变化,都可以根据需要获取有关信息。

    public class HttpServletRequestLifecycleListener implements ServletRequestListener {

        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            System.out.println("----------Start requestDestroyed------------");
            System.out.println((HttpServletRequest)sre.getServletRequest());
            System.out.println("----------End requestDestroyed------------");

        }

        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            System.out.println("----------Start Initialized------------");
            System.out.println((HttpServletRequest)sre.getServletRequest());
            System.out.println("----------End Initialized------------");
        }
    }

  • 相关阅读:
    算法通关村第一关-链表黄金挑战环形链表问题
    晨启,MSP430开发板,51开发板,原理图,PCB图
    如何查看 Docker 安装的事件历史记录
    linux内核源码分析 - nvme设备的初始化
    SpringMVC基础:JSON数据格式
    一个可操作PPT的.Net开源库
    不安全的反序列化(php&java)及漏洞复现
    BootStrap-前端框架
    Ubuntu下Nginx配置ModSecurity详细思路及过程
    设计模式与应用:解释器模式
  • 原文地址:https://blog.csdn.net/m0_47161778/article/details/126184825