目录
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(模型)层。