重要:

1.响应状态码

Servlet

Servlet时java实现客户端与服务器交互的主要机制

上下文路径

使用Servlet需要实现Servilt包,然后重写里面的方法

重写后有这几个方法: 1.init:表示初始化Servlet

2.service:具体的业务操作

3.destroy:Servlet对象的销毁方法

映射Servlet

启动顺序

默认条件下 Servlet第一次访问时创建 如果修改为tomcat服务器启动时创建

   HelloServlet

   com.atguigu.servlet.HelloServlet

   1

一个servlet对应一个url地址,需要优化

Servlet注解

问题: 一个servlet对应8行web.xml的配置,这样配置比较繁琐,建议使用注解模式 注解: @WebServlet name属性: 默认值在运行期自动变成 包名.类名 urlPatterns/value属性: 可以映射多个请求路径(实用性不强,换为value)

@WebServlet(name = "MsgServlet",urlPatterns = {"/xxx","/xxxxx","/xxxx"})

如果使用注解中只有一个属性,则value可以不写

HttpServlet:

根据用户不同的请求类型调用不同的业务方法

    //该service方法会被自动的调用!!!!

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       

        //调用的是其中的service方法

        //获取请求的方式 get/post/put/delete/........

        //req.getMethod() 获取请求的类型

        String method = req.getMethod();

        if (method.equals("GET")){

            this.doGet(req, resp);

        }else if (method.equals("POST")) {

            this.doPost(req, resp);

        }......

    }

}

package com.atguigu.servlet;

import jakarta.servlet.GenericServlet;

import jakarta.servlet.ServletException;

import jakarta.servlet.ServletRequest;

import jakarta.servlet.ServletResponse;

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("/myHttp")

public class MyHttpServlet extends HttpServlet {

   /**

    * 下列的方法需要自己完成

    * @param req

    * @param resp

    * @throws ServletException

    * @throws IOException

    */

   @Override

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       resp.getWriter().write("hello get");

  }

   @Override

   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       resp.getWriter().write("hello post");

  }

HttpServletRequest

前端提交数据,后端通过getParameter方式获取参数

如果返回多个同名数据,则可以使用getParameterValues

HttpServletResponse

服务器响应客户端时,封装了相应报文的对象

//5.测试响应数据

  //5.1 添加响应码

  resp.setStatus(404);

  //5.2添加响应数据

  resp.setHeader("name","response");

  //5.3解决乱码问题

  //resp.setCharacterEncoding("GBK");

  //5.4 字符集编码: utf-8 浏览器默认使用GBK编码格式 要求浏览器指定编码解析数据

  resp.setContentType("text/html;charset=utf-8");

  //resp.getWriter().write("你好我是服务器数据");

  resp.sendError(404,"页面走丢了");

转发与重定向

转发:

req.getRequestDispatcher("/要转发到的地址").forward(req,resp);

由AServlet访问BServlet的过程叫做转发,A和B都存在于服务器内部

Aservlet

package com.atguigu.servlet;

import jakarta.servlet.*;

import jakarta.servlet.http.*;

import jakarta.servlet.annotation.*;

import java.io.IOException;

@WebServlet(name = "AServlet", value = "/aServlet")

public class AServlet extends HttpServlet {

   /**

* AServlet和BServlet都位于服务器内部

* 转发: 由A访问B的过程叫做转发

* 内部:

*     http://localhost:8080/上下文/aServlet

*     http://localhost:8080/上下文/bServlet

* 规则: 在服务器内部 从/开始     /代表服务器的根

*/

@Override

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   System.out.println("访问AServlet");

   String name = req.getParameter("name");

   System.out.println("参数:"+name);

   System.out.println("开始转发操作");

//转发路径   服务器运行的源码是字节码, out下的路径      

   req.getRequestDispatcher("/bServlet").forward(req,resp);

}

}

BServlet

package com.atguigu.servlet;

import jakarta.servlet.*;

import jakarta.servlet.http.*;

import jakarta.servlet.annotation.*;

import java.io.IOException;

@WebServlet(name = "BServlet", value = "/bServlet")

public class BServlet extends HttpServlet {

   //url: http://localhost:8080/上下文/bServlet

@Override

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

   System.out.println("访问BServlet");

   String name = req.getParameter("name");

   System.out.println("客户端数据:"+name);

//设置页面响应的字符串编码

   resp.setContentType("text/html;charset=utf-8");

   resp.getWriter().write("服务器响应成功");

}

}

WEB-INF下的资源只能通过转发获取

响应重定向

缺少上下文路径 所以补齐.

resp.sendRedirect(req.getContextPath()+“/重定向路径”)

package com.atguigu.servlet;

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(name = "EServlet", value = "/eServlet")

public class EServlet extends HttpServlet {

   //http://localhost:8080/上下文/eServlet

   @Override

   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       String name = req.getParameter("name");

       System.out.println("获取参数E:"+name);

       resp.setContentType("text/html;charset=utf-8");

       resp.getWriter().write("重定向成功!!!");

  }

}

重定向发起了多次请求,多次响应 request和response是多个 所以不能传递参数 重定向是浏览器行为 解析/ 只代表主机地址 如:http://localhost:8080 缺少上下文路径 所以补齐. 重定向操作地址变化..

旧业务结束,新业务开始 使用重定向 如果业务还有延续 使用转发

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: