请求和响应

 

 

图片 1

图片 2

 

 

服务器处理请求的流程:

服务器处理请求的流程:

    • 服务器每便收到请求时,都会为那几个请求开辟八个新的线程。
    • 服务器会把客户端的央浼数据封装到request对象中,request就是伸手数据的载体!
    • 服务器还会创立对象,那几个目的与客户端连接在一块,它可以用来向客户端发送响应。
    • 服务器每回接到请求时,都会为这几个请求开辟贰个新的线程。
    • 服务器会把客户端的哀求数据封装到request对象中,request就是呼吁数据的载体!
    • 服务器还会创设对象,那一个目的与客户端连接在一起,它可以用来向客户端发送响应。

一、HttpServletResponse对象

一、HttpServletResponse对象

  壹 、发送状态码相关的方法

  ① 、发送状态码相关的点子

  ServletResponse:与商事毫无干系的品类。

  ServletResponse:与商谈非亲非故的品种。

  HttpServletResponse:与商事相关的类型

  HttpServletResponse:与商谈相关的品种

状态码:200意味成功、302表示重定向、404表示客户端错误(访问资源不存在)、500代表服务器端错误

状态码:200代表成功、302代表重定向、404代表客户端错误(访问财富不设有)、500意味服务器端错误

  • sendError(int sc) :发送错误状态码,例如404,500
  • sendError(int sc,String msg):发送错误状态码,还足以带2个错误音信
  • setStatus(int sc):发送成功的状态码,可以用来发送302
  • sendError(int sc) :发送错误状态码,例如404,500
  • sendError(int sc,String msg):发送错误状态码,还足以带1个错误音讯
  • setStatus(int sc):发送成功的状态码,能够用来发送302

案例:

案例:

@WebServlet(name = "AServlet" ,urlPatterns = "/Aservlet")
public class AServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {
        response.sendError(404,"资源存在,但还发你404");
    }
} 
@WebServlet(name = "AServlet" ,urlPatterns = "/Aservlet")
public class AServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {
        response.sendError(404,"资源存在,但还发你404");
    }
} 

  2、响应头:Content-Type、Refresh、Location等等

  2、响应头:Content-Type、Refresh、Location等等

  • setHeader(String name,String value):适用于单值的响应头,例如
  • setHeader(String name,String value):适用于单值的响应头,例如

 response.setHeader(“aaa”,”AAA”); 

 response.setHeader(“aaa”,”AAA”); 

  • addHeader(String name,String value):适用于多值的响应头,例如:
  • addHeader(String name,String value):适用于多值的响应头,例如:

 response.addHeader(“aaa”,”ddd”);

 response.addHeader(“aaa”,”ddd”);

response.addHeader(“aaa”,”ccc”);

response.addHeader(“aaa”,”ccc”);

response.addHeader(“aaa”,”fff”); 

response.addHeader(“aaa”,”fff”); 

  • setIntHeader(String name,int
    value):适用于单值的int类型的响应头,例如:
  • setIntHeader(String name,int
    value):适用于单值的int类型的响应头,例如:

 response.setIntHeader(“Content-Length”,888); 

 response.setIntHeader(“Content-Length”,888); 

  • addIntHeader(String name,int value):适用于多值的int类型的响应头
  • setDateHeader(String name,long
    value):适用于单值得飞秒类型的响应头,例如:
  • addIntHeader(String name,int value):适用于多值的int类型的响应头
  • setDateHeader(String name,long
    value):适用于单值得微秒类型的响应头,例如:

response.setDateHeader(“expires”,1000*60*60*24);//页面过期时间为24小时   

response.setDateHeader(“expires”,1000*60*60*24);//页面过期时间为24钟头   

  • addDateHeader(String name,long value):适用于多值得飞秒类型的响应头
  • addDateHeader(String name,long value):适用于多值得皮秒类型的响应头

    常用setHeader(String name,String value).

    常用setHeader(String name,String value).

案例:

