常用接口解析
ServletRequest接口:
封装了请求信息, 封装了客户端请求的细节,与协议无关
(1)getParameter(String name):获取客户端的参数值
(2)getAttribute(String name):获取给定属性的值
(3)getCharacteEncoding():获取请求信息的字符编码
HttpServletRequest接口,(子接口)支持http协议
servletresponse接口
表示一个servlet响应,隐藏了向浏览器发送响应的复杂过程。
方法:
getWriter:返回了一个可以向客户端发送文本的的Java.io.PrintWriter对象
getOutputStream:一个二进制流对象,因此这个方法是用来发送二进制数据的。
setContentType(): 设置响应的内容类型,并将“text/html”作为一个参数传入,这是在告诉浏览器响应的内容类型为HTML,需要以HTML的方法解释响应内容而不是普通的文本,或者也可以加上“charset=UTF-8”改变响应的编码方式以防止发生中文乱码现象
HttpServletResponse接口(子接口):封装了支持http协议的响应信息
ServletConfig接口
当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init( )方式传入一个ServletConfig对象
getInitParameter():获取Servlet初始化的参数(参数类型都是String类型的)
getInitParaterName():获取Servlet初始化参数的名称
getServletName():获取Servlet在web.xml配置中的name的值
getServletContext():获取ServletContext的引用
servletContext:
Servlet上下文信息
(1)、getContext():获取url,
(2)、setAttribute():设置属性的值
Servlet内部实现
HttpServlet是一个抽象类,继承GenericServlet类,GenericServlet类也是抽象类 实现了Servlet、ServletConfig接口
GenericServlet
1、为Servlet接口中的所有方法提供了默认的实现,则程序员需要什么就直接改什么,不再需要把所有的方法都自己实现了。
2、 将init( )方法中的ServletConfig参数赋给了一个内部的ServletConfig引用从而来保存ServletConfig对象,不需要程序员自己去维护ServletConfig了
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
为什么还要空参数的init()?
如果在类中覆盖了GenericServlet抽象类的init()方法,那么程序员就必须手动的去维护ServletConfig对象了,还得调用super.init(servletConfig)方法去调用父类GenericServlet的初始化方法来保存ServletConfig对象,这样会给程序员带来很大的麻烦
只需要覆盖那个不带参数的init( )方法就好了,此时,servletConfig对象仍然有GenericServlet保存着
HttpServlet
HttpServlet是由GenericServlet抽象类扩展而来的
覆盖了GenericServlet抽象类中的Service(ServletRequest req,ServletResponse res)方法,并且添加了一个自己独有的Service(HttpServletRequest request,HttpServletResponse方法。
HttpServlet中的service方法把接收到的ServletRequsest类型的对象转换成了HttpServletRequest类型的对象,把ServletResponse类型的对象转换成了HttpServletResponse类型的对象。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
this.service(request, response);
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
service方法:
解析HttpServletRequest中的方法参数,并调用以下方法之一:doGet,doPost,doHead,doPut,doTrace,doOptions和doDelete。都表示一个Http方法。doGet和doPost是最常用的。所以,如果我们需要实现具体的服务逻辑,不再需要覆盖service方法了,只需要覆盖doGet或者doPost就好了。
HttpServlet有两个特性是GenericServlet所不具备的:
1.不用覆盖service方法,而是覆盖doGet或者doPost方法。在少数情况,还会覆盖其他的5个方法。
2.使用的是HttpServletRequest和HttpServletResponse对象。
Response的乱码问题
response缓冲区的默认编码是iso8859-1,此码表中没有中文。 浏览器端使用GB2312编码方式解码