第三章:Servlet、ServletConfig、ServletContext
1.Servlet技术

1.1 Servlet概述:
什么是servlet:它是运行在web服务器端的一个java小程序,简单来说,它就是一个java类
在使用servlet时,需要导入javax.servlet下的jar包。比如:tomcat服务器提供了
servlet的servlet-api.jar包,所以在开发时用tomcat服务器就不需要再导入servlet的jar包。
Servlet它是一个资源,是用来被用户访问的资源,同时是一个动态资源,它是由sun指定的servlet规范。
Servlet的作用:它是基于Http协议的,主要是用来接收客户端发送的请求,处理请求,把数据响应给客户端。

1.2 Servlet的入门
1.Servlet的接口和实现类:

Servlet它是一个接口,在javax.servlet 包下面。
五个方法:

  • destroy():执行这个方法,销毁了servlet对象
  • init(ServletConfig config):在web服务器创建servlet对象以后,执行这个初始化方法。
  • service(ServletRequest req, ServletResponse res) :服务方法,用来接收客户端发送的请求,并且响应数据到客户端
  • getServletConfig():现在不讲
  • getServletInfo():servlet 的信息,比如作者、版本和版权,这个方法在开发中不用。

GenericServlet,它是一个类,实现了Servlet接口
HttpServlet,它是一个类,实现了Servlet接口,同时继承了GenerciServlet
创建servlet三种方式

直接实现Servlet接口。
继承GenericServlet类
继承HttpServlet类。
一般在开发中,创建servlet,通常去继承这个HttpServlet.
比如:class MyServlet extends HttpServlet{ 重写咱们所需要的方法}

1.3.实现第一个Servlet程序

>>> 1.自己手动创建Servlet,通过Dos命令窗口编译Servlet,把编译好的class文件部署到tomcat服务器运行。
>>> 2.通过Eclipse创建Servlet,部署到tomcat服务器,然后就可以访问咱们所需要的Servlet。步骤:1.创建HelloWordServlet,继承GenericServlet2.重写父类GenerciServlet的service方法。3.在服务方法里面,处理客户端的请求后,把数据响应给客户端。比如:public class HelloWordServlet extends GenericServlet{@Overridepublic void service(ServletRequest arg0, ServletResponse response)throws ServletException, IOException {// 处理客户端发送的请求,并且把数据响应给客户端System.out.println("接收了客户端的请求-------------------");//把数据响应给客户端,与浏览器绑定的输出流,作用向浏览器输出数据PrintWriter pw = response.getWriter();pw.print("Hello World");}}访问Servlet,提供servlet的访问路径:比如:<!-- 配置访问/hello路径,对应的servlet --><servlet><servlet-name> helloWorld</servlet-name><servlet-class>cn.itcast.firstmyapp.servlet.HelloWordServlet</servlet-class></servlet><!-- 配置浏览器访问servlet的路径 --><servlet-mapping><servlet-name> helloWorld</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping>

通过浏览器访问:http://localhost:8080/webFirst/hello
就找到对应的HelloWorldServlet,把数据响应给浏览器。

导入jar包:先拷贝对应的jar包,放到WebContent下面的WEB-INF下面的lib文件夹下面。
jar的图标就变成小奶瓶。

1.3.Servlet的生命周期:
生命周期:自然界人从出生到最终走向西方极乐世界,这个周期过程就是人的生命周期,
其实servlet的生命周期和人的一样,从servlet对象被创建,经过使用servlet对象,
到最终servlet对象被销毁,整个过程就是servlet的生命周期。
与生命周期相关的三个方法:

初始化阶段:
init(ServletConfig config) 初始化方法:首次访问这个Servlet,servlet对象会被创建,执行初始化方法,执行一次。

运行阶段:
service(ServletRequest req, ServletResponse res) 服务方法:每次访问servlet时,服务方法都会被执行,执行多次。。

销毁阶段:
destroy()销毁方法:在服务器正常关闭时。会执行销毁方法,执行一次。

比如:

  public class LifeServlet extends GenericServlet {/*** 初始化方法*/@Overridepublic void init(ServletConfig config) throws ServletException {System.out.println("首次访问LifeServlet时,会执行这个初始化方法-------------");}/*** servlet的服务方法*/@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {System.out.println("每次访问lifeservlet,都会执行这个服务方法--------");}/*** 销毁方法*/@Overridepublic void destroy() {System.out.println("在服务器关闭时,会执行销毁方法----------");}}在web.xml文件上面配置访问路径:<servlet><servlet-name>lifeServlet</servlet-name><servlet-class>cn.itcast.firstmyapp.servlet.LifeServlet</servlet-class></servlet><servlet-mapping><servlet-name>lifeServlet</servlet-name><url-pattern>/life</url-pattern></servlet-mapping>

1.4 Servlet应用-HttpServlet
在开发中,通常浏览器访问web服务器端的资源,是带有协议的访问,比如说http协议、https协议等,所以说
在创建servlet时。需要使用带有协议的servlet,那么咱们程序员在创建servlet时,通常用继承HttpServlet的
方式来实现。
1.查看HttpServlet源码得到的结论:
在HttpServlet里面重写service方法时,因为在service方法里面,最终调用doGet或者doPost方法,
所以说在重写服务方法时,一般情况下不会重写service方法,而是直接重写doGet和doPost方法
在客户端发送get请求,在服务器端就用doGet方法接收、
在客户端发送Post请求,在服务器端就用doPost方法来接收
代码如下:

  public class MyHttpServlet extends HttpServlet{/*** 接收客户端发送的get请求*/public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method = req.getMethod();System.out.println(method);System.out.println("这是发送的get请求");}/*** 接收客户端发送的post请求*/public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method = req.getMethod();System.out.println(method);System.out.println("这是发送的Post请求");}}

