说明
在 Servlet介绍 中,有介绍的 Servlet 生命周期,了解到 init() 方法的作用:
通过 反射 创建 Servlet 对象,然后调用
init()方法(且只调用一次)
应用场景
将初始化的操作写在 init() 方法中,如:读取初始化参数等
如何使用
重写 init() 方法
两个 init() 方法
init() 方法有两个:
init(ServletConfig):带有
ServletConfig形参的init():不带形参的
ServletConfig 作用
获取初始化参数
init-param获取 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