J2EE进阶之servlet 九

本文详细介绍了Servlet的基本概念,包括Servlet的定义、生命周期、配置方法及其实现步骤。通过示例展示了如何编写Servlet程序,并探讨了ServletConfig和ServletContext的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet

Servlet

    * 做javaweb动态        Servlet/JSP     
    * Servlet简介
        * 小的java的程序,运行在服务器端,接收和响应从客户端(浏览器)发送过来的请求。

        * 编写Servlet程序(记事本和DOS下)
            * 编写一个类实现Servlet接口,实现5个方法
                * 继承GenericServlet类,重写一个方法。重写service方法

            * 配置文件(在哪配置)
                <servlet>
                    <servlet-name>HelloServlet</servlet-name>
                    <servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>
                </servlet>
                <servlet-mapping>
                    <servlet-name>HelloServlet</servlet-name>
                    <url-pattern>/hello</url-pattern>
                </servlet-mapping>

        * 带包编译
            * javac -d . HelloServlet.java

            * 设置临时环境变量(当成窗口有用)
                * set classpath=%classpath%;xxx.jar 

        * 启动服务器,访问
            * http://localhost:80/website/hello

Servlet的生命周期

        * 生命周期:Servlet被创建,服务,销毁的过程。
            * Servlet实例被创建后,调用init方法进行初始化
                init(ServletConfig);
            * service方法处理从客户端发送过来的请求
                service(request,response);
            * 销毁时调用destroy方法
                destroy();


        * 总结:只有第一次访问的时候,服务器创建Servlet的实例,调用init方法进行初始化操作。服务器创建两个对象,request和response,调用
                的service进行处理,有一次请求,service就执行一次。服务器关闭或者移除项目,servlet实例就销毁,调用destroy方法进行销毁。

案例代码:

  1 package itwsj;
  2 import java.io.IOException;
  3 
  4 import javax.servlet.Servlet;
  5 import javax.servlet.ServletConfig;
  6 import javax.servlet.ServletException;
  7 import javax.servlet.ServletRequest;
  8 import javax.servlet.ServletResponse;
  9 
 10 /**
 11  * Servelt 
 12  * @author Angus
 13  *
 14  */
 15 public class ServletDemo implements Servlet{
 16     /**
 17      * Servlet被创建后,调用init方法进行初始化?
 18      *  * 什么时候被创建呢?
 19      *      * 第一次访问的时候创建的Servlet实例(服务器创建的)
 20      *  * init方法执行了几次呢?
 21      *      * 调用一次
 22      */
 23     @Override
 24     public void init(ServletConfig config) throws ServletException {
 25         // TODO Auto-generated method stub
 26         System.out.println("init...");
 27     }
 28     /**
 29      * service被调用了几次?
 30      *  * 有多少次请求,service执行几次
 31      */
 32     @Override
 33     public void service(ServletRequest req, ServletResponse res)
 34             throws ServletException, IOException {
 35         // TODO Auto-generated method stub
 36         System.out.println("service...");
 37     }
 38     @Override
 39     public ServletConfig getServletConfig() {
 40         // TODO Auto-generated method stub
 41         return null;
 42     }
 43 
 44 
 45 
 46     @Override
 47     public String getServletInfo() {
 48         // TODO Auto-generated method stub
 49         return null;
 50     }
 51     /**
 52      * Servlet什么时候被销毁?
 53      *  * 服务器关闭,把应用移除
 54      * destroy调用了几次?
 55      *  * 一次
 56      */
 57     @Override
 58     public void destroy() {
 59         // TODO Auto-generated method stub
 60         System.out.println("destroy...");
 61     }
 62     
 63     
 64 
 65 
 66 
 67 
 68 }

运行截图:

第一次运行:

第二次运行:

第三次结束运行:

关系

        Servlet 接口
            |
        GenericServlet(和协议无关)
            |
        HttpServlet (和HTTP协议相关)
            |
        HelloServlet    


        * 编写一个类,直接继承HttpServlet。
        * 重写init,重写init()就ok。
            * 初始化
        * 重写doGet()或者doPost()

        * 在web.xml中进行配置。


    * 开发一个Servlet(最简单步骤)
        * 编写一个类继承HttpServlet
        * 重写两个doGet()和doPost(),互相调用。
        * 在web.xml中编写配置文件



        * 调用doGet方法,写自己的业务逻辑。
            * 返回浏览器。

        * 调用doPost方法,写自己的业务逻辑。
            * 返回浏览器。

