package com.datou.javaweb;
import com.sun.xml.internal.xsom.impl.scd.Iterators;
import javax.servlet.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
/*
* Servlet 的生命周期
* Tomcat是一个Servlet容器,管理整个Servlet生命周期,自己创建Servlet实例并且调用Servlet的相关生命周期方法
* Servlet容器是运行 Servlet ,Jsp,Filter等软件环境
*Servlet生命周期相关方法:
* 构造器:第一次请求servlet时,创建servlet实例调用构造器只被调用一次,说明servlet是单列模式
* init: 只被调用一次,在创建好实例时候被调用,用于初始化当前servlet,他有对应参数是构造器不及的所以有init方法
* service: 被多次调用,每次请求都会调用service方法,实际用于响应请求
* destroy: 只被调用一次,在当前所在的web应用被卸载时候调用,相当于释放当前Servlet所占资源
*
* */
public class FirstWeb implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("servlet init");
//获取在web.xml中配置的init-param参数通过param-name来获取指定的参数
String user = servletConfig.getInitParameter("user");
System.out.println(user);
//获取所有的参数名,然后通过遍历得到对应一个一个的值
Enumeration<String> names = servletConfig.getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String v = servletConfig.getInitParameter(name);
System.out.println("name" + name + "vulue" + v);
}
//获取web.xml中servlet-name的值
String servletName = servletConfig.getServletName();
System.out.println(servletName);
//ServletContext
//1. 可以由ServletConfig获取
//2.该对象代表当前的web应用,可以认为 ServletContext是当前web应用的一个大管家,
// 可以从中获取到web应用各个方面的信息
//获取ServletContext对象
ServletContext context = servletConfig.getServletContext();
//获取web.xml web应用的context-param的param-name对应参数的值
String a = context.getInitParameter("address");
System.out.println(a);
//获取web.xml中所以web应用的参数名然后逐个获取对应的值
Enumeration<String> b = context.getInitParameterNames();
while (b.hasMoreElements()) {
String c = b.nextElement();
System.out.println("name" + c + "v" + context.getInitParameter(c));
}
//获取web应用某个文件在web服务器上的绝对路径,而不是部署前的路径
String repath = context.getRealPath("/37.jpg");
System.out.println(repath);
//获取当前web应用的名称
String contentName = context.getContextPath();
System.out.println(contentName);
//获取当前web应用某一个文件对应的输入流
InputStream s = context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.out.println(s);
}
@Override
public ServletConfig getServletConfig() {
System.out.println("servlet config");
return null;
}
//这两个 ServletRequest,ServletResponse由Tomcat服务器帮助实现
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//servletRequest 封装了请求信息,可以从中获取任何的请求信息
//servletResponse 封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现
//根据请求参数的名字返回值 名字对应表单name属性
String a = servletRequest.getParameter("user");
String b = servletRequest.getParameter("pwd");
//根据请求参数名字返回 请求参数对应的字符串数组 ,之所以是数组在多选时候是数组列如表单的CheckBox
String[] c = servletRequest.getParameterValues("user");
for (String k : c) {
System.out.println(k);
}
System.out.println("servlet service");
//返回form表单对应的所有name值类似于ServletConfig中的getInitParameterNames一样
Enumeration<Stringt> s = servletRequest.getParameterNames();
//返回表单对应的key 和 value
Map<String, String[]> m = servletRequest.getParameterMap();
for (Map.Entry<String, String[]> entry : m.entrySet()) {
System.out.println(entry.getKey() + ":" + Arrays.asList(entry.getValue()));
}
}
@Override
public String getServletInfo() {
System.out.println("servlet getservleinfo");
return null;
}
@Override
public void destroy() {
System.out.println("servlet destory");
}
public FirstWeb() {
System.out.println("构造器");
}
}
<?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">
<!--配置初始页面 可以配置多个<welcome-file> 他会依次寻找-web根目录下的页面-->
<welcome-file-list>
<welcome-file>login.html</welcome-file>
<!--<welcome-file></welcome-file>-->
</welcome-file-list>
<!--配置当前web应用的初始化参数 多个参数配置多个context-param-->
<!--context-param和init-param区别-->
<!--context-param初始化参数可以给所有的servlet用,而init-param只有当前servlet可以获取-->
<context-param>
<!--参数名-->
<param-name>address</param-name>
<!--参数值-->
<param-value>上海市宝山区</param-value>
</context-param>
<context-param>
<param-name>as</param-name>
<param-value>aaaaa</param-value>
</context-param>
<!--配置映射Servlet -->
<servlet>
<!--Servlet注册名-->
<servlet-name>firstWeb</servlet-name>
<!--Servlet全类名,也就是对应位置-->
<servlet-class>com.datou.javaweb.FirstWeb</servlet-class>
<!--配置Servlet初始化参数 该节点必须要放在load-on-startup节点的前面 配置多个参数需要配置多个init-param-->
<init-param>
<!--参数名-->
<param-name>age</param-name>
<!--参数值-->
<param-value>18</param-value>
</init-param>
<init-param>
<param-name>user</param-name>
<param-value>admin</param-value>
</init-param>
<!--可以指定Servlet 被创建的时机 若为负数则在第一次请求时被创建,若为0或正数则在当前web应用被servlet容器加载时创建
且数字越小越早被创建-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--通过对Servlet名映射对应url,同一个servlet名称可以被映射到多个servlet-mapping上及servlet-name可以相同
在使用servlet映射到url中可以使用*通配符,但是只能有两种固定格式。一种格式是"*.扩展名",带扩展名不能加斜杠/,另一种格式是以正斜杠"/"开头并以"/*"结尾
也就是带*的有两种写法,也就是
<url-pattern>/*</url-pattern>
<url-pattern>*.do</url-pattern>
以下不合法 既带/又带扩展名的不合法
<url-pattern>/*.action</url-pattern>
-->
<servlet-mapping>
<!--需要和某一个servlet节点的子节点servlet-name节点的文本一致-->
<servlet-name>firstWeb</servlet-name>
<!--映射具体的访问虚拟路径其中/代表当前web应用的根目录 -->
<url-pattern>/first</url-pattern>
</servlet-mapping>
</web-app>
<!--jsp的本质就是一个jsp servlet-->