Servlet笔记

  1. Servlet是一种用Java编写的服务器端程序,主要用于交互式地浏览和修改数据,生成动态Web内容(以前需要用main方法执行,现在想通过浏览器访问,让浏览器可以通过一个地址访问到我,我再去调用对应的方法。)。Servlet的生命周期包括客户端请求、加载Servlet类到内存、实例化并调用init()方法进行初始化、处理请求(通过service()方法或其对应的具体方法如doGet()、doPost()等)以及最终的destroy()方法进行资源清理。这些操作通常是动态执行的,服务器可以在启动时提供选项来强制装载和初始化特定的Servlet实例。
  2. servlet本质上也是java类,但是要遵循servlet规范(继承HttpServlet类(jar包在tomcat里面))编写。由servlet容器编写。servlet和http紧密相连,可以处理http协议相关的所有内容。提供了servlet功能的服务器servlet容器(tomcat)。
  3. servlet的生命周期,什么时候创建(当请求到达容器时,容器查找改Servlet对象是否存在,如果不存在,创建并实例化,方法只执行一次),什么时候调用(容器调用Servlet的service方法,并更具http请求方式调用对应方法),什么时候销毁(容器关闭时销毁)。(init方法,service方法,destroy方法:在特定时机容器自动调用)
  4. 乱码

    req.setCharacterEncoding("UTF-8");
    只针对post请求方式。
    new String(req.getParameter("uname").getBytes("ISO-8859-1"), "UTF-8")

    针对任何请求,但是如果数据本身不乱码,仍然使用new String()转换,则会乱码。(tomcat8及以上)

    login.jsp

    <%--
      Created by IntelliJ IDEA.
      User: HP
      Date: 2024/7/9
      Time: 13:46
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登陆</title>
    </head>
    <body>
    <form method="post" action="S02">
        姓名<input type="text" name="uname"/>
        密码<input type="password" name="upwd"/>
        <button>登录</button>
    </form>
    </body>
    </html>

    servlet2

    package com.example.zlp;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    import java.io.IOException;
    
    @WebServlet("/S02")
    public class Servlet2 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            String uname=req.getParameter("uname");
            String upwd=req.getParameter("upwd");
            System.out.println("uname:"+uname+"   upwd:"+upwd );
    
        }
    }
  5. 请求转发
    Servlet03.java
    package com.example.zlp;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    import java.io.IOException;
    /*
    请求转发跳转req.getRequestDispatcher(url).forward(req,resp);
    可以让请求跳转到客户端或者servlet
    http://localhost:8080/S1/S03?uname=wo&upwd=123
    特定:1.服务端行为,客户端请求到达后,服务器进行转发,此时会将请求对象进行保存。2.地址栏不发生改变。3.从始至终只有一个请求。4.request数据可以共享
     */
    @WebServlet("/S03")
    public class Servlet03 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //接受参数
            String uname=req.getParameter("uname");
            String upwd=req.getParameter("upwd");
            System.out.println("Servlet03 uname:"+uname+"   upwd:"+upwd );
            //请求转发跳转到Servlet04
    //        req.getRequestDispatcher("S04").forward(req,resp);
            //请求转发跳转到jsp页面
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }
    Servlet04.jsp
    package com.example.zlp;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    import java.io.IOException;
    /*
    请求转发跳转
    可以让请求跳转到客户端或者servlet
    服务端行为
     */
    @WebServlet("/S04")
    public class Servlet04 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //接受参数
            String uname=req.getParameter("uname");
            String upwd=req.getParameter("upwd");
            System.out.println("Servlet04 uname:"+uname+"   upwd:"+upwd );
    
        }
    }
  6. request作用域:在一个请求中传递数据,在请求转发中可以通过request来传输/共享数据,setAttribute,getAttribute,removeAttribute。在第一个servlet中set,在请求转发的servlet或者jsp中get。
  7.  response:向客户端输出数据,对客户端请求进行响应,并将处理结果返回客户端。
    getWriter(),getOutputStream()
    package com.example.zlp;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.ServletOutputStream;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/S05")
    public class Servlet05 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //字符输出流
    //        PrintWriter writer=resp.getWriter();
    //        writer.write("hello");
            //字节输出流
            ServletOutputStream outputStream= resp.getOutputStream();
            outputStream.write("hi".getBytes());
            //不能同时使用(会报错),getWriter已经使用了response对象了
        }
    }
    
  8. 响应乱码
    package com.example.zlp;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.ServletOutputStream;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/S05")
    public class Servlet05 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //服务端默认编码格式是ISO-8859-1,不支持中文
            // 设置服务端编码格式
            //resp.setCharacterEncoding("UTF-8");
            //设置客户端编码格式和响应的MIME类型
            //resp.setHeader("content-type","text/html;charset=UTF-8");
            //同时设置客户端和服务端的编码格式
            resp.setContentType("text/html;charset=UTF-8");
            //字符输出流
    //        PrintWriter writer=resp.getWriter();
    //        writer.write("<h2>你好</h2>");
            //字节输出流
            ServletOutputStream outputStream= resp.getOutputStream();
            outputStream.write("<h2>你好</h2>".getBytes("UTF-8"));
            //不能同时使用(会报错),getWriter已经使用了response对象了
        }
    }
    
  9. 重定向:是一种服务端指导,客户端行为,客户端发出请求被服务器接受处理,之后进行响应,同时会给客户端一个新的地址,当接收到响应后,马上会根据第二个新地址发出请求,服务端接收请求并响应,重定向完成。
    response.sendRedirect("index.jsp");
    请求转发和重定向的区别
    请求转发   重定向
    一次请求,request对象共享 两次请求,request对象不共享
    服务端行为 客户端行为
    地址栏不改变 地址栏发生改变
    绝对地址定位到站点后   绝对地址定位到http://
  10.  
  11.  

 

 

posted @ 2024-07-04 14:42  appointint  阅读(7)  评论(0编辑  收藏  举报