demo:

  1 package cn.itcast.servlet;
  2 
  3 import java.io.IOException;
  4 
  5 import javax.servlet.ServletException;
  6 import javax.servlet.http.HttpServlet;
  7 import javax.servlet.http.HttpServletRequest;
  8 import javax.servlet.http.HttpServletResponse;
  9 
 10 public class ServletDemo5 extends HttpServlet {
 11     
 12     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
 13             throws ServletException, IOException {
 14         // xxx
 15     }
 16 
 17     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
 18             throws ServletException, IOException {
 19         doGet(req,resp);
 20     }
 21     
 22 }

修改模板

        * 安装MyEclipse路径,找到com.genuitec.eclipse.wizards.xxx.jar

        * myeclipse10.7\Common\plugins\com.genuitec.eclipse.wizards_9.0.0.me201211011550.jar

        * (千万别解压) -- 右键 -- 用解压工具打开 -- templates -- 修改模板

        * 前提条件:先关闭MyEclipse。启动。

第一次访问(自动加载)

        * init()
            * 
        * 通过配置,配置启动加载,服务器一启动加载Servlet实例
            * 在web.xml中,在<servlet>标签下
                <load-on-startup>正整数</load-on-startup>
                * 中间值越小,优先级越高。

访问路径的配置

        <url-pattren>/demo</url-pattren>    
            * 访问:localhost/day07/demo   

        * 完全路径匹配
            * 以/开头的,    /demo       
                * 例子:<url-pattren>/servlet/demo</url-pattren>   
                * 访问:localhost/day07/servlet/demo

        * 目录匹配
            * 以/开头的     /*      

        * 扩展名匹配
            * 不能以/开头        *.action    *.do    
            * /servlet/*.do     启动服务器报错。


        * 优先级:完全路径匹配    > 目录匹配 > 扩展名匹配(*****)

在web开发常见的路径的问题

        * 相对路径
            * 一个文件相对于另一个文件的位置的关系。
                ../demo     ./demo  demo
            * 不能以/开头


            * 例子:   访问demo8的Servlet:http://localhost/day07/demo8
                        访问demo1.html        http://localhost/day07/demo1.html

                * 从demo1.html中访问demo8的servlet
                    * 访问:   ./demo8     demo8

                * 访问html目录下demo2.html   :http://localhost/day07/html/demo2.html
                访问demo8的Servlet:            http://localhost/day07/demo8

                    * 访问:   ../demo8

    * 绝对路径(推荐使用)
        * 访问:   http://localhost:80/day07/demo8
        * 简写:   /day07/demo8
        * 以/开头的


        * 客户端的绝对路径(编写项目名称)
            * /day07/demo8  

        * 服务器的绝对路径(没有项目名称)
            * /demo8

ServletConfig(跟配置文件相关)

        * String getServletName()                   获取配置文件中servlet的名称
        * String getInitParameter(String name)      获取初始化参数
        * Enumeration getInitParameterNames()       获取初始化的名称


        * ServletContext getServletContext()  

测试demo

  1 package cn.itcast.demo;
  2 
  3 import java.io.IOException;
  4 import java.util.Enumeration;
  5 
  6 import javax.servlet.ServletConfig;
  7 import javax.servlet.ServletException;
  8 import javax.servlet.http.HttpServlet;
  9 import javax.servlet.http.HttpServletRequest;
 10 import javax.servlet.http.HttpServletResponse;
 11 
 12 
 13 
 14 /**
 15  *  操作ServletConfig对象
 16  * @author Angus
 17  *
 18  */
 19 public class ConfigServlet1 extends HttpServlet {
 20 
 21     public void doGet(HttpServletRequest request, HttpServletResponse response)
 22             throws ServletException, IOException {
 23         
 24         // 获取ServletConfig对象
 25         ServletConfig config = this.getServletConfig();
 26         // 获取servlet的名称
 27         String name = config.getServletName();
 28         System.out.println("servlet的名称:"+name);
 29         
 30         String username = config.getInitParameter("username");      
 31         String password = config.getInitParameter("password");
 32         System.out.println("用户名:"+username);
 33         System.out.println("密码:"+password);
 34         
 35         // 
 36         Enumeration<String> e = config.getInitParameterNames();
 37         while(e.hasMoreElements()){
 38             String name1 = e.nextElement();
 39             String value = config.getInitParameter(name1);
 40             System.out.println(name1+" : "+value);
 41         }
 42         
 43     }
 44 
 45     public void doPost(HttpServletRequest request, HttpServletResponse response)
 46             throws ServletException, IOException {
 47         doGet(request, response);
 48     }
 49 
 50 }

