servlet

 

一、什么Servlet?

       servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。

1.1、编写一个servlet程序:

a、写一个java类,实现servlet接口

b、修改web.xml文件,给servlet提供一个可访问的URI地址



c、部署应用到tomcat服务器

D、测试:http://locahost:8080/day08_servlet/demo1

二、执行过程

 

三、Servlet生命周期(重要)
    实例化-->初始化-->服务->销毁

出生:(实例化-->初始化)第一次访问Servlet就出生(默认情况下)

活着:(服务)应用活着,servlet就活着

死亡:(销毁)应用卸载了servlet就销毁。

servlet可以直接创建servlet格式的文件,web.xml中会自动创建servlet配置

Servlet的三种创建方式

4.1、实现javax.servlet.Servlet接口(参见:编写一个servlet程序:)

4.2、继承javax.servet.GenericServlet类(适配器模式)

4.3、继承javax.servlet.http.HttpServlet类(模板方法设计模式)

(开发中常用方式)

Servlet --> GenericServlet --> HttpServlet  (继承HttpServlet)

曾祖父     爷爷        爸爸     孙子

servlet映射细节:

servlet映射细节1:

servet映射细节2: 通配符* 代表任意字符串

url-pattern:*.do  以*.字符串的请求都可以访问 注:不要加/

url-pattern:/*  任意字符串都可以访问

url-pattern: /action/* 以/action开头的请求都可以访问

匹配规则:

优先级:从高到低

绝对匹配-->  /开头匹配 --> 扩展名方式匹配

 

如果url-pattern的值是/,表示执行默认映射。所有资源都是servlet

 

四、Servlet的线程安全

单实例:每次访问多线程

解决线程安全问题的最佳办法,不要写全局变量,而写局部变量。

 

五、Servlet获取配置信息

**ServletConfig的使用

一个servlet对象对应一个servletconfig对象,通过servletconfig可以获取servlet配置信息,内部的局部数据

作用1:可以获取servlet配置信息

方式1:

方式2

方式3:

作用2:可以获得ServletContext对象---一个应用(装着对个servlet的应用程序)对应一个context对象,获取全局数据

 都是由tomcat服务器创建

六、ServletContext(重要)

ServletContext: 代表的是整个应用。一个应用只有一个ServletContext对象。单实例。

作用:

域对象:在一定范围内(当前应用),使多个Servlet共享数据。

常用方法:

void setAttribute(String name,object value);//向ServletContext对象的map中添加数据

Object getAttribute(String name);//从ServletContext对象的map中取数据

void rmoveAttribute(String name);//根据name去移除数据

根据在服务器上应用的相对路径获取绝对路径 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>BigData1704W04_servlet</display-name>
  <!-- web.xml是在程序开始执行的时候,首先被自动加载 -->
  
  <!-- 完成对ServletDemo1的注册:相当于告诉服务器我要创建的对象对应的类 -->
  
  <!-- 写一个全局的属性 -->
  <context-param>
  <param-name>美女</param-name>
  <param-value>冰冰</param-value>
  </context-param>
  <!-- 
  完成注册 :
          一个servlet标签就相当于一个服务器应用 -->
  <servlet>
     <servlet-name>servletDemo1</servlet-name>
     <servlet-class>com.qianfeng.servlet.ServletDemo1</servlet-class>
     
  </servlet>
   <servlet>
     <servlet-name>servletDemo2</servlet-name>
     <servlet-class>com.qianfeng.servlet.ServletDemo2</servlet-class>
    
  </servlet>
    <servlet>
     <servlet-name>servletDemo3</servlet-name>
     <servlet-class>com.qianfeng.servlet.ServletDemo3</servlet-class>
  </servlet>
  <servlet >
    <servlet-name>ServletDemo4</servlet-name>
    <servlet-class>com.qianfeng.servlet.ServletDemo4</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ServletDemo5</servlet-name>
    <servlet-class>com.qianfeng.servlet.ServletDemo5</servlet-class>
     
     <!-- 在servlet内部设置的属性属于局部的属性,通过config获取 -->
     <init-param>
      <param-name>code</param-name>
      <param-value>utf-8</param-value>
     </init-param>
  </servlet>
  <servlet>
    <servlet-name>ServletDemo6</servlet-name>
    <servlet-class>com.qianfeng.servlet.ServletDemo6</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ServletDemo7</servlet-name>
    <servlet-class>com.qianfeng.servlet.ServletDemo7</servlet-class>
  </servlet>
  
  <!-- 设置的外部访问路径 -->
  <!-- 路径匹配(路径设置的规则)
  1.写一个具体的名字匹配      前面必须加/
  2.*   任意路径匹配           前面必须加/
  3.*.do 扩展名匹配  *.名字       不需要在前面加/
 
  优先级   1>2>3

   -->
  <servlet-mapping>
  <servlet-name>servletDemo1</servlet-name>
  <url-pattern>/demo1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  <servlet-name>servletDemo2</servlet-name>
  <url-pattern>/demo2/*</url-pattern>
  </servlet-mapping>
    <servlet-mapping>
  <servlet-name>servletDemo3</servlet-name>
  <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ServletDemo4</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ServletDemo5</servlet-name>
    <url-pattern>/demo5</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ServletDemo6</servlet-name>
    <url-pattern>/demo6</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ServletDemo7</servlet-name>
    <url-pattern>/demo7</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

package com.qianfeng.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是服务器端的一个小应用程序---负责完成一个功能
 * servlet的生命周期是从servlet对象被创建到被销毁
 * servlet对象是由服务器创建的
 * 
 * servlet对象的生命周期
 * 1.ServletDemo1()   执行一次
 * 2.init方法   初始化方法    执行一次
 * 3.service方法   提供服务方法    执行多次
 * 4.destroy方法   销毁方法    执行一次
 * 
 * sevice方法的特点:
 * 1.sevice创建一次,service方法执行多次
 * 整个的服务器周期内sevlet对象值创建一次,使用多次,好处:节省内存
 * servlet关闭的时间是随着服务器的关闭而关闭
 */


