精华内容
参与话题
问答
  • javaweb—servlet的简单入门使用

    万次阅读 2016-07-22 11:00:50
    Servlet(Server Applet),全称JavaServlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指...

    ServletServer Applet),全称JavaServlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

    Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。[百度百科]

     

    ** 如何使用servlet?

    #1.编写一个继承与HttpServletjava

    #2.重写doGetdoPost方法

    #3.配置web.xml文件,配置servlet节点

    MyFirstServlet.java

    package com.ibatis01.servlet;

     

    import java.io.IOException;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    public class MyFirstServlet extends HttpServlet {

     

             protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       response.getWriter().append("my frist servlet");

             }

     

             protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       doGet(request, response);

             }

    }

    Web.xml

    ……

    <servlet>

        <servlet-name>MyFirstServlet</servlet-name>

        <servlet-class>com.ibatis01.servlet.MyFirstServlet</servlet-class>

      </servlet>

      <servlet-mapping>

        <servlet-name>MyFirstServlet</servlet-name>

        <url-pattern>/MyFirst</url-pattern>

      </servlet-mapping>

    ……

    运行结果:

    ** URL匹配

                        url-pattern                   浏览器输入

    精确匹配             /first                 http://localhost:8080/day/first

                                                   /itcast/demo1          http://localhost:8080/day/itcast/demo1

     

    模糊匹配             /*                   http://localhost:8080/day/任意路径

                                                   /itcast/*               http://localhost:8080/day/itcast/任意路径

                                                  *.后缀名              http://localhost:8080/day/任意路径.do

                                                   *.do

                                                   *.action

                                                   *.html(伪静态):并不是一个真的静态文件

    默认路径[缺省路径,尽量少用]       /          http://localhost:8080/day

    注意:

    #1.路径要不就是/开始,要不就是*开始,而且两种不能混合在一起用。

    #2.当多个servlet被同时匹配,精确匹配优先

    #3.默认路径:当路径匹配不到任何自定义的servleturl路径,则去tomcat下找DefaultServlet到对象的应用下查找对应的静态文件,如果还找不到就返回404 not found[先找动态资源,再找静态文件]

     

    ** servlet的生命周期

    构造方法:第一次访问servlet时候调用

    init方法:创建完servlet时候调用

             service方法:每次请求的时候调用

             destroy方法:当servlet被销毁时候被调用

    注意:

    #1. service方法本来是用来分发调用doPost方法还是doGet方法,如果我们重写了service方法就不会调用doGet或者doPost方法。

    #2. Init 方法有有参数和无参数两种方法,有参数的其实还是会调用无参的,所以servlet方法初始化代码写在无参数的init方法即可

    #3. Servlet对象在tomcat中是单实例多线程的[servlet肯定用了多线程]

    package com.ibatis01.servlet;

     

    import java.io.IOException;

     

    import javax.servlet.ServletConfig;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    publicclass MyFirstServlet extends HttpServlet {

       

        /**

         * 构造方法

        */

        public MyFirstServlet() {

           System.out.println("1. 我被创建了......");

        }

       

        /**

         * init方法

        */

        @Override

        public void init(ServletConfig config) throws ServletException {

           System.out.println("2. init方法被调用......");

        }

       

        /**

         * service方法

         */

        @Override

        protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {

           System.out.println("3. service方法被调用......");

        }

       

        @Override

        public void destroy() {

           System.out.println("4. 调用destroy方法......");

        }

       

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

           System.out.println("doGet 方法被调用......");

           response.getWriter().append("my frist servlet");

        }

     

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

           System.out.println("doPost 方法被调用......");

           doGet(request, response);

        }

    }

     

     

    ** servlet的自动加载

    web.xml中加入load-on-startup即可[中间的数值越大优先级越低]

    <servlet>

        <servlet-name>MyFirstServlet</servlet-name>

        <servlet-class>com.ibatis01.servlet.MyFirstServlet</servlet-class>

        <!-- servlet在服务器启动的时候就创建 -->

        <load-on-startup>1</load-on-startup>

      </servlet>

     

    ** servlet的线程安全问题

    由于servlet是单实例多线程的,所以有可能引发多线程问题!

    package com.ibatis01.servlet;

     

    import java.io.IOException;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    public class ThreadServlet extends HttpServlet {

          

             private int num=0;

     

             protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       try {

                                num++;

                                Thread.sleep(2000);

                                response.getWriter().append(this.toString()+"<br/>").append("num="+num);

                       } catch (InterruptedException e) {

                                e.printStackTrace();

                       }       

             }

     

             protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       doGet(request, response);

             }

    }

    结果是:[出现了想要的问题]

    可以通过加锁来来解决问题

    package com.ibatis01.servlet;

     

    import java.io.IOException;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    public class ThreadServlet extends HttpServlet {

     

             private int num = 0;

     

             protected void doGet(HttpServletRequest request, HttpServletResponse response)

                                throws ServletException, IOException {

                       synchronized (this) {

     

                                try {

                                         num++;

                                         Thread.sleep(2000);

                                         response.getWriter().append(this.toString() + "<br/>").append("num=" + num);

                                } catch (InterruptedException e) {

                                         e.printStackTrace();

                                }

                       }

             }

     

             protected void doPost(HttpServletRequest request, HttpServletResponse response)

                                throws ServletException, IOException {

                       doGet(request, response);

             }

    }

     

    展开全文
  • servlet入门超简单

    2020-11-18 10:25:29
    文章目录一、servlet入门二、servlet生命周期总结 一、servlet入门 servlet :其实就一个运行在web服务器上的小的Java程序,用于处理从web客户端发送的请求并且对请求作出响应。 服务器向浏览器打印一个hello: 第...


    一、servlet入门

    servlet :其实就一个运行在web服务器上的小的Java程序,用于处理从web客户端发送的请求并且对请求作出响应。

    服务器向浏览器打印一个hello:
    第一步:建立一个类去实现servlet接口,实现service方法
    在这里插入图片描述

    
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class HelloServlet implements Servlet{
    
    	@Override
    	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
    		res.getWriter().println("Hello Servlet");
    	}	
    	@Override
    	public void destroy() {	
    	}
    
    	@Override
    	public ServletConfig getServletConfig() {
    		return null;
    	}
    
    	@Override
    	public String getServletInfo() {
    		return null;
    	}
    
    	@Override
    	public void init(ServletConfig config) throws ServletException {
    	}
    }
    
    

    第二步:在web.xml配置servlet,如下图:

      <servlet><!--配置servlet-->
      	<servlet-name>HelloServlet</servlet-name><!--配置servlet名称-->
      	<servlet-class>com.servlet.demo.HelloServlet</servlet-class><!--配置servlet类全路径-->
      </servlet>
    
      <servlet-mapping>  <!--配置servlet的映射-->
      	<servlet-name>HelloServlet</servlet-name>  <!--配置servlet名称,与上面必须一致-->
      	<url-pattern>/hello</url-pattern>  <!--配置servlet访问路径-->
      </servlet-mapping>
    

    在这里插入图片描述
    第三步:启动服务器,然后输出访问路径,查看页面即可
    在这里插入图片描述
    地址栏的/hello先和url-pattern匹配然后根据映射servlet-name找到servlet-name相同的然后执行servlet-class的类然后执行里面service方法。

    通常情况下,我们不会像上面那么编写,因为要实现的方法多,一般可以使用servlet的实现类去继承。例如,HttpServlet.是一个与协议相关的Servlet是专门用来处理HTTP协议的请求。通常编写一个 Servlet一般都会让这个 servlet继承HttpServlet重写service方法。
    在service方法内部根据请求方式不同执行不同的doXxx()的方法(get 请求执行doGet方法,如果是post请求就会执行doPost方法)。
    所以往往继承了HttpServlet之后不需要重写service方法,只需要重写doGet和doPost方法。往往请求要处理的内容的代码都是一致的,所以需要让doGet和doPost相互调用可以简化编程。

    二、servlet生命周期

    servlet生命周期:Servlet对象从创建到销毁的过程。

    servlet何时被创建又是何时被销毁的?
    Servlet中有init, service,destroy方法,这几个方法称为是Servlet生命周期相关的方法。
    Servlet是在第一次被访问的时候会被实例化,只要servlet一被实例化那么servlet 中的init方法就会执行(init只会执行一次)。任何一次从客户端发送来的请求,那么servlet中的service方法就会执行(在service方法的内部根据请求的方式不同调用不同doXxx方法)。当servlet从服务器中移除或者服务器关闭的时候Servlet对象被销毁,里面的destroy方法就会执行,然后垃圾回收就会将其回收掉。

    三、servlet启动时加载

    Servlet对象是第一次被访问的时候会被创建的,init方法就会执行。假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件并且解析可能需要花费3秒钟)。第一个用户第一次访问这个Servlet的时候,需要等待3秒钟。如何使第一个用户在第一次访问的时候不需要花费这么长时间?

    Servlet 默认是在第一次访问的时候创建的对象,现在通过一个配置将Servlet的实例化的过程放在服务器启动的时候(让服务器启动的时候创建Servlet 的对象)。如果现在这样做那么之前花费的时间就会在服务器启动的时候一起花费掉了。对于用户来讲就不需要额外花费这个时间。

    建立一个继承httpservlet的实例化对象。然后去web.xml中配置load-on-startup 一般是要写2,如果有多个servlet数字越小,优先级越高

      <servlet>
        <description></description>
        <display-name>ServletDemo</display-name>
        <servlet-name>ServletDemo</servlet-name>
        <servlet-class>com.servlet.demo.ServletDemo</servlet-class>
        <!-- 配置启动时加载 默认要低于1,因为服务器有一个servlet是1。不能高于服务器的优先级-->
        <load-on-startup>2</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>ServletDemo</servlet-name>
        <url-pattern>/ServletDemo</url-pattern>
      </servlet-mapping>
    

    四、servlet之url-pattern配置方式(访问路径)

    当servlet容器接收到浏览器发起的一个url请求后,容器会用url减去当前应用的上下文路径,以剩余的字符串作为servlet映射,假如url是http://localhost:8080/appDemo/index.html,其应用上下文是appDemo,容器会将http://localhost:8080/appDemo去掉,用剩下的/index.html部分拿来做servlet的映射匹配

    当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。
    访问优先级:完全路径匹配 > 目录匹配 > 扩展名匹配

    完全路径匹配

    以 / 开始
    比如:/ServletDemo1 或者 /aa/ServletDemo2

    另外后面可以跟任意的查询条件,都会被匹配,如下:
    http://localhost:8080/web_test/ServletDemo1?username=123&age=123
    也会被匹配到MyServlet。

    目录匹配

    以 / 开始,以/* 结束 。* 的意思是任意字符
    比如: /aaa/* 或者 /aaa/bbb/*
    那么访问servlet则需要如下:
    localhost:8080/项目名/aaa/任意字符

    如下会被匹配到
    http://localhost:8080/web_test/aaa/123.action

    扩展名匹配

    不能以 / 开始,以* 开始
    比如: * .action 或者 * .do 或者 *.jspu
    那么访问servlet则需要如下:
    localhost:8080/项目名/任意字符.action

    如下会被匹配到
    http://localhost:8080/web_test/aaa/123.action

    五、servlet中的一些常见对象的使用

    Servletconfig对象

    Servletconfig 用来获得servlet的相关的配置的对象

    
    import java.io.IOException;
    import java.util.Enumeration;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    public class ServletDemo extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		ServletConfig config = this.getServletConfig();//获得servletconfig对象
    		String username = config.getInitParameter("username");//getInitParameter可以获得指定名字的初始化值
    		String password = config.getInitParameter("password");
    		System.out.println(username+"  "+password);
    		//下面是获得所有的初始化的一个操作
    		Enumeration<String> names = config.getInitParameterNames();
    		while (names.hasMoreElements()) {
    			String name = names.nextElement();
    			String value = config.getInitParameter(name);
    			System.out.println(name+"  "+value);
    		}
    		//获得servlet的名称
    		String servletName = config.getServletName();
    		System.out.println(servletName);
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    

    运行后控制器如下图:
    在这里插入图片描述

    ServletContext对象

    ServletContext : Servlet的上下文对象。ServletContext 对象对Servliet之前和之后的内容都知道。这个对象一个web项目只有一个。在服务器启动的时候为每个web项目创建一个单独的ServletContext对象。

    作用如下:

    获取web项目信息

    全局初始化参数配置

      <!-- 全局初始化参数配置 -->
      <context-param>
      	<param-name>username</param-name>
      	<param-value>root</param-value>
      </context-param>
      <context-param>
      	<param-name>password</param-name>
      	<param-value>abc</param-value>
      </context-param>
    

    功能实例:

    import java.io.IOException;
    import java.util.Enumeration;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ServletDemo1 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		ServletContext context = this.getServletContext();//获得servletContext
    		String mimeType = context.getMimeType("aa.txt");//获得文件MIME类型
    		System.out.println(mimeType);
    		
    		String path = context.getContextPath();//获得请求路径的工程名
    		System.out.println(path);
    		
    		String username = context.getInitParameter("username");//获得全局初始化参数
    		String password = context.getInitParameter("password");
    		System.out.println(username+"  "+password);
    		
    		Enumeration<String> names = context.getInitParameterNames();
    		while (names.hasMoreElements()) {
    			String name = names.nextElement();
    			String value = context.getInitParameter(name);
    			System.out.println(name+"  "+value);
    		}
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    

    运行后控制台显示如下图:
    在这里插入图片描述

    获取web项目下文件

    用传统方式的使用相对路径,在src下读取properties文件,不好使。
    之前使用Io流就可以读取文件( java项目中)。现在是一个web项目,web项目需要发布到tomcat下才能访问的。获取web项目下的文件如果使用传统的lo就会出现问题。
    原因:路径中使用的是相对路径,相对的是JRE环境)。那么这个jre环境在哪呢,实际上是在tomcat的bin路径上,所以文件假如放在bin路径的下是可以找到的。但是这中方法不好,下面学习一种利用ServletContext对象去获取文件。

    注意:没有以斜杠开始的路径都属于相对路径
    文件内容:
    在这里插入图片描述
    如图文件所放位置:
    传统方式: 不使用
    在这里插入图片描述
    传统方式打开得去目录下打开服务器才能加载到
    在这里插入图片描述
    在这里插入图片描述

    ServletContext方式:
    在这里插入图片描述
    运行服务器后查询可得到文件内容:
    在这里插入图片描述
    测试代码:

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    public class ServletDemo2 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Properties p = new Properties();
    		//InputStream is = new FileInputStream("Demo2.properties");//传统方式,文件在tomcat的lib里
    		//InputStream is = new FileInputStream(this.getServletContext().getRealPath("/WEB-INF/classes/Demo2.properties"));//传统方式改进,文件在项目的web-inf的classes里,通过获得绝对路径去获得流
    		InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/Demo2.properties");//推荐使用
    		p.load(is);
    		
    		String driverClassName = p.getProperty("driverClassName");
    		String url = p.getProperty("url");
    		String username = p.getProperty("username");
    		String password = p.getProperty("password");
    		
    		System.out.println(driverClassName);
    		System.out.println(url);
    		System.out.println(username);
    		System.out.println(password);
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    

    作为域对象存取数据

    域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围。

    ServletContext是在服务器启动的时候为每个web项目单独创建一个ServletContext对象。当web项目从服务器中移除,或者是关闭服务器的时候ServletContext,对象会被销毁。向ServletContext中保存的数据一直存在(当服务器关i闭的时候ServletContext,对象被销毁,然后里面数据才会失效)。
    范围:整个web 应用。

    测试代码:
    ServletDemo中添加初始化:

    	public void init() throws ServletException {
    		this.getServletContext().setAttribute("name", "张三");
    	}
    

    ServletDemo3中添加获取方法:

    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String name = (String)this.getServletContext().getAttribute("name");
    		System.out.println("姓名:"+name);//必须强转,因为返回的是一个对象。
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    

    访问demo3得到结果,所以域对象范围很大
    在这里插入图片描述

    总结

    认识servlet,有关域对象的更多介绍会在后续发出

    展开全文
  • Servlet入门实践

    千次阅读 2015-11-20 09:28:35
    本文主要介绍servlet,包括入门到升入,基本上可以对servlet有一个很好的认识;

    本文主要介绍servlet,包括入门到升入,基本上可以对servlet有一个很好的认识;

    1servlet介绍:

      Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
    手把手教你建立一个继承servlet的类:
    1. 在webcontent点击右键选择other,选择servlet,这里就建成了servlet的类
    2. 重写doGet和doPost方法

    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setCharacterEncoding("utf-8");
            PrintWriter out = response.getWriter();
            out.println("hello peace");
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    1. 修改web.xml或者加上webServlet注解:
      修改web.xml:在根标签下加入一下代码
    <!-- 配置一个servlet -->
      <!-- servlet的配置 -->
      <servlet>
      <!-- servlet的内部名称,自定义。尽量有意义 -->
           <servlet-name>TestServlet</servlet-name>
            <!-- servlet的类全名: 包名+简单类名 -->
           <servlet-class>com.rlovep.servlet.TestServlet</servlet-class>
           <!-- servlet的映射配置 -->
      </servlet>
      <servlet-mapping>
      <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
          <servlet-name>TestServlet</servlet-name>
          <!-- servlet的映射路径(访问servlet的名称) -->
          <url-pattern>/TestServlet</url-pattern>
      </servlet-mapping>

    或者在类定义上加上webServlet的注解(注意两者只能有一个)
    注意:1.不要在web.xml根标签中指定metadata-complete=”true”.2。不要在web.xml中配置servlet
    修改后的servlet类:

    @WebServlet("/TestServlet")//设置servlet的访问路径为/TestServlet;或者这样写@WebServlet(name="TestServlet",urlPatterns={"/TestServlet"})
    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setCharacterEncoding("utf-8");
            PrintWriter out = response.getWriter();
            out.println("hello peace");
        }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    1. 访问http://localhost:8080/HttpSer/TestServlet即可看到结果。

    2servlet的路径映射:

    <url-pattern>/TestServlet</url-pattern>或者:@WebServlet(urlPatterns={"/TestServlet"})
    
    匹配方式 url-pattern 地址栏
    精确匹配 /TestServlet
    /TestServlet/test
    http://localhost:8080/HttpSer/TestServlet
    http://localhost:8080/HttpSer/TestServlet/test
    模糊匹配 /*
    /TestServlet/*
    /*.do
    http://localhost:8080/HttpSer/任意路径
    http://localhost:8080/HttpSer/TestServlet/任意路径
    http://localhost:8080/HttpSer/任意路径.do

    注意
    1)url-pattern要么以 / 开头,要么以*开头。 例如, TestServlet是非法路径。
    2)不能同时使用两种模糊匹配,例如 /TestServlet/*.do是非法路径
    3)当有输入的URL有多个servlet同时被匹配的情况下:
      3.1 精确匹配优先。(长的最像优先被匹配)
      3.2 以后缀名结尾的模糊url-pattern优先级最低!!!

    3servlet生命周期:

    1. 生命周期的引入:
      Servlet的生命周期: servlet类对象什么时候创建,什么时候调用什么方法,什么时候销毁。
      以前的对象: new Student(); stu.study(); stu=null;
      Servlet程序的生命周期由tomcat服务器控制的!!!!
    2. Servlet重要的四个生命周期方法:
      构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 只调用1次。证明servlet对象在tomcat是单实例的。
      init方法: 创建完servlet对象的时候调用。只调用1次。
      service方法: 每次发出请求时调用。调用n次。
      destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。
    3. 代码演示:
    @WebServlet(name="TestServlet",urlPatterns={"/TestServlet"})
    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
         int i=0;
        /**
         * 1.构造方法,只被调用一次
         */
        public TestServlet() {
            super();
            System.out.println("构造方法>>>>");
        }
        /**
         * 2.init初始化方法,在构造方法后只被调用一次
         * 有参数的init方法会调用init方法;;一般覆盖无参数的init方法;
         */
         @Override
        public void init() throws ServletException {
            // TODO Auto-generated method stub
            super.init();
            System.out.println("inti>>>>");
        }
      /**
         * 3.service方法,发生请求和响应时调用的方法,次数不限
         * 一般是重写doget和dopost,此去只是方便演示
         */
        @Override
        protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
            System.out.println("service>>>" +i++);
        }
      /**
       * 4.destory方法,只有在停止服务器和重新部署web应用时调用
       */
        @Override
        public void destroy() {
            System.out.println("destory");
            super.destroy();
        }
    }
    #输出结果:http://localhost:8080/HttpSer/TestServlet。连续访问四次,得到下面的结果:
    构造方法>>>>
    inti>>>>
    service>>>0
    service>>>1
    service>>>2
    service>>>3
    Oct 11, 2015 8:53:52 PM org.apache.catalina.core.StandardContext reload
    INFO: Reloading Context with name [/HttpSer] has started
    destory
    1. 伪代码演示:
    Tomtcat内部代码运行:
    1)通过映射找到到servlet-class的内容,字符串: com.rlovep.serlvet.TestServlet
    2)通过反射构造TestServlett对象
         2.1 得到字节码对象
             Class clazz = class.forName(" com.rlovep.serlvet.TestServlet");
        2.2 调用无参数的构造方法来构造对象
              Object obj = clazz.newInstance();     ---1.servlet的构造方法被调用
    3)创建ServletConfig对象,通过反射调用init方法
        3.1 得到方法对象
             Method m = clazz.getDeclareMethod("init",ServletConfig.class);
         3.2 调用方法
            m.invoke(obj,config);           --2.servlet的init方法被调用
    4)创建request,response对象,通过反射调用service方法
         4.1 得到方法对象
            Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
        4.2 调用方法
        m.invoke(obj,request,response); --3.servlet的service方法被调用
    5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
         5.1 得到方法对象
            Method m = clazz.getDeclareMethod("destroy",null);
        5.2 调用方法
             m.invoke(obj,null);          --4.servlet的destroy方法被调用
    1. 图像演示如下:
      1

    4自动加载servlet:

    默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。
    改变servlet创建对象的时机: 提前到加载web应用的时候!!!
    在servlet的配置信息中,加上一个或者加上注解(loadOnStartup=1)即可:

     <servlet>
      <!-- servlet的内部名称,自定义。尽量有意义 -->
           <servlet-name>TestServlet</servlet-name>
            <!-- servlet的类全名: 包名+简单类名 -->
           <servlet-class>com.rlovep.serlvet.TestServlet</servlet-class>
           <load-on-startup>1</load-on-startup>
      </servlet>
    或者:
    @WebServlet(name="TestServlet",loadOnStartup=1,urlPatterns={"/TestServlet"})

    5多用户问题:

    注意: servlet对象在tomcat服务器是单实例多线程的。可以有多个用户;
    因为servlet是多线程的,所以当多个线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。
    解决办法:
    1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)
    2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

    6Servlet常用对象:

    servlet:有几个比较有用的对象:

    1.HttpServletRequest   请求对象   http协议中已讲
    2.HttpServletResponse  响应对象  http协议中已讲
    3.ServletConfig       servlet配置对象
    4.ServletContext    Servlet的上下文对象。对整个web应用有效
    5.HttpSession        会话对象,当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;

    ServletConfig对象介绍:

    ServletConfig对象: 主要是用于加载servlet的初始化参数。在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)
    可以直接从getServletConfig方法;或者自己在有参的init中获得 .
    在web.xml中创建参数:一样有两种方法:

     <servlet>
      <!-- servlet的内部名称,自定义。尽量有意义 -->
           <servlet-name>TestConfig</servlet-name>
            <!-- servlet的类全名: 包名+简单类名 -->
           <servlet-class>com.rlovep.serlvet.TestConfig</servlet-class>
           <init-param>
                <param-name>name</param-name>
                <param-value>peace</param-value>
           </init-param>
      </servlet>
    或者:
    @WebServlet(urlPatterns={"/TestConfig"},
            initParams={@WebInitParam(name="driver",value="com.mysql*")
                        ,@WebInitParam(name="url",value="jdbc*"),
                        @WebInitParam(name="user",value="root"),
                        @WebInitParam(name="pass",value="123456")})

    测试如下:

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletConfig servletConfig = getServletConfig();
            //得到servlet的名字
            System.out.println(servletConfig.getServletName());
            //根据参数名获取参数值
            String name=servletConfig.getInitParameter("user");
            System.out.println(name+">>>>>");
            //获取所有参数名称
            Enumeration<String> names = servletConfig.getInitParameterNames();
            while(names.hasMoreElements()){
                String s=names.nextElement();
                System.out.println(s+"="+servletConfig.getInitParameter(s));
            }
        }

    ServletContext对象介绍:

    1. 引入
    ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一 个ServletContext对象。
    2. 对象引用的得到
    创建时机:加载web应用时创建ServletContext对象。
    得到对象: 从ServletConfig对象的getServletContext方法得到或者直接调用ServletContext servletContext = getServletContext();
    3. 核心api

    java.lang.String getContextPath()   --得到当前web应用的路径
    java.lang.String getInitParameter(java.lang.String name)  --得到web应用的初始化参数
    java.util.Enumeration getInitParameterNames()
    void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
    java.lang.Object getAttribute(java.lang.String name)
    void removeAttribute(java.lang.String name)
    RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
    java.lang.String getRealPath(java.lang.String path)     --得到web应用的资源文件
    java.io.InputStream getResourceAsStream(java.lang.String path)

    4. 演示如下

    ServletContext servletContext = getServletContext();
            //得到当前web应用路径
            System.out.println("路径:"+servletContext.getContextPath());
            //根据参数名获得参数值
            System.out.println("AAA="+servletContext.getInitParameter("AAA"));
            //获取所有参数名称
            Enumeration<String> names = servletContext.getInitParameterNames();
            while(names.hasMoreElements()){
                String s=names.nextElement();
                System.out.println(s+":"+servletContext.getInitParameter(s));
            }
            //设置域对象,整个web应用有效
            servletContext.setAttribute("name","peace");
            servletContext.setAttribute("age", "23");
            //获得域对象
            System.out.println("name"+servletContext.getAttribute("name"));
            System.out.println("age"+servletContext.getAttribute("age"));
            //删除域对象
            servletContext.removeAttribute("age");
            System.out.println("age"+servletContext.getAttribute("age"));
    

    7.转发和重定向;

    域对象介绍:

    域对象:作用是用于保存数据,获取数据。可以在不同的动态资源(servlet)之间共享数据。
    案例:

    #通过重定向,使用实体内容传递数据,一般只能存储字符
    Servlet1 传数据:name=eric 
            response.sendRedirect("/Servlet2?name=eric")            
    Servlet2接收:
            String request.getParameter("name");
    #通过域对象传递:可以传递任何数据;
    ServletContext就是一个域对象,上面有介绍怎么用
        保存数据:void setAttribute(java.lang.String name, java.lang.Object object)
        获取数据: java.lang.Object getAttribute(java.lang.String name)
        删除数据: void removeAttribute(java.lang.String name)
    ServletContext域对象:作用范围在整个web应用中有效!!!
    所有域对象:
    HttpServletRequet 域对象  测试;
    ServletContext域对象
    HttpSession 域对象
    PageContext域对象

    重定向:

    重定向是服务器告诉浏览器,重新请求另一页面,请求信息丢失更新
    a)地址栏会改变,变成重定向到地址。
    b)重定向可以跳转到当前web应用,或其他web应用,甚至是外部域名网站。
    c)不能在重定向的过程,把数据保存到request中。
    测试如下:

    1.建立一个TestRedect servlet:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            /**
             * 保存数据到request域对象
             */
            request.setAttribute("name", "rose");
                //重定向
                    /**
                     * 注意:可以跳转到web应用内,或其他web应用,甚至其他外部域名。
                     */
            //request域数据会丢失
            response.sendRedirect("/HttpSer/GetData");
            //重定向到外部域名:
            //response.sendRedirect("www.baidu.com");
        }
    2.建立一个GetData的servlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            out.println("hello");
            System.out.println("获得域对象"+request.getAttribute("name"));
        }

    现象如下:
    1.地址栏从http://localhost:8080/HttpSer/TestRedect变为http://localhost:8080/HttpSer/GetData
    2.request域对象数据丢失:获得域对象null

    转发:

    转发是服务器将请求信号封装后转发到另一个servlet页面,请求信息会保存
    a)地址栏不会改变
    b)转发只能转发到当前web应用内的资源
    c)可以在转发过程中,可以把数据保存到request域对象中
    测试如下:

    1.建立一个TestRedect servlet:
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
             * 保存数据到request域对象
             */
            request.setAttribute("name", "rose");
            //转发    
            /**
             * 注意:不能转发当前web应用以外的资源。
             */
            /*RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/GetDataServlet");
            rd.forward(request, response);*/
            this.getServletContext().
            getRequestDispatcher("/GetData").forward(request, response);
        }
    2.建立一个GetData的servlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            out.println("hello");
            System.out.println("获得域对象"+request.getAttribute("name"));
        }

    现象如下:
    1.地址栏没有变化
    2.request域对象数据没有丢失:获得域对象rose
    来自一条小鲨鱼(rlovep.com)
    代码下载

    展开全文
  •  通过前面两个章节的铺垫,本章正式迈入Servlet的学习 方法 1.概念 我们知道,有了http协议,规定了web交互的基本规范。有了服务器,用户的请求能够实时的得到响应。那么现在有个问题,就是用户发送一个请求给...

    前言

          通过前面两个章节的铺垫,本章正式迈入Servlet的学习

    方法

    1.概念

    我们知道,有了http协议,规定了web交互的基本规范。有了服务器,用户的请求能够实时的得到响应。那么现在有个问题,就是用户发送一个请求给服务器,我服务器怎么才能知道该调用后台的哪些代码呢?Servlet应运而生了!

    实际上它就是帮助处理用户请求到服务器,服务器调用相应的方法。

    2.第一个Servlet程序

    在讲解这个之前呢,推荐大家下载一款Java集成开发工具IntelliJ IDEA,有同学疑问了?我们之前不是有eclipse吗?为什么要用新的开发工具啊?原因是eclipse简单,功能不齐全!!!还有人说了,那用MyEclipse啊。这我也能理解,博主之前一直再用MyEclipse,公司里用eclipse、MyEclipse、IntellJ IDEA的比率大概在2:4:4,也就是说MyEclipse和IntellJ IDEA你选一个就行了!因为我之前一直在用MyEclipse,所以这次尝试一下IntelliJ IDEA。

    我们拿之前的SMS项目的代码作为讲解! JAVA串烧(二)SMS编写之后台

    1)打开IDE,在web文件夹下新增两个jsp文件login.jsp和success.jsp,前者是用户登录的表单,后者是登录成功的跳转页面。目前你可以不需要理会JSP文件的含义,只是把它当作一个普通的html文件来看待就行了!

    目前的工程结构如下所示:

    login.jsp源码如下:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>用户登录</title>
      </head>
      <body>
      <form action="/login.do" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="text" name="password"><br>
        <input type="submit" value="登录">
      </form>
      </body>
    </html>
    

    success.jsp源码如下:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>用户登录</title>
      </head>
      <body>
        <h1>用户登录成功</h1>
      </body>
    </html>

    注意:这是一个相当简单的登录表单,没有加入任何的CSS以及JS的修饰,不影响功能!

    前提条件:将web项目部署到tomcat服务器中(每种工具的具体部署方法不同,读者可自行百度)

    我这里将SMS工程部署到了之前下载好的tomcat中。以IntellJ为例:

    这里用户点击登录的话就触发了一次请求,请求的url为 login.do

    那么服务器如何知道这个请求应该调用什么代码呢,下面让我们来写Servlet告诉他吧!

    2)编写Servlet文件(它也是一个Java文件,继承了HttpServlet)\com\jwang\student\servlet\UserServlet.java

    package com.jwang.student.servlet;
    
    import com.jwang.student.bo.User;
    import com.jwang.student.service.UserService;
    import com.jwang.student.service.impl.UserServiceImpl;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class UserServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response){
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            try {
                UserService userService = new UserServiceImpl();
                User user = new User("01",username,password);
                if (userService.login(user)) {
                    request.getSession().setAttribute("username", username);
                    request.getRequestDispatcher("/success.jsp").forward(request, response);
                } else {
                    request.setAttribute("errorMsg", "用户名或密码错误,请重新输入!");
                    request.getRequestDispatcher("/login.jsp").forward(request, response);
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response){
            this.doGet(request, response);
        }
    }

    以上代码的含义就是接收用户发出的请求,做登录验证!大家可以看到我调用了userService的login()方法,大家应该还没忘吧!

    到这里我们的login.do请求应该是要访问这段代码的。

    3)配置请求路径login.do指向UserServlet

    \web\WEB-INF\web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>UserServlet</servlet-name>
            <servlet-class>com.jwang.student.servlet.UserServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>UserServlet</servlet-name>
            <url-pattern>/login.do</url-pattern>
        </servlet-mapping>
    </web-app>

    好了,经过了以上的准备工作,你的第一个Servlet就算是配置好了!

    启动程序,进入登录表单输入用户名与密码,点击登录

    • 成功:系统跳转到success.jsp,显示登录成功
    • 失败:系统返回至login.jsp,用户需要重新输入用户名和密码进行登录

    登录的用户名与密码在数据库中Users表:博主的是admin和admin

    附录:

    1.开发中启动web应用的时候一定要是debug模式,方便调试

    IntellJ IDEA中请点击这个小虫子!

    在代码中左侧点击鼠标打上断点即可实现代码调试!

    常用的快捷键是: F8下一步 、F9下一个断点

    不使用快捷键的话,debug窗口如下:

    2.乱码问题 

    大家有没有发现,表单中写入了中文后,传递到后台就发生了乱码!!!这种很烦!

    因为我的工程是utf-8编码的,所以添加如下代码即可解决乱码问题!

    展开全文
  • Servlet入门介绍

    2020-11-12 17:20:12
    什么是ServletServlet是两个单词,server applet,指的就是运行在服务端的小程序。Servlet就是一个接口,定义了Java类被浏览器访问到的规则(也就是被Tomcat识别到的规则) 快速入门: 1、创建一个JavaEE的项目 2...
  • servlet 是在服务器上运行的小程序,一个 servlet 就是一个 Java 类,并且可以通过 “请求 - 响应” 编程模式来访问这个驻留在服务器内存里面的 servlet 程序 tomcat 容器等级以及 servlet 的位置 二、编写 ...
  • Servlet入门(一)

    万次阅读 多人点赞 2018-08-20 23:54:15
    1.Servlet的基本概念: Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互。 注意:Servlet不是从命令行启动的,而是由包含...
  • Servlet基础总结

    千次阅读 2018-11-15 12:05:53
    Servlet接口2.1 一个简单的Servlet应用程序2.2 ServletRequest2.3 ServletResponse2.4 ServletConfig2.5 ServletContext 1. 引言 Servlet技术的核心是ServletServlet API有以下4个Java包: javax.servlet ...
  • servlet简介:java服务器小程序,主要用于生成动态web内容。因为web页面基于用户提交数据,web页面数据频繁改变,页面信息来自于数据库,所以我们需要动态创建web页面。 serlvet功能:读取客户端发来的显示信息...
  • servlet入门

    2013-07-17 10:18:09
    简介:Servlet是sun公司提供的一门用于开发动态web资源的技术。Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤: 1、编写一个...
  • Servlet入门简单介绍

    2017-08-11 19:45:13
    Servlet简介 1、Servlet是服务器端的重要组件,直译为服务端的小程序,它属于动态资源,用来处理请求,服务器接收到请求后会调用Servlet来处理请求。 2、Servlet的主要作用:接收请求;处理请求; 完成响应。 当...
  • Servlet入门实战

    万次阅读 2016-09-14 10:56:58
    Servlet 什么是ServletServlet=Server+Applet.Servlet是运行在服务器端的java应用程序,它独立于平台和协议。可以生成动态的web 页面。它是客户端请求和服务器响应的中间层。 Servlet和CGI(公共网关接口)相比...
  • Servlet入门

    2017-02-28 11:07:55
    今天开始学习Servlet,当前及未来的市场上看,此技术可以长期坚挺,所以对我们在江湖漂的程序员们来说,这个是居家旅行必备的技能,闲话不多,开始入门! 一、了解Servlet servlet全称java servlet,是用...
  • servlet入门

    2013-10-21 18:10:18
    import java.io.IOException;...import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSer
  • Tomcat与Servlet入门

    2017-08-29 00:04:02
    使用Tomcat发布一个WEB工程:Tomcat的安装及目录结构 【下载Tomcat】 http://tomcat.apache.org/download-70.cgi 【安装Tomcat】 解压即可,tomcat不要放在中文目录下 【了解Tomcat的目录结构】 ...*
  • 【Servlet】servlet入门

    2013-11-22 10:11:19
    新建一个项目,点击 src 选择 New|Servlet .创建一个FirstSer.java文件 package com.servlet;import java.io.IOException;...import javax.servlet.ServletException; import javax.servlet.http.HttpServl
  • 教你Servlet入门

    千次阅读 热门讨论 2015-03-24 14:44:12
    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础。这篇博客主要帮助大家了解一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 ...
  • 林炳文Evankaka原创作品。...一了解Servlet的概念二Servlet技术功能三 Servlet技术特点四 Servlet生命周期五servlet工作过程六 Servlet与JSP区别七Servlet代码结构八 Servlet第一个程序 一、了解Servlet的概念  Se
  • 工程名为ServletExample     点击Finish,建立maven项目完成如下       生成后的目录没有java源码目录,按照maven的约定,还要新建src/main/java的源码目录。选中项目,点击鼠标右键     不...
  • SIP Servlet入门教程及例子

    万次阅读 2010-08-16 14:05:00
    作为一个SIP Servlet Tutorial,这个文档主要描述了在JavaEE平台下如何开发基于SIP协议的应用服务。当然这个教程也包含了如何将JavaEE技术与SIP应用程序集成。 这个教程主要涉及到的软件有: 1. ...

空空如也

1 2 3 4 5 ... 20
收藏数 59,618
精华内容 23,847
关键字:

servlet入门