package cn.itcast.servletlife.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 第一访问我们的servlet:
* 方法调用顺序:
* LifeServlet 构造方法!
LifeServlet init!
LifeServlet service!
第二访问我们的servlet:
直接调用我们service方法!
*/
/**
* Servlet只有一个实例(单例),多线程访问
*
* 生命周期方法: 从他创建(生)到 销毁(死)过程中所调用的方法都叫生命周期方法!
*/
public class LifeServlet implements Servlet {
private ServletConfig config;
/**
* Servlet 构造方法,该实例在用户第一次访问时候创建,只会创建一次
* 如果servlet配置中存在<load-on-startup>2</load-on-startup>,他会在tomcat启动中,就自动把该Servlet实例化!
*/
public LifeServlet(){
System.out.println("LifeServlet 构造方法!");
}
/**
* Servlet init初始化方法,该方法在创建对象后调用"一次"
* init方法:初始化一些对象,加入一些配置信息,如果比较耗时,第一个用户访问等待时候会很长。
* 如果servlet配置中存在<load-on-startup>2</load-on-startup>,他会在tomcat启动中,就自动把该Servlet实例化掉!
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("LifeServlet init!");
//System.out.println("config = "+config);
this.config = config;
System.out.println("--ServletConfig配置信息对象--");
//servlet配置信息对象
ServletConfig servletConfig = this.getServletConfig();
String servletName = servletConfig.getServletName();
//获取web.xml中<servlet>标签中<servlet-name></servlet-name>值
System.out.println("servletName = "+servletName);
//获取web.xml中<servlet>标签中<init-param>属性的值
String locale = servletConfig.getInitParameter("locale");
System.out.println("locale = "+locale);
System.out.println("--getInitParameterNames--");
//获取web.xml中<servlet>标签中所有<init-param>标签
java.util.Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
System.out.println(name+" = "+servletConfig.getInitParameter(name));
}
}
/**
* Servlet service请求处理方法,该方法可能调用多次(多次请求),也有可能一次都不调用(没有请求)!
* ServletRequest 本次请求,对该请求的一个描述对象,该对象包含,请求参数,请求头,等等。。。。
* ServletResponse 本次请求响应对象,该对象可以用来向我们浏览器反馈响应信息,响应头,响应内容(html)
*/
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
//获取web.xml中<servlet>标签中<init-param>属性的值
String locale = this.getServletConfig().getInitParameter("locale");
/*
* res.setCharacterEncoding("GBK");
设置响应内容格式,和内容编码,
——————注意这个两句必须在res.getWriter();之前才有作用
*/
res.setContentType("text/html;charset="+getServletConfig().getInitParameter("encoding"));
PrintWriter out = res.getWriter();
if("en".equals(locale)){
out.println("<h1>hello servlet</h1>");
}else{
out.println("<h1>你好 servlet</h1>");
}
out.flush();
}
/**
* Servlet destroy销毁方法,该方法在tomcat正常关闭的时候调用一次.
*/
@Override
public void destroy() {
System.out.println("LifeServlet destroy!");
}
/**
* ServletConfig 类,用于描述我们在web.xml配置文件中<servlet>标签相关的信息
* getServletConfig()方法在init方法后执行,返回传入的config信息.
*/
@Override
public ServletConfig getServletConfig() {
return this.config;
}
/**
* 返回字符串一般包含作者,版本,版权
*/
@Override
public String getServletInfo() {
return "itcast 1.0 itcast";
}
}
web.xml配置信息:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>cn.itcast.servletlife.servlet.LifeServlet</servlet-class>
<!--
配置servlet初始化参数
在servelt中我们可以通过 ServletConfig对中getInitParameter()
-->
<init-param>
<!-- 参数的key -->
<param-name>locale</param-name>
<!-- 参数的value-->
<param-value>zh_ch</param-value>
</init-param>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 大于或等于0 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/LifeServlet</url-pattern>
</servlet-mapping>
</web-app>