案例:

    • 发送302,设置Location头,完结一时重定向!

    /*

    • 演示重定向
    • 用户请求BServlet,然后BServlet响应302,给出Location头
    • */
      @WebServlet(name = “BServlet”,urlPatterns = “/BServlet”)
      public class BServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        System.out.println("BServlet");
        /*
        * 重定向:
        * 1、设置Location
        * 2、发送302状态码
        * */
        response.setHeader("Location","/CServlet");
        response.sendError(302);
      

      }
      }

    /*

    • 浏览器会重定向到那来
    • */
      @WebServlet(name = “CServlet”,urlPatterns = “/CServlet”)
      public class CServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("CServlet");
      

      }
      }

    // BServlet响应头

    • 出殡302,设置Location头,完毕目前重定向!

    /*

    • 演示重定向
    • 用户请求BServlet,然后BServlet响应302,给出Location头
    • */
      @WebServlet(name = “BServlet”,urlPatterns = “/BServlet”)
      public class BServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        System.out.println("BServlet");
        /*
        * 重定向:
        * 1、设置Location
        * 2、发送302状态码
        * */
        response.setHeader("Location","/CServlet");
        response.sendError(302);
      

      }
      }

    /*

    • 浏览器会重定向到那来
    • */
      @WebServlet(name = “CServlet”,urlPatterns = “/CServlet”)
      public class CServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("CServlet");
      

      }
      }

    // BServlet响应头

HTTP/1.1 302 
Location: /CServlet
Content-Length: 0
Date: Wed, 30 Aug 2017 01:57:17 GMT

HTTP/1.1 302 
Location: /CServlet
Content-Length: 0
Date: Wed, 30 Aug 2017 01:57:17 GMT

  //BServlet请求头

  //BServlet请求头

GET /BServlet HTTP/1.1
Host: localhost:8080
User-Agent: *****
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: Idea-e96526d7=db12919d-58f1-479a-b0f7-3104911c767b;
Webstorm-2933ea9e=87a0f860-7465-47bb-8d57-4358bd45ea39;
JSESSIONID=AD5DC7F501C87B36FF2186A0A1596564
Connection: keep-alive
Upgrade-Insecure-Requests: 1

GET /BServlet HTTP/1.1
Host: localhost:8080
User-Agent: *****
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: Idea-e96526d7=db12919d-58f1-479a-b0f7-3104911c767b;
Webstorm-2933ea9e=87a0f860-7465-47bb-8d57-4358bd45ea39;
JSESSIONID=AD5DC7F501C87B36FF2186A0A1596564
Connection: keep-alive
Upgrade-Insecure-Requests: 1

  //CServlet响应头

  //CServlet响应头

HTTP/1.1 200 
Content-Length: 0
Date: Wed, 30 Aug 2017 01:57:17 GMT

HTTP/1.1 200 
Content-Length: 0
Date: Wed, 30 Aug 2017 01:57:17 GMT

  //CServlet请求头

  //CServlet请求头

GET /CServlet HTTP/1.1
Host: localhost:8080
User-Agent: *****
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: Idea-e96526d7=db12919d-58f1-479a-b0f7-3104911c767b;
Webstorm-2933ea9e=87a0f860-7465-47bb-8d57-4358bd45ea39;
JSESSIONID=AD5DC7F501C87B36FF2186A0A1596564
Connection: keep-alive
Upgrade-Insecure-Requests: 1

