JavaWeb学习——Servlet相关的接口和类

摘要:本文主要学习了Servlet相关的接口和类。

Servlet的接口和类

三种方式

实现Servlet有三种方式:

实现javax.servlet.Servlet接口。

继承javax.servlet.GenericServlet类。

继承javax.servlet.http.HttpServlet类。

实现Servlet接口

Servlet接口是最基础的接口,如果要使用Servlet,就要实现这个接口,或者继承其他已经实现了这个接口的类。

创建一个类并实现Servlet接口:

 public class TestServlet implements Servlet {
@Override
public ServletConfig getServletConfig() {
return null;
} @Override
public String getServletInfo() {
return null;
} @Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service()方法被执行……");
} @Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init()方法被执行……");
} @Override
public void destroy() {
System.out.println("destroy()方法被执行……");
}
}

继承GenericServlet类

GenericServlet类实现并重写了Servlet接口的一些方法,使得程序员在开发的时候只需要关注service()方法的实现就好。

创建一个类并继承GenericServlet类:

 public class TestServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service()方法被执行……");
}
}

继承HttpServlet类

HttpServlet类继承了GenericServlet类,是对HTTP请求的特殊支持,由于开发的项目一般遵循HTTP协议,所以经常使用的是HttpServlet类。

在HttpServlet的service(HttpServletRequest, HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明在子类中去重写doGet()或doPost()方法即可。

创建一个类并继承HttpServlet类:

 public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}

继承HttpServlet类需要重写的几个方法

1)doGet()方法

用来处理GET操作。这个操作允许客户端简单地从一个HTTP服务器“获得”资源。对这个方法的重载将自动地支持HEAD方法。

GET操作应该是安全而且不会对数据做永久性改变的。这个操作也应该可以安全地重复。

这个方法的默认执行结果是返回一个HTTP的BAD_REQUEST错误。

2)doPost()方法

用来处理POST操作。这个操作包含请求体的数据,Servlet应该按照要求执行。

POST操作可能会对数据做永久性改变。

这个方法的默认执行结果是返回一个HTTP的BAD_REQUEST错误。当使用POST操作时,必须重载这个方法。

3)doPut()方法

用来处理PUT操作。

PUT操作可能会对数据做永久性改变。

这个方法的默认执行结果是返回一个HTTP的BAD_REQUEST错误。当使用PUT操作时,必须重载这个方法。

4)doDelete()方法

用来处理DELETE操作。PUT操作可能会对数据做永久性改变。

这个方法的默认执行结果是返回一个HTTP的BAD_REQUEST错误。当使用DELETE请求时,必须重载这个方法。

doGet()方法和doPost()方法的比较

从安全角度看,doGet()方法的安全性小于doPost()方法,因为get会把提交的信息显示到地址栏。

从提交的内容来看,doGet()方法要小于doPost()方法,doGet()方法一般不要大于2k,doPost()方法理论上无限制,但是在实际开发中,建议不要大于64k。

从速度看,doGet()方法要比doPost()方法快,doGet()方法会直接处理,而doPost()方法可能会形成队列。

此外,doGet()方法可以保留URI中的参数,利于收藏。

其他接口和类

ServletConfig接口

代表当前Servlet的配置信息,封装了ServletContext对象和配置参数信息。

可以通过Servlet里面的getServletConfig()方法获取:

 public ServletConfig getServletConfig();

常用方法:

 public String getServletName();// 获取当前Servlet的友好名称。
public ServletContext getServletContext();// 获取ServletContext对象。
public String getInitParameter(String name);// 获取初始化参数,初始化参数可以在web.xml配置文件的<servlet></servlet>标签里的<init-param></init-param>标签里设置。
public Enumeration<String> getInitParameterNames();// 获取全部初始化参数,初始化参数同样需要在web.xml配置文件的<servlet></servlet>标签里的<init-param></init-param>标签里设置。

ServletContext接口

代表当前Web应用,服务器为每个Web应用程序都创建一个对应的ServletContext对象,被所有客户端共享。当Web应用启动时自动创建,当Web应用关闭和重新启动、服务器关闭时都会造成ServletContext销毁。

可以通过ServletConfig里面的getServletContext()方法获取:

 public ServletContext getServletContext();

常用方法:

 public String getServletContextName();// 获取当前项目的名称。
public String getServerInfo();// 返回Servlet容器名称和版本号。
public ServletContext getContext(String uripath);// 通过路径获取ServletContext对象。
public String getContextPath();// 获取服务器上当前项目的相对目录。比如:/HelloWorld。
public String getRealPath(String path);// 得到指定文件的真实路径,从应用程序根目录开始。比如:TestServlet得到的是盘符:\文件夹\工作空间\项目名称\WebContent\TestServlet。
public Set<String> getResourcePaths(String path);// 得到指定相对路径下的文件夹名和文件名,从应用程序根目录开始,指定路径必须以/开头。比如:/得到的是应用程序根目录下的内容。
public URL getResource(String path) throws MalformedURLException;// 得到指定相对路径下的地址,从应用程序根目录开始。比如:/得到的是jndi:/域名/项目名/。
public InputStream getResourceAsStream(String path);// 将指定文件转化为流以便读取,从应用程序根目录开始。比如:index.html可以获取到应用程序根目录下的index.html并转为流。
public RequestDispatcher getRequestDispatcher(String path);// 创建跳转到指定路径的转发器,从应用程序根目录开始,指定路径必须以/开头。
public RequestDispatcher getNamedDispatcher(String name);// 创建跳转到指定Servlet名的转发器,不需要也不能以/开头。
public String getInitParameter(String name);// 获取指定的初始化参数,初始化参数需要在web.xml配置文件的<context-param></context-param>标签里设置。
public Enumeration<String> getInitParameterNames();// 获取所有指定的初始化参数,初始化参数也需要在web.xml配置文件的<context-param></context-param>标签里设置。
public boolean setInitParameter(String name, String value);// 设置初始化参数,效果同在web.xml配置文件的<context-param></context-param>标签里设置的一样。
public Object getAttribute(String name);// 通过属性名获取属性对象。
public Enumeration<String> getAttributeNames();// 获取全部属性名。
public void setAttribute(String name, Object object);// 设置属性名和属性对象。
public void removeAttribute(String name);// 通过属性名删除属性对象。

RequestDispatcher接口

RequestDispatcher实例对象是由Servlet引擎创建的,用于包装一个要被其他资源调用的资源,并可以通过其中的方法将客户端的请求转发给所包装的资源。

RequestDispatcher接口中定义了两个方法:forward()方法和include()方法。forward()和include()方法接收的两个参数,必须是传递给当前Servlet的service()方法的ServletRequest和ServletResponse对象,或者是对它们进行了包装的ServletRequestWrapper和ServletResponseWrapper对象。

可以通过ServletContext对象的getRequestDispatcher()方法和getNamedDispatcher()方法获取:

 public RequestDispatcher getRequestDispatcher(String path);
public RequestDispatcher getNamedDispatcher(String name);

请求转发:

 // 该方法用于将请求从一个Servlet传递到服务器上另外的Servlet、Jsp页面或者Html文件,由当前的Servlet发送给另一个Servlet,该方法必须在响应被提交给客户端之前调用。
// 在当前的Servlet中可以给请求设置属性,设置的响应头信息不回被忽略,但是设置的响应体信息可能会被忽略。
public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException;

请求包含:

 // 该方法用于在响应中包含Servlet、Jsp页面或者Html文件,由当前的Servlet发送给客户端,必须要在当前Servlet中设置编码格式。
// 当前Servlet和要包含的资源都可以设置响应体,按先后顺序输出到客户端。
public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException;

请求转发与请求包含比较:

请求转发大多是应用在Servlet中,转发目标大多是Jsp页面。

请求包含大多是应用在Jsp页面中,完成多页面的合并。

ServletRequest接口

ServletRequest对象封装了请求数据,可以获取到请求信息。

ServletResponse接口

ServletResponse对象封装了响应数据,可以获取到响应信息。

HttpServletRequest接口

当客户端通过HTTP协议访问时,HttpServletRequest对象封装了来自客户端的HTTP请求,使用这个对象可以获取到客户端的请求信息。

常用方法:

 //获取协议信息
public String getProtocol();// 获取协议信息的版本号,如HTTP/1.1。
public String getScheme();// 获取协议名称,如HTTP、FTP。
//获取转发器
public RequestDispatcher getRequestDispatcher(String path);// 获取指定地址的转发器。
//操作属性
public void setAttribute(String name, Object object);// 设置属性名和属性对象。
public Object getAttribute(String name);// 通过属性名获取属性对象。
public Enumeration<String> getAttributeNames();// 得到全部的属性名。
public void removeAttribute(String name);// 通过属性名删除属性对象。
//获取参数
public String getParameter(String name);// 通过参数名获取参数值。
public Map<String, String[]> getParameterMap();// 将所有参数名和参数值以Map的形式返回。
public Enumeration<String> getParameterNames();// 获取全部参数名。
public String[] getParameterValues(String name);// 通过参数名获取数组类型的参数值。
//操作请求体
public String getCharacterEncoding();// 获取请求体中Servlet的编码方式。
public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;// 设置请求体中Servlet的编码方式。
public int getContentLength();// 获取请求体的长度。
public String getContentType();// 获取请求体的MIME类型,包括编码。
public ServletInputStream getInputStream() throws IOException;// 将请求体封装为二进制的流文件。
public BufferedReader getReader() throws IOException;// 将请求体封装为字符类型的流文件。
public boolean isSecure();// 是否使用的安全协议,如HTTPS。
//获取服务器信息
public int getServerPort();// 获取服务器的端口号。
public String getServerName();// 获取服务器的主机名。
public Locale getLocale();// 获取本地位置信息,若ZHCN等等。
public Enumeration<Locale> getLocales();// 使用枚举获取服务器的多个位置信息。
public String getLocalAddr();// 获取本地地址,根据访问方法不同而不同,为127.0.0.1或者公网ip。
public String getLocalName();// 获取本地IP的名称,如127.0.0.1就是localhost。
public int getLocalPort();// 获取端口号,本应用就是8081。
//获取客户端信息
public String getRemoteAddr();// 获取客户端的IP地址。
public String getRemoteHost();// 获取客户端的主机名。
public int getRemotePort();// 获取客户端的端口号。
//得到请求头信息(HttpServletRequest独有的)
public int getIntHeader(String name);// 得到整形单值的请求头的值。
public long getDateHeader(String name);// 得到毫秒类型单值的请求头。
public String getHeader(String name);// 得到字符串类型单值的请求头的值。
public Enumeration<String> getHeaders(String name);// 返回枚举得到多值的请求头的值。
public Enumeration<String> getHeaderNames();// 返回枚举得到所有请求头的名称。
//得到常用信息(HttpServletRequest独有的)
public String getMethod();// 得到请求方式。
public String getContextPath();// 获取项目的根目录名。返回指定上下文(web应用)的URL的前缀,比如/BookStore。
public String getServletPath();// URL中调用Servlet的那一部分,不包含附加路径信息,比如/BookServlet。
public String getQueryString();// 获取URL后面全部的查询字符串参数。
public String getRequestURI();// 获取请求URI,不包含请求内容,不包含域名。
public StringBuffer getRequestURL();// 获取URL,包含域名,不包含请求内容。未被Servlet服务器Decode过。
public String getRequestedSessionId();// 返回这个请求相应的SessionId。
public HttpSession getSession();// 获取Session对话,用于与网页通信。
public Cookie[] getCookies();// 返回使用数组存储的Cookie对象。

HttpServletResponse接口

当客户端通过HTTP协议访问时,HttpServletResponse对象封装了来自服务端的HTTP响应,使用这个对象可以获取到服务端发送给客户端的响应信息。

常用方法:

 //获取缓冲信息
public void flushBuffer() throws IOException;// 强制刷新缓冲区的内容到客户端,之后如果调用forward方法将报异常。
public void resetBuffer();// 只清除缓冲。
public void reset();// 清除缓冲、状态码、头信息,设置页面不缓存。
public int getBufferSize();// 返回响应使用的缓冲区使用的实际大小。
public void setBufferSize(int size);// 设置缓冲区的大小。
//设置响应信息
public void setContentLength(int len);// 设置响应体的长度。
public void setContentType(String type);// 设置响应的编码格式,并通知浏览器使用该方式解码。
public String getCharacterEncoding();// 设置响应体中MIME的编码方式。
public ServletOutputStream getOutputStream() throws IOException;// 返回使用二进制流包装的响应。
public PrintWriter getWriter() throws IOException;// 返回使用字符流包装的文本给客户端。
public boolean isCommitted();// 判断响应是否已被提交或完成。
//获取本地信息
public Locale getLocale();// 获取响应的本地信息。
public void setLocale(Locale loc);// 设置本地响应信息,包括要使用什么解码。
//设置响应头信息(HttpServletRequest独有的)
public void setIntHeader(String name, int value);// 设置整形单值的响应头的值。
public void addIntHeader(String name, int value);// 设置整形多值的响应头的值。
public void setDateHeader(String name, long date);// 设置毫秒类型单值的响应头的值。
public void addDateHeader(String name, long date);// 设置毫秒类型多值的响应头的值。
public void setHeader(String name, String value);// 设置字符串类型单值的响应头的值。
public void addHeader(String name, String value);// 设置字符串类型多值的响应头的值。
public boolean containsHeader(String name);// 返回一个布尔值,判断响应的头部是否被设置。
//得到响应头信息(HttpServletRequest独有的)
public String getHeader(String name);// 获取字符串类型多值的响应头的值。
public Collection<String> getHeaders(String name);//返回集合得到多值的响应头的值。
public Collection<String> getHeaderNames();//返回集合得到所有响应头的名称。
//设置状态信息(HttpServletResponse独有的)
public void sendError(int sc) throws IOException;// 设置错误状态返回的状态码。
public void sendError(int sc, String msg) throws IOException;// 设置错误状态返回的状态码及描述信息。
public void setStatus(int sc);// 设置状态码。
public int getStatus();// 获取状态码。
//其他设置(HttpServletResponse独有的)
public void addCookie(Cookie cookie);// 添加Cookie对象。
public String encodeRedirectURL(String url);// 通过指定的编码对URL进项编码,并携带sessionid,跨应用。
public String encodeURL(String url);// 通过指定的编码对URL进项编码,并携带sessionid,本应用。
public void sendRedirect(String location) throws IOException;// 进行重定向。

