hualinux servlet 2.16:HttpServlet类(实际开发用)

目录

 一、知识点

二、例子

2.1 优化GenericServlet抽象类(没有直接继承HttpServlet类)

2.2 测试

2.2 例2 优化2.1(直接继承HttpServlet类)


HttpServlet继承GenericServlet抽象类,在实际开发中是常用的

 一、知识点

HttpServlet :

1.是一个Servlet,继承自GenericServlet.针对于HTTP协议所定制。

2..在service()方法中直提把ServletReuqest和Serv1etResponse 转为HttpServletRequest和HttpServletResponst
并调用了重载的service(HttpServletRequest, HttpServletResponse)

3.实际开发中,直按抛承HttpServlet,并根据请求方式复写doXxx()方法接口。

4.好处:直换由针对性的覆盖doxx()方法;直接使用HttpServletRequest和HttpServletResponse,不再需要强转。

二、例子

2.1 优化GenericServlet抽象类(没有直接继承HttpServlet类)

我在上一章《hualinux servlet 2.15:GenericServlet类》中的 2.3 优化2.2例子(使用GenericServlet抽象类)中,当需要使用到Http相关操作的时候,经常会用到GET或POST,这样GenericServlet类每次都得把HttpServletRequest或HttpServletResponse方法进行强转,如下面代码:

//获取请求方式是 GET 还是 POST
HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest
String method = httpServletRequest.getMethod();
System.out.println(method);

太麻烦了,用到http方面的,可以直接使用servlet接口子类HttpServlet。

建立一个MyHttpServlet.java继承《hualinux servlet 2.15:GenericServlet类》中”2.2 优化2.1例子(抽成通用类)“的MyGenericServlet类,MyHttpServlet.java代码如下:

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyHttpServlet extends MyGenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        if (servletRequest instanceof HttpServletRequest){
            HttpServletRequest request = (HttpServletRequest) servletRequest;

            if (servletResponse instanceof HttpServletResponse){
                HttpServletResponse response = (HttpServletResponse) servletResponse;
                service(request,response);
            }
        }
    }

    public void service(HttpServletRequest request,  HttpServletResponse response) throws ServletException, IOException {
        //1. 获取请求方式
        String method = request.getMethod();

        //2. 根据请求方式再调用对应的处理方法
        if ("GET".equalsIgnoreCase(method)){
            doGet(request,response);
        }else if ("POST".equalsIgnoreCase(method)){
            doPost(request,response);
        }
    }

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

}

修改LoginServlet.java代码如下:

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class LoginServlet extends MyHttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1. 获取请求参数: username, password
        String username = request.getParameter("username");
        String password = request.getParameter("password");

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

        PrintWriter out = response.getWriter();

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

是不是比之前《hualinux servlet 2.15:GenericServlet类》中”2.3 优化2.2例子(使用GenericServlet抽象类)“更好了^_^

不用每次都强转

 

2.2 测试

测试结果和《hualinux servlet 2.15:GenericServlet类》的例子都是一样的。

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

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

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

2.2 例2 优化2.1(直接继承HttpServlet类)

在2.1中,继承方式如图:

感觉一个一个写有些麻烦,有没有现成的类,答案是肯定的!

MyHttpServlet类和MyGenericServlet类其实可以不用写,直接继承HttpServlet类就行了

idea中可以在src目录右击直接建立servlet类,默认就是继承HttpServlet

把LoginServlet重启命名为其它做一下备份,然后删除直接建立一个新的servlet

ps:

如把LoginServlet重命名为其它,再新建LoginServlet类,web.xml中的servlet映射也会相应自动修改成你重命名的类名,需要手工修改回来。

 

src-->右击"new-->Create New Servlet-->起个名字叫“HttpServlet”,会自动生成代码

HttpServlet.java代码如下:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取请求参数: username, password
        String username = request.getParameter("username");
        String password = request.getParameter("password");

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

        PrintWriter out = response.getWriter();

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

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

    }
}

上面中因为用的是post表单提交的,所以写doPost方法中写代码。

是不是比之前更好些了^_^

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

 

再次强调:

1. 用户名和密码是放在数据库中的,如mysql数据库,为了安全密码会加密,如用Scrypt、Bcrypt 和 Argon2等,MD5、SHA1、SHA256 就不太适合存储密码!

2. servlet中不允许直接写jdbc代码的,如用MVC的话是放在M(模型)层。

 

猜你喜欢

转载自blog.csdn.net/hualinux/article/details/106834753