一、什么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文件:
getInitParameter |
获取资源路径:
String getRealPath(String path);//根据资源名称得到资源的绝对路径.
可以得到当前应用任何位置的任何资源。
实现Servlet的转发。
RequestDispatcher
getRequestDispatcher(
String path)
;//参数表示要跳转到哪去