但在实际开发中,我们不会直接去实现Servlet接⼝,因为那样需要覆盖的⽅法太多
我们⼀般创建类继承HttpServlet,实现步骤:
何时执⾏:servlet对象创建的时候执⾏,默认只执行一次
ServletConfig : 代表的是该servlet对象的配置信息
何时执⾏:每次请求都会执⾏
ServletRequest :代表请求,认为ServletRequest 内部封装的是http请求的信息
ServletResponse :代表响应,认为要封装的是响应的信息
何时执⾏:服务器关闭,或者servlet对象销毁的时候执⾏
Servlet何时创建 | 默认第⼀次访问servlet时创建该对象 |
Servlet何时销毁 | 服务器关闭servlet就销毁了 |
每次访问必然执⾏的⽅法 | service(ServletRequest req, ServletResponse res)⽅法 |
问题:对XXXServlet进⾏了10次访问,init(),destory(),service(),doGet(),doPost()
⼀共执⾏了多少次?request对象创建⼏个?response创建⼏个?
init()一次,destory零次,servlet()一次,service()十次,doGet()加上doPost()一共十次,request对象十个,response对象十个 --------------------------------------------------
<!-- 配置/注册Servlet类,才能被服务器识别 --> <servlet> <!-- servlet 起名 --> <servlet-name>Hello</servlet-name> <!-- ⾃定义Servlet的全限定类名 --> <servlet-class>demo.a_servlet.HelloServlet</servlet-class> </servlet> <!-- 配置servlet资源虚拟路径 --> <servlet-mapping> <servlet-name>Hello</servlet-name> <!-- 请求路径 --> <url-pattern>/hello</url-pattern> </servlet-mapping>
其中url-pattern的配置⽅式:
<url-pattern>/hello</url-pattern>
<url-pattern>/hello/*</url-pattern>
<url-pattern>*.user</url-pattern>
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
Servlet的何时创建:默认第⼀次访问时创建。
当在servlet的配置时,加上⼀个配置 servlet对象在服务器启动时就创建。
<servlet> <servlet-name>Hello</servlet-name> <servlet-class>demo.a_servlet.HelloServlet</servlet-class> <!-- 设置servlet在服务器启动时创建 --> <load-on-startup>5</load-on-startup> </servlet>
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
public void init(ServletConfig config) throws ServletException { System.out.println("init()执行了"); //使用config对象 //1.获得当前这个Servlet的名字 servlet的名字 servlet-name String servletName=config.getServletName(); System.out.println(servletName); //2.获得servlet的初始化参数 String encoding = config.getInitParameter("encoding"); System.out.println(encoding); //3.获得所有的初始化参数的名字 Enumeration<String> names = config.getInitParameterNames(); while(names.hasMoreElements()){ String s = names.nextElement(); System.out.println(s); String initParameter = config.getInitParameter(s); System.out.println(initParameter); } //4.获得ServletContext对象 ServletContext context = config.getServletContext(); }
public void service(ServletRequest req, ServletResponse rsp) throws ServletException, IOException { System.out.println("service执行了"); // 获得ServletContext对象 ServletContext application = req.getServletContext(); //1.获得应用的路径(名字) String path = application.getContextPath(); System.out.println(path); //2.获得应用的初始化参数-web.xml String config = application.getInitParameter("config"); System.out.println(config); }
假设有这么四个文件:
public void service(ServletRequest req, ServletResponse rsp) throws ServletException, IOException { System.out.println("service执行了"); // 获得ServletContext对象 ServletContext application = req.getServletContext(); // 获得应用中资源的绝对路径 必须掌握 // src/a.txt -> 应用/WEB-INF/classes String aPath = application.getRealPath("WEB-INF/classes/a.txt"); // web/b.txt String bPath = application.getRealPath("b.txt"); // web/WEB-INF/c.txt String cPath = application.getRealPath("WEB-INF/c.txt"); // 其他工程目录下 -> 应用中找不到 }
⽅法:String path = context.getRealPath(相对于该web应⽤的相对地址);
⼀个有作⽤范围的对象,可以在范围内共享数据
整个web应(所有的web资源都可以随意向ServletContext域中存取数据,数据可以共享)。
点击量,播放量,登陆时间等所有用户可以共享的数据
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { //获得ServletContext对象 ServletContext context = req.getServletContext(); //判断点击量是否为空,否则添加点击量 if (context.getAttribute("num")==null){ context.setAttribute("num",1); System.out.println(context.getAttribute("num")); }else { //每次响应,调用service,实现点击量自增 Integer a=Integer.valueOf(String.valueOf(context.getAttribute("num"))); a=a+1; context.setAttribute("num",a); System.out.println(a); } }