南京 网站设计,营销管理系统,大数据营销方式有哪些,青海省建设银行网站1.Srvlet概述
Servlet是运行在java服务器端的程序#xff0c;用于接收和响应来着客户端基于HTTP协议的请求
如果想实现Servlet的功能#xff0c;可以通过实现javax。servlet。Servlet接口或者继承它的实现类
核心方法#xff1a;service#xff08;#xff09;#xf…1.Srvlet概述
Servlet是运行在java服务器端的程序用于接收和响应来着客户端基于HTTP协议的请求
如果想实现Servlet的功能可以通过实现javax。servlet。Servlet接口或者继承它的实现类
核心方法service任何客户端的请求都会经过该方法 2.Servlet快速入门
1.创建一个WEB项目
2.重写一个类继承GenericServlet
3.重写service方法
4.在web.xml中配置Servlet
5.部署并启动项目
6.通过浏览器测试
例
package servlet;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;import java.io.IOException;/*Servlet快速入门*/
public class ServletDemo01 extends GenericServlet {Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println(service执行了...);}
}web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--Servlet快速入门1的配置--servletservlet-nameservletDemo01/servlet-nameservlet-classservlet.ServletDemo01/servlet-class/servletservlet-mappingservlet-nameservletDemo01/servlet-nameurl-pattern/servletDemo01/url-pattern/servlet-mapping
/web-app 网页输入http://localhost:8080/demo1/servletDemo01
Servlet的执行过程 Servlet关系视图 3.Servlet实现方式之HttpServlet
Servlet实现方式
1.第一种
实现Servlet接口实现所有的抽象方法。该方法支持最大程度的自定义
2.第二种
继承GenericServlet抽象类必须重写servic方法其他方法可选择重写。该方法让我们开发Servlet变得简单。但是这种方式和HTTP协议无关
3.第三种
继承HttpServlet抽象类需要重写doGet和doPost方法。该方式表示请求和响应都需要和HTTP协议相关
步骤
1.创建一个类继承HttpServlet
2.重写doGet和doPost方法
3.在web.xml中配置Servlet
4.部署并启动项目
5.通过浏览器测试
例
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*快速入门02
*/
public class ServletDemo02 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(方法执行了...);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--Servlet快速入门1的配置--servletservlet-nameservletDemo01/servlet-nameservlet-classservlet.ServletDemo01/servlet-class/servletservlet-mappingservlet-nameservletDemo01/servlet-nameurl-pattern/servletDemo01/url-pattern/servlet-mapping!--Servlet快速入门2的配置--servletservlet-nameservletDemo02/servlet-nameservlet-classservlet.ServletDemo02/servlet-class/servletservlet-mappingservlet-nameservletDemo02/servlet-nameurl-pattern/servletDemo02/url-pattern/servlet-mapping
/web-app
4.Servlet的生命周期
对象的生命周期就是对象从出生到死亡的过程。即出生 - 活着 - 死亡。官方说法是对象创建到销毁的过程
出生请求第一次到达 Servlet 时对象就创建出来并且初始化成功。只出生创建一次将对象放到内存中
活着服务器提供服务的整个过程中该对象一直存在每次都是执行 service 方法
死亡当服务停止时或者服务器宕机时对象死亡
例
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*Servlet的生命周期
*/
public class ServletDemo03 extends HttpServlet {//对象出生的过程Overridepublic void init() throws ServletException {System.out.println(对象创建并初始化成功);}//对象服务的过程Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(接收到了客户端的请求...);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}//对象销毁的过程Overridepublic void destroy() {System.out.println(对象销毁了...);}
}web.xml !--Servlet生命周期的配置--servletservlet-nameservletDemo03/servlet-nameservlet-classservlet.ServletDemo03/servlet-class/servletservlet-mappingservlet-nameservletDemo03/servlet-nameurl-pattern/servletDemo03/url-pattern/servlet-mapping
结论Servlet 对象只会创建一次销毁一次。所以 Servlet 对象只有一个实例。如果一个对象实例在应用中是唯一的存在那么我们就称它为单例模式
5.Servlet线程安全问题
由于 Servlet 采用的是单例模式也就是整个应用中只有一个实例对象。所以我们需要分析这个唯一的实例对象中的类成员是否线程安全
模拟用户登录功能来查看 Servlet 线程是否安全
例
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题*/
public class ServletDemo04 extends HttpServlet{//1.定义用户名成员变量private String username null;Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//2.获取用户名username req.getParameter(username);try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//3.获取输出流对象PrintWriter pw resp.getWriter();//4.响应给客户端浏览器pw.print(welcome: username);//5.关流pw.close();}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}!--Servlet线程安全的配置--servletservlet-nameservletDemo04/servlet-nameservlet-classservlet.ServletDemo04/servlet-class/servletservlet-mappingservlet-nameservletDemo04/servlet-nameurl-pattern/servletDemo04/url-pattern/servlet-mapping
谷歌浏览器中url传递参数usernameaaa
火狐浏览器中url传递参数usernamebbb
结果两个浏览器都是welcomebbb
结论一个浏览器代表一个线程多个浏览器代表多个线程。按理说我们期望的应该是每个浏览器查看的都应该是自己的用户名。而现在的结果是浏览器中数据混乱。因此我们可以认为 Servlet 是线程不安全的
解决定义类成员要谨慎。如果是共用的并且只会在初始化时赋值其他时间都是获取的话那么是没问题的。如果不是共用的或者每次使用都有可能对其赋值那就要考虑线程安全问题了可以将其定义到 doGet 或 doPost 方法内或者使用同步功能即可。
方法1将username由成员变量放到方法中
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题*/
public class ServletDemo04 extends HttpServlet{//1.定义用户名成员变量// private String username null;Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username null;//2.获取用户名username req.getParameter(username);try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//3.获取输出流对象PrintWriter pw resp.getWriter();//4.响应给客户端浏览器pw.print(welcome: username);//5.关流pw.close();}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}方法二使用同步代码块
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/*
Servlet线程安全的问题*/
public class ServletDemo04 extends HttpServlet{//1.定义用户名成员变量private String username null;Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//String username null;synchronized (this){//2.获取用户名username req.getParameter(username);try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//3.获取输出流对象PrintWriter pw resp.getWriter();//4.响应给客户端浏览器pw.print(welcome: username);//5.关流pw.close();}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}6.Servlet不同映射方式
第一种
具体名称的方式。访问的资源路径必须和映射配置完全相同
第二种
/ 开头 通配符的方式。只要符合目录结构即可不用考虑结尾是什么
第三种
通配符 固定格式结尾的方式。只要符合固定结尾格式即可不用考虑前面的路径
注意优先级问题。越是具体的优先级越高越是模糊通用的优先级越低。第一种 - 第二种 - 第三种
例
第一种具体名称的方式
访问http://localhost:8080/demo1/servletDemo05
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*Servlet不同映射方式*/
public class ServletDemo05 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(ServletDemo05执行了...);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}}!--Servlet不同映射方式--!--指定名称的方式--servletservlet-nameservletDemo05/servlet-nameservlet-classservlet.ServletDemo05/servlet-class/servletservlet-mappingservlet-nameservletDemo05/servlet-nameurl-pattern/servletDemo05/url-pattern/servlet-mapping
第二种/开头通配符的方式
访问http://localhost:8080/demo1/servlet/.... !--/ 开头 通配符的方式--servletservlet-nameservletDemo05/servlet-nameservlet-classservlet.ServletDemo05/servlet-class/servletservlet-mappingservlet-nameservletDemo05/servlet-nameurl-pattern/servlet/*/url-pattern/servlet-mapping
第三种通配符固定格式结尾
访问http://localhost:8080/demo1/xxx.do
!--通配符固定格式结尾的方式--servletservlet-nameservletDemo05/servlet-nameservlet-classservlet.ServletDemo05/servlet-class/servletservlet-mappingservlet-nameservletDemo05/servlet-nameurl-pattern*.do/url-pattern/servlet-mapping
7.Servlet创建时机
1.第一次访问时创建
优势减少对服务器内存的浪费。提高了服务器启动的效率
弊端如果有一些要在应用加载时就做的初始化操作无法完成
2.服务器加载时创建
优势提前创建好对象提高了首次执行的效率。可以完成一些应用加载时要做的初始化操作
弊端对服务器内存占用较多影响了服务器启动的效率
修改Servlet创建时间在servlet标签中添加load-on-startu标签 正整数代表服务器加载时创建值越小、优先级越高。 负整数或不写代表第一次访问时创建
load-on-startup加载顺序的序号/load-on-startup 序号为1就是服务器启动时第一个加载 序号为2就是服务器启动时第二个加载
如果两个Servlet都要配置为正整数那么值小的优先级高 !--Servlet生命周期的配置--servletservlet-nameservletDemo03/servlet-nameservlet-classservlet.ServletDemo03/servlet-classload-on-startup1/load-on-startup/servletservlet-mappingservlet-nameservletDemo03/servlet-nameurl-pattern/servletDemo03/url-pattern/servlet-mapping
会在启动tomcat的时候初始化
8.默认Servlet
默认Servlet是由服务器提供的一个Servlet它配置在Tomcat的conf目录下的web.xml中
它的映射路径是url-pattern/url-pattern我们在发送请求时首先会在我们项目中的 web.xml 中查找映射配置找到则执行。
但是当找不到对应的 Servlet 路径时就去找默认的 Servlet由默认 Servlet 处理。所以一切都是 Servlet。
如果我们访问一个不存在的url浏览器会加载一个404界面这个404界面其实就是tomcat配置的默认的Servlet处理的结果。
9.ServletConfig
1.ServletConfig概述
ServletConfig 是 Servlet 的配置参数对象在 Servlet 的规范中允许为每一个 Servlet 都提供一
些初始化的配置。所以每个 Servlet 都有一个自己的 ServletConfig
作用在 Servlet 的初始化时把一些配置信息传递给 Servlet
生命周期
生命周期和Servlet相同
如果Servlet配置了load-on-startup1/load-on-startup那么ServletConfig也会在应用加载时创建
ServletConfig的配置信息都是键值对的形式
2.ServletConfig的配置方式
在servlet标签中通过init-param标签来配置。有两个子标签
param-name代表初始化参数的 key
param-value代表初始化参数的 value
一个init-param配置一个信息一个信息由name和value组成只允许一个键值对存在
例
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*ServletConfig的演示*/
public class ServletConfigDemo extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}web.xml
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--配置Servlet--servletservlet-nameservletConfigDemo/servlet-nameservlet-classservlet.ServletConfigDemo/servlet-class!--配置ServletConfig初始化参数--init-param!--用于获取初始化参数的key--param-nameencoding/param-name!--初始化参数的值--param-valueUTF-8/param-value/init-paraminit-paramparam-namedesc/param-nameparam-valueThis is ServletConfig/param-value/init-param/servletservlet-mappingservlet-nameservletConfigDemo/servlet-nameurl-pattern/servletConfigDemo/url-pattern/servlet-mapping/web-app
3.ServletConfig的常用方法
返回值方法名说明StringgetInitParameter(String name)根据参数名称获取参数的值EnumerationStringgetlnitParameterNames()获取所有参数名称的枚举String getServletName()获取Servlet的名称ServletContextgetServletContext()获取ServletContext对象
package servlet;import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;/*ServletConfig的演示*/
public class ServletConfigDemo extends HttpServlet {//声明ServletConfig配置对象private ServletConfig config;//通过init方法来为ServletConfig配置对象赋值Overridepublic void init(ServletConfig config) throws ServletException {this.config config;}Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//演示ServletConfig常用方法//根据key获取valueString encodingValue config.getInitParameter(encoding);System.out.println(encodingValue);//获取所有的keyEnumerationString keys config.getInitParameterNames();while (keys.hasMoreElements()){//获取每一个keyString key keys.nextElement();//根据key获取valueString value config.getInitParameter(key);System.out.println(key , value);}//获取Servlet的名称String servletName config.getServletName();System.out.println(servletName);//获取ServletContext对象ServletContext context config.getServletContext();System.out.println(context);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}访问http://localhost:8080/demo2/servletConfigDemo
10.ServletContext
1.ServletContext概述
ServletContext 是应用上下文对象应用域对象。每一个应用中只有一个 ServletContext 对象
作用可以配置和获得应用的全局初始化参数可以实现 Servlet 之间的数据共享
生命周期应用一加载则创建应用被停止则销毁。
出生——活着——死亡
出生 应用一加载该对象就被创建出来了。一个应用只有一个实例对象。(Servlet和ServletContext都是单例的)
活着只要应用一直提供服务该对象就一直存在。
死亡应用被卸载或者服务器挂了该对象消亡。
域对象
域对象指的是对象有作用域。也就是有作用范围域对象可以实现数据的共享不同作用范围的域对象共享数据的能力也不一样
在 Servlet 规范中一共有 4 个域对象ServletContext 就是其中的一个它也是 web 应用中最大的作用域也叫 application 域它可以实现整个应用之间的数据共享
2.ServletContext的配置方式
ServletContext 并不属于某个 Servlet 的配置而是针对于整个应用的配置也叫全局的初始化参数
在web-app标签中通过context-param标签来配置。有两个子标签
param-name代表全局初始化参数的 key
param-value代表全局初始化参数的 value
package servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ServletContextDemo extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}web.xml
!--配置Servlet--servletservlet-nameservletContextDemo/servlet-nameservlet-classservlet.ServletContextDemo/servlet-class/servletservlet-mappingservlet-nameservletContextDemo/servlet-nameurl-pattern/servletContextDemo/url-pattern/servlet-mapping!--配置ServletContext--context-paramparam-nameglobalEncoding/param-nameparam-valueUTF-8/param-value/context-paramcontext-paramparam-nameglobalDesc/param-nameparam-valueThis is ServletContext/param-value/context-param3.ServletContext的常用方法
返回值方法名说明StringgetInitParameter(String name)根据名称获取全局配置的参数StringgetContextPath()获取当前应用的虚拟访问目录StringgetRealPath(string path)根据虚拟目录获取应用部署的磁盘绝对路径voidsetAttribute(String name,Object value)向应用域对象中存储数据ObjectgetAttribute(String name)通过名称获取应用域对象中的数据voidremoveAttribute(String name)通过名称移除应用域对象中的数据
package servlet;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ServletContextDemo extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取ServletContext对象ServletContext context getServletContext();//常用方法演示//获取全局配置参数getInitParameter(String key) 根据key获取valueString value context.getInitParameter(globalDesc);System.out.println(value);//获取应用的虚拟目录getContextPath()String contextPath context.getContextPath();System.out.println(contextPath);//根据虚拟目录获取绝对路径getRealPath(String path)String realPath context.getRealPath(/);System.out.println(realPath);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}访问http://localhost:8080/demo2/servletContextDemo 11.注解开发 Servlet
1.自动注解开发
1.创建一个web项目
2.定义一个类继承HttpServlet
3.重写doGet和doPost方法
4.在类上使用WebServlet注解配置Servlet
5.部署并启动项目
6.通过浏览器测试
package Servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*基于注解方式开发WebServlet(Servlet路径)*/
WebServlet(/servletDemo01)
public class ServletDemo01 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(ServletDemo01执行了...);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}2.注解详解
Target({ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
Documented
public interface WebServlet {//指定Servlet的名称。等效于web.xml文件servlet标签下的servlet-nameString name() default ;//用于映射Servlet。等效于url-patternString[] value() default {};String[] urlPatterns() default {};//指定Servlet的加载时机。等效于load-on-startupint loadOnStartup() default -1;//指定Servlet的初始化参数。等效于init-paramWebInitParam[] initParams() default {};//指定Servlet是否支持异步boolean asyncSupported() default false;//指定Servlet的小图标String smallIcon() default ;//指定Servlet的大图标String largeIcon() default ;//指定Servlet的描述信息String description() default ;//指定Servlet的显示名称String displayName() default ;
}