//第一种创建servlet对象的方式
public class ServletDemo1 implements Servlet {
//构造方法
    public ServletDemo1() {
System.out.println("ServletDemo1");
}
@Override
//初始化方法
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init");
}

@Override
//提供服务的方法
//service方法是自动被调用的
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Demo1:service");
}

@Override
//负责将当前的对象进行销毁
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy");
}

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


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

package com.qianfeng.servlet;


import java.io.IOException;


import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;


//第二种创建方式
/*
 * 这里ServletDemo2继承自GenericServlet,GenericServlet实现了Servlet接口
 * 在GenericServlet里面将servlet接口的所有方法都已经实现了,所以当我们在需要用到哪个方法的时候,
 * 我们只需要创建GenericServlet的子类,在子类中只写这个方法即可,其他的方法不需要写了,我们把GenericServlet类的行为称为适配器模式
 */
public class ServletDemo2 extends GenericServlet {


@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Demo2-service");
}


}
package com.qianfeng.servlet;


import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*ServletDemo3与HttpServlet之间的关系就是模板设计模式
 * 
 * 这里的ServletDemo3继承自HttpServlet,HttpServlet继承自GenericServlet,GenericServlet实现了Servlet接口
 * 
 */


//第三种创建方式
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Demo3:doGet");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub

}
}

package com.qianfeng.servlet;


import java.io.IOException;
import java.io.PrintWriter;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ServletDemo4 extends HttpServlet {



public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


response.setContentType("text/html");
PrintWriter out = response.getWriter();

System.out.println("Demo4:doGet");

out.close();
}


public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


doGet(request, response);
}


}

package com.qianfeng.servlet;


import java.io.IOException;
import java.io.PrintWriter;


import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * servletConfig:一个servlet对象对应一个config对象,通过config只能访问servlet内部的数据(局部数据)
 * servletContext:一个应用对应一个context对象,他可以获取全局的数据
 * 
 * 共同点:他们都是由tomcat服务器创建的
 */
public class ServletDemo5 extends HttpServlet {
ServletConfig sConfig = null;
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);//这行代码必须存在
sConfig = config;//接收服务器创建的config对象
}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


response.setContentType("text/html");
PrintWriter out = response.getWriter();

//根据key获取属性值
String value = sConfig.getInitParameter("code");
System.out.println(value);

out.close();
}



public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        doGet(request, response);
}


}
package com.qianfeng.servlet;


import java.io.IOException;
import java.io.PrintWriter;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * servletContext:
 * 1.获取全局变量
 * 2.共享数据
 * 3.通过资源在服务器上应用内的相对路径获取绝对路径
 */
public class ServletDemo6 extends HttpServlet {



public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


response.setContentType("text/html");
PrintWriter out = response.getWriter();
//首先获取context对象
ServletContext sContext = getServletContext();

//* 1.获取全局变量
System.out.println(sContext.getInitParameter("美女"));
//* 2.共享数据
System.out.println(sContext.getAttribute("like"));
System.out.println(sContext.getAttribute("unlike"));
//* 3.通过资源在服务器上应用内的相对路径获取绝对路径
//所谓的相对路径,这里指的是从当前的工程开始的路径
//注意两个路径:文件的原始路径     文件在服务器上的路径
String aurl = sContext.getRealPath("WEB-INF\\classes\\com\\qianfeng\\servlet\\a.properties");
System.out.println(aurl);
out.close();
}



public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


doGet(request, response);
}


}
package com.qianfeng.servlet;


import java.io.IOException;
import java.io.PrintWriter;


import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ServletDemo7 extends HttpServlet {


/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.

* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


//将值存入context
ServletContext sContext = getServletContext();

sContext.setAttribute("like", "wife");
sContext.setAttribute("unlike", "xiaosan");
}


/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.

* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println("  <BODY>");
out.print("    This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println("  </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}


}

获取全局配置信息:

修改web.xml文件:

String

getInitParameter(String name) //根据配置文件中的key得到value

 

获取资源路径:

String  getRealPath(String path);//根据资源名称得到资源的绝对路径.

可以得到当前应用任何位置的任何资源。

实现Servlet的转发。

 RequestDispatcher  getRequestDispatcher(String path) ;//参数表示要跳转到哪去

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值