Servlet安装以及基础操作

Servlet

创建

  1. 新建一个类,继承Servlet接口
public class TestServlet2 implements Servlet {
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    public ServletConfig getServletConfig() {
        return null;
    }
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }
    public String getServletInfo() {
        return null;
    }
    public void destroy() {
    }
}

  1. 配置

    • 方法一:在webapp/WEB-INF/web.xml中添加配置

      <servlet>
          <servlet-name>test</servlet-name>
          <servlet-class>TestServlet2</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>test</servlet-name>
          <url-pattern>/test</url-pattern>
      </servlet-mapping>
      
    • 方法二:3.0注解配置

      //在类上使用WebServlet注解
      @WebServlet("/demo1")
      public class TestServlet2 implements Servlet{
          ...
      }
      

原理

  1. 浏览器根据网址找到具体的主机,根据后缀找到虚拟路径还有资源名称
  2. tomcat检索web.xml中找到和资源名称相同的url-pattern获得对应servlet-name
  3. tomcat根据servlet-name找到对应servlet-class
  4. tomcat将全类名对应的字节码文件加载进内存(反射)Class.forName()
  5. 创建对象 cls.newInstance())
  6. 调用类中的service方法

生命周期方法

init

  • 初始化方法

  • 在Servlet被创建时执行,只会执行一次

  • 默认情况下,第一次访问时Servlet被创建

    • 可以在web.xml中指定Servlet的创建时机

    • <load-on-startup>0</load-on-startup>
      <!--非0时服务器启动时创建-->
      
  • 只执行一次,说明Servlet在内存中是单例的

    • 所以多用户同时访问时可能会产生多线程安全问题
    • 解决:尽量不要在Servlet中定义成员变量,且不要修改成员变量的值

service

  • 提供服务的方法
  • 每一次Servlet被访问时执行,可以执行多次
  • tomcat服务器创建request和response对象后会传递service方法,然后调用service方法
    • 响应时,服务器从response对象中拿出想要消息数据给浏览器

destroy

  • 销毁方法

  • 在Servlet被销毁时执行(即服务器正常关闭时),执行一次

    • 只有服务器正常关闭之前才会执行

Request & Response

@WebServlet("/demo2")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException{
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{
    }
}

Request:获取请求消息

  • image-20230605190925861
  • 获取请求头

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{
        Enumeration<String> headerNames = request.getHeaderNames();//获取请求体数据
        while(headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            String value = request.getHeader(name);
        }
    }
    
  • 获取请求体数据:用BufferReader

  • 获取前端参数

    • request.getParameter("Key");
      request.getParameterValues("Key");
      
  • 请求转发

    • request.getRequestDispatcher("/demo2").forward(request,response);
      

Response:设置响应消息

  • 重定向

    • response.sendRedirect("/demo3");
      
  • 转发与重定向的区别

    • 转发是一次请求,重定向是两次

    • 转发不改变url,重定向会

    • 请求转发在服务器完成,重定向在客户端完成

    • 转发的url必须是当前web工程的内部地址,重定向可以是任意地址

  • 设置响应头

    • //void setHeader(String name, String value) 
      response.setHeader("name","value");
      
    • 用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在

  • 设置响应行

    • response.setStatus(响应状态码);
      
  • 设置响应体

    • PrintWriter writer = response.getWriter();
      writer.write("页面输出内容");
      
posted @   ---Wg---  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示