1.Servlet入门与介绍

来源:互联网 发布:mac xshell替代工具 编辑:程序博客网 时间:2024/06/05 21:37

Servlet:server applet 

        定义: Servlet是运行在服务器端的小程序,定义浏览器能被服务器访问的一个规范,其实是一个接口。

        功能:接受请求

                   处理请求

                   响应请求

       快速入门:
  1.在MyEclipse下创建web project项目
  2.定义一个Java类,实现Servlet接口
  3.重写所有未实现方法
  4.配置Servlet,在web.xml
     <!-- 配置Servlet,为了配置Servlet的访问路径 -->
     <servlet>
    <servlet-name>demo1</servlet-name>  //取别名
    <servlet-class>cn.itcast.servlet.ServletDemo1</servlet-class>  //我们定义的子类的全类名
     </servlet>
 
     <servlet-mapping>
    <servlet-name>demo1</servlet-name>
    <!-- 设置访问路径,以/开头  -->
    <url-pattern>/demo</url-pattern>   //虚拟路径
     </servlet-mapping>
  4.发布项目  (按住服务器右键,添加项目,点运行)
  5.访问该子类的网址
  浏览器中:http://127.0.0.1:8080/项目名/web.xml中配置的虚拟路径名

                  (服务器ip:所连接服务器端口号)

    当此端口号与其他进程发生冲突时候,可以手动配置,在服务器文件,conf文件夹下server.xml

      原理:

   服务器通过反射的方式 创建Servlet对象,调用其方法

  * servlet生命周期:
  * 被创建:默认情况下,Servlet第一次被访问时,被创建,调用init()方法。
      只执行一次。Servlet是单例的。可能会存在线程安全问题,尽量不要定义成员变量。
      可以配置Servlet的创建时机。在web.xml的<servlet>标签中配置<load-on-startup>
      <!-- 修改servlet的创建时机:
       * 负整数:默认值 -1,在第一次被访问时创建
       * 非负整数:在服务器启动时创建
        * 数字越小,优先级越高
      -->
      <load-on-startup>0</load-on-startup>
  
  * 提供服务:每一次被访问时,会调用service()方法提供服务
  
  * 被销毁:服务器关闭时,servlet被销毁。
      服务器正常关闭是,在销毁Servlet之前,会调用destory()方法

     Servlet需要实现的五大抽象方法

    1、public void init(ServletConfig config)

    @Override
 public void init(ServletConfig config) throws ServletException { 

//初始化只调用一次,分为启动即初始化和请求页面后初始化
  // 在这个方法里,一般做一些初始化的事情
  // 我可以获取一些配置参数
  // http://localhost:8090/MyServletDemo/demo1
  // ServletConfig 配置对象 是一个接口 子类对象由服务创建 当服务器调用init方法时作为参数传递给你
  // 获取在web.xml中配置的初始化参数
  

//  可以获取一些配置参数
  this.config = config;
  // ServletConfig 配置对象 是一个接口 子类对象由服务创建 当服务器调用init方法时作为参数传递给你
  // 获取在web.xml中配置的初始化参数
  // 方式1
  String name = config.getInitParameter("username");
  System.out.println(name);
  String age = config.getInitParameter("age");
  System.out.println(age);
  System.out.println(config.getClass());

  // 方式二
  Enumeration<String> names = config.getInitParameterNames();
  System.out.println("-------------------");
  while (names.hasMoreElements()) {
   String key = names.nextElement();
   String value = config.getInitParameter(key);
   System.out.println(key + "==" + value);
  }

  // 其实我们初始化的事情,应该放在服务开启的时候就去初始化
  // 那如何在服务器一开启就初始化呢 我们在web.xml中可以去配置
  // <load-on-startup>0</load-on-startup>
  // 默认值是-1 是你在第一次请求时才去调用init()方法
  // 如果是非负整数 服务器开启时就会调用 init()方法
  // 通过全局域对象 来存储数据
  ServletContext context = config.getServletContext();
     context.setAttribute("num", "10");


  System.out.println("我是初始化函数");//这是响应到服务器端的,非浏览器端
 }

ServletConfig对象:配置对象 

  ServletConfig是一个接口 在Servlet初始化的时候 有服务器创建其子类对象传递给 init()方法

功能
   1.获取servlet初始化参数

   2.获取ServletContext对象   //全局域对象,在整个工程范围内都可以使用

  

  因为 ServletContext对象是由服务器创建出来的 我们要获取其对象 得通过ServletConfig对象中的方法才能获取出来
    * ServletContext getServletContext()  
  3.获取servlet配置的名称 就是在web.xml中给servlet起的名字
    * String getServletName() 
  * Servlet中对应getServletConfig方法。要想使用该方法获取config对象。

 context.getAttribute("num"); //设置全局域变量

context.setAttribute("num", "10");//获取

 context.removeAttribute("num");//移除


   则需要提升config对象的作用域。
    1.声明成员变量ServletConfig
    2.在init方法中赋值
    3.在getServletConfig方法中获取

如何配置初始化参数:

<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>org.west.demo.MyServletDemo</servlet-class>
  <init-param>
   <param-name>username</param-name>
   <param-value>zhangsan</param-value>
  </init-param>
 
  <init-param>
   <param-name>age</param-name>
   <param-value>20</param-value>
  </init-param>
 
  <load-on-startup>-1</load-on-startup>//
  </servlet>

    <servlet-mapping>
   <servlet-name>MyServlet</servlet-name>
   <url-pattern>/demo</url-pattern>
  </servlet-mapping>

2.通过本类this.getServletConfig()获取ServletConfig

   @Override
 public ServletConfig getServletConfig() {
  // TODO Auto-generated method stub
  return config;
 }

3. 对外提供服务的方法 ,每次请求都会调用
 @Override
 public void service(ServletRequest req, ServletResponse res)
   throws ServletException, IOException {
  
  System.out.println("服务来了");
   String ip = req.getRemoteAddr();//获取访问者ip

   String ip1 = request.getLocalAddr();//获取服务器端ip
   String method = request.getMethod();//获取请求的方法get/post
   System.out.println("来自于" + ip + "地址的访问本机ip地址" + ip1);
   if("192.168.1.1".equals(ip)){
//    System.out.println("主机访问来了");
    res.getWriter().write("<font size='18' color='red'>localhost visit</font>");
   }else {
//   System.out.println("非主机访问");
    PrintWriter writer = res.getWriter();
    res.getWriter().write("<font size='18' color='red'>Other visit</font>");
  }
 }

4.获取版本信息, 一般不关心

@Override
 public String getServletInfo() {
  // TODO Auto-generated method stub
  return null;
 }

5.服务器关闭时,会调用此类,代表Servlet子类的销毁

@Override
 public void destroy() {
  // TODO Auto-generated method stub
  
 }