10-30 程宗武Servlet

10-30 Servlet

1. Servlet

Servlet 是运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API动态的向客户端输出内容(HTML)。

1.1 Servlet与普通java程序的区别

1. 必须实现servlet接口 
2. 必须在servlet容器(服务器)中运行 
3. servlet程序可以接收用户请求参数以及向浏览器输出数据

1.2 实现一个Servlet的三种方式

1.实现Servlet类 (Servlet接口中定义的方法如下)
    public interface Servlet {
        void init(ServletConfig var1) throws ServletException;

        ServletConfig getServletConfig();

        void service(ServletRequest var1, ServletResponse var2) throws                      ServletException, IOException;

        String getServletInfo();

        void destroy();
    }
2.继承GenericServlet(GenericServlet 类实现了 Servlet, ServletConfig, Serializable这三个接口 )
3.继承HttpServlet类(HttpServlet继承自GenericServlet类,同时也定义了一些自己的方法doGet(),doPost()等)
三者之间的关系图大致如下:(其中HttpServlet继承自GenericServlet类)

image-20201030175502091

1.3 抽象方法

@WebServlet(name = "myServlet",urlPatterns = "/myServlet")
public class MyServlet implements Servlet {

    /*初始化 servlet ,由servlet容器调用,以指示servlet正在 将servlet放入服务中。
     servlet容器在实例化servlet后仅调用init方法一次。
     在servlet可以接收任何 请求之前,init方法必须成功完成。 */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init方法执行了");
    }

    //返回一个ServletConfig对象,其中包含该servlet的初 始化和启动参数
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //由servlet容器调用,以允许 servlet响应请求。此方法仅在servlet的init()方法成功完成后调用。
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service方法执行了");
    }

    //以纯文本的方式返回关于servlet的信息,如作者、版本和版权
    @Override
    public String getServletInfo() {
        return null;
    }

    //servlet销毁时调用
    @Override
    public void destroy() {
        System.out.println("destroy方法执行了");
    }
}

image-20201030170238179

image-20201030170310779

1.4 声明周期

Servlet 生命周期流程如下:
1. 浏览器通过 URL 请求 tomcat 服务器 
2. tomcat 服务器将 URL 解析后找到相应的项目,并查找是否有 urlPatterns = "/xxx" 的 servlet 存在 
3. 查找到 servlet 后创建对象,调用 init 方法初始化 servlet 
4. tomcat 创建 request 、 response 对象,并调用 service 方法。执行成后,修改 response 并返 回 
5. tomcat 将 response 解析成 http 响应格式的数据,返回给浏览器 
6. 浏览器解析,显示数据 
7. 如果 tomcat 停止,调用 destory() 方法,销毁 servlet

总结:
1. Servlet对象是由服务器创建 
2. request与response对象也是由tomcat服务器创建 
3. request对象封装了浏览器过来的所有请求信息,response对象代表了服务器的响应信息

1.5 请求头

Referer: http://localhost:8080/JavaWebProjects_war_exploded/1.html 上一次请求的地址

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36

2.request对象的基本概念

2.1 HttpServletRequest

HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的 所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息

image-20201030200511821

2.1.1 request获取请求行信息

@WebServlet(name = "bServlet", urlPatterns = "/BServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求方式的类型
        System.out.println("获取请求的方式类型:" + req.getMethod());
        //获取请求行中的资源名部分URI(资源部分的路径)
        System.out.println("获取请求行中的资源名部分:" + req.getRequestURI());
        //获取完整URL
        System.out.println("获取完整URL:" + req.getRequestURL());
        //获取当前版本协议和名称
        System.out.println("获取当前版本协议和名称:"+req.getProtocol());
        //获取IP地址
        System.out.println("获取IP地址:"+req.getRemoteAddr());
        //获取端口
        System.out.println("获取端口:"+getLocalPort());
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

image-20201030200131279

2.1.2 request获取请求头信息

@WebServlet(name = "bServlet", urlPatterns = "/BServlet")
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //以String的形式返回指定请求头的值
        System.out.println("请求头的值:" + req.getHeader("User-Agent"));
        //返回此请求包含的所有头名称的枚举
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            System.out.println("***");
            String name = headerNames.nextElement();
            System.out.println("HeaderNames:" + name);
            System.out.println("Header:" + req.getHeader(name));
            System.out.println("***");
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

image-20201030201612970只截取了部分

2.1.2 request获取请求体信息

@WebServlet(name = "cServlet", urlPatterns = "/CServlet")
public class CServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //根据表单的name属性,获取对应的值
        System.out.println("username:" + req.getParameter("username"));
        //获取name相同的所有value
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby :
                hobbies) {
            System.out.println("hobby:"+hobby);
        }
        //获取参数名为key,参数值为value的Map集合
        Map<String, String[]> map = req.getParameterMap();
        for (String key : map.keySet()) {
            for (String value : map.get(key)) {
                System.out.println("key:" + key);
                System.out.println("value:" + value);
            }
        }
    }
}

image-20201030210919081

2.1.3 request中的方法

String getContextPath()  获取上下文路径(工程名字)
void setAttribute(String name, Object o)  设置属性到域中 
Object getAttribute(String name)  从域中获取属性值 
void removeAttribute(String name)  从域中移除属性
RequestDispatcher getRequestDispatcher(String path) 获取请求转发器(request对象方法)

void forward(ServletRequest request, ServletResponse response) 将请求转发到另一 个资源(servlet)上( RequestDispatcher 对象的方法)

标签

评论

this is is footer