2021年9月13日

今天的内容

1.URL匹配规则

2.ServletContext对象【重点】

3.Request对象

4.Response对象

5.Cookie和Session【重点!!!开发要用的】

1.URL的匹配规则

@WebServlet("/test")

/test就是咱们某一个资源的路径写法

用户申请了一个资源

http://localhost:8080/day41_wb/LoginServlet

1.http协议

2.localhost 本地服务器主机的名字

3.8080端口号

4.day41_wb/LoginServlet是咱们所申请的资源

day41_wb/当前应用程序目录,就是程序的绝对路径

LoginServlet 申请的资源

url匹配原则:

1.精准匹配

比如 /资源名字@WebServlet("/test.do")

2模糊匹配符

比如 @WebServlet("*.do") 以.do为后缀的资源都可以进行访问

比如@WebServlet("/*") 所有资源都可以访问

package com.qfedu.a_servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//精准匹配,通过你写的@WebServlet真实的值,去找到你所对应的资源
@WebServlet("/TestServlet1")
public class TestServlet1 extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.setContentType("text/html;charset=utf-8");
       response.getWriter().append("这个是精准匹配");
  }
}
package com.qfedu.a_servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


//这个模糊匹配是以后缀是.do的资源
//进行匹配的时候在web应用程序下面,.do可以随意些就可以找到这个资源了
//注意*前面没有加斜线
//@WebServlet("*.do")
public class TestServlet2 extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.setContentType("text/html;charset=utf-8");
       response.getWriter().append("这个是模糊匹配里面的一种 以.do后缀的匹配");

  }
}
package com.qfedu.a_servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//模糊匹配的另外一种写法,就是在/后面随意写就可以了!!!
//以后会用,在将过滤器的时候使用。
//@WebServlet("/*")
public class TestServlet3 extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.setContentType("text/html;charset=utf-8");
       response.getWriter().append("我这个是随意的资源访问,url写啥都可以给你匹配到");
  }
}

2.ServletContext【重要】

ServletContext接口,实例化以后是一个对象,

是咱们当前应用程序可以使用的唯一对象。

在一个Servlet里面,使用另外一个Servlet的提供的数据,怎么办?转发,但是不用用转发怎么办?需要使用ServletContext对象,是全局的。比如你在一个Servlet里面设置一个数据,想要在另外一个Servlet里面使用这个数据,没办法。但是可以通过ServletContext这个接口,这个对象是全局的。如果你在一个Servlet里面使用servletContext 对象设置一个数据,在另外一个Servlet里面也可以通过ServletContext这个对象获取这个数据

两个Servlet依靠servletContext对象进行通信,分享一些数据

package com.qfedu.b_servletContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/context1.do")
public class ContextServlet1 extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //要使用一个对象,这个对象可以实现servlet之间的共享数据
       //1.获取servletContext对象没当前上下文对象
       ServletContext servletContext = request.getServletContext();
       //2.给当前上下文对象设置一部分数据
       servletContext.setAttribute("msg", "我是Context1对象");
       servletContext.setAttribute("person", new Person("老邢", 78));
       String serverInfo = servletContext.getServerInfo();//返回的是当前Servlet的详细信息
       String contextPath = servletContext.getContextPath();//项目的根目录(以后出现404可以先找这个根目录然后再一点一点的找)

       System.out.println(serverInfo);
       System.out.println(contextPath);
  }
}
package com.qfedu.b_servletContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/context2.do")
public class ContextServlet2 extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.setContentType("text/html;charset=utf-8");//处理响应的中文乱码
       //这个Servlet是获取当前上下文对象存的数据
       //1.获取当前上下文对象
       ServletContext servletContext = request.getServletContext();
       Object msg = servletContext.getAttribute("msg");
       System.out.println(msg);
       Person person = (Person)servletContext.getAttribute("person");
       System.out.println(person);

       response.getWriter().append(" "+msg);
  }
}

3.Request对象

ServletReuqest接口

用户访问服务器,服务器会生成一个对象包含了http所有请求头

由于使用的是http协议,HttpServletRequest

3.1RequestAPI

getRequestURL(); 获取完成的url

getRequestURI();获取资源名字

getQueryString();获取一个url参数部分

getRemoteAddr();返回的是客户端的ip地址

getRemoteUser();返回的是客户端的用户

getRemotePort();返回的是客户端的主机的端口号

getRemoteHost();返回的是客户端的主机地址

getCookie();获取CookieD对象

getSession();获取Session对象

getLocalName();获取Web服务器主机的名字

getServletContext();获取上下文对象的

setCharacterEncoding();设置编码集的

getParameter();获取前端传过来的数据的

setAttribute();将数据设置给request对象

getAttribute();获取request对象中的数据的

package com.qfedu.c_request;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/request2")
public class RequestServlet2 extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String remoteAddr = request.getRemoteAddr();
       String remoteHost = request.getRemoteHost();
       String remoteUser = request.getRemoteUser();
       int remotePort = request.getRemotePort();
       System.out.println(remoteAddr);//ip地址
       System.out.println(remoteHost);//主机的地址
       System.out.println(remoteUser);//用户名字
       System.out.println(remotePort);//端口号
       //以上代码如果你们在同一个网段是可以测试的
       //写完这个代码以后,你把ip地址告诉你室友,让他去访问你写的这个资源
       //http://10.8.199:8080/day41_wb/request2
       //发现打印的都是别人访问的东西。意味着从这地方知道,
       //你想黑军方的网站,是不可能,你在哪都能找到你,让后关起来,审判,枪毙
       //以后开发必用的!!!是以下的方法
//       String name = request.getParameter("name");//获取前段传过来的数据
//       request.setCharacterEncoding("utf-8");//请求设置编码集
//       request.getRequestDispatcher("index.jsp").forward(request, response);//转发的代码
//       request.setAttribute("name", "狗蛋");
//       request.getAttribute("name");
       //request.getServletContext();//获取上文对象的
  }
}

4.Response对象

响应对象,把数据给客户端

咱们的Servlet紧紧围绕着两个点学习(Request, Response)请求和响应

setHeader(); 设置响应头的参数

setContentType();设置字符编码集

getWriter();获取字符输出流对象

addCoookie(); 对浏览器新增一个Cookie

sendRedirect();重定向

5.Cookie和Session

http是一种无状态的访问

浏览器发送请求到服务器,服务器给与一定的响应,但是断开连接以后,如果服务器更新了,如果服务器没有发送任请求,是没有任何响应的

这个就是无状态的访问:

实际操作中存在一定的问题:

比如登录一个网站以后,再次跳转到这个网站的其他页面,他是不会保持第一个页面的状态的,这叫无状态的。

登录一个页面的话,他不会保证上一页面的状态,如何来保持上一个页面的状态的呢?靠咱们即将要讲的会话技术(Cookie和Session),才能保持上一个页面的状态!!!

如果没有cookie和session的话,http协议是一个无状态的协议,你每一个跳转到下一个页面的时候都是需要先登录的,这就很麻烦了。

比如淘宝(cookie和session的话),登录上去了,(需要登录才能)选择商品,(需要登录)放到购物车,(需要登录)然后购买,这样用户的体验是相当差的然后才有咱们即将要讲的会话控制。会话控制的目的就是为了点击页面的时候,保持上面一个页面的状态

5.1会话技术

cookie:

浏览器保存的内容,通常cookie是在浏览器中保存的,每一次访问服务器的时候,浏览器会自动的把cookie带到下一个页面。

cookie的大小时有限制,通常是4096byte.

cookie信息中不能有中文

cookie的保存是以键值对形式存在的

session:

保存服务器中,每一个session在咱们当前的服务器会有一个标识号,

会保存浏览器访问服务器的一些记录信息,没有大小的限制

可以保存中文

信息的保存也是以键值对形式存在的

5.2Cookie

如果想要使用cookie要保证咱们的浏览器是开启cookie,所以说有一定的弊端,如果浏览器cookie关了,关了就不能再使用cookie了

常用的API

1.cookie的构造方法,目的是实例化出来cookie对象

Cookie(String name, String value);

2.设置cookie的方法

setValue(String value);修改cookie的值

setMaxAge(int time);设置cookie的有效时间

setPath(String path);设置当前cookie的有效路径

3.要将cookie发送到浏览器

response.addCookie(Cookie cookie);

先给浏览器设置cookie,获取cookie,销毁cookie,获取cookie(销毁cookie以后还有没有cookie)

设置cookie

package com.qfedu.d_cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cookie")
public class CookieServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //1.创建cookie对象
       //将键 是java2109 值是shengjie实例出来,存到cookie对象中
       Cookie cookie = new Cookie("java2109", "shujie");
       //2.s设置有效时间,如果不设置有效时间,没有关闭浏览器,cookie一直在的
      /*
      * 正数:表示当前cookie的有效时间
      * 负数:表示当前浏览器打开的时候存在,关闭时候的没了
      * 0:销毁当前的cookie
      * */
       cookie.setMaxAge(60*60*24);//设置了有效期是个正数,即使你
       //关闭了浏览器,也可以获取cookie值,可以自动登录的东西
      // cookie.setPath("/day42_wb");
       //3.把cookie发送给浏览器
       response.addCookie(cookie);

  }
}

获取cookie

package com.qfedu.d_cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request, response);
  }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //获取浏览器中cookie,返回值是一个数组
       Cookie[] cookies = request.getCookies();
       for (Cookie cookie : cookies) {
           //两个
           // JSESSION
           //java2109
           //浏览器一旦关闭cookie就没了
           System.out.println(cookie.getName());//获取键
           System.out.println(cookie.getValue());//获取值
           System.out.println("================");
      }

  }
}

销毁cookie

package com.qfedu.d_cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/destroyCookie")
public class DestroyServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //退出登录
        Cookie[] cookies = request.getCookies();//获取cookie
        for (Cookie cookie : cookies) {
            //JSESSION
            //java2109
            if(cookie.getName().equals("java2109")) {
                cookie.setMaxAge(0);//销毁cookie
                //重新发送给浏览器
                response.addCookie(cookie);
            }
        }
    }
}



posted @ 2021-09-13 21:43  张三疯321  阅读(25)  评论(0)    收藏  举报