JavaWeb学习——Servlet相关的接口和类
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相关的接口和类的更多相关文章
- javaWeb学习总结(3)- Servlet总结(servlet的主要接口、类)
Servlet总结01——servlet的主要接口.类 (一)servlet类 Servlet主要类.接口的结构如下图所示: 要编写一个Servlet需要实现javax.servlet.Servlet ...
- 与servlet相关的接口
(二)与servlet相关的接口 从servlet仅有的5个方法当中,我们知道其涉及3个接口,分别是: ServletConfig ServletRequest ServletResponse 2.1 ...
- JavaWeb学习—Servlet
1.什么是Servlet Servlet是一个继承HttpServlet类的Java类 Servlet必须部署在web服务器端,用来处理客户端的请求 2.Servlet运行过程 Web Client ...
- JavaWeb学习--Servlet认识
Servlet开发 用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个HTTP请求.服务器端程序接受这个请求,并对请求进行处理,然后发送一个回应.浏览器收到回应,再把回应的内容显示出来.这种请 ...
- Servlet常用的接口和类
使用接口和类的作用:Servlet也是依靠继承父类和实现接口来实现的.使用Servlet必须要引入两个包:javax.servlet和javax.servlet.http.所有的Servlet应用都是 ...
- Java EE Servlet相关的两个包
Servlet in Java EE 在Java EE的规范API中(链接),Servlet相关联的最重要的两个Package为: 1.javax.servlet 包含了一系列接口和类,他们在一个Se ...
- Javaweb学习笔记——(九)——————Servlet的进入,及ServletConfig、GenericServlet、HttpServlet、ServletContext、获取类路径资源
Servlet1.什么是Servlet? *Servlet是Javaweb三大组件之一(Servlet,Filter,Listener) *Servlet是用来处理客户端请求的动态资源 *Servle ...
- JavaWeb学习笔记之Servlet(一)
1. 引子: 当我们开始进入JavaWeb开发的学习时,我们就必须要和Servlet和HTTP这两个词进行打交道了,尤其是Servlet.即使到了后面使用JSP (我们知道JSP其本身就是一个Serv ...
- JavaWeb学习——了解Servlet
JavaWeb学习——了解Servlet 摘要:本文主要学习了什么是Servlet,以及如何使用Servlet进行开发. 基础知识 背景 随着互联网技术的发展,基于HTTP和HTML的web应用急速增 ...
随机推荐
- 你知道,HTTPS用的是对称加密还是非对称加密?
1.引言 随着互联网安全意识的普遍提高,对安全要求稍高的应用中,HTTPS的使用是很常见的,甚至在1年前,苹果公司就将使用HTTPS作为APP上架苹果应用市场的先决条件之一(详见<苹果即将强制实 ...
- [Mathematics][BJTU][Calculus]Detailed explanations and proofs of the Dirac-Abel Discriminant Methods which deal with the conditional convergence
So, today we will talk about the conditional convergence and two discriminant methods, namely Dirac- ...
- 配置文件—— .travis.yml
.travis.yml 介绍 https://docs.travis-ci.com/user/getting-started/ 用途 yaml语法的写出来的配置文件,用来描述如何持续构建,支持各种语言 ...
- 图形界面GUI
JFrame jframe = new JFrame(); //创建一个窗口 jframe.setVisible(true) //设置窗口显示 jframe.setLocation() //设置窗口位 ...
- Atoder-3620
The season for Snuke Festival has come again this year. First of all, Ringo will perform a ritual to ...
- csuoj-1900 锋芒毕露
Description 小闪最近迷上了二刀流——不过他耍的其实是剑——新买了一个宝库用来专门存放自己收集的双剑.一对剑有两把,分只能左手用的和只能右手用的,各自有一个攻击力数值.虽然一对剑在小闪刚拿到 ...
- .net core 3.1简体中文语言包,英文只能提示变成中文!
.net core 3.1简体中文语言包,英文只能提示变成中文!这个是我自己手动用谷歌翻译翻译的一批文档,已经把.net core3.1完全翻译了,由于是翻译器翻译,所以怕翻译有错漏,所以没有去掉英文 ...
- 智和网管平台国产化AIOps智能运维 建立自主可控网络安全体系
没有网络安全就没有国家安全,中国作为一个崛起中的大国,网络安全至关重要.新一届中央高度重视信息安全自主可控的发展,Gartner研究报告表明,2019年中国三分之二的数据中心.IT基础设施支出流向中国 ...
- 【Vuejs】335-(超全) Vue 项目性能优化实践指南
点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...
- 带你快速了解Java锁中的公平锁与非公平锁
前言 Java语言中有许多原生线程安全的数据结构,比如ArrayBlockingQueue.CopyOnWriteArrayList.LinkedBlockingQueue,它们线程安全的实现方式并非 ...