Servlet笔记

Servlet
  1)、简介
    Servlet是运行在服务器上的一段小java程序,通过http来接收和响应用户的请求。
    Servlet是sun公司制定的一套规范。
    所有Servlet的实现类都可以称为Servlet

  2)、HelloWorld
    1、创建Servlet的实现类
    2、在service方法中写代码
    3、web.xml里面配置servlet
      <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.sutdy.servlet.LoginServlet</servlet-class>
      </servlet>

      <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
      </servlet-mapping>

    4、当用户访问:http://localhost:8080/项目名/LoginServlet

  5、Servlet的生命周期
    Servlet运行在Servlet容器里,Tomcat服务器,
    服务器创建和销毁servlet对象,管理servlet

    构造器;创建对象
    init();初始化
    service();处理请求
    destory();销毁

    第一次请求servlet的时候
    构造器--》init()--》service()
    以后请求
    service();
    销毁
    web应用被卸载 destory()

    private ServletConfig config;
    init(ServletConfig config){
      this.config = config;
    };

  3)、ServletConfig
    代表:当前Servlet的配置信息 一个Servlet对应一个ServletConfig
    获取:Servlet初始化时服务器将ServletConfig对象传入init方法。
    功能:
      1)、获取Servlet别名
        config.getServletName()

      2)、获取Servlet初始化参数
        <servlet>
          <servlet-name>ConfigServlet</servlet-name>
          <servlet-class>com.atguigu.servlet.ConfigServlet</servlet-class>
          <init-param>
            <param-name>username</param-name>
            <param-value>leifengyang</param-value>
          </init-param>
        </servlet>
        config.getInitParameter("name值");

      3)、获取ServletContext对象
        config.getServletContext();

  4)、ServletContext
    代表:Servlet上下文,也就是当前web应用,一个web应用对应一个ServletContext
    获取:servletConfig.getServletContext();
    功能:
      1)、获取当前web项目的初始化参数
        <context-param>
          <param-name>user</param-name>
          <param-value>root</param-value>
        </context-param>
        String user = context.getInitParameter("user");

      2)、获取web项目在服务器上的路径,虚拟路径 /项目名 http://localhost:8080/项目名
        String path = context.getContextPath();

      3)、获取当前web项目下资源的真实路径 服务器上存储的实际路径(磁盘路径)
        String realPath = context.getRealPath("资源在web项目下的虚拟路径");

      4)、作为最大的域对象共享数据 ServletContext application
          域对象可以用来在不同的web资源中共享数据
          pageConext request session application



  5)、HttpServlet--->eclipse自动创建
    专门用来处理Http请求
    doGet():处理get请求
    doPost():处理post请求

    doGet(){
      doPost();
    }
    doPost(){
      //写代码
    }

    用户发来一个请求--->servlet(service())--->GenericServlet(service())--->
    HttpServlet(重写的service()-->service(判断请求类型))
      --->doGet()
      --->doPost();

  6)、HttpServletRequest
    代表:封装当次Http请求信息的对象
    获取:服务器会自动传入
    功能:
      1)、获取请求参数
        request.getParameter("username");//key-value
        request.getParameterValues("aihao");//获取多选框之类的数据

      2)、转发
        request.getRequestDispatcher("success.html").forward(request,response);

      3)、获取请求头信息
        request.getHeader("请求头");
        request.getHeaders("请求头");
      4)、作为域对象共享数据
        application request

      5)、获取项目虚拟路径
        String path= request.getContextPath();

  7)、HttpServletResponse
    代表:代表当次的响应对象
    获取:服务器传参进入
    功能:
      1)、给页面输出内容
        response.getWriter().write("HelloWorld");
      2)、重定向
        response.sendRedirect("重定向的位置");

  8)、转发与重定向

    他是在web应用中页面跳转的重要手段
            转发               重定向
    浏览器地址栏    不变               变
    请求次数       1                  2
    使用方式      request            response.sendRedirect();
          .getRequestDispatcher()
          .forward(request,response)

    位置      服务器内部找资源并返回     浏览器端处理(重新访问)
  WEB-INF(受保护)   可以                不可以
共享请求域数据       可以共享               不可以
目标资源         只能找当前项目里面            任意位置



  9)、字符编码问题
    乱码问题原因:字符集不统一

    1、get请求提交中文(放在url里面)
      原因:服务器获取解析url的时候不知道编码规则
        修改服务器的配置文件:server.xml
          8080 URIEncoding="utf-8"
    2、post请求提交中文(放在请求体里)
      原因:服务不知道怎么解析收到的文字
        request.setCharacterEncoding("utf-8");
    3、响应也乱码 response.getWriter.write("中文")
      原因:浏览器不知道写出的这些数据的编码及内容类型
        response.setContentType("text/html;charset=utf-8");

  10)、工程路径问题
    1)、url组成
    
      http://localhost:8080/项目名/资源名
      协议名://主机名:端口号/项目名/资源名

    2)、路径问题
      相对路径:不以/开始,相对于当前资源的路径
      在转发情况下,相对路径可能不靠谱

      绝对路径:以/开始,相对于根目录的路径
        推荐使用绝对路径

        1、页面上的路径: /代表得是服务器的根目录 http://localhost:8080
          写绝对路径加上项目名
          <a href=""></a> <img src=""> <form action=""> <script src=""> <link href="">...

        2、服务器上的路径: /代表 当前项目 http://localhost:8080/项目名
          <url-pattern>/login</url-pattern>
          request.getRequestDispatcher("/login-success.html")

        3、重定向的路径:他是浏览器解析 /代表得是服务器的根目录 http://localhost:8080
          response.sendRedirect(reuqest.getContextPath+"/资源路径")

 

Servlet运行流程

HttpServlet原理图解:

虚拟路径与真实路径图解

转发和重定向图解




posted @ 2020-03-25 17:14  orzxxll  阅读(138)  评论(0)    收藏  举报