GET /CServlet HTTP/1.1
Host: localhost:8080
User-Agent: *****
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: Idea-e96526d7=db12919d-58f1-479a-b0f7-3104911c767b;
Webstorm-2933ea9e=87a0f860-7465-47bb-8d57-4358bd45ea39;
JSESSIONID=AD5DC7F501C87B36FF2186A0A1596564
Connection: keep-alive
Upgrade-Insecure-Requests: 1

    • 定时刷新,设置Refresh头,可以领略为定时重定向。

    /*

    • 演示定时刷新
    • 安装多个Refresh,表示定时刷新
    • */
      @WebServlet(name = “DServlet”,urlPatterns = “/DServlet”)
      public class DServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        /*
        * 下面是用来发送响应体
        * */
        PrintWriter writer = response.getWriter();
        writer.print("欢迎xxx登陆!5秒钟后会自动跳转到主页!乱码来的");
        //设置名为Refresh的响应头
        response.setHeader("Refresh","5;URL=/EServlet");
      

      }
      }

    • 禁绝浏览器缓存:Cache-Control、pragma、expires

    /*

    • 剥夺浏览器缓存
    • */
      @WebServlet(name = “FServlet”,urlPatterns = “/FServlet”)
      public class FServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
        response.setDateHeader("Expires",-1);
      

      }
      }

    • <meta>标签可以替代响应头:<meta
      http-equiv=”Content-Type” content=”text/html”;charset=UTF-8>
    • 定时刷新,设置Refresh头,可以清楚为定时重定向。

    /*

    • 示范定时刷新
    • 安装2个Refresh,表示定时刷新
    • */
      @WebServlet(name = “DServlet”,urlPatterns = “/DServlet”)
      public class DServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        /*
        * 下面是用来发送响应体
        * */
        PrintWriter writer = response.getWriter();
        writer.print("欢迎xxx登陆!5秒钟后会自动跳转到主页!乱码来的");
        //设置名为Refresh的响应头
        response.setHeader("Refresh","5;URL=/EServlet");
      

      }
      }

    • 不准浏览器缓存:Cache-Control、pragma、expires

    /*

    • 剥夺浏览器缓存
    • */
      @WebServlet(name = “FServlet”,urlPatterns = “/FServlet”)
      public class FServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        response.setHeader("Cache-Control","no-cache");
        response.setHeader("Pragma","no-cache");
        response.setDateHeader("Expires",-1);
      

      }
      }

    • <meta>标签可以替代响应头:<meta
      http-equiv=”Content-Type” content=”text/html”;charset=UTF-8>

③ 、响应体:常常是html、也足以是图表

3、响应体:常常是html、也足以是图表

  response的八个流:

  response的多少个流:

    • ServletOutputStream,用来向客户端发送字节数据, ServletOutputStream out =
      response.getOutputStream(); 
    • PrintWriter,用来向客户端发送字符数量,需求安装编码, PrintWriter writer =
      respones.getWriter(); 
    • 八个流无法而且使用。
    • ServletOutputStream,用来向客户端发送字节数据, ServletOutputStream out =
      response.getOutputStream(); 
    • PrintWriter,用来向客户端发送字符数量,要求设置编码, PrintWriter writer =
      respones.getWriter(); 
    • 四个流无法而且拔取。

案例:

案例:

使用PrintWriter发送字符数量

利用PrintWriter发送字符数量

运用ServletOutputStream发送字节数据(图片)

采用ServletOutputStream发送字节数据(图片)

重定向:设置302,设置Location,其中变化的只有Location,所以Java提供了贰个便捷方法,完毕重定向。

重定向:设置302,设置Location,其中变化的唯有Location,所以Java提供了三个神速方法,完成重定向。

sendRedirect(String location)方法