JavaWeb学习——Servlet相关的接口和类的更多相关文章

  1. javaWeb学习总结(3)- Servlet总结(servlet的主要接口、类)

    Servlet总结01——servlet的主要接口.类 (一)servlet类 Servlet主要类.接口的结构如下图所示: 要编写一个Servlet需要实现javax.servlet.Servlet ...

  2. 与servlet相关的接口

    (二)与servlet相关的接口 从servlet仅有的5个方法当中,我们知道其涉及3个接口,分别是: ServletConfig ServletRequest ServletResponse 2.1 ...

  3. JavaWeb学习—Servlet

    1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...

  4. JavaWeb学习--Servlet认识

    Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...

  5. Servlet常用的接口和类

    使用接口和类的作用:Servlet也是依靠继承父类和实现接口来实现的.使用Servlet必须要引入两个包:javax.servlet和javax.servlet.http.所有的Servlet应用都是 ...

  6. Java EE Servlet相关的两个包

    Servlet in Java EE 在Java EE的规范API中(链接),Servlet相关联的最重要的两个Package为: 1.javax.servlet 包含了一系列接口和类,他们在一个Se ...

  7. Javaweb学习笔记——(九)——————Servlet的进入,及ServletConfig、GenericServlet、HttpServlet、ServletContext、获取类路径资源

    Servlet1.什么是Servlet? *Servlet是Javaweb三大组件之一(Servlet,Filter,Listener) *Servlet是用来处理客户端请求的动态资源 *Servle ...

  8. JavaWeb学习笔记之Servlet(一)

    1. 引子: 当我们开始进入JavaWeb开发的学习时,我们就必须要和Servlet和HTTP这两个词进行打交道了,尤其是Servlet.即使到了后面使用JSP (我们知道JSP其本身就是一个Serv ...

  9. JavaWeb学习——了解Servlet

    JavaWeb学习——了解Servlet 摘要:本文主要学习了什么是Servlet,以及如何使用Servlet进行开发. 基础知识 背景 随着互联网技术的发展,基于HTTP和HTML的web应用急速增 ...

随机推荐

  1. 堡垒机WebSSH进阶之实时监控和强制下线

    这个功能我可以不用,但你不能没有 前几篇文章实现了对物理机.虚拟机以及Kubernetes中Pod的WebSSH操作,可以方便的在web端对系统进行管理,同时也支持对所有操作进行全程录像,以方便后续的 ...

  2. Linux入侵痕迹检测方案【华为云技术分享】

    背景说明 扫描是一切入侵的基础,通过扫描来发现目标主机是否为活动主机.操作系统是什么版本.开放了哪些服务等.扫描技术纷繁复杂,新的扫描技术也层出不穷,不可能穷举所有扫描技术,下面按入侵步骤对主机扫描. ...

  3. 吴裕雄--天生自然python学习笔记:python通过“任务计划程序”实现定时自动下载或更新运行 PM2.5 数据抓取程序数据

    在 Windows 任务计划程序中,设置每隔 30 分钟自动抓取 PM2.5 数据,井保存 在 SQLite 数据库中 . import sqlite3,ast,requests,os from bs ...

  4. 记一次Elasticsearch OOM的优化过程——基于segments force merge 和 store type 转为 niofs

    首选,说明笔者的机器环境(不结合环境谈解决方案都是耍流氓): cpu 32核,内存128G,非固态硬盘: RAID0 (4T * 6),单节点,数据量在700G到1800G,索引15亿~21亿.敖丙大 ...

  5. CodeForces-Round235D

      链接:http://codeforces.com/contest/401/problem/D 题意:给出一个数字num和m,问通过重新排列num中的各位数字中有多少个数(mod m)=0,直接枚举 ...

  6. Dubbo源码分析之 SPI(一)

    一.概述 dubbo SPI 在dubbo的作用是基础性的,要想分析研究dubbo的实现原理.dubbo源码,都绕不过 dubbo SPI,掌握dubbo SPI 是征服dubbo的必经之路. 本篇文 ...

  7. 【CuteJavaScript】Angular6入门项目(1.构建项目和创建路由)

    本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...

  8. 【系列专题】ECMAScript 重温系列(10篇全)

    ES6 系列ECMAScript 2015 [ES]150-重温基础:ES6系列(一) [ES]151-重温基础:ES6系列(二) [ES]152-重温基础:ES6系列(三) [ES]153-重温基础 ...

  9. selenium处理弹窗

    处理登录弹窗:https://www.cnblogs.com/TD1900/p/11938573.html #定位弹窗 ale = driver.switch_to.alert #处理方式 ale.a ...

  10. 回归损失函数2 : HUber loss,Log Cosh Loss,以及 Quantile Loss

    均方误差(Mean Square Error,MSE)和平均绝对误差(Mean Absolute Error,MAE) 是回归中最常用的两个损失函数,但是其各有优缺点.为了避免MAE和MSE各自的优缺 ...