运行结果就是配置文件的内容:

结果:

ServletContext域对象

        * 获取全局初始化参数(配置)
            * String getInitParameter(String name)      获取全局初始化参数
            * Enumeration getInitParameterNames()       获取全局初始化参数的名称

        * 实现数据的共享
            * void setAttribute(String name, Object object)     设置属性
            * Object getAttribute(String name)                  获取
            * void removeAttribute(String name)                 删除

        * 读取资源文件
            * InputStream getResourceAsStream(String path)      通过文件的地址获取输入流
            * String getRealPath(String path)                   通过文件的地址获取文件的绝对磁盘路径  

初始化参数demo

  1 package cn.itcast.demo;
  2 
  3 import java.io.IOException;
  4 
  5 import javax.servlet.ServletContext;
  6 import javax.servlet.ServletException;
  7 import javax.servlet.http.HttpServlet;
  8 import javax.servlet.http.HttpServletRequest;
  9 import javax.servlet.http.HttpServletResponse;
 10 
 11 /**
 12  * 操作servletContext对象
 13  * @author Angus
 14  *
 15  */
 16 public class ContextDemo1 extends HttpServlet {
 17 
 18     public void doGet(HttpServletRequest request, HttpServletResponse response)
 19             throws ServletException, IOException {
 20         
 21         // 获取servletContext对象
 22         ServletContext context = this.getServletContext();
 23         String encoding = context.getInitParameter("encoding");
 24         System.out.println("编码:"+encoding);
 25         
 26     }
 27 
 28     public void doPost(HttpServletRequest request, HttpServletResponse response)
 29             throws ServletException, IOException {
 30         doGet(request, response);
 31     }
 32 
 33 }

配置文件:

  1   <!-- 配置全局初始化参数 -->
  2   <context-param>
  3     <param-name>encoding</param-name>
  4     <param-value>UTF-8</param-value>
  5   </context-param>

共享demo:

  1 package cn.itcast.demo;
  2 
  3 import java.io.IOException;
  4 
  5 import javax.servlet.ServletContext;
  6 import javax.servlet.ServletException;
  7 import javax.servlet.http.HttpServlet;
  8 import javax.servlet.http.HttpServletRequest;
  9 import javax.servlet.http.HttpServletResponse;
 10 
 11 /**
 12  * 记录网站访问的次数
 13  * @author Angus
 14  *
 15  */
 16 public class ContextDemo2 extends HttpServlet {
 17     
 18 
 19     public void init() throws ServletException {
 20         this.getServletContext().setAttribute("count", 0);
 21     }
 22 
 23     public void doGet(HttpServletRequest request, HttpServletResponse response)
 24             throws ServletException, IOException {
 25         ServletContext context = this.getServletContext();
 26         Integer count = (Integer) context.getAttribute("count");
 27         context.setAttribute("count", ++count);
 28         
 29         response.setContentType("text/html;charset=UTF-8");
 30         response.getWriter().write("<h1>大爷,下次再来哦!!</h1>"+"亲,网站被访问了"+count+"次");
 31         
 32         
 33         
 34     }
 35 
 36     public void doPost(HttpServletRequest request, HttpServletResponse response)
 37             throws ServletException, IOException {
 38         doGet(request, response);
 39     }
 40 
 41 }

效果:

