一.Servlet类的学习
创建一个新的子项目,在子项目中新建一个"HelloServlet"类,并且配置对应的映射。
代码如下:
HelloServlt.java
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.print("Hello");
resp.getWriter().print("Hello,Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
项目结构如下:
对HelloServlet中继承方法解析
之后我们便可以在HelloServlet
类中使用this.XXX
来查看HelloServlet都继承了那些方法,以及这些方法的用处。
首先我们可以先确定do…()的方法,这些方法都是Servlet.service中根据请求方法来选择运行的方法,具体有以下几个:
// 这些都是service方法中根据req请求方法而选择运行的方法
this.doPost();
this.doGet();
this.doDelete();
this.doHead();
this.doOptions();
this.doPut();
this.doTrace();
这些方法我们会在之后的学习中使用到。以后使用到时可以详细的学习。
之后我们可以来看看get开头的方法。这些方法我们可以根据名字轻松的看出来它们获取的信息。这些方法如下:
this.getInitParameter();
this.getLastModified();
this.getServletConfig();
this.getServletInfo();
this.getServletName();
this.getInitParameterNames();
this.getServletContext();
this.getClass();
this.getInitParameter() 方法
其中我们需要了解this.getInitParameter()
方法。根据方法名我们不能看出它是获取servlet初始化参数的方法,那么servlet初始化参数是什么?它又是怎么设置的呢?
我们在web.xml
中的<servlet>
标签中,我们发现它有一个<init-paramter>
,我们可以在这个标签中设置初始化参数的名称以及值。
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
<!-- 设置此servlet的初始化参数-->
<init-param>
<!-- 初始化参数名称-->
<param-name>MyName</param-name>
<!-- 初始化参数的值-->
<param-value>BugMaker2000</param-value>
</init-param>
</servlet>
如上我们设置了一个名称是"MyName",值是"BugMaker2000"的初始化参数。
现在我们在HelloServlet中进行测试。
在HelloServlet
中添加如下代码:
resp.getWriter().println("MyName : " + this.getInitParameter("MyName"));
之后我们访问’…/hello’,结果如下:
初始化参数被成功获取。
其余的方法有:
this.clone();
this.equals();
this.hashCode();
this.toString();
this.destroy();
this.init();
this.log();
...
这些方法我们可以根据字面意思快速了解其含义,在此就不一一赘述。感兴趣的小伙伴可以自己去阅读源码。
ServletContext对象
在刚刚我们对this.XX方法的分析中,我们不难发现其中有一个this.getServletContext()
的方法。
看到本章节的标题,想必大家也能猜到,这个ServletContext
便是本章的主角。
那么我们不禁想问:什么是ServletContext?它有什么作用?
什么是ServletContext?
ServletContext是一个全局的储存信息的空间,服务器开始就存在,服务器关闭才释放。
推荐阅读本篇博客:ServletContext详解
我们可以做一个总结:ServletContext
是一个可以被所有客户端访问、被所有servlet共享的一个公共空间。web容器
启动时,会为每个web应用
创建一个ServletContext
。
重点是共享数据以及与web应用在web容器中存在时间相同。
每个web应用有且仅有一个ServletContext
.
ServletContext的作用
由于ServletContext
作为一个共享的空间,所以servlet
之间可以通过ServletContext
通讯。
使用ServletContext
的案例有:公共聊天室。
ServletContext使用案例
在本案例中,我们会对ServletContext
的共享数据功能做出一个基本的使用。
测试方法:
- 创建一个SetServletContext类,此类的作用是向
ServletContext
中放入一条数据。 - 创建一个GetServletContext类,此类的作用是向
ServletContext
中获取SerServlet放入的数据。 - 配置两个类的映射
- 启动服务器测试。
1.创建SetServletContext类。
package com.kuang.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SetServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 向ServletContext中放入一条数据
String message = "我的名字是BugMaker2000";
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("Message",message);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.创建GetServletContext类。
package com.kuang.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class GetServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取servletContext中的数据
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
// 这两句话可以用 resp.setContentType("text/html;charset=utf-8"); 代替
ServletContext servletContext = this.getServletContext();
PrintWriter writer = resp.getWriter();
writer.print("信息 : " + servletContext.getAttribute("Message"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.设置两个Servlet的映射。
<servlet>
<servlet-name>setServletContext</servlet-name>
<servlet-class>com.kuang.servlet.SetServletContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>setServletContext</servlet-name>
<url-pattern>/setServletContext</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getServletContext</servlet-name>
<servlet-class>com.kuang.servlet.GetServletContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getServletContext</servlet-name>
<url-pattern>/getServletContext</url-pattern>
</servlet-mapping>
4.测试结果:
我们先访问’/setServletContext’
此时ServletContext
中已经被插入了我们设置好的数据。
之后我们再访问’/getServletContext’:
我们可以看到数据别成功获取并且输出。
小知识:
在GetServletContext中,我们添加了两行代码:
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
这两行的代码的作用是:设置响应输出的内容类型以及设置响应的编码格式。如果我们响应中输出的内容带有中文,那么resp.setCharacterEncoding("utf-8");
此行代码必不可缺,否则页面输出的中文将会是乱码。resp.setContentType("text/html");
这行代码的作用是设置响应输出的文本内容的类型,此处设置的参数为text/html
是的页面响应输出的内容中可以带有HTML
格式,并且可以被页面识别。
此外,这两行代码可以用一行代码代替:
resp.setContentType("text/html;charset=utf-8");
本章完结。