Java篇-Servlet应用

作者: TianTianBaby223 | 来源:发表于2018-09-17 12:29 被阅读34次

    一 : Servle简介

    Servlet运行在服务端的java小程序,是sun公司提供的一套接口规范,用来处理客户端请求,响应给浏览器的动态资源,但Servlet的实质就是java代码,通过java的API动态的向客户端输出内容

    Servlet架构

    二 : 实现Servlet接口以及方法

    Java Resources包下创建一个java类并且是现 Servlet的接口
    并且实现接口中的方法,并且手动web.xml文件配置相应的Servlet信息

    public class QuickStartServlet implements Servlet{
    
        @Override
        public void destroy() {
            // TODO Auto-generated method stub
            System.out.println("Servlet Destroy");
        }
    
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            // TODO Auto-generated method stub
            System.out.println("Servlet IS init");
            //获得servlet 的name 
            String servlet = config.getServletName();
            System.out.println(servlet);
            
            //获得servlet的初始化参数
            String parm = config.getInitParameter("url");
            System.out.println(parm);
            
            //获得ServletContext
            ServletContext serContext = config.getServletContext();
        }
    
        @Override
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            // TODO Auto-generated method stub
            System.out.println("Servlet IS Running");
            res.getWriter().write("Servlet IS Running");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public String getServletInfo() {
            // TODO Auto-generated method stub
            return null;
        }
    
    }
    

    运行服务器并访问,打印结果 :

    Servlet IS init
    QuickStartServlet
    jdbc:mysql://mydb
    Servlet IS Running
    

    停止服务器打印结果 :

    Servlet Destroy
    

    三 : Servlet生命周期

    在第二部分的打印结果中,我们可以分析和总结出Servlet的生命周期特点
    ① : init(ServletConfig config) 在Servlet对象创建的时候执行,当然,也可以在服务器启动后调用,在web.xml中配置,下面会提到.
    ServletConfig 为该servlet对象的配置信息

    ② : public void service(ServletRequest req, ServletResponse res)在每次访问请求的时候都会执行.
    ServletRequest req : 代表请求 ,内部封装的http请求的信息
    ServletResponse res : 代表响应,内部封装的是响应返回的信息

    ③ : destroy() servlet销毁的时候执行(服务器关闭servlet就销毁了)

    四 : HttpServlet

    在实际开发中,不会去直接实现Servlet接口,因为要重写的方法太多,我们一般创建类继承HttpServlet,我们只要重写doGetdoPost就好了,而实现Servlet接口以及实现接口方法的任务就交给HttpServlet及父类去搞定,我们并不需要太关心.
    doGetdoPost每次访问都会调用(get 方式 调用doGet,post 方式调用doPost)

    实现步骤 :
    新创建一个Servlet

    第一步
    默认继承了HttpServlet
    第二步
    点击next,然后修改一下URL Mappings 会自动在web.xml中配置好需要的相关配置,十分智能不需要手动添加了,接着finish就完成了创建
    第三步

    创建的继承HttpServlet代码

    request.Method() 获得请求方式
    如果是get将调用doGet()
    如果是post将调用doPost()

    public class QuickStartServlet2 extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.getWriter().append("Served at: ").append(request.getContextPath());
        }
    
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
            response.getWriter().write("doGet running....");
        }
    
    }
    

    四 : Servlet访问流程

    在访问请求来到时Tomcat服务器中的Tomat引擎(核心代码)会帮助处理 :
    ① 解析请求的资源地址
    ② 创建servlet对象
    ③ 创建代表请求的request对象和代表响应的response
    象,每次访问service方法,都会创建一对新的requestresponse对象

    流程

    五 : Servlet配置

    • servlet类的配置 :
    <servlet>
        <servlet-name>QuickStartServlet</servlet-name>
        <servlet-class>com.TianTianBaby.servlet.QuickStartServlet</servlet-class>
        <init-param>
          <param-name>url</param-name>
          <param-value>jdbc:mysql://mydb</param-value>
        </init-param>
      </servlet>
    
    • servlet虚拟路径配置
    <servlet-mapping>
        <servlet-name>QuickStartServlet</servlet-name>
        <url-pattern>/quickStartServlet</url-pattern>
      </servlet-mapping>
    

    其中类的配置中的servlet-name要与虚拟路径中servlet-name保持一致,因为通过虚拟路径url-pattern确定servlet-name找寻对应的servlet-class.

    • url-pattern通常配置

    ①完全匹配 : 访问的资源与配置的资源完全相同才能访问到

        <url-pattern>/quickStartServlet</url-pattern>
    

    ②目录匹配 : /虚拟目录..../*

        <url-pattern>/aaa/bbb/ccc/*</url-pattern>
    

    ③扩展名匹配 : *.扩展名

        <url-pattern>*.abcdtz</url-pattern>
    

    第二种与第三种不要混用/aaa/bbb/*.abcd(错误)

    • 欢迎页面匹配

    会按照匹配顺序逐一寻找,默认的页面

     <welcome-file-list>
        <welcome-file>login.html</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    
    • 服务器启动实例化Servlet配置

    Servlet默认第一次访问时创建
    当Servlet配置时

       <load-on-startup>3</load-on-startup>
    

    servlet对象在服务器启动时就创建,数字代表优先级,数字越小优先级越高

    • 缺省Servlet

    将url-pattern配置/,代表该servlet是缺省的servlet
    缺省的servlet : 当你访问资源地址所有的servlet都不匹配时,缺省的servlet负责处理.

    web应用中所有的资源的响应都是servlet负责,包括静态资源.
    当我们在自己的web应用中没有配置缺省的,访问时又没有找到相应的动态资源,则Tomcat中web.xml给我们配置了一个缺省的servlet负责处理这些静态资源

    <servlet>
            <servlet-name>default</servlet-name>
            <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>0</param-value>
            </init-param>
            <init-param>
                <param-name>listings</param-name>
                <param-value>false</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    

    如果还找不到,这时候会给我们返回404

    六 : ServletContext

    ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,ServletContext对象一个web应用只有一个,一个web应用可以有多个servlet对象.

    ServletContext对象的生命周期

    创建 : 服务器启动或者发布web应用
    销毁 : 服务器关闭或移除web应用

    获取ServletContext对象方式
    ServletContext context = getServletContext();
    ServletContext context = config.getServletContext();
    
    ServletContext的作用

    ①获得web应用全局的初始化参数
    配置全局的初始化参数 :

    <context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
      </context-param>
    

    通过context对象获得参数

    ServletContext context = getServletContext();
    //1.获得初始化参数
    String initPar = context.getInitParameter("driver");
    

    ②获得web应用中任何资源的绝对路径

    String apath = context.getRealPath("/tz.txt");
    

    相当于

    //在读取src(classes)下的资源是可以同类加载器--专门加载classes下的文件的
    //getResource()参数是一个相对地址,相对于classes
    String path = ContextServlet.class.getClassLoader().getResource("c.txt").getPath();
    

    ③ServletContext是一个域对象

    域对象就是存储数据的区域.在整个web应用,素有的web资源都可以随意向ServletContext域中存取数据,数据可以共享

    在域对象中存入数据

    context.setAttribute("name", "tt");
    

    在域对象中取出数据

    //域对象--从servletContext中取数据
    String att = (String)getServletContext().getAttribute("name");
    

    在域对象中移除属性

    getServletContext().removeAttribute(String name)
    

    相关文章

      网友评论

        本文标题:Java篇-Servlet应用

        本文链接:https://www.haomeiwen.com/subject/tkvtgftx.html