Servlet init(ServletConfig)、init()方法的作用

说明

在 Servlet介绍 中,有介绍的 Servlet 生命周期,了解到 init() 方法的作用:

通过 反射 创建 Servlet 对象,然后调用 init() 方法(且只调用一次)

应用场景

将初始化的操作写在 init() 方法中,如:读取初始化参数等

如何使用

重写 init() 方法

两个 init() 方法

init() 方法有两个:

  • init(ServletConfig):带有 ServletConfig 形参的

  • init():不带形参的

ServletConfig 作用

  1. 获取初始化参数 init-param

  2. 获取 ServletContext 对象

源代码

从 HttpServlet 的父类 GenericServlet 可知下面源码:

public void init(ServletConfig config) throws ServletException {
    // 将形参 config 赋值给成员变量 config
    this.config = config;
    // 调用了无参 init() 方法
    this.init();
}

public void init() throws ServletException {
}

// 返回成员变量 config
public ServletConfig getServletConfig() {
    return this.config;
}

结论 - 重写 init(ServletConfig) 不推荐

重写有参 init(ServletConfig) 方法,就需要在第一行调用父类的 init(ServletConfig) 方法 :

super.init(config)

如果不调用父类的 init(ServletConfig) 方法,就不会执行:

this.config = config;

导致调用 getServletConfig() 方法时,返回的是 null

结论:重写此方法,一旦 忘记调用 父类的方法,导致可能报错,所以 不推荐

正确例子:

public void init(ServletConfig config) throws ServletException {
    super.init(config)
}

结论 - 重写 init() 推荐

父类的 init(ServletConfig) 方法中,最后调用了 init() 方法,所以 重写 init() 方法的作用,与 重写 init(ServletConfig) 方法的作用是一样的

好处: 而且重写 init() 方法,不会出现上文的bug,所以 推荐使用

案例

实现登录功能,将登录名、密码配置到 web.xml 中,重写 init() 方法,读取 登录名、密码。再与表单提交的用户名、密码进行比较,如果一致就认为登录成功,否则就登录失败

登录页

创建 login.jsp 页面,代码如下:

<form method="post" action="doLogin">
    用户名:<input name="username"><br>
    密码:<input name="password"><br>
    <input value="登录" type="submit">
</form>

处理登录的Servlet类 - LoginServlet

处理登录的Servlet:LoginServlet

public class LoginServlet extends HttpServlet {
    private String usernameInitPara;
    private String passwordInitPara;
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html; charset=UTF-8");
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        PrintWriter out=resp.getWriter();
        //登录成功
        if(usernameInitPara.equals(username) && passwordInitPara.equals(password)){
            resp.sendRedirect("index.jsp");
        }else{//登录失败重定向到loginFails.jsp
            resp.sendRedirect("loginFails.jsp");
        }
    }
    // 读取xml中的正确登录、密码
    @Override
    public void init(ServletConfig config) throws ServletException {
        usernameInitPara =config.getInitParameter("username");
        passwordInitPara =config.getInitParameter("password");
    }
}

配置web.xml

<!-- 配置Servlet -->
<servlet>
    <!-- 起别名 -->
    <servlet-name>LoginServlet</servlet-name>
    <!-- Servlet全路径 -->
    <servlet-class>top.malaoshi.LoginServlet</servlet-class>
    <init-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </init-param>
    <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </init-param>
</servlet>
<!-- 配置Servlet映射 -->
<servlet-mapping>
    <!-- 上面定义的别名 -->
    <servlet-name>LoginServlet</servlet-name>
    <!-- 映射url,访问 http://ip:port/contextpath/doLogin,tomcat将请求转交给该Servlet -->
    <url-pattern>/doLogin</url-pattern>
</servlet-mapping>

参考:
https://www.cnblogs.com/mumu122GIS/p/9985777.html


原文出处:/show_1IXrsN06aVH.html