设为首页 加入收藏

TOP

Java后端01(初识servlet)(二)
2023-07-26 08:17:31 】 浏览:142
Tags:Java 后端 初识 servlet
,如果不匹配,会出现405
  • post 请求中如果携带参数,参数不会出现在 url 中,get 请求中如果携带参数,参数会出现在 url 中
  • get 请求中参数大小是有限的,过大的参数无法携带,port 请求中参数大小远大于 get 方式
  • servlet生命周期

    1. 实例化(特性:延迟加载,单例)

      ? tomcat 运行的时候,servlet 并不会立刻实例化,直到有用户发送请求,并且根据 web.xml 中所配置的映射关系,找到了对应的 servlet 类的类路径的时候,tomcat 这个时候会利用反射创建出对应 servlet 类的对象,为了保证效率,servlet类是单例的。

    2. 初始化

      ? init方法来自于从HttpServlet 的继承,该方法是成员方法,所以一定是在实例化之后调用的,会在构造方法运行之后运行,但是无论访问多少次,Servlet init,只会初始化一次。

    3. 提供服务

      ? 正常执行 Service 方法,开发者在方法中借助 req 和 resp 进行请求和响应的处理,方法运行结束之后,响应自动返回

    4. 销毁

      ? tomcat 服务器关闭的时候,destory 方法被调用。这个过程不是很直观的能被观察到

    5. 被回收

      ? servlet 被销毁之后,不再有引用存储实例的内存地址,这个时候,servlet实例就满足了被 GC 回收的条件

    // 重写方法观察生命周期
    public class HelloServlet extends HttpServlet {
    
        public HelloServlet() {
            System.out.println("HelloServlet -> HelloServlet()");
        }
    
        @Override
        public void init() throws ServletException {
            System.out.println("HelloServlet -> init()");
        }
    
        @Override
        public void destroy() {
            System.out.println("HelloServlet -> destroy()");
        }
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 通过响应对象,设置响应内容
            // 准备响应内容
            String content = "This is a text content!";
            // 获取响应对应的输出流,和 socket 变成的流的获取类似
            PrintWriter printWriter = resp.getWriter();
            // 将数据读取到输出流中
            printWriter.write(content);
            // 当doGet方法运行完成之后,响应会被 tomcat 自动返回给客户端
    
            // 定义 url 映射,让服务器知道客户端发送的哪一个请求,会由当前 servlet 处理
        }
    }
    

    CDN快速构建前端页面

    布局网站:https://www.runoob.com/try/bootstrap/layoutit/

    <link href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
    <script src="//cdn.bootcss.com/jquery/2.1.4/jquery.min.js"></script>
    <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    

    页面跳转(至静态页面)

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 模拟页面跳转
        // 通过转发方式跳转到指定页面(或者发送指定请求)
        req.getRequestDispatcher("页面文件路径").forward(req,resp);
        // 通过重定向方式跳转到指定页面(或者发送指定请求)
        req.sendRedicrect("页面文件路径");
    }
    

    转发和重定向的区别:转发是一次请求(将请求资源直接发送给客户端),重定向是两次请求(通知客户端去访问资源),如果用户访问的资源不可以被直接获取,那么重定向可以判断该用户有没有权限获得这些资源,转发并不可以,转发则是可以保护页面资源,因为不知道该页面是从何而来

    servlet自启动(通过注解去启动servlet)

    ? 一般在自启动的servlet类中配置init方法,可以在tomcat启动的时候,该servlet类会自动被实例化以及初始化,但是并不会调用service

    @WebServlet(loadOnStartup = 10)
    // 取值范围为1-99 值越大,优先级越低,反之值越小,优先级越高
    

    req,resp常用方法

    req常用方法

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 浏览器发送请求时候的完整url,包括协议,主机名,端口号
        System.out.println(req.getRequestURL());
        // 将url去除掉协议和主机名,并输出(上下文,访问资源路径)
        System.out.println(req.getRequestURI());
        // 获取请求中的参数数据,也就是 ? 之后的信息,只能获取GET方式请求的参数,无法获取POST
        System.out.println(req.getQueryString());
        // 获取客户端的ip地址
        System.out.println(req.getRemoteAddr());
        // 获取客户端的主机名
        System.out.println(req.getRemoteHost());
        // 获取服务器端自己的ip地址
        System.out.println(req.getLocalAddr());
        // 获取服务器端自己的主机名
        System.out.println(req.getLocalName());
        // 获取客户端返送请求的请求方式
        System.out.println(req.getMethod());
    }
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 接收单个值的参数
        System.o
    首页 上一页 1 2 3 下一页 尾页 2/3/3
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇面试官:try-catch 到底写在循环.. 下一篇一次服务启动慢问题排查

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目