Servlet学习
HttpServlet的继承关系:
Servlet <-- GenericServlet <-- HttpServlet
Http请求常用的4种字段类型:
GET (读取)
POST (保存)
PUT (修改)
DELETE (删除)
1. 官方提供的HttpServlet
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("GET");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("POST");
}
}
2. 为什么使用doGet、doPost,而不是直接用service方法?
首先, HttpServlet
中的doGet
和doPost
方法是service方法的进一步处理。Servlet接口中一共5中方法,但实际开发中常用的只是service方法。因此需要进行一定的代码冗余处理。
Servlet接口中的5种方法:
public interface Servlet {
void init(javax.servlet.ServletConfig servletConfig) throws javax.servlet.ServletException;
javax.servlet.ServletConfig getServletConfig();
// 常用
void service(javax.servlet.ServletRequest servletRequest, javax.servlet.ServletResponse servletResponse) throws javax.servlet.ServletException, java.io.IOException;
java.lang.String getServletInfo();
void destroy();
}
doGet
和doPost
方法的处理思路:
对service方法进行http字段判别即可:
自己写一个MyHttpServlet类, 继承关系如下:
service
<-- MyGenericServlet
<-- MyHttpServlet
MyGenericServlet
实现Servlet
接口;MyHttpServlet
继承MyGenericServlet
:
public class MyHttpServlet extends MyGenericServlet{
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 判定 http 方法字段类型
String method = request.getMethod();
// 注意 http 方法字段全为大写
switch (method) {
case "GET":
this.doGet(request, response);
break;
case "POST":
this.doPost(request, response);
break;
}
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
// TO do
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
// TO do
}
}
官方
HttpServlet
中doGet
方法对rep
使用的是HttpServletRequest
类型, 而Servlet
提供的是ServletRequest
类型。 查看源码可知:HttpServletRequest
又是ServletRequest
的子类。所以将ServletRequest
向下转为HttpServletRequest
类型即可。
- 最后创建一个Servlet实例继承MyHttpServlet就能实现
doGet
和doPost
方法:
public class helloServlet extends MyHttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
res.getWriter().write("hello Get!");
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
res.getWriter().write("hello Post!");
}
}