Servlet

一:什么是Servlet?

  浏览器访问服务器获取资源的时候,其中数据是通过java实现Servlet的类来获取的。继承了Servlet的类可以与前端进行交互。

  实现Servlet接口的类被称为Servlet资源

 

二:Servlet接口中的5个重要方法:

  1. 被创建:执行init方法,只会执行一次 (说明Servlet只会被创建一次,是单例模式)
  2. 被调用:执行service方法,没调用一次就执行一次
  3. 被销毁:执行destroy方法,当tomcat正常关闭时调用,也只会调用一次
  4. 获取Servlet配置对象:getServletConfig(了解)
  5. 获取Servlet信息:getServletInfo(要十分了解) ,版本、作者等.

 

三:注解配置

  java中需要和前端交互的类是需要配置一个虚拟路径的,方便找到。使用注解就可以配置。

  在类上使用@WebServlet(urlPatterns = " ",loadOnStartup = 0)   其中第一个是虚拟路径,第二个是创建时机,如果不写创建时机的话直接传入虚拟路径字符串就可以    

 

四:路径的定义规则  

  1. /xxx :一直在用
  2. /xxx/xxx:多层路径,也叫做目录结构
  3. *.do :所有的以.do结尾的请求。 不要加/。
  演示
  1. /xxx/xxx :
  @WebServlet("/user/demo4")
  @WebServlet("/user/*")
  @WebServlet("/*"):注意:*的优先级最低
  2. /*.do
  @WebServlet("*.do")

 

五:HttpServlet:Servlet的替代品,是Servlet的实现类,比Servlet要好。

  浏览器向服务器请求数据时会根据需求的不同请求方式也不同,HttpServlet里有各种请求所对应的方法,比如get 对应doGet方法。

 

 六:在继承HttpServlet的class中获取前端请求的页面信息

  例:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

  不论是对应哪种请求方式的方法,其中都有2个参数,一个是前端传来的各种信息(req),另一个可以向前端响应信息(resp)。

 

  1:req中的一些方法:

     获取请求行的信息:

     (1)req.getMethod()    //获取请求方式

     (2)req.getContextPath()    //获取虚拟目录

     (3)req.getServletPath()      //获取Servlet路径

    (4) req.getQueryString()      //获取get方式的请求参数

    (5)req.getRequestURI()    //获取请求的uri(从虚拟路径开始)

   (6) req.getRequestURL()    //获取请求的uri(从ip开始)

   (7)req.getProtocol()         //获取协议和版本

   (8)req.getRemoteAddr()  //获取客户端的ip地址

    获取请求头的信息:

    (1)req.getHeader(String str)   //获取传入的名称的信息

    (2)req.getHeaderNames() //获取所有的头信息,返回值是Enumeration<String> 

    获取请求体的信息:  

    1. String getParameter(String name)  :根据参数名称获取参数值。
如:username=zhangsan 传入username就可以得到zhangsan
    2. String[] getParameterValues(String name) :根据参数名称获取参数值的数组
适用于多选的情况,如:hobby=xxx&hobby=bbb&hobby=ccc
    3. Enumeration<String> getParameterNames() :获取所有的请求参数名称
   获取这些么名称的方式跟刚才一样,遍历Enumeration
    4. Map<String,String[]> getParameterMap() :获取所有的参数的Map集合
   key:参数名称 String类型
value:参数的值 String[]类型
  2:resp中的方法
    (1): resp.setStatus() //设置状态码
    (2): resp.setHeader() //设置响应头
    (2): resp.getWriter().writer() //字符输出

七:乱码问题:
  1:前端传来的请求信息乱码问题:

   get方式在Tomcat8以及更高版本自动解决

   post需要在方法第一行设置request.setCharacterEncoding("utf-8");

   2:Servlet资源向页面输出汉字时的乱码

    设置编码格式和浏览器一致即可

    resp.setCharacterEncoding("gbk")

 

八:转发:

  有时候前端向服务器请求资源时,一个Servlet资源无法完成全部需求,会跳转到其他Servlet资源完成其余需求,这就是转发

  语法:req.getRequestDispatcher(要转发到的Servlet资源路径).forward(req,resp);

  特点:

        1. 浏览器不会发生 变化
        2. 只能转发到当前服务器的内部资源中
        3. 转发是一次请求(在浏览器中按f12看请求的次数)

 

九:重定向

  有时候前端向服务器请求资源,请求的Servlet资源无法完成需求,返回路径让前端向其他Servlet资源请求,这就是重定向

  语法:resp.sendRedirect(服务器虚拟路径/Servlet资源路径)

  特点:

      1. 冲定向地址栏会发生变化(地址会显示最后请求的资源路径)
      2. 重定向可以请求当前服务器之外的资源
      3. 重定向是两次请求,无法使用request域对象来共享数据

 

十:reques域

  我们使用请求转发,很可能多个Servlet之间需要共享数据才能完成某一个功能,可以使用域对象来完成共享

  1:request域:在转发的Servlet资源中共享数据

  语法:(1):setAttribute(key,value)  //添加数据

     (2):getAttribute(key)    //获取数据

     (3):removeAttribute(key)     //删除数据

 

十一:ServletContent

  ServletContent:servlet上下文,整个项目都可以共享其中的数据,可以用于Servlet之间的通信和跟服务器进行通信(ServletContent对象在应用中是唯一的)

   功能:1:获取MIME类型

        例:String img = "a.jpg"

          System.out.print(this.getServletContext().getMimeType(img))   //打印 image/jpeg

     2:作为域对象来共享数据

        (1)设置数据  setAttribute()

        (2)获取数据 getAttribute()

        (3)删除数据 removeAttribute()

     3:获取服务器资源文件的真实路径

        getRealPath()

  获取ServletContent对象的方式:

      1:通过request对象获取:request.getServletContent()

      2:通过HttpServlet来获取:this.getServletContent()

 

十二:Cookie

  Cookie是存储在浏览器上的一些信息

  特点:1:Cookie存在客户端浏览器上,相对来说不太安全,别人拿到你的Cookie会泄露信息

        2:大小有限制,一般是4k

     3:同一个域下的Cookie个数也有限制,一般是40个

  作用:1:一般存储少量且不重要的信息

        2:在不登录的情况下完成用户认证

     3:记住账号之类的

  添加Cookie:

      Cookie coo = new Cookie(key,value);

      resp.addCookie(coo)

  获取Cookie:

      Cookie[] coo = req.getCookies();

  设置Cookie存储的时间:

      resp.setMaxAge(秒数,也可以设置日期) 

  

十三:Session

  概念:服务器端会话技术,在一次会话中多次请求间共享数据,将数据保存在服务器端的的对象中。HttpSession

  同一个会话中,只有一个Session对象

  原理:会话第一次,创建一个Session对象,然后分配一个id给他。响应前端时,将id以Cookie的形式发送给前端,接下来每次都通过id寻找对应的Session对象

  细节:1、一般浏览器关闭之后下次就不是同一个Session了,因为Cookie里的id没了,可以设置Cookie时间存储时间来获得同一个Session对象

     2、客户端不关闭,服务器关闭,下次就不是同一个Session对象了,但数据不会丢失。因为Tomcat自带有钝化技术和活化技术

       (1)钝化:在服务器关闭之前,将Session对象序列化在磁盘上

       (2)活化:在服务器启动后,将磁盘上的Session文件转化为内存中的Session对象

     3:Session什么时候被销毁?  

        (1). 服务器关闭
        (2). sessoin对象调用invalidate();
        (3). session默认失效时间30分钟

  特点:没有大小限制且安全

     可以存储任意类型任意大小的数据

     可以将一次会话的多次请求的数据存储在服务器上

  获取Session对象:

        HttpSession se = req.getSession();

  设置数据:

        setAttribute(key,value)

  获取数据:

        getAttribute(key)

  删除数据:

        removeAttribute(key);

posted @ 2020-01-13 20:27  拔丝小红薯  阅读(244)  评论(0编辑  收藏  举报