Servlet基础知识点练习、域对象ServletContext练习、
一、练习Servlet和配置文件web.xml
代码
package cn.itcast.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 实现Servlet接口,重写5个方法 * 在web.xml进行配置 * @author Administrator * */ public class ServletDemo1 implements Servlet{ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.getWriter().write("hello demo1..."); } public void init(ServletConfig config) throws ServletException { } public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } public void destroy() { } }
package cn.itcast.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 生命周期 * @author Administrator * */ public class ServletDemo2 implements Servlet { /** * Servlet实例被创建后,调用init方法进行初始化 * Servlet什么时候被创建呢? * * 不是服务器一启动时,实例被创建,第一次访问的时候,实例才被创建。 * init方法调用几次呢? * * 只被调用一次。 */ public void init(ServletConfig config) throws ServletException { System.out.println("init..."); } /** * service调用几次呢? * * 有一次请求,调用一次service方法 */ public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("service..."); } /** * Servlet实例什么时候被销毁呢? * * 服务器关闭,手动移除。 * destroy调用几次呢? * * 一次 */ public void destroy() { System.out.println("destroy..."); } public ServletConfig getServletConfig() { return null; } public String getServletInfo() { return null; } }
package cn.itcast.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 配置servlet启动时加载 * @author Administrator * */ public class ServletDemo5 extends HttpServlet { /** * 默认的情况下第一次访问的时候init被调用。 * */ public void init() throws ServletException { System.out.println("init..."); // 初始化数据库的链接 } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 写的内容 // 获取表单输入的内容 // 自己逻辑,通过名称查询数据库,把张三的姓名查到了 // 把张三返回浏览器, //向控制台输出结果 System.out.println("doGet..."); // 向页面输出内容 response.getWriter().write("hello demo5..."); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
package cn.itcast.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * ServletConfig对象 * @author Administrator * */ public class ServletDemo6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 测试ServletConfig对象的api // 先获取ServletConfig对象 ServletConfig config = getServletConfig(); // 获取配置文件中serlvet的名称 System.out.println("servlet的名称:"+config.getServletName()); // 获取初始化的参数 String username = config.getInitParameter("username"); String password = config.getInitParameter("password"); System.out.println(username+" : "+password); // 获取初始化参数的名称们 Enumeration<String> e = config.getInitParameterNames(); while(e.hasMoreElements()){ String name = e.nextElement(); String value = config.getInitParameter(name); System.out.println(name+" : "+value); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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"> <!-- 配置全局初始化参数 --> <context-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </context-param> <!-- 先配置Servlet信息 --> <servlet> <!-- 配置Servlet名称,名称必须唯一 --> <servlet-name>ServletDemo1</servlet-name> <!-- 配置Servlet的完全路径(包名+类名) --> <servlet-class>cn.itcast.servlet.ServletDemo1</servlet-class> </servlet> <!-- 配置Servlet映射(访问路径) --> <servlet-mapping> <!-- 配置Servlet名称,和上面的名称必须相同 --> <servlet-name>ServletDemo1</servlet-name> <!-- 配置虚拟路径(访问路径) --> <url-pattern>/demo1</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletDemo2</servlet-name> <servlet-class>cn.itcast.servlet.ServletDemo2</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo2</servlet-name> <url-pattern>/demo2</url-pattern> </servlet-mapping> <!-- 使用模板生成的 --> <servlet> <servlet-name>ServletDemo5</servlet-name> <servlet-class>cn.itcast.servlet.ServletDemo5</servlet-class> <!-- 设置优先级 --> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ServletDemo5</servlet-name> <url-pattern>/demo5</url-pattern> </servlet-mapping> <!-- 演示初始化参数 --> <servlet> <servlet-name>ServletDemo6</servlet-name> <servlet-class>cn.itcast.servlet.ServletDemo6</servlet-class> <!-- 配置初始化参数 --> <init-param> <param-name>username</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> </servlet> </web-app>
二、域对象ServletContext
定义:WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
一个WEB应用对应一个ServletContext对象
一个WEB应用下有多个Servlet程序
一个web应用所有的servlet程序都共享同一个ServletContext对象
作用:* 用来存储,起媒介的作用。ServletContext相当于一个媒介,demo1向其中存入数据,demo2可以冲其中取出数据
* 获取WEB应用全局初始化参数
* 在web.xml中配置,不能放在servlet之中
<context-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</context-param>
String getInitParameter(String name)
getInitParameterNames()
* 实现数据的共享(*****)
void setAttribute(String name, Object object) 存入数据
void removeAttribute(String name) 删除数据
Object getAttribute(String name) 获取数据
* 读取资源文件(*****)
InputStream getResourceAsStream(String path) 通过文件的地址获取输入流
String getRealPath(String path) 通过文件的地址获取文件的绝对磁盘路径
代码
package cn.itcast.context; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 获取全局初始化参数 * @author Administrator * */ public class ContextDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先获取ServletContext对象 ServletContext context = getServletContext(); // 获取初始化参数 String encoding = context.getInitParameter("encoding"); System.out.println("编码:"+encoding); //获取所有的参数名 Enumeration<String> e = context.getInitParameterNames(); while(e.hasMoreElements()){ String name = e.nextElement(); // 通过name获取值 String value = context.getInitParameter(name); System.out.println(name+" : "+value); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package cn.itcast.context; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 统计网站的访问次数 * @author Administrator * */ public class CountServlet extends HttpServlet { /** * 实例被创建,调用init方法进行初始化 * 在域对象存入一个变量,赋值为0 */ public void init() throws ServletException { // 获取ServletContext对象 getServletContext().setAttribute("count", 0); } /** * 每一次访问,都会执行该方法。 * 拿出count的变量,值自增,存入到域对象中 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先获取ServletContext对象 ServletContext context = getServletContext(); // 获取count的值,自增 Integer count = (Integer) context.getAttribute("count"); // 存入到域对象中 context.setAttribute("count", ++count); // 向页面输出内容 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<h3>大爷,欢迎再来哦!!</h3>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package cn.itcast.context; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 读取资源文件 * @author Administrator * */ public class ReadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { read5(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } /** * 通过ServletContext对象获取文件的绝对磁盘路径 * 获取src目录下文件 * @throws IOException */ public void read5() throws IOException{ // 获取对象 String path = getServletContext().getRealPath("/WEB-INF/classes/db.properties"); // System.out.println(path); // C:\apache-tomcat-6.0.14\webapps\day09\WEB-INF\classes\db.properties // 获取输入流 InputStream in = new FileInputStream(path); print(in); } /** * 获取WebRoot目录目录下db.properties文件 * @throws IOException */ public void read4() throws IOException{ // ServletContext读取文件 InputStream in = getServletContext().getResourceAsStream("/db.properties"); // 打印方式 print(in); } /** * 获取包目录下db.properties文件 * @throws IOException */ public void read3() throws IOException{ // ServletContext读取文件 InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/cn/itcast/context/db.properties"); // 打印方式 print(in); } /** * 获取src目录下db.properties文件 * @throws IOException 编译后,src文件不见了,全都放在class文件里 */ public void read2() throws IOException{ // ServletContext读取文件 InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); // 打印方式 print(in); } /** * 传统方式读取资源文件 * 交给服务器处理,相对的位置tomcat/bin * @throws IOException */ public void read1() throws IOException{ // 获取输入流 InputStream in = new FileInputStream("src/db.properties"); print(in); } /** * 在控制台打印内容 * @param in * @throws IOException */ public void print(InputStream in) throws IOException{ Properties pro = new Properties(); // 加载 pro.load(in); // 获取文件中的内容 String username = pro.getProperty("username"); String password = pro.getProperty("password"); String desc = pro.getProperty("desc"); System.out.println("用户名:"+username); System.out.println("密码:"+password); System.out.println("描述:"+desc); } }
package cn.itcast.context; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 显示网站的访问次数 * @author Administrator * */ public class ShowServlet extends HttpServlet { /** * 获取网站的访问次数,输出到客户端 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Integer count = (Integer) getServletContext().getAttribute("count"); // 向页面输出 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<h3>该网站一共被访问了"+count+"次</h3>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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"> <!-- 配置全局初始化参数 --> <context-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </context-param> <servlet> <servlet-name>ContextDemo1</servlet-name> <servlet-class>cn.itcast.context.ContextDemo1</servlet-class> </servlet> <servlet> <servlet-name>CountServlet</servlet-name> <servlet-class>cn.itcast.context.CountServlet</servlet-class> </servlet> <servlet> <servlet-name>ShowServlet</servlet-name> <servlet-class>cn.itcast.context.ShowServlet</servlet-class> </servlet> <servlet> <servlet-name>ReadServlet</servlet-name> <servlet-class>cn.itcast.context.ReadServlet</servlet-class> </servlet> <servlet> <servlet-name>ServletDmo1</servlet-name> <servlet-class>cn.itcast.http.ServletDmo1</servlet-class> </servlet> <servlet> <servlet-name>RefreshServlet</servlet-name> <servlet-class>cn.itcast.http.RefreshServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ContextDemo1</servlet-name> <url-pattern>/context1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CountServlet</servlet-name> <url-pattern>/count</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ShowServlet</servlet-name> <url-pattern>/show</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ReadServlet</servlet-name> <url-pattern>/read</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDmo1</servlet-name> <url-pattern>/servlet1</url-pattern> </servlet-mapping> </web-app>
记录网站访问次数
CountServlet进行网站访问,ShowServlet显示网站访问次数
package cn.itcast.context; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 统计网站的访问次数 * @author Administrator * */ public class CountServlet extends HttpServlet { /** * 实例被创建,调用init方法进行初始化 * 在域对象存入一个变量,赋值为0 */ public void init() throws ServletException { // 获取ServletContext对象 getServletContext().setAttribute("count", 0); } /** * 每一次访问,都会执行该方法。 * 拿出count的变量,值自增,存入到域对象中 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先获取ServletContext对象 ServletContext context = getServletContext(); // 获取count的值,自增 Integer count = (Integer) context.getAttribute("count"); // 存入到域对象中 context.setAttribute("count", ++count); // 向页面输出内容 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<h3>大爷,欢迎再来哦!!</h3>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package cn.itcast.context; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 显示网站的访问次数 * @author Administrator * */ public class ShowServlet extends HttpServlet { /** * 获取网站的访问次数,输出到客户端 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Integer count = (Integer) getServletContext().getAttribute("count"); // 向页面输出 response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("<h3>该网站一共被访问了"+count+"次</h3>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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"> <servlet> <servlet-name>CountServlet</servlet-name> <servlet-class>cn.itcast.context.CountServlet</servlet-class> </servlet> <servlet> <servlet-name>ShowServlet</servlet-name> <servlet-class>cn.itcast.context.ShowServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CountServlet</servlet-name> <url-pattern>/count</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ShowServlet</servlet-name> <url-pattern>/show</url-pattern> </servlet-mapping> </web-app>