|    1. 创建JavaEE项目          2.  定义一个类,实现Servlet接口                 *  public class ServletDemo1 implements Servlet          3.  实现接口中的抽象方法          4.  配置Servlet                  在web.xml中配置:              <!--配置Servlet  -->              <servlet>                   <servlet-name>demo1</servlet-name>                   <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>              </servlet>              <servlet-mapping>                   <servlet-name>demo1</servlet-name>                   <url-pattern>/demo1</url-pattern>              </servlet-mapping>    | 
|    Servlet的体系结构                Servlet  -- 接口                 |          GenericServlet  -- 抽象类                 |          HttpServlet  -- 抽象类          *  GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象                 *  将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可          * HttpServlet:对http协议的一种封装,简化操作                 1. 定义类继承HttpServlet                 2. 复写doGet/doPost方法    | 
|    public class MyServlet3 extends HttpServlet {   @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { } }  | 
|    Servlet3.0:          *  好处:                 * 支持注解配置。可以不需要web.xml了。          *  步骤:                 1.  创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml                 2.  定义一个类,实现Servlet接口                 3.  复写方法                 4.  在类上使用@WebServlet注解,进行配置                        * @WebServlet("资源路径")    | 
| @WebServlet("/myServlet3") public class MyServlet3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) { } }  | 
|    1. 请求行                 请求方式  请求url 请求协议/版本                 GET  /login.html   HTTP/1.1                 *  请求方式:                        *  HTTP协议有7中请求方式,常用的有2种                               *  GET:                                      1.  请求参数在请求行中,在url后。                                      2.  请求的url长度有限制的                                      3.  不太安全                               *  POST:                                      1.  请求参数在请求体中                                      2.  请求的url长度没有限制的                                      3.  相对安全          2. 请求头:客户端浏览器告诉服务器一些信息                 请求头名称: 请求头值                 *  常见的请求头:                        1.  User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息                               *  可以在服务器端获取该头的信息,解决浏览器的兼容性问题                        2.  Referer:http://localhost/login.html                               *  告诉服务器,我(当前请求)从哪里来?                                      *  作用:                                             1.  防盗链:                                             2.  统计工作:          3. 请求空行                 空行,就是用于分割POST请求的请求头,和请求体的。          4. 请求体(正文):                 *  封装POST请求消息的请求参数的    | 
|    POST /login.html?user=lisi   HTTP/1.1                    Host: localhost                    User-Agent: Mozilla/5.0  (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0                    Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8                    Accept-Language:  zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2                   Accept-Encoding:  gzip, deflate                    Referer:  http://localhost/login.html                    Connection: keep-alive                    Upgrade-Insecure-Requests: 1                    username=zhangsan           | 
|    1. 响应行                        1.  组成:协议/版本 响应状态码 状态码描述                        2.  响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。                               1.  状态码都是3位数字                                2.  分类:                                      1.  1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码                                      2.  2xx:成功。代表:200                                      3.  3xx:重定向。代表:302(重定向),304(访问缓存)                                      4.  4xx:客户端错误。                                             *  代表:                                                    *  404(请求路径没有对应的资源)                                                     *  405:请求方式没有对应的doXxx方法                                      5.  5xx:服务器端错误。代表:500(服务器内部出现异常)   2响应头:   格式:头名称: 值   常见的响应头:   Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式   Content-disposition:服务器告诉客户端以什么格式打开响应体数据   值:   in-line:默认值,在当前页面内打开   attachment;filename=xxx:以附件形式打开响应体。文件下载   3.响应空行   4.响应体:传输的数据    | 
|    HTTP/1.1 200 OK                 Content-Type:  text/html;charset=UTF-8                 Content-Length:  101                 Date:  Wed, 06 Jun 2018 07:08:42 GMT                 <html>                   <head>                     <title>$Title$</title>                   </head>                   <body>                   hello , response                   </body>                 </html>    | 
|     1. 获取请求行数据   (***)获取虚拟目录:/day14           String getContextPath()    (***)获取请求URI:/day14/demo1                 *  String getRequestURI():         /day14/demo1                 StringBuffer  getRequestURL()   :http://localhost/day14/demo1                 *  URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国                 *  URI:统一资源标识符 : /day14/demo1                                  共和国   2. 获取请求头数据                 *  方法:                 *  (***)String getHeader(String name):通过请求头的名称获取请求头的值   3. 获取请求体数据:   String getParameter(String name):根据参数名称获取参数值 username=zs&password=123   Map<String,String[]> getParameterMap():获取所有参数的map集合   4.解决获取时候的中文乱码   ***** 中文乱码问题:          * get方式:tomcat 8 已经将get方式乱码问题解决了          *  post方式:会乱码          * 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");    | 
|    5.请求转发。   *2. 请求转发:一种在服务器内部的资源跳转方式   1.     步骤:   1.     1.通过request对象获取请求转发器对象:RequestDispatcher  getRequestDispatcher(String path)   2.         2.     2.使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse  response)    3.         request. getRequestDispatcher(“/index.html”).  forward(request, response);    | 
|    * 功能:设置响应消息          1.  设置响应行                 1.  格式:HTTP/1.1 200 ok                 2. 设置状态码:setStatus(int sc)           2. 设置响应头:setHeader(String name, String value)           3.  设置响应体:                 *  使用步骤:                        1.  获取输出流                               * 字符输出流:PrintWriter getWriter()                               * 字节输出流:ServletOutputStream getOutputStream()                        2.  使用输出流,将数据输出到客户端浏览器    | 
|    * 重定向:资源跳转的方式                 *  代码实现:                        //1.  设置状态码为302                  response.setStatus(302);                  //2.设置响应头location                   response.setHeader("location","/day15/responseDemo2");          //简单的重定向方法-以后用的技术            response.sendRedirect("/day15/responseDemo2");    | 
|    * forward 和  redirect 区别   重定向的特点:redirect                           1.  地址栏发生变化                        2.  重定向可以访问其他站点(服务器)的资源                        3.  重定向是两次请求。不能使用request对象来共享数据   * 转发的特点:forward                        1.  转发地址栏路径不变                        2.  转发只能访问当前服务器下的资源                        3.  转发是一次请求,可以使用request对象来共享数据    | 
|    * 乱码问题:                 1.  PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1                 2.  设置该流的默认编码            resp.setCharacterEncoding("utf-8");                3.  告诉浏览器响应体使用的编码          resp.setHeader("Content-type","text/html;charset=utf-8");  //简单的形式,设置编码,是在获取流之前设置《我们以后用的》    response.setContentType("text/html;charset=utf-8");    | 
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |