Servlet——阶段性总结

什么是servlet?

   交互式处理客户端发送到服务器的请求,并完成操作相应。

   动态响应网页

作用

  •    接收客户端请求,完成操作
  •    动态生成网页
  •      将包含操作结果的动态网页响应给客户端

servlet的体系结构     extends HttpServlet

     两个父类  : HttpServletRequest , HttpServletResponse

    两个父接口 : request,  response

servlet的生命周期   

   前置条件:
  tomcat 在启动时,检测web.xml和注解 ,是否有load-on-startup为0 或正数的servlet
  如果有 : 调用getServletConfig() 找配置信息  getServletContext()找到具体包下的servlet。
  如果没有 : 在请求的时候,调用getServletConfig() 找配置信息   getServletContext()找到具体包下的servlet

  1. new()    只执行一次:单例模式    容器:tomcat创建
  2. init() 初始化  给一些属性赋初始值  只执行一次。          【说明】创建结束后,把servlet对象存在Tomcat的内容空间中,成为servlet容器
  3. 调用service()方法  调用子类里的对应重写的doGet或doPost方法响应结果
  4. destory() 销毁: 当重启或关闭容器时,才调用销毁方法,只调用一次。servet运行在多线程环境中,非线程安全

Servlet——阶段性总结_第1张图片

 servlet的配置方式

       3.0之前 使用web.xml

           
       

       3.0之后  使用注解

       @WebServlet(name = "OrderServlet" ,value = "/orderServlet")

request常用方法:请求对象 

  •       getParamenter("")
  •       setCharacterEncoding("UTF-8");
  •       getRequestDispatcher()
  •       setAttribute();
  •       getAttribute();

response常用方法:  响应对象

  •      setContentType();
  •      setHeader();
  •      setCharacterEncoding();
  •      sendRedirect();

转发与重定向区别:

重定向:作用在客户端,相当于客户端发出一个新的请求
             地址栏会显示重定向之后的路径
             重定向后的servlet无法获取之前servlet里的数据
             因为在HTTP协议中,不同请求之间的数据不共享
             get请求  doGet
转发:作用在服务器端,是一次请求内的跳转
           地址栏不会感知变化
           由于在一次请求内,servlet之间数据共享
           和之前请求方式相同  

Cookie

  •    浏览器在访问服务器时,由web服务器在HTTP响应头中附带传送给浏览器的数据
  •   如果web浏览器保存cookie,那么它以后每次访问该web服务器时,都应在HTTP请求头中将这个cookie回传给web服务器中。
  •   一个cookie主要由标识该信息的名称、值组成

原理

Servlet——阶段性总结_第2张图片

创建cookie

//创建cookie
Cookie cookie = new Cookie("code",code);
cookie.setPath("");   //设置路径
cookie.setMaxAge();  //  >0 有效期为秒,=0浏览器关闭,<0 内存存储,默认为-1
response。addCookie(cookie);  //添加到response对象中,响应时发送给客户端

获取Cookie

//获取Cookie
 Cookie  cookie=resquest.getCookie();
   //遍历
    for(Cookie cookie01:cookie){
      if(cookie01.getName().equal("code")){
         code=cookie01.getValue();
          break;
    }
  }

优点:

  • 可配置到期规则
  • 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对
  • 数据持久性:Cookie默认在过期之前是可以一直存在客户端浏览器上的 

缺点:

  • 大小受到限制:大多数浏览器对cookie的大小有4K、8K字节的限制。
  • 用户配置为禁用:有些用户禁用了浏览器接收cookie的功能
  • 风险:cookie有可能被篡改

Session:

定义:

  • 用户记录用户的状态。session 指的是在一段时间内,每个客户端与web服务器的一连串相关的交互过程
  • 在一个Session中,客户可能会多次请求访问同一个资源,也有可能访问各种不同的服务器资源

原理:

Servlet——阶段性总结_第3张图片

  • 服务器会为每一次会话分配一个request对象
  • 同一个浏览器发起的多次请求,同属于一次会话 session
  • 首次使用session,服务器会自动创建session,并创建cookie存储sessionid发送回客户端 
//获取session对象
Httpsession session=request.getSession();

//保存数据
setAtribute("key",value);

//获取数据
session.getAttribute("key");

 Cookie  和  session的区别

  •      存放内容:cookie只能字符串  session  任意类型
  •      存放位置:cookie在客户端     session 在服务端
  •      安全性:cookie不够安全,session 相对安全
  •      时效cookie 默认即时失效     session 默认30分钟

简化servlet:设置BaseServlet,避免创建多个servlet,可以让新建的servlet继承BaseServlet,不需继承HttpServlet。

public class BaseServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取前端请求的方法的名字
        String methodname=request.getParameter("method");
        try {
            //判断是否获取到方法名
            if(methodname!=null) {
                //利用反射机制,找到方法所在的类,调用对应的方法
                //反射
                Method method = this.getClass().getMethod(methodname, HttpServletRequest.class, HttpServletResponse.class);
                if (method != null) {
                    //调用方法,方法返回的是视图名
                    //返回结果:是servlet子类中的方法的返回值,
                    // return "forward/redirect:login.jsp";
                    String url = (String) method.invoke(this, request, response);
                    if (url != null && url != "") {
                        //截取到有效路径  获取 forward:后面的内容
                        String pagePath = url.split(":")[1];
                        if (url.startsWith("forward:")) {
                            request.getRequestDispatcher(pagePath).forward(request, response);
                        } else if (url.startsWith("redirect:")) {
                            //重定向
                            response.sendRedirect(pagePath);
                        } else {
                            //响应AJAX数据
                            response.getWriter().print(url);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("没有调用的方法:"+e.getMessage());
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

 Get 和 post 区别

GET请求:

  • GET提交的数据会存放在url中,以?分割url和传输数据,参数之间以&相连
  • GET方式明文传递,数据量小,不安全
  • 效率高,浏览器默认请求方式为GET请求
  • 对应的Servlet的方法是doGet

POST请求:

  • POST请求方法是把提交的数据存放在HTTP包的Body中
  • 密文传递数据,数据量大,安全
  • 效率相对美元GET高
  • 对应的Servlet的方法是doPost

HTTP协议  三次握手  四次挥手

通信流程:

  • 客户端与服务器建立连接  (三次握手)
  • 客户端向服务器发送请求
  • 服务器接受请求,并根据请求返回相应的文件作为应答
  • 客户与服务器关闭连接(四次挥手)

Servlet——阶段性总结_第4张图片

你可能感兴趣的:(java,servlet)