hualinux servlet 2.15:GenericServlet类(了解 继承Servlet接口)

 目录

一、知识点

二、例子

2.1 例1 使用GenericServlet接口之前

2.1.1  需求

2.1.2 实现代码

2.1.3 测试

2.2 优化2.1例子(抽成通用类)

2.3 优化2.2例子(使用GenericServlet抽象类)


GenericServlet类,这个类使用的不是很多,了解一下即可

一、知识点

GenericServlet :
1.是一个Serlvet.是Servlet接口和ServletConfig接口的实现类。但是一个抽象类。 其中的service方法为抽象方法

扫描二维码关注公众号,回复: 11303317 查看本文章

2.如果新建的Servlet程序直按继承GenericSerlvet会使开发更简洁。

3.具体实现:
1)在Genericservlet中声明了-个SerlvetConfig类型的成员交量,在init(ServletConf1g)方法中对其进行了初蛤化
2)利用serv1etConfig成员交量的方法实现了Serv1etConfig接口的方法
3)还定义了一个init() 方法,在init(SerlvetConfig) 方法中对其进行调用,子奥可以直接覆盖init() 在其中实现对Servlet 的初始化
4)不建议直按覆盖init(ServletConfig), 因为如果忘记编写super(ServletConfig), 而还是用了Ser1vetconfig 接口的方法,
则会出现空指计异常。

JEE API中的关系为

 

二、例子

2.1 例1 使用GenericServlet接口之前

2.1.1  需求

在web. xml文件中设置两个WEB应用的初始化参数,user, password.定义-个1ogin.html,里边定义两个请求字段: user, password. 发送请求到loginServlet在创建一个LoginServlet,在其中获取请求的user, password. 比对其和web.xml文件中定义的请求参数是否一若一致,响应Hel1o:xxx,若不一致,响应Sorry: xxxxx为user.

2.1.2 实现代码

1 web.xml配置

为了方便在web.xml的<context-param>放置用户名和密码,并设备路由映射。

下面设置用户名为t1,密码为789

<!-- 这个是在<servlet>外面,不是它的二级配置-->
<context-param>
    <param-name>user</param-name>
    <param-value>t1</param-value>
</context-param>
<context-param>
    <param-name>password</param-name>
    <param-value>789</param-value>
</context-param>

<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/loginServlet</url-pattern>
</servlet-mapping>

2 创建login.html

web-->login.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
</head>
<body>
<form action="loginServlet" method="post">
    用户: <input type="text" name="username" />
    密码: <input type="password" name="password" />
    <input type="submit" value="提交"/>
</form>
</body>
</html>

3 创建LoginServlet.java

src-->LoginServlet.java

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServlet implements Servlet {
    private ServletConfig MyservletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        this.MyservletConfig=servletConfig;

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //1. 获取请求参数: username, password
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        //2. 获取当前WEB应用的初初化参数: user, password
        // 需要使用 servletConfig 对象。
        ServletContext servletContext = MyservletConfig.getServletContext();
        String initUser = servletContext.getInitParameter("user");
        String initPassword = servletContext.getInitParameter("password");

        PrintWriter out = servletResponse.getWriter();

        //3. 比对,这里不用
        //4. 打印响应字符串
        if (initUser.equals(username) && initPassword.equals((password))){
            out.print("Hello: "+ username);
        }else {
            out.print("Sorry: " + username);
        }
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

2.1.3 测试

运行idea,在弹出的浏览器中尾部输入 login.html

用户名和密码对的情况,输入用户名和密码分别为t1和789,点“提交”

用户名和密码不对的情况,输入用户名和密码分别为hua和123,点“提交”

2.2 优化2.1例子(抽成通用类)

在2.1例子中发现很多多余的是空的,根本不用写,为了使代码更简洁通用,可以建立一个抽象类MyGenericServlet继承Servlet,MyGenericServlet代码如下:

import javax.servlet.*;
import java.io.IOException;

public abstract class MyGenericServlet implements Servlet {
    private ServletConfig servletConfig;
    @Override
    public void init(ServletConfig arg0) throws ServletException {
        this.servletConfig=arg0;
    }

    @Override
    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    @Override
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;


    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

修改LoginServlet继承MyGenericServlet类

LoginServlet修改代码如下:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServlet extends MyGenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //1. 获取请求参数: username, password
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        //2. 获取当前WEB应用的初初化参数: user, password
        // 需要使用 servletConfig 对象。
        ServletContext servletContext = getServletConfig().getServletContext();
        String initUser = servletContext.getInitParameter("user");
        String initPassword = servletContext.getInitParameter("password");

        PrintWriter out = servletResponse.getWriter();

        //3. 比对, 这里不用写,
        //4. 打印响应字符串
        if (initUser.equals(username) && initPassword.equals((password))){
            out.print("Hello: "+ username);
        }else {
            out.print("Sorry: " + username);
        }
    }
}

是不是比2.1更简洁了,多余的可以不写了。

其它不变,重启idea,在弹出的浏览器中尾部输入 login.html,测试效果和2.1是一样的

 

2.3 优化2.2例子(使用GenericServlet抽象类)

在2.2例子中实现servlet接口还是有点麻烦,自己要写很多,其实 servlet 有一个子类 GenericServlet 可以直接实现封装很多方法做普通类比自己写更方便。

把上面的MyGenericServlet.java通用类删除,使用使用java自带的通用类GenericServlet 并修改LoginServlet.java代码如下:

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServlet extends GenericServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //1. 获取请求参数: username, password
        String username = servletRequest.getParameter("username");
        String password = servletRequest.getParameter("password");

        //2. 获取当前WEB应用的初初化参数: user, password
        // 需要使用 servletConfig 对象。
        ServletContext servletContext = getServletConfig().getServletContext();
        String initUser = getServletContext().getInitParameter("user");
        String initPassword = getServletContext().getInitParameter("password");

        PrintWriter out = servletResponse.getWriter();

        //3. 比对, 这里不用写,
        //4. 打印响应字符串
        if (initUser.equals(username) && initPassword.equals((password))){
            out.print("Hello: "+ username);
        }else {
            out.print("Sorry: " + username);
        }
    }
}

是不是比2.2更好了^_^,

其它不变,重启idea,在弹出的浏览器中尾部输入 login.html,测试效果和2.1是一样的

 

猜你喜欢

转载自blog.csdn.net/hualinux/article/details/106834084
今日推荐