Java-servelt


一、Servlet线程特性

(一)Web应用服务器将为每个客户端的连接启动一个线程来服务

(二)多个浏览器客户端访问同一个Servlet,服务器会创建多少个Servlet对象

  • 第一次访问Servlet时,服务器将创建一个该Servlet类的对象,并调用doXXX方法生成响应
  • 多个客户端访问同一个Servlet时,不再创建新的对象,而是共用同一个Servlet对象
  • 可以说,Servlet是多线程单实例的(一个web.xml配置servlet-name 对应一个实例

(三)课堂练习

1.目标

  • 多个浏览器客户端访问同一个Servlet,服务器会创建多少个Servlet对象吗?

2.步骤

(1)创建 Web Project

(2)创建Servlet

(3)分别在构造方法、无参init方法、doGet方法、doPost方法中编写打印输出语句进行验证

(4)启动多个浏览器访问同一个servlet,最终访问的是同一个servlet实例

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
    public HelloServlet() {
        System.out.println("HelloServlet的构造方法");
    }
    @Override
    public void init() throws ServletException {
        System.out.println("HelloServlet.init()方法");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet.doPost()方法");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet.doGet()方法");
    }
}

3.结论

  • 结论:第一次访问Servlet时,服务器将创建一个该Servlet类的对象,并调用doXXX方法生成响应;
  • 多个客户端访问同一个Servlet时,不再创建新的对象,而是共用同一个Servlet对象。
  • Servlet是多线程单实例

二、请求和响应接口

(一)Web应用基于HTTP协议,HTTP协议基于请求/响应模型

1.什么是请求数据

  • 通过浏览器给服务端的所有数据称为请求数据

2.什么是响应数据

  • 通过服务器返回给客户端的数据称为响应数据

3.封装和操作请求数据和响应数据是请求接口和响应接口

4.doXXX

public abstract class HttpServlet
extends GenericServlet
implements java.io.Serializable

  • 服务器(Tomcat)会创建请求对象和响应对象传递给doXXX方法,doXXX方法中可以直接使用请求和响应对象
  • 参数:
    • req - 一个 HttpServletRequest 对象,其中包含客户端对 servlet 发出的请求
    • resp - 一个 HttpServletResponse 对象,其中包含 servlet 发送给客户端的响应

1、OPTIONS

  • 由服务器调用(通过 service 方法)以允许 servlet 处理 OPTIONS 请求。
  • 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性

2、HEAD 

  • 向 服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息

 3、GET

  • 由服务器调用(通过 service 方法)以允许 servlet 处理 GET 请求。
  • 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url

4、POST

  • 由服务器调用(通过 service 方法)以允许 servlet 处理 POST 请求。
  • 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form

5、PUT

  • 由服务器调用(通过 service 方法)以允许 servlet 处理 PUT 请求。
  • 向指定资源位置上传其最新内容

6、DELETE

  • 由服务器调用(通过 service 方法)以允许 servlet 处理 DELETE 请求。
  • 请求服务器删除Request-URL所标识的资源

7、TRACE

  • 由服务器调用(通过 service 方法)以允许 servlet 处理 TRACE 请求。
  • 回显服务器收到的请求,主要用于测试或诊断

课堂练习

5.目标

  • 编写简单Servlet,验证服务器会创建请求和响应对象

6.步骤

  • 在doXXX()方法打印请求对象和响应对象
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet()方法");
        System.out.println("request:"+request);
        System.out.println("response:"+response);
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }
    request:org.apache.catalina.connector.RequestFacade@13f51bb8
    response:org.apache.catalina.connector.ResponseFacade@1d32f7b6

7.结论

  • 服务器实现了请求和响应接口,实现类分别是RequestFacade以及ResponseFacade;
  • 每次访问Servlet,服务器都会创建请求对象和响应对象传递给doXXX方法
  • doXXX方法中可以直接使用请求和响应对象
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet()方法");        
        System.out.println("request:"+request);        
        System.out.println("response:"+response);        
        //获取上下文路径        
        String contextPath = request.getContextPath();        
        System.out.println(contextPath);        
        response.getWriter().append("Served at: ").append(request.getContextPath());    
    }
    /0428-web-servlet

三、利用Servlet对客户端不同方式请求作出动态响应

(一)客户端访问服务器端Servlet的方式有三种

  1. 直接从地址栏输入URL访问;

  2. 在网页中点击超级链接访问;

  3. 在网页中通过表单提交访问;

(二)课堂练习

1.目标

  • 编写Servlet,返回客户端IP地址,以测试三种请求方式

2.步骤

  1. 编写Servlet

  2. doGet():网页输出:"您好,目前调用的是doGet方法,您的IP地址是:"+ip

  3. doPost():网页输出:"您好,目前调用的是doPost方法,您的IP地址是:"+ip

    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置编码
            resp.setContentType("text/html;charset = utf-8");
            /*ServletRequest接口
            String getRemoteAddr();    返回发送请求的客户端的互联网协议(IP)地址。*/
            //获取ip
            String ip = req.getRemoteAddr();
            //输出ip
            resp.getWriter().println("您好,目前调用的是doGet方法,您的IP地址是:" + ip);
    }
    @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html;charset = utf-8");
            String ip = req.getRemoteAddr();
            resp.getWriter().write("您好,目前调用的是doPost方法,您的IP地址是:" + ip);
        }
  4. 直接在浏览器地址栏输入URL访问:Get

  5. 在网页中点击超链接访问:Get

    
    
    
    
    Insert title here
    
    
        Go servlet
    
    

  6. 在网页中通过表单提交

    1. 没有指定method的表单,默认是get方式

      
      
      
      
      Insert title here
      
      
      

    2. 指定method为post的表单,提交方式为post

      
      
      
      
      Insert title here
      
      
      

3.总结

  1. 直接使用URL访问,是GET方式,调用doGet方法;
  2. 超级链接访问,是GET方式,调用doGet方法;
  3. 表单提交访问,取决form的method属性的值,默认是get,指定为post时,调用doPost方法;

四、Servlet中获取普通请求不同名或同名的参w数(name1=value1&name2=value2&...)的方法

(一)客户端向服务器servlet传递请求参数的方式有2种