目錄
2.1 優化GenericServlet抽象類(沒有直接繼承HttpServlet類)
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(模型)層。