Servlet三大域对象:request session application(ServletContext)
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>day09_01</display-name>
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>cn.itcast.web.servlet.AServlet</servlet-class>
<init-param>
<param-name>p1</param-name>
<param-value>v1</param-value>
</init-param>
<init-param>
<param-name>p2</param-name>
<param-value>v2</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>yyy</servlet-name>
<servlet-class>cn.itcast.web.servlet.EServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>FServlet</servlet-name>
<servlet-class>cn.itcast.web.servlet.FServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>yyy</servlet-name>
<url-pattern>/EServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>FServlet</servlet-name>
<url-pattern>/FServlet</url-pattern>
</servlet-mapping>
</web-app>
1.实现Servlet的方式
1.实现javax.servlet.Servlet接口
package cn.itcast.web.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AServlet implements Servlet {
@Override
public void destroy() {
System.out.println("destroy()..");
}
//获取Servlet配置信息
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig()");
return null;
}
//获取Servlet的信息
@Override
public String getServletInfo() {
System.out.println("getServletInfo()");
return "我是一个快乐的Servlet";
}
//调用一次 在servlet对象创建之后马上执行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init()..");
//获取初始化参数
System.out.println(servletConfig.getInitParameter("p1"));
System.out.println(servletConfig.getInitParameter("p2"));
//获取所有初始化参数的名字
Enumeration e = servletConfig.getInitParameterNames();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service()..");
}
}
package cn.itcast.web.servlet;
import java.io.IOException;
import javax.ejb.Init;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//模拟GenericServlet
public class BServlet implements Servlet {
private ServletConfig config;
//需要就写 不需要不写
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("a我要死了");
}
//这个方法 一定会在init()后被调用,本类的this。config 已经有值了
@Override
public ServletConfig getServletConfig() {
return this.config;
}
//没有用
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return "我是一个快乐的Servlet";
}
//由Tomcat调用 只用一次
//他是这些方法中第一个被调用的 在构造器之后立马调用
@Override
public void init(ServletConfig config) throws ServletException {
//把Tomcat传递的ServletConfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他类中使用
this.config = config;
init();
}
//自己定义的方法
public void init(){
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("每次处理请求都会被调用!");
}
public ServletContext getServletContext(){
return config.getServletContext();
}
public String getServletName(){
return config.getServletName();
}
public String getInitParameter(String name){
return config.getInitParameter(name);
}
}
package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CServlet extends BServlet {
@Override
public void init() {
System.out.println("娃娃 我出生啦");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
String value = getInitParameter("p1");
}
}
2.继承javax.servlet.GenericServlet类
package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class DServlet extends GenericServlet {
@Override
public void init() throws ServletException {
System.out.println("哈哈哈 我来也");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("hello world");
}
@Override
public void destroy() {
System.out.println("destroy()...");
}
}
3.继承javax.servlet.http.HttpServlet类
新增一个login.html测试post方法
<body>
This is my HTML page. <br>
<form action="/day09_01/EServlet" method="post">
<input type="submit" value="提交">
</form>
</body>
package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet()...");
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("doPost()..");
}
}
在<servlet>中配置<load-on-startup>中给出一个非负整数。服务器启动即开始。
package cn.itcast.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("hello--world 服务器第一次启动就开始");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("测试eclipse的Servlet doGet()方法");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.getServletContext();
this.getServletConfig().getServletContext();
}
}
2.一个ServletConfig对象,对应一段web.xml中Servlet的配置信息
API: String getServletName(),获取的是<servlet_name>中的内容
ServletContext getServletContext():获取Servlet上下文对象
String getInitParameter(String name):通过名称获取指定初始化参数的值
Enumeration getInitParameterName():获取所有初始化参数的名称
3.不要在servlet创建成员变量,创建局部变量即可。。。。。可以创建无状态成员,或者只读有状态的成员
5.一个项目只有一个ServletContext对象 application;
获取方法4种(先写2种): this.getServletContext
this.getServletConfig().getServletContext();
4.在<servlet>中配置<load-on-startup>中给出一个非负整数。服务器启动即开始。
6.4个域对象(用来多个Servlet传递数据):1.PageContext 2.ServletRequest 3.HttpSession 4.ServletContex
域内部有一个Map ,所以
l void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在ServletContext中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
l Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性;
l void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;
l Enumeration getAttributeNames():获取所有域属性的名称;
AServlet 向ServletContext中保存数据(加入一个name 张三),BServlet获取数据
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AServlet extends HttpServlet {
//演示向ServletContext中保存数据
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.获取ServletContext对象
* 2.调用其setAttribute()方法完成保存数据
* */
ServletContext application = this.getServletContext();
application.setAttribute("name", "张三");
}
}
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示从ServletContext获取数据
public class BServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.获取ServletContext对象
* 2.调用其getAttribute()方法完成获取数据
* */
ServletContext application = this.getServletContext();
String name = (String) application.getAttribute("name");
System.out.println(name);
}
}
CServlet 获取公共的初始化参数
公共的初始化参数在web.xml中</web-app>前创建即可
如
<context-param>
<param-name>context-param</param-name>
<param-value>context-value</param-value>
</context-param>
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CServlet extends HttpServlet {
//演示ServletContext 获取公共的初始化参数
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.得到servletcontext
* 2.调用它getInitParamter(String)得到初始化参数
*/
ServletContext application = this.getServletContext();
String value = application.getInitParameter("context-param");
System.out.println(value);
}
}
DServlet 使用Servletcontext获取资源路径
package cn.itcast.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DServlet extends HttpServlet {
//使用Servletcontext获取资源路径
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到的是有盘符的路径 如:F:/xx/x/x/x
String path = this.getServletContext().getRealPath("/index.jsp");
System.out.println(path);
//获取资源的路径后 再创建出输入流
InputStream inputStream = this.getServletContext().getResourceAsStream("/index.jsp");
//获取当前路径下所有资源的路径
Set<String> paths = this.getServletContext().getResourcePaths("/WEB-INF");
System.out.println(paths);
}
}
接下来是两个实用的小demo
1.统计访问量
package cn.itcast.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.omg.IOP.ServiceContext;
public class AServlet extends HttpServlet {
//统计访问量
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.获取servletContext对象
* 2.从ServletContext对象中获取名为count对象
* 3.如果存在,加1 保存
* 4.如果不存在,则证明第一次存在,向ServletContext保存名为count的属性
*/
ServletContext application = this.getServletContext();
Integer count = (Integer) application.getAttribute("count");
if(count == null){
application.setAttribute("count", 1);
}else{
application.setAttribute("count", count+1);
}
/*
* 向浏览器输出
* 需要使用响应对象
*/
PrintWriter pw = response.getWriter();
pw.print("<h1>"+count+"</h1>");
}
}
2.获取类路径下的资源
这是类路径的资源 txt里面内容随便写写
这里下载一个commons-io-1.4.jar方便读取输入流内容并转换成String,,,,,放在WEB-INF的lib下。
如
String string = IOUtils.toString(inputStream); //读取输入流内容,转换成字符串返回
System.out.println(string);
package cn.itcast.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
public class BServlet extends HttpServlet {
//演示获取类路径下的资源
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 1.得到classLoader
* 》先得到Class 再得到ClassLoader
* 2.调用其getResourceAsStream(),得到一个InputStream
*/
//相对/classes
// ClassLoader classLoader = this.getClass().getClassLoader();
// InputStream inputStream = classLoader.getResourceAsStream("cn/itcast/servlet/a.txt");
//
//相对当前.class文件所在目录
Class c =this.getClass();
// InputStream inputStream = c.getResourceAsStream("a.txt");
//相对于classes下
// InputStream inputStream = c.getResourceAsStream("/a.txt");
InputStream inputStream = c.getResourceAsStream("/../../index.jsp");
String string = IOUtils.toString(inputStream); //读取输入流内容,转换成字符串返回
System.out.println(string);
}
}