读取资源文件demo

  1 package cn.itcast.demo;
  2 
  3 import java.io.FileInputStream;
  4 import java.io.FileNotFoundException;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.util.Properties;
  8 
  9 import javax.servlet.ServletContext;
 10 import javax.servlet.ServletException;
 11 import javax.servlet.http.HttpServlet;
 12 import javax.servlet.http.HttpServletRequest;
 13 import javax.servlet.http.HttpServletResponse;
 14 
 15 /**
 16  * 读取资源的文件
 17  * @author Angus 
 18  *
 19  */
 20 public class ReadServlet extends HttpServlet {
 21 
 22     public void doGet(HttpServletRequest request, HttpServletResponse response)
 23             throws ServletException, IOException {
 24         run5();
 25     }
 26 
 27     public void doPost(HttpServletRequest request, HttpServletResponse response)
 28             throws ServletException, IOException {
 29         doGet(request, response);
 30     }
 31     
 32     
 33     /**
 34      * 通过文件的绝对磁盘路径读取资源文件
 35      * @throws IOException
 36      */
 37     public void run5() throws IOException{
 38         ServletContext context = getServletContext();
 39         String path = context.getRealPath("/WEB-INF/classes/db.properties");
 40         // C:\apache-tomcat-6.0.14\webapps\day07\WEB-INF\classes\db.properties
 41         System.out.println(path);       
 42         InputStream in = new FileInputStream(path);
 43         Properties pro = new Properties();
 44         pro.load(in);   
 45         String username = pro.getProperty("username");
 46         String password = pro.getProperty("password");
 47         String desc = pro.getProperty("desc");  
 48         System.out.println("用户名:"+username);
 49         System.out.println("密码:"+password);
 50         System.out.println("描述“:"+desc);
 51     }
 52     
 53     
 54     /**
 55      * 使用ServletContext读取WebRoot目录下的资源文件
 56      * @throws IOException
 57      */
 58     public void run4() throws IOException{
 59         ServletContext context = getServletContext();
 60         InputStream in = context.getResourceAsStream("/db.properties"); 
 61         Properties pro = new Properties();
 62         pro.load(in);   
 63         String username = pro.getProperty("username");
 64         String password = pro.getProperty("password");
 65         String desc = pro.getProperty("desc");      
 66         System.out.println("用户名:"+username);
 67         System.out.println("密码:"+password);
 68         System.out.println("描述“:"+desc);
 69     }
 70     
 71     /**
 72      * 使用ServletContext读取包下的资源文件
 73      * @throws IOException
 74      */
 75     public void run3() throws IOException{
 76         ServletContext context = getServletContext();
 77         InputStream in = context.getResourceAsStream("/WEB-INF/classes/cn/itcast/demo/db.properties");
 78         
 79         Properties pro = new Properties();
 80         pro.load(in);
 81         
 82         String username = pro.getProperty("username");
 83         String password = pro.getProperty("password");
 84         String desc = pro.getProperty("desc");
 85         
 86         System.out.println("用户名:"+username);
 87         System.out.println("密码:"+password);
 88         System.out.println("描述“:"+desc);
 89     }
 90     
 91     /**
 92      * 使用ServletContext读取src下的资源文件
 93      * @throws IOException
 94      */
 95     public void run2() throws IOException{
 96         ServletContext context = getServletContext();
 97         InputStream in = context.getResourceAsStream("/WEB-INF/classes/db.properties");
 98         
 99         Properties pro = new Properties();
100         pro.load(in);
101         
102         String username = pro.getProperty("username");
103         String password = pro.getProperty("password");
104         String desc = pro.getProperty("desc");
105         
106         System.out.println("用户名:"+username);
107         System.out.println("密码:"+password);
108         System.out.println("描述“:"+desc);
109     }
110     
111     /**
112      * 读取资源文件
113      * @throws IOException 
114      */
115     public void run1() throws IOException{
116         InputStream in = new FileInputStream("src/db.properties");
117         Properties pro = new Properties();
118         pro.load(in);
119         
120         String username = pro.getProperty("username");
121         String password = pro.getProperty("password");
122         String desc = pro.getProperty("desc");
123         
124         System.out.println("用户名:"+username);
125         System.out.println("密码:"+password);
126         System.out.println("描述“:"+desc);
127     }
128 
129 }
130 
131 
132 
133 
134 

缺省的servlet

        * tomat/conf/web.xml中配置  可以配置404等返回码一些情况

        <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>true</param-value>   true可以跟进代码目录
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值