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(模型)層。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章