在开发中,注意的细节:

1.在使用对象时,使用带有协议的请求和响应对象HttpServletRequset和HttpServletResponse
2.在开发时,继承HttpServlet是,直接重写doGet和doPost方法,而不是重写service方法
访问servlet的具体执行过程:见图分析。
1.5 使用Eclipse工具开发servlet
通过开发工具创建servlet有两种方式:

1.先创建一个普通的java类,需要去实现Servlet接口,或者继承对应的HttpServlet(GenericServlet)类,
咱们普通的java类就具有了servlet功能,所以需要手动在web.xml配置文件中添加访问servlet的路径信息。

2.直接创建servlet,会自动在web.xml文件中添加访问servlet的路径信息。
步骤:
1.新建web项目:
比如说:创建一个web项目名称:chapter03
2.创建一个servlet程序:
比如说:先创建一个包,名称cn.itcast.servlet ,servlet的名称:TestServlet01
3.部署和访问servlet:
通过开发工具部署web项目,如chapter03,访问它下面的servlet资源:
访问的地址:http://localhost:8080/chapter03/testServlet01

注意:一般情况下,为了简化开发,咱们会在doPost方法里面调用doGet方法。

具体见下代码:

  /***  doGet方法,用来接收浏览器发送的get请求*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubPrintWriter out = response.getWriter();out.print("this servlet is created by eclipse");}/*** doPost方法,用来接收浏览器发送的post请求*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
需求: 可以发送get请求和post请求得到1到100之间的和protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int sum=0;for(int i=0;i<=100;i++){sum=sum+i;}------}/*** doPost方法,用来接收浏览器发送的post请求*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}

1.6 实现Servlet的虚拟路径映射
1.Servlet的多重映射:一个Servlet,可以对应多个访问路径。
比如:一个servlet对应的访问路径:/test02 或者 /test03

 </servlet-mapping><servlet-mapping><servlet-name>TestServlet01</servlet-name><url-pattern>/test02</url-pattern></servlet-mapping><servlet-mapping><servlet-name>TestServlet01</servlet-name><url-pattern>/test03</url-pattern></servlet-mapping>

2.Servlet的映射路径可以使用通配符
servlet的映射路径有三种方式:、

完全目录匹配: 比如 /hello
目录匹配: 比如 /abc/* 或者 /*
扩展名匹配: .do ,.action 注意 /*.do这种写法是错误的。
优先级:完全目录匹配>目录匹配>扩展名匹配
3.缺省Servlet
什么是缺省Servlet:它的映射路径 “/” ,代表这是一个缺省的servlet.
缺省的servelt作用:处理请求的资源找不到的问题(404 代表请求的资源找不到)

2.ServletConfig接口
什么是ServletConfig: 它是servlet的配置对象,作用就是获取与servlet的初始化参数。
它的子类是GenericServlet和HttpServlet.
它被实列化是通过web服务器实现的。
得到servletConfig对象:getServletConfig()
ServletConfig常用的方法:

  1. 获取servlet的初始化参数的值:getInitParameter(String name):根据encoding获取utf-8
  2. 获取servlet初始化参数的名称:getInitParameterNames() :获取encoding和username等名称
  3. 得到servletContext对象:getServletContext()
  4. 获取servlet的名称:getServletName():对应web.xml里面TestServlet02
    初始化参数的配置:
<!-- servlet初始化参数的配置 -->
<init-param><param-name>encoding</param-name><param-value>utf-8</param-value>
</init-param>
<init-param><param-name>username</param-name><param-value>x</param-value>
</init-param>

3.ServletContext接口
ServletContext对象是在web服务器启动时就创建了,是web服务器创建的servletContext对象,
每一个web项目只有一个ServletContext对象。
ServletContext对象的作用:获取web应用程序的初始化参数,在web应用程序能共享数据,获取web项目下的资源文件。
得到ServletContext对象:

1.通过ServletConfig对象: config.getServletContext()
2.直接得到: getServletContext();

1.获取web应用程序的初始化参数(web应用程序就是web项目)

  1. 获取全局初始化参数的值:getInitParameter(String name)
  2. 获取全局初始化参数的名称:getInitParameterNames()
    比如:
<!-- 配置全局的初始化参数 -->
<context-param><param-name>AAA</param-name><param-value>aaa</param-value>
</context-param>
<context-param><param-name>BBB</param-name><param-value>bbb</param-value>
</context-param>

2.实现多个servlet对象之间共享数据:因为一个web项目只有一个ServletContext对象。
ServletContext对象就是域对象:域对象在一定范围内能存值和取值。
域对象相关的方法:
* 存值:void setAttribute(String key,Object obj);

  • 取值:Object obj = getAttribute(key);

  • 删除值:void removeAttribute(key);
    比如:在TestServlet04里面存值:

       //1.得到ServletContext对象ServletContext context = this.getServletContext();//2.存值context.setAttribute("key", "servlet04里面存的值----");
    

    在TestServletO5里面获取值:
    //1.得到servletContext对象
    ServletContext context = this.getServletContext();
    //2.从ServletContext取值
    Object obj =context.getAttribute(“key”);
    String value=obj.toString();
    response.setContentType(“text/html;charset=utf-8”);
    response.getWriter().print(value);
    3.获取Web下面的资源文件
    通过ServletContext对象能够获取Web项目下面文件的字节输入流,或者文件的绝对路径。
    路径问题:
    普通java项目:直接使用jdk编译java文件,所以说文件的路径是相对于工作空间。
    比如:

           Properties por = new Properties();InputStream inStream = new FileInputStream("src/config.properties");por.load(inStream);String value =por.getProperty("key");System.out.println(value);
    

web项目:运行在tomcat服务器上面的,所有说文件的路径是相对于tomcat服务器。
服务器端是没有src这个目录,写路径不能写src,必须相对于tomcat服务器端的路经。
1.获取文件的自己输入流:路径是相对于tomcat服务器的路径
InputStream in =getResourceAsStream(String path)
比如:

 // 获取文件的字节输入流ServletContext context = this.getServletContext();String path="/WEB-INF/classes/config.properties";InputStream in = context.getResourceAsStream(path);Properties pro= new Properties();pro.load(in);//获取配置文件的值String v1 = pro.getProperty("Company");String v2= pro.getProperty("Address");response.getWriter().print("company name :"+v1+" company address :"+v2);

2.获取文件的绝对路径:路径是相对于服务器端的路径
String realPath = getRealPath(path);
比如:

  //1.得到ServletContext对象ServletContext context = this.getServletContext();//2.获取文件的绝对路径String path="/WEB-INF/classes/config.properties";//3.调用getRealPath//E:\soft\apache-tomcat-7.0.55\webapps\chapter03\WEB-INF\classes\config.propertiesString realPath = context.getRealPath(path);System.out.println(realPath);InputStream in = new FileInputStream(realPath);

Servlet技术(第三章)相关推荐

  1. 第三章 计算机网络技术,计算机网络技术第三章习题

    计算机网络技术第三章习题 1.网络协议是指网络数据交换而制定的规责.约定与标准的集合,它由______._______.________三部分组成 2.计算机网络采用_______的体系结构,网络中两 ...

  2. 计算机三级网络技术第三章(第一轮)

    第三章  IP地址规划技术 (选择题8-11    综合题第一题.应用题子网划分(占分值20分) 常考知识点:IP地址分类及子网划分     无类域间路由技术(CIDR)     NAT技术工作原理  ...

  3. 知识图谱 概念与技术 第三章

    知识图谱 概念与技术 肖仰华等编著 中国工信出版集团 电子工业出版社 第三章 词汇挖掘与实体识别 知识图谱中的实体识别基本思路: 当一个词汇在某个上下文表达的是某个预定义概念时,则是一个实体. 例如& ...

  4. 软件工程技术--第三章 需求分析

    第三章 需求分析 需求分析 ​ 需求分析的任务是要准确地定义新系统的目标,准确回答"系统必须做什么"的问题,并用需求规格说明书规范的形式准确地表达用户的需求. ​ 虽然在可行性研究 ...

  5. 微型计算机技术第三版第三章答案,微型计算机原理与接口技术第三章习题及答案...

    第三章 习题及答案 2. DS=1000H, BX=0200H, SI=2, 内存10200H-10205H 单元的内容分别是10H, 2AH, 3CH, 46H, 59H, 6BH ,下列指令执行后 ...

  6. 电路与模拟电子技术第三章(要点及部分习题)

    第三章 一阶线性电路的时域分析 第三章围绕三个元件讲故事(电阻.电容和电感),介绍了过度过程.时间常数等概念.利用经典法分析一阶电路的零输入响应.零状态响应和全响应,从而归纳出分析一阶电路的三要素法. ...

  7. 大数据技术第三章-分布式文件系统HDFS

    前言:马上期末考试了,瑟瑟发抖~ 总结了一些大数据技术原理和应用的知识点,如有错误,请求指正~ 大数据技术原理与应用期末复习前两章知识点 1.HDFS集群采用主从结构,节点主要包括名称节点和数据节点 ...

  8. C#可视化编程技术第三章:DBHelper类(内含思路、代码、注释)

    DBHelper类: DBHelper类,就是用类将ADO.NET用方法封装起来.减少程序员的工作量. 代码思路: 将已经学会的ADO.qNET用代码分开封装,比如说: 一个SqlConnection ...

  9. 第三章 信息系统集成专业技术知识

    第三章 信息系统集成专业技术知识 知识点 1.信息系统的生命周期有哪几个过程 2.信息系统开发的方法有几种:各种用于什么情况的项目. 3.软件需求的定义及分类: 4.软件设计的基本原则是什么: 5.软 ...

  10. 第三章 Java Servlet基础

    第三章 Java Servlet基础 3.6.2 转发 1.获得RequestDispatcher对象 2.RequestDispatcher对象调用forward()方法实现转发 请求转发工作原理 ...

最新文章

  1. 016-热更新之FishingJoy一
  2. 石家庄地铁线路查询系统
  3. k8s查看节点CPU消耗情况
  4. @insert 对象_python中列表插入append(), extend(), insert()
  5. spring学习(22):分层架构
  6. wordpress忘记登录密码,更改域名的办法。
  7. 我的QQ群,欢迎入坑!
  8. jdk源码阅读-HashMap
  9. Bailian3711 字符串移位包含问题【字符串循环匹配】(POJ NOI0107-19)
  10. 脚本录制软件python 按键精灵 tc_GitHub - yang-dongxu/KeymouseGo: 类似按键精灵的鼠标键盘录制和自动化操作...
  11. linux远程链接Windows桌面,linux远程桌面链接windows
  12. c语言的编译器vs2019的安装及简单实用
  13. QR码与DM码的对比
  14. https端口必须443吗
  15. erp管理系统软件价格
  16. 数据中台在企业数字化转型中的践行(上篇)
  17. 游戏技能效果与buff设定
  18. Dictionary Learning(字典学习、稀疏表示以及其他)
  19. 《Python金融大数据风控建模实战》 第6章 变量分箱方法
  20. jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片

热门文章

  1. Python进阶(九) -- 操作excel文件
  2. 企业代码提交和发布流程
  3. SpringBoot 使用异常自定义错误码
  4. CSS div斜线倾斜45度
  5. JPEG文件二进制格式分析
  6. Kettle spoon 工具实战分享
  7. [Unicode] Unicode的上标与下标
  8. java list下标_Java根据list下标拆分子list的四种方式
  9. C# 实现支持markdown语法编辑器
  10. 两个正态总体方差比的置信区间