sendRedirect(String location)方法

 response.sendRedirect(“http://www.baidu.com“); 

 response.sendRedirect(“http://www.baidu.com“); 

二、HttpServletRequest对象

二、HttpServletRequest对象

  请求协议中的数据都得以由此request对象来获取,request封装了客户端具备的呼吁数据,GET无请求体。

  请求协议中的数据都得以经过request对象来赢得,request封装了客户端具备的伸手数据,GET无请求体。

  一 、获取常用音讯

  一 、获取常用消息

    • 获取客户端IP,案例:封IP,request.getRemoteAddr();
    • 恳请格局,request.getMethod(),POST或GET
    • 获取客户端IP,案例:封IP,request.getRemoteAddr();
    • 伸手格局,request.getMethod(),POST或GET

  二 、获取请求头

  ② 、获取请求头

    • String getHeader(String name):适用于单值头
    • int getIntHeader(String name):适用于单值int类型的请求头
    • long getDateHeader(String name):适用于单值阿秒类型的呼吁头
    • Enumeration<String> getHeaders(String
      name):适用于多值请求头
    • String getHeader(String name):适用于单值头
    • int getIntHeader(String name):适用于单值int类型的哀求头
    • long getDateHeader(String name):适用于单值微秒类型的伸手头
    • Enumeration<String> getHeaders(String
      name):适用于多值请求头

  案例:

  案例:

    • 经过User-Agent识别用户浏览器类型

      1 @WebServlet(name = “AServlet”,urlPatterns = “/AServlet”)
      2 public class AServlet extends HttpServlet {
      3 protected void doGet(HttpServletRequest request, HttpServletResponse response)
      4 throws ServletException, IOException {
      5 String addr = request.getRemoteAddr();
      6 System.out.println(“IP:”+addr);
      7 System.out.println(“METHOD:”+request.getMethod());
      8 String userAgent = request.getHeader(“User-Agent”);
      9 // System.out.println(userAgent);
      10 // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWeb基特/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
      11 //是不是包涵Chrome,假设带有,表明用户使用的是google浏览器
      12 if(userAgent.toLowerCase().contains(“chrome”)){
      13 System.out.println(“您好:”+addr+”,您用的是谷歌(谷歌)”);
      14 }else if (userAgent.toLowerCase().contains(“firefox”)){
      15 System.out.println(“您好:”+addr+”,您用的是火狐”);
      16 }
      17 }

    • 防盗链:如果请求不是通过本站的超链接发出的,发送错误状态码404。Referer那么些请求头表示请求的来自。

    @WebServlet(name = “BServlet”,urlPatterns = “/BServlet”)
    public class BServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        * 使用Referer请求头,来防盗链
        * 直接在地址栏输入,则Referer头值为null
        * */
        String referer = request.getHeader("Referer");
        System.out.println(referer);
        if (referer == null || !referer.contains("localhost")){
            response.sendRedirect("http://www.baidu.com");
        }else {
            System.out.println("hello");
        }
    }
    

    }

    • 经过User-Agent识别用户浏览器类型

      1 @WebServlet(name = “AServlet”,urlPatterns = “/AServlet”)
      2 public class AServlet extends HttpServlet {
      3 protected void doGet(HttpServletRequest request, HttpServletResponse response)
      4 throws ServletException, IOException {
      5 String addr = request.getRemoteAddr();
      6 System.out.println(“IP:”+addr);
      7 System.out.println(“METHOD:”+request.getMethod());
      8 String userAgent = request.getHeader(“User-Agent”);
      9 // System.out.println(userAgent);
      10 // Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
      11 //是或不是带有Chrome,就算带有,表明用户使用的是google浏览器
      12 if(userAgent.toLowerCase().contains(“chrome”)){
      13 System.out.println(“您好:”+addr+”,您用的是谷歌(Google)”);
      14 }else if (userAgent.toLowerCase().contains(“firefox”)){
      15 System.out.println(“您好:”+addr+”,您用的是火狐”);
      16 }
      17 }

    • 防盗链:假诺请求不是经过本站的超链接发出的,发送错误状态码404。Referer那一个请求头表示请求的源于。

    @WebServlet(name = “BServlet”,urlPatterns = “/BServlet”)
    public class BServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
        * 使用Referer请求头,来防盗链
        * 直接在地址栏输入,则Referer头值为null
        * */
        String referer = request.getHeader("Referer");
        System.out.println(referer);
        if (referer == null || !referer.contains("localhost")){
            response.sendRedirect("http://www.baidu.com");
        }else {
            System.out.println("hello");
        }
    }
    

    }

  三 、获取请求U本田UR-VL

  三 、获取请求U科雷傲L

    http://localhost:8080/day10\_2/AServlet?username=xx&password=yyy

    http://localhost:8080/day10\_2/AServlet?username=xx&password=yyy

  • String getScheme():获取协议,http
  • String getServerName():获取服务器名,localhost
  • String getServerPost():获取服务器端口,8080
  • String getContextPath():获取项目名, /day10_2
  • String getServletPath():获取Servlet路径, /AServlet
  • String
    getQueryString():获取参数部分,即问号后边的一对,username=xx&password=yyy
  • String
    getRequestU奥迪Q5I():获取请求URAV4I,等于项目名+Servlet路径,/day10_2/AServlet
  • String
    getRequestU凯雷德L():获取请求U帕杰罗L,等于不含有参数的成套请求路径,http://localhost:8080/day10\_2/AServlet
  • String getScheme():获取协议,http
  • String getServerName():获取服务器名,localhost
  • String getServerPost():获取服务器端口,8080
  • String getContextPath():获取项目名, /day10_2
  • String getServletPath():获取Servlet路径, /AServlet
  • String
    getQueryString():获取参数部分,即问号前面的片段,username=xx&password=yyy
  • String
    getRequestU景逸SUVI():获取请求UENCOREI,等于项目名+Servlet路径,/day10_2/AServlet
  • String
    getRequestU奥迪Q7L():获取请求U汉兰达L,等于不分包参数的整套请求路径,http://localhost:8080/day10\_2/AServlet

  肆 、获取请求参数:请求参数:请求参数是由客户端发送给服务的,有只怕是在请求体中(POST),也有大概是在U奇骏L之后(GET)。

  四 、获取请求参数:请求参数:请求参数是由客户端发送给服务的,有可能是在请求体中(POST),也有只怕是在U奥迪Q3L之后(GET)。

  • String getParameter(String
    name):获取钦定名称的哀告参数值,适用于单值请求参数
  • String[] getParamerValues(String
    name):获取钦赐名称的哀告参数值,适用于多值请求参数
  • Enumeration<String> getParameterName():获取具有请求参数名称
  • Map<String,String[]>
    getParameterMap():获取具有请求参数,其中key为参数名,value为参数值。
  • 案例:超链接参数
  • 案例:表单数据

    1
    2
    3
    4
    5 Title
    6
    7
    8

    测试请求参数

    9 点击这里
    10


    11

    12 用户名:
    13 密码:
    14 爱好:打球
    15 美食
    16 看书
    17
    18
    19

    20
    21

    1 /
    2
    演示request获取请求参数!
    3 /
    4 @WebServlet(name = “AServlet”,urlPatterns = “/AServlet”)
    5 public class AServlet extends HttpServlet {
    6 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    7 String username = request.getParameter(“username”);
    8 String password = request.getParameter(“password”);
    9 String[] hobby = request.getParameterValues(“hobby”);
    10 System.out.println(username+”,”+password+”,”+ Arrays.toString(hobby));
    11 /
    12
    测试获取具有请求参数的称谓
    13 /
    14 Enumeration names = request.getParameterNames();
    15 while (names.hasMoreElements()) {
    16 System.out.println(names.nextElement());
    17 }
    18 /
    19
    获取具有请求参数,封装到Map中
    20 /
    21 Map map = request.getParameterMap();
    22 for (String name : map.keySet()) {
    23 String[] values = map.get(name); System.out.println(name+”=”+Arrays.toString(values));
    24 }
    25 System.out.println(“hello”);
    26 }
    27 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    28 System.out.println(“GET:”+request.getParameter(“xxx”));
    29 System.out.println(“GET:”+request.getParameter(“yyy”));
    30 }
    31 }

  • String getParameter(String
    name):获取内定名称的伸手参数值,适用于单值请求参数
  • String[] getParamerValues(String
    name):获取钦点名称的伸手参数值,适用于多值请求参数
  • Enumeration<String> getParameterName():获取具有请求参数名称
  • Map<String,String[]>
    getParameterMap():获取具有请求参数,其中key为参数名,value为参数值。
  • 案例:超链接参数
  • 案例:表单数据

    1
    2
    3
    4
    5 Title
    6
    7
    8

    测试请求参数

    9 点击这里
    10


    11

    12 用户名:
    13 密码:
    14 爱好:打球
    15 美食
    16 看书
    17
    18
    19

    20
    21

    1 /
    2
    演示request获取请求参数!
    3 /
    4 @WebServlet(name = “AServlet”,urlPatterns = “/AServlet”)
    5 public class AServlet extends HttpServlet {
    6 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    7 String username = request.getParameter(“username”);
    8 String password = request.getParameter(“password”);
    9 String[] hobby = request.getParameterValues(“hobby”);
    10 System.out.println(username+”,”+password+”,”+ Arrays.toString(hobby));
    11 /
    12
    测试获取具有请求参数的称呼
    13 /
    14 Enumeration names = request.getParameterNames();
    15 while (names.hasMoreElements()) {
    16 System.out.println(names.nextElement());
    17 }
    18 /
    19
    获取具有请求参数,封装到Map中
    20 /
    21 Map map = request.getParameterMap();
    22 for (String name : map.keySet()) {
    23 String[] values = map.get(name); System.out.println(name+”=”+Arrays.toString(values));
    24 }
    25 System.out.println(“hello”);
    26 }
    27 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    28 System.out.println(“GET:”+request.getParameter(“xxx”));
    29 System.out.println(“GET:”+request.getParameter(“yyy”));
    30 }
    31 }

  ⑤ 、请求转载和呼吁包罗:

  伍 、请求转载和请求包涵:

    RequestDispatcher rd =
