zoukankan      html  css  js  c++  java
  • 关于Servlet小总结

    Servlet

    Servlet简介

    • Servlet(Service+Applet)服务器小程序,主要用于生成动态的Web内容。
    • Servlet通常通过HTTP协议接收和响应来自Web客户端的请求。
    • Servlet实际上是一个接口

    Servlet简单实现

    • 创建一个类:Myservlet 该文件目录为:D:IdeaProjectsFirstServletsrcservletMyServlet.java
    package 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;
    import java.io.PrintWriter;
    //继承HttpServlet类
    public class MyServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter out = resp.getWriter();
            out.println("<h1 style='color:red'>"+"Hello Servlet"+"</h1>");
        }
    }
    
    
    • 在WEB-INF文件夹下对web.xml中配置Servlet映射
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>myservlet</servlet-name>//类的别名
            <servlet-class>servlet.MyServlet</servlet-class>//该类的路径
        </servlet>
        <servlet-mapping>
            <servlet-name>myservlet</servlet-name>//类的别名
            <url-pattern>/myservlet</url-pattern>//请求该类对应的URL
        </servlet-mapping>
    </web-app>
    

    实现原理:①当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

                   ②查找web.xml文件,是否有对应的<url-pattern>标签体内容。
    
    			   ③如果有,则在找到对应的<servlet-class>全类名
    
                   ④tomcat会将字节码文件加载进内存,并且创建其对象
    
                   ⑤调用其方法
    

    创建Servlet的三种方法:

    • 实现Servlet接口

      *必须得实现接口中的抽象方法*
      
    • 继承GenericServlet类

    • 继承HttpServlet类

    Servlet注解

    每次创建Servlet类之后都要在WEB-INF文件夹下对web.xml中配置Servlet映射,但凡类较多的时候web.xml文件会因为配置Servlet显得文件过长可读性较差。而使用注解则不需要部署web.xml文件。

    PS:tomcat7之前的版本是不支持注解的。这是Servlet3的特性,所以在创建项目时指定版本3.0以上。

    格式: @WebServlet("资源路径") 在配置映射时,路径要加斜杠,不然会报错

    package 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;
    import java.io.PrintWriter;
    @WebServlet("/myservlet")   //此处为Servlet注解 
    //继承HttpServlet类
    public class MyServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter out = resp.getWriter();
            out.println("<h1 style='color:red'>"+"Hello Servlet"+"</h1>");
        }
    }
    

    Servlet生命周期

    **①加载Servlet类。**
    
    		类加载器负责加载servlet类。 当Web容器接收到servlet的第一个请求时,将加载servlet类。
    
    **②创建Servlet实例。**
    
    		加载servlet类之后在第一次访问Servlet对应的URL时,tomcat会对该Servlet类创建对象,并执行构造函数。servlet实例在servlet生命周期中只创建一次。
    
    **③调用Servlet类的`init`方法。初始化**
    
    		在第一次创建Servlet时被调用,只调用一次,后续请求不再调用。用于一次性初始化。
    
    **④调用Servlet类的`service`方法。提供服务**
    
    		当对Servlet进行访问时,就会提供访问服务方法(如:`service()` `doGet()` `doPost()`)处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
    
    **⑤调用Servlet类的`destroy`方法。销毁**
    
    	从服务中删除servlet实例之前(关闭或重启tomcat),Web容器调用`destroy`方法。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收,释放资源。
    

    启动时加载Servlet

    启动时加载常用于系统的预处理

      在web.xml使用<load-on-startup>设置启动时加载,所传递的值表示加载时的优先级,**若传递的为负值则系统第一个加载**
    

    Servlet客户端 HTTP请求的结构

    • HTTP请求包含三部分:请求行、请求头、请求体

      • 请求行(请求方法、请求URL、HTTP协议及版本)

        如:POST /loginServlet HTTP/1.1

        关于请求方式:POST请求的请求参数在请求体中

                               **GET请求的请求参数在请求行中,在URL之后**
        
      • 请求头

        Host: localhost:8080
        
           User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.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
        Content-Type: application/x-www-form-urlencoded
        Content-Length: 30
        Connection: keep-alive
        Referer: http://localhost:8080/FirstServlet/login.html
        Cookie: JSESSIONID=131FD70E4649021B826F5654951687CF
        Upgrade-Insecure-Requests: 1

        User-Agent(用户环境,包括客户使用的操作系统及版本 CPU类型 浏览器版本等一些信息)

      • 请求体****(封装POST请求消息的请求参数)

        username=admin&password=123456
        

    Servlet服务器 HTTP响应的结构

    • HTTP响应包含三部分:响应行、响应头、响应体

      • 响应行(报文协议及版本、状态码及状态描述)

        Http/1.1 200 OK
        
      • 响应头(一些辅助信息)

        Content-Type:text/html
        
            .......
        
      • 响应体(描述了浏览器要响应的信息)

    HTTP常见状态码

    状态码 错误描述
    200 服务器处理成功
    404 无法找到文件
    500 内部服务器错误
    403 服务器拒绝访问
    301、302 请求重定向
    400 无效的请求
    401 未经过授权
    503 服务器超负荷或停机维护,无法处理请求

    ConteneType的作用

    • ConteneType决定浏览器以何种方式来处理响应体
    类型 描述
    text/plain 纯文本
    text/html HTML文档
    text/xml xml文档
    application/x-msdownload 需要下载的资源

    Servlet请求转发与响应重定向

    Servlet请求转发

    原理:输入一个正确的URL之后,会产生一个请求发送到Tomcat上,在Servlet_A处理完之后调用request.getRequestDispatcher().forward()方法之后,将HttpServletRequest对象原封不动的发送给Servlet_B,在Servlet_B处理完之后产生响应返回给客户端。

    checkLogin.java

    package servlet_direct;
    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("/direct/check")
    public class checkLogin extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("用户登录成功!");
            req.getRequestDispatcher("/direct/index").forward(req,resp);//请求转发语句
        }
    }
    
    

    indexServlet.java

    package servlet_direct;
    
    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("/direct/index")
    public class indexServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().println("<h1>This is index page</h1>" );
        }
    }
    
    
        ②转发只能访问当前服务器下的资源
    
        ③转发是一次请求,可以使用request对象来共享数据
    

    Servlet响应重定向

    原理:输入一个正确的URL之后,会产生一个请求发送到Tomcat上,在Servlet_A处理完产生响应返回给客户端,客户端再产生新的请求跳转到新地址上,由Tomcat发送给Servlet_B处理完之后产生新的响应返回给客户端。

    checkLogin.java

    package servlet_direct;
    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("/direct/check")
    public class checkLogin extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("用户登录成功!");
            resp.sendRedirect("/FirstServlet/direct/index");//响应重定向语句
        }
    }
    

    indexServlet.java

    package servlet_direct;
    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("/direct/index")
    public class indexServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().println("<h1>This is index page</h1>" );
        }
    }
    
    

    请求转发和响应重定向比较

    请求转发 响应重定向
    转发地址栏路径不变 地址栏发生变化
    只能访问当前服务器下的资源 可以访问其他站点(服务器)的资源
    一次请求,可以使用request对象来共享数据 两次请求。不能使用request对象来共享数据

    会话技术(Cookie和Session)

    会话:客户端和服务器之间发生一系列的请求与响应的过程。(一方断开即会话结束)

    作用:在一次会话的范围内的多次请求间,共享数据

    **方式: **客户端会话技术:Cookie

            服务器端会话技术:Session
    

    概念:客户端会话技术,将数据保存到客户端。当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息服务器向客户端发送Cookie时,会在HTTP响应头中增加Set-Cookie响应头信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。

    Cookie工作原理

    当浏览器向服务器发送请求之后,服务器会创建一个Cookie对象,将数据保存在其中,然后把Cookie对象放在响应头(response.addCookie(cookie对象))发送给浏览器,浏览器接收响应后将Cookie保存在客户端;当浏览器再次访问服务器时,会把保存的Cookie放在请求头中一起发送给服务器,服务器从中获取Cookie(request.getCookie()),然后作出响应。

    cookie_first.java

    package servlet_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_first")
    public class cookie_first extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //创建Cookie对象,存储相应数据
            Cookie cookie = new Cookie("name", "Jack");
            //将生成的cookie发送给浏览器
            response.addCookie(cookie);
           //设置持久化时间
            cookie.setMaxAge(60*2);//有效时间2分钟
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    cookie_second.java

    package servlet_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_second")
    public class cookie_second extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //服务器从中获取cookie
            Cookie[] cookies = request.getCookies();
            for (Cookie cookie : cookies) {
                response.getWriter().println(cookie.getName()+"="+cookie.getValue());
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    
    

    Servlet Session

    概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。默认情况下session的有效时间为30分钟。

    Session工作原理

    客户端发送一个全新的请求给服务器,服务器就会创建一个Session对象,并且设置SessionId:178HA。然后Servlet会执行session.setAttribute("name","王小二");设置自定义属性,把数据封装在这个Session对象中,将Session对象保存在服务器中。之后会将SessionID连同响应回浏览器,浏览器就会把SessionId值存储在Cookie中。在下一次发送请求时,会携带SessionID:178HA给服务器。服务器会根据所获取的Session编号找到对应的Session对象,然后利用该Session对象把保存的数据取出来!

    loginServlet.java

    package servlet_session;
    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 javax.servlet.http.HttpSession;
    import java.io.IOException;
    @WebServlet("/session/login")
    public class loginServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //创建Session对象
            HttpSession session = req.getSession();
            //设置自定义属性
            session.setAttribute("name","王小二");
            //获取SessionId
            System.out.println(session.getId());
            req.getRequestDispatcher("/session/index").forward(req,resp);
        }
    }
    
    
    

    indexServlet.java

    package servlet_session;
    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 javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet("/session/index")
    public class indexServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session = req.getSession();
            System.out.println(session.getId());
            //获取自定义属性
            String name =(String)session.getAttribute("name");
            //设置响应编码格式
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().println("当前登录用户为:"+name);
        }
    }
    
    
    

    Post请求中文乱码

    对于Tomcat8.X版本,默认Get请求发送中文就是UTF-8格式,无须转换。

    而对于Post请求,通过调用setCharacterEncoding("UTF-8")来解决中文乱码问题。

  • 相关阅读:
    Nginx文件下载服务器部署
    Git分支命名规范
    ROS通信介绍
    linux环境设置默认路由的优先级
    Python日志方案
    Python threading Local()函数用法:返回线程局部变量
    Python中websocket的使用示例
    MQTT的Python使用示例
    利用systemback打包个人ISO系统镜像
    Spring Security学习笔记三
  • 原文地址:https://www.cnblogs.com/jascen/p/11246754.html
Copyright © 2011-2022 走看看