HttpServlet
1、HttpServlet概述
HttpServlet类是GenericServlet的子类。
它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。
2、HttpServlet覆盖了service()方法
HttpServlet类中提供了service(HttpServletRequest,HttpServletResponse)方法,这个方法是HttpServlet
自己的方法,不是从Servlet继承来的。在HttpServlet的service(ServletRequest,ServletResponse)方法中会
把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse,
然后调用service(HttpServletRequest,HttpServletResponse)方法,这说明子类可以去覆盖
service(HttpServletRequest,HttpServletResponse)方法即可,这就不用自己去强转请求和响应对象了。
其实子类也不用去覆盖service(HttpServletRequest,HttpServletResponse)方法,因为HttpServlet还要
做另一步简化操作,下面会介绍。
HttpServlet.java 源码
public abstract class HttpServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest httpServletRequest;
HttpServletResponse httpServletResponse;
try {
httpServletRequest = (HttpServletRequest) req; [强转]
httpServletResponse = (HttpServletResponse) res; [强转]
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(httpServletRequest, httpServletResponse); [调用下面service()方法]
}
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
……
}
……
}
3、doGet()和doPost()
在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求
是GET还是POST。如果是GET请求,那么会去调用本类的doGet()方法,
如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。
如:
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("hello doGet()...");
}
}
public class BServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("hello doPost()...");
}
}
4、HttpServletRequest 和 HttpServletResponse类
HttpServletRequest 的方法:
* String getParameter(String paramName):获取指定请求参数的值;
* String getMethod():获取请求方法,例如GET或POST;
* String getHeader(String name):获取指定请求头的值;
* void setCharacterEncoding(String encoding):设置请求体的编码!因为GET请求没有请求体,
所以这个方法只只对POST请求有效。当调用request.setCharacterEncoding(“utf-8”)之后,再通
过getParameter()方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。所以,
这个方法必须在调用getParameter()方法之前调用!
HttpServletResponse 的方法:
* PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。
例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);
* ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用
这个流,例如要向客户端响应图片;
* void setCharacterEncoding(String encoding):用来设置字符响应流的编码,例如在调
用setCharacterEncoding(“utf-8”);之后,再response.getWriter()获取字符响应流对象,这时的
响应流的编码为utf-8,使用response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端;
* void setHeader(String name, String value):向客户端添加响应头信息,
例如setHeader(“Refresh”, “3;url=http://www.itcast.cn”),表示3秒后自动刷新到http://www.itcast.cn;
* void setContentType(String contentType):该方法是setHeader(“content-type”, “xxx”)的简便方法,
即用来添加名为content-type响应头的方法。content-type响应头用来设置响应数据的MIME类型,
例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”),如果响应数据为文本类型,
那么还要台同时设置编码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为
文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;
* void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。
例如给客户端发送404:sendError(404, “您要查找的资源不存在!”)。
---------------------