request.getRequestDispatchet(“/MyServlet”);
使用request获取RequestDisapatcher对象,方法的参数是被转化或含有的Servlet的Servlet路径      

    RequestDispatcher rd =
request.getRequestDispatchet(“/MyServlet”);
使用request获取RequestDisapatcher对象,方法的参数是被转载或包蕴的Servlet的Servlet路径      

  • 伸手转载:rd.forward(request,response);
  • 恳请包蕴:rd.include(request,response);
  • 伸手转载:rd.forward(request,response);
  • 恳请包括:rd.include(request,response);

    有时一个请求须求多少个Servlet同盟才能不辱任务,所以须要在三个Servlet跳到另3个Servlet!

    有时一个请求须要八个Servlet合营才能到位,所以必要在2个Servlet跳到另1个Servlet!

图片 3

图片 4

    • 3个伸手跨多少个Servlet,必要使用转载和包括。
    • 呼吁转载:由下3个Servlet完毕响应体,当前Servlet可以安装响应头(留头不留体);
    • 伸手包括:由多少个Servlet共同完毕响应体(都留)。
    • 无论请求转载大概请求包罗,都在三个请求范围内,使用同一request和response。
    • 二个请求跨八个Servlet,需求动用转载和带有。
    • 伸手转载:由下三个Servlet达成响应体,当前Servlet可以安装响应头(留头不留体);
    • 伸手蕴涵:由多个Servlet共同完成响应体(都留)。
    • 无论是请求转发或然请求包罗,都在3个呼吁范围内,使用同一request和response。

  6、request域

  6、request域

      Servlet中三大域对象:request、session、application,都有如下方法

      Servlet中三大域对象:request、session、application,都有如下方法

    • void setAttribute(String name,Object value)
    • Object getAttribute(String name)
    • void removeAttribute(String name)
    • 同多个请求范围内采用request.setAttribute()、request.getAttribute()来传值,前三个Servlet调用setAttribute()保存值,后二个Servlet调用getAttribute()获取
    • void setAttribute(String name,Object value)
    • Object getAttribute(String name)
    • void removeAttribute(String name)
    • 同二个请求范围内尔y用request.setAttribute()、request.getAttribute()来传值,前3个Servlet调用setAttribute()保存值,后1个Servlet调用getAttribute()获取

    图片 5

    图片 6

 

 

  ⑦ 、请求转载和重定向的界别

  七 、请求转载和重定向的不一致

    • 伸手转载是一个呼吁2个响应,而重定向是七个请求三次响应
    • 伸手转载地址栏不成形,而重定向会彰显后二个请求的地方
    • 伸手转载只可以中转到本项目其余Servlet,而重定向不止重定向到本项目标任何Servlet,还是可以定向到此外品类
    • 恳请转发是服务器端行为,只需提交转载的Servlet路径,而重定向必要给出requestU智跑I,即含有项目名。
    • 呼吁转发和重定向效用是转账高,因为是2个呼吁。
      • 急需地方栏变化,那么必须重定向
      • 需求在下二个Servlet中赢得request域中的数据,必要求动用转载。

    /*

    • 示范请求转发和包括
    • 在意在一个汤姆cat中不可以有name、urlPatterns名称一致的动静,否则抛极度
    • */
      @WebServlet(name = “OneServlet”,urlPatterns = “/OneServlet”)
      public class OneServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        System.out.println("OneServlet");
        response.setHeader("aaa","AAA");//设置响应头
      

            /
            
      向request域中添加2天性能       /
           request.setAttribute(“username”,”zhangsan”)
           response.getWriter().print(“hello OneServlet”);//设置响应体,包蕴时显得,转载时不显得 request.getRequestDispatcher(“/TwoServlet”).include(request,response);//请求包罗   //等同于调用TwoServlet的service()方法
         //request.getRequestDispatcher(“/TwoServlet”).forward(request,response);//请求转发  }
      }
      @WebServlet(name = “IncludeTwoServlet”,urlPatterns = “/include/TwoServlet”)
      public class TwoServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
           System.out.println(request.getAttribute(“username”));
          System.out.println(“TwoServlet…”);

        response.getWriter().print("hello TwoServlet");//设置响应体
      

      }
      }

    • 恳请转载是一个请求2个响应,而重定向是三个请求三次响应
    • 恳请转载地址栏不转移,而重定向会显示后一个伸手的地点
    • 呼吁转载只可以中转到本项目其余Servlet,而重定向不止重定向到本项目标别的Servlet,仍可以定向到别的项目
    • 请求转载是劳务器端行为,只需付出转载的Servlet路径,而重定向需求给出requestU凯雷德I,即含有项目名。
    • 恳请转载和重定向成效是转载高,因为是三个伸手。
      • 亟需地点栏变化,那么必须重定向
      • 内需在下2个Servlet中拿走request域中的数据,必须求运用转载。

    /*

    • 以身作则请求转载和富含
    • 瞩目在多个汤姆cat中不可以有name、urlPatterns名称相同的景观,否则抛卓殊
    • */
      @WebServlet(name = “OneServlet”,urlPatterns = “/OneServlet”)
      public class OneServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {
        System.out.println("OneServlet");
        response.setHeader("aaa","AAA");//设置响应头
      

            /
            
      向request域中添加多少个本性       /
           request.setAttribute(“username”,”zhangsan”)
           response.getWriter().print(“hello OneServlet”);//设置响应体,包涵时显示,转载时不显得 request.getRequestDispatcher(“/TwoServlet”).include(request,response);//请求包涵   //等同于调用TwoServlet的service()方法
         //request.getRequestDispatcher(“/TwoServlet”).forward(request,response);//请求转发  }
      }
      @WebServlet(name = “IncludeTwoServlet”,urlPatterns = “/include/TwoServlet”)
      public class TwoServlet extends HttpServlet {
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
           System.out.println(request.getAttribute(“username”));
          System.out.println(“TwoServlet…”);

        response.getWriter().print("hello TwoServlet");//设置响应体
      

      }
      }

