前端菜鸟玩Servlet

简介

Servlet(Server Applet) 。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,理解Servlet为后者。

所以说servlet就是实现了Servlet接口的类!用来响应HTTP请求并处理返回

生命周期

同样的在一个servlet的创建到销毁同样存在钩子函数

  1.  Servlet 通过调用 init () 方法进行初始化。
  2.  Servlet 调用 service() 方法来处理客户端的请求。
  3.  Servlet 通过调用 destroy() 方法终止(结束)。

init()

整个生命周期只执行一次,,init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。可以做一些例如建立数据连接的操作

service()

在service方法会调用doGet、doPost、doPut、doDelete等方法,所以我基本只要根据客户端的请求方式重写doGet、doPost方法,因为这get,post两种请求方式最多。

destroy()

整个生命周期只执行一次,可以做一些例如关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘以及其他类似的清理活动。

 

注解配置方式

在servlet3开始往后无需想之前版本使用web.xml中的配置去映射到某个servlet才能使用,可以直接使用注解WebServlet实现,写在方法前

//@WebServlet("/login")
@WebServlet(name = "login", value = "/login" loadOnStartup="1")
public class login extends HttpServlet {
    /*get请求时返回登录页面*/
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");   //执行相应数据格式为html
           ......
               
}

value是指访问地址,loadOnStartup是指servlet在加载时的顺序,理解成优先级

 

HelloServlet

package com.hhtc.javaweb;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet { //最重要的是继承HTTPServlet抽象类,该类最终继承自Servlet接口
    private String message;

    public void init() {
        message = "Hello World!";
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>init()初始化的数据message为:" + message + "</h1>");
        out.println("</body></html>");
    }

    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    
    public void destroy() {
        PrintWriter out = response.getWriter();
        out.println("destroy()执行");
    }
}

ServletContext对象

该对象是全局存储信息的对象,所有的客户端都可以访问这个共有的对象,

WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用,并且它被所有客户端共享。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。公共聊天室就会用到它。

当web应用关闭、Tomcat关闭或者Web应用reload的时候,ServletContext对象会被销毁。

共享数据

//某个servlet设置共享数据       
        ServletContext context = this.getServletContext();//获取上下文
        String username = "lsp";
        context.setAttribute("username",username);

//另一个servlet获取共享数据
        final ServletContext context = this.getServletContext();
        String username = (String)context.getAttribute("username");

请求转发

一般请求转发都是使用HTTPServletRequest实现,虽然该ServletContent上下文对象也可实现

this.getServletContext().getRequestDispatcher("/login").forward(request, response);

 

因为存在ServletContext中的数据在服务器中会长时间,这样就会占用很多内存,因此在使用ServletContext时,建议不要往里面添加过大的数据!

 

HttpServletResponse

HttpServletResponse和下面的HttpServletRequest都是在调用doGet,doPost方法时传入的两个对象参数

HttpServletResponse是第二个参数,用于设置HTTP响应

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {

请求重定向:resp.sendRedirect("/login/index2");

在服务器收到请求后,一般逻辑都是处理好数据之后对其响应返回数据,但不,可以直接请这个请求处理交由另一个servlet去处理,再去响应。

还有很多方法,例如void setCharacterEncoding(String charset),用于设置响应的编码类型,等等很多方法都是对HTTP响应的设置

 

 

HttpServletRequest

HttpServletRequest是doPost或doGet方法的第一个参数,用于设置HTTP请求

在servlet程序中可以通过Cookie[] getCookies()返回一个数组,包含客户端发送该请求的所有的 Cookie 对象。

读取请求参数

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form action="${pageContext.request.contextPath}/login" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/> 
    <input type="submit" value="提交">
</form>
</body>
</html>

从上边前端页面输入的数据要在servlet中拿到数据

  • req.getRequestDispatcher("/index.jsp").forward(req,resp);  请求转发,也就是返回哪个jsp页面
  • req.getParameter("name")  获取前端传过来的参数,可以是get方式也可以是post方式传过来的,反正通过k获取

public class Login extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");//设置请求响应编码
        resp.setCharacterEncoding("utf-8");
        //获取请求参数
        final String username = req.getParameter("username");
        final String password = req.getParameter("password"); 
        System.out.println("用户名:" + username);
        System.out.println("密码:" + password); 

        //请求转发
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
    }
}

 

参考:https://www.cnblogs.com/wyzstudy/p/15711382.html

posted @ 2022-11-16 10:34  写点bug不过分吧  阅读(75)  评论(0编辑  收藏  举报