web容器在启动的时候,它会为每个web程序创建一个唯一的ServletContext对象,通过使用它可以对当前的web应用进行操作
共享数据
在web应用中有一个servlet对web容器对象进行操作或者提交数据之后,其他的servlet对象也可以访问并得到web容器中的数据。
下面演示一个例子帮助大家理解,HelloServlet类的操作是向web容器中存放键值对形式(K:V)格式的数据,GetServlet类是从web容器中取出键所对应的值。
向web容器中填充数据的类
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//web程序的容器操作对象
ServletContext context = this.getServletContext();
String username = "喜多川";
//使用web程序的操作对象将键值对的数据存放到web容器中,供给当前web程序下的servlet使用
context.setAttribute("username",username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//不管是post请求还是get请求,都转为get请求处理
doGet(req, resp);
}
}
从web容器中得到数据的类
public class GetHello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html"); //设定页面响应格式
resp.setCharacterEncoding("utf-8"); //设定页面编码
String username = (String)this.getServletContext().getAttribute("username"); //拿到username对应的值
resp.getWriter().print(username); //将结果输出到页面上
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
完成以上两步的代码编写后记得向web.xml中注册servlet
<!-- 注册servlet-->
<!-- Servlet第一个应用,共享数据-->
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.darling.servlet01.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Gets</servlet-name>
<servlet-class>com.darling.servlet01.GetHello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Gets</servlet-name>
<url-pattern>/gets</url-pattern>
</servlet-mapping>
注册完成后访问网址的地址分别为
http://localhost:8080/hello 对应 HelloServlet类
http://localhost:8080/gets 对应 GetHello类
获取初始化配置信息
说道获取信息,首先应该知道信息存在哪里才可以获取,所以这个初始化配置信息就在web.xml中自定义的
定义的格式是: 其实就像是一个键值对的格式————>url : jdbc:mysql://localhost:3306/mybatis
<context-param>
<param-name>url</param-name> //键
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value> //值:数据库链接时的端口
</context-param>
然后编写java代码类
/**
* 该类意为实现servlet第二个获取初始化配置信息的功能
*/
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//自己定义的键的名字是啥,那么就获取对应的值("url为自定义的")
String urls = this.getServletContext().getInitParameter("url");
resp.getWriter().print(urls);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
然后别忘了对编写的java类注册成servlet身份,这样才能在网页中访问
<!-- Servlet第二个应用:获取初始化配置信息-->
<servlet>
<servlet-name>S2</servlet-name>
<servlet-class>com.darling.servlet01.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>S2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
注册完之后,访问网址为
http://localhost:8080/s2
请求转发
这个servlet应用很简单,就是当你进入一个页面的时候,这个页面将不显示当前内容,直接将你转发到新的页面。
代码如下:
/**
* 该类意为实现servlet第三个应用:请求转发功能
*/
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// "/gets"是在web.xml中注册servlet时自己定义的网页路径
this.getServletContext().getRequestDispatcher("/gets").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
当然上面这个也要在web.xml中进行servlet注册
<!-- Servlet第三个应用:请求转发功能-->
<servlet>
<servlet-name>S3</servlet-name>
<servlet-class>com.darling.servlet01.ServletDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>S3</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
注册完之后访问网址为
http://localhost:8080/s3
获取配置文件的信息
配置文件的拓展名是——> *.Properties
当前存在一个配置文件为 db.properties ,内容如下
username=root
password=123456
想要访问配置文件中的数据,那么就先创建java类
/**
* 该类意为实现servlet的第三个应用:获取配置文件中的信息
*/
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB- INF/classes/db.properties"); //当前生成的web程序中配置文件所在的相对路径,注意是相对路径
Properties properties = new Properties();
properties.load(resourceAsStream);
String uam = properties.getProperty("username"); //获取username对应的值
String pwd = properties.getProperty("password"); //获取password对应的值
resp.getWriter().print(uam+":"+pwd); //打印在网页上
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
java类编写完之后,记得在web.xml中注册servlet身份
<!-- Servlet第四个应用:获取配置文件中的信息-->
<servlet>
<servlet-name>S4</servlet-name>
<servlet-class>com.darling.servlet01.ServletDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>S4</servlet-name>
<url-pattern>/s4</url-pattern>
</servlet-mapping>
注册完之后访问网址为
http://localhost:8080/s4
最后说一句Tomcat10和Tomcat9中使用HttpServlet类的不同方式
Tomcat9以及以下版本中HttpServlet类在javax包下,全称 javax.servlet.http.HttpServlet
Tomcat10中HttpServlet类在jakarta包下,全称 jakarta.servlet.http.HttpServlet
不注意这个问题的话可能会,啊不一定会出现访问servlet注册时的网页时,提示访问错误,错误访问码500,错误信息是:不认为你所编写的类是servlet对象,因为找不到HttpServlet类所以编写的类没有继承成功,所以不认为是servlet对象。