三、编码

三、编码

  常见字符编码:ISO-8889-1(不扶助汉语),gbk(系统默许编码,中国的国标码),utf-8(万国码,协理全球的编码)

  常见字符编码:ISO-8889-1(不扶助粤语),gbk(系统暗中认可编码,中国的国标码),utf-8(万国码,扶助全球的编码)

① 、响应编码

① 、响应编码

  • 当使用response.getWriter()来向客户端发送字符数量时,假若在头里从未设置编码,那么暗中同意使用iso,因为iso不匡助汉语,一定乱码;
  • 在接纳response.getWriter()此前能够运用response.setCharacterEncoding()来设置字符流的编码为gbk或utf-8,当然大家普通选取utf-8,那样发送出去的字符都拔取了设置的编码形式。
  • 在应用response.getWriter()以前可以利用response.setHeader(”Content-type”,”text/html;charset=utf-8″)来安装响应头,布告浏览器那边使用的是utf-8,浏览器通过Content-Type头知道,浏览器也使用utf-8。
  • setHeader(”Content-type”,”text/html;charset=utf-8″)的高速方法是:setContentType(”text/html;charset=utf-8″)。
  • 当使用response.getWriter()来向客户端发送字符数量时,假若在头里没有安装编码,那么暗中认同使用iso,因为iso不帮衬中文,一定乱码;
  • 在接纳response.getWriter()此前能够运用response.setCharacterEncoding()来设置字符流的编码为gbk或utf-8,当然我们常见选用utf-8,那样发送出去的字符都选择了设置的编码格局。
  • 在使用response.getWriter()此前可以利用response.setHeader(”Content-type”,”text/html;charset=utf-8″)来安装响应头,文告浏览器那边使用的是utf-8,浏览器通过Content-Type头知道,浏览器也采用utf-8。
  • setHeader(”Content-type”,”text/html;charset=utf-8″)的立刻方法是:setContentType(”text/html;charset=utf-8″)。

图片 7

图片 8

② 、请求编码

二 、请求编码

  • 客户端发送给服务器的伸手参数是怎么编码:客户端首先打开一个页面,然后再页面中付出表单或点击超链接,在乞求那么些页面时,服务器响应的编码是何许,那么客户端发送请求时的编码就是如何
  • 劳动器端暗许使用什么编码来解码参数:服务器端暗中同意ISO-8859-1来解码,一定出现乱码。
  • 伸手编码处理分为二种:GET、POST,GET请求参数不在请求体中,而POST请求参数在请求体中,全部他们的处理形式是差其他!
  • GET请求编码处理:
    • String username = new
      String(request.getParameter(“iso-8859-1″,”utf-8”));
    • 在server.xml中配置URIEncoding=utf-8
  • POST请求编码处理:
    • String username = new
      String(request.getParameter(“iso-8859-1″,”utf-8”));
    • 在拿到参数以前调用request.setCharacterEncoding(“utf-8”);
  • 客户端发送给服务器的呼吁参数是何许编码:客户端首先打开3个页面,然后再页面中提交表单或点击超链接,在伏乞那么些页面时,服务器响应的编码是哪些,那么客户端发送请求时的编码就是如何
  • 劳动器端暗中同意使用什么编码来解码参数:服务器端暗许ISO-8859-1来解码,一定出现乱码。
  • 恳请编码处理分为三种:GET、POST,GET请求参数不在请求体中,而POST请求参数在请求体中,全部他们的处理格局是差距的!
  • GET请求编码处理:
    • String username = new
      String(request.getParameter(“iso-8859-1″,”utf-8”));
    • 在server.xml中配置URIEncoding=utf-8
  • POST请求编码处理:
    • String username = new
      String(request.getParameter(“iso-8859-1″,”utf-8”));
    • 在得到参数此前调用request.setCharacterEncoding(“utf-8”);

图片 9

图片 10

3、URL编码

3、URL编码

  表单的品种:Content-Type:
application/x-www-form-urlencoded,就是把作为转换来%后头紧跟着两位的16进制。

  表单的品类:Content-Type:
application/x-www-form-urlencoded,就是把作为转换到%背后紧跟着两位的16进制。

  客户端和服务器之间传递中文时索要把它转换到网络适合的章程。

  客户端和服务器之间传递汉语时索要把它转换成互联网适合的形式。

  • 它不是字符编码
  • 它是用来在客户端与服务器之间传递参数用的一种办法。
  • U大切诺基L编码必要先驾驭一种字符编码,把字符串解码后,得到byte[],然后把小于0的字节+256,再转换到16进制,前边添加三个%。
  • POST请求默认使用UOdysseyL编码,汤姆cat会自动使用U哈弗L解码。
  • URL编码:String username = URLEncoder.encode(username,”utf-8″);
  • URL解码:String username = URLEncoder.decode(username,”utf-8″);
  • 它不是字符编码
  • 它是用来在客户端与服务器之间传递参数用的一种办法。
  • UCR-VL编码须求先明了一种字符编码,把字符串解码后,拿到byte[],然后把小于0的字节+256,再转换来16进制,前边添加2个%。
  • POST请求暗中认同使用U劲客L编码,汤姆cat会自动使用UENCOREL解码。
  • URL编码:String username = URLEncoder.encode(username,”utf-8″);
  • URL解码:String username = URLEncoder.decode(username,”utf-8″);

图片 11

图片 12

 

 

  大家需把链接中的中文参数,使用url来编码,使用jsp,因为HTML不可以给出Java代码。

  大家需把链接中的中文参数,使用url来编码,使用jsp,因为HTML无法给出Java代码。

4、路径

4、路径

  • web.xml中<url-pattern>路径(叫它Servlet路径)
    • 要么以“*”开头,要么以“/”开头
  • 中转和带有路径
  • 重定向路径(客户端路径)
  • 页面中中国足球球协会一流联赛链接和表单路径
    • 与重定向相同,都以客户端路径,必要加上项目名
  • ServletContext获取能源路径
    • 争执当前项目目录,即目前index.jsp所在目录
  • ClassLoader得到财富路径
    • 相对classes目录
  • Class获取财富路径
    • 以“/”开端相对classes目录
    • 不以“/”先导相对当前.class文件所在目录。
  • web.xml中<url-pattern>路径(叫它Servlet路径)
    • 要么以“*”开头,要么以“/”开头
  • 中转和带有路径
  • 重定向路径(客户端路径)
  • 页面Chinese Football Association Super League链接和表单路径
    • 与重定向相同,都是客户端路径,必要丰盛项目名
  • ServletContext获取财富路径
    • 相对当前项目目录,即当前index.jsp所在目录
  • ClassLoader拿到能源路径
    • 相对classes目录
  • Class获取财富路径
    • 以“/”起头相对classes目录
    • 不以“/”起初相对当前.class文件所在目录。