位置: IT常识 - 正文

day15-Servlet04

编辑:rootadmin
Servlet04 12.ServletConfig 12.1ServletConfig基本介绍 ServletConfig类是为Servlet程序配置信息的类 Servlet对象和ServletConfig对象都是由Tomcat负责创建 Servlet对象默认是第一次访问的时候创建,Servlet ... Servlet0412.ServletConfig12.1ServletConfig基本介绍ServletConfig类是为Servlet程序配置信息的类Servlet对象和ServletConfig对象都是由Tomcat负责创建Servlet对象默认是第一次访问的时候创建,ServletConfig在Servlet对象创建的时候,就创建一个对应的ServletConfig对象12.2ServletConfig作用获取Servlet程序的servlet-name的值获取初始化参数init-param获取ServletContext对象(上下文对象)12.3ServletConfig应用实例

推荐整理分享day15-Servlet04,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

例子

需求:编写DBServlet.java,完成如下功能

在web.xml配置连接mysql的用户名和密码

在DBServlet执行doGet()或者doPost()时,可以获取到web.xml配置的用户名和密码

思路分析:

浏览器发送请求,Tomcat去创建DBServlet,DBServlet去web.xml文件中去获取配置的参数,获取的方法有两种:一是使用dom4j,二是使用ServletConfig类

web.xml配置Servlet:

<!--配置DBServlet--><servlet> <servlet-name>DBServlet</servlet-name> <servlet-class>servlet.DBServlet</servlet-class> <!--为该Servlet配置初始参数--> <init-param> <!--参数名--> <param-name>username</param-name> <!--参数值--> <param-value>jack</param-value> </init-param> <init-param> <param-name>pwd</param-name> <param-value>123456</param-value> </init-param></servlet><servlet-mapping> <servlet-name>DBServlet</servlet-name> <url-pattern>/db</url-pattern></servlet-mapping>

DBServlet:

package servlet;import javax.servlet.*;import javax.servlet.http.*;import java.io.IOException;public class DBServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //在DBServlet执行doGet()或者doPost()时,可以获取到web.xml配置的用户名和密码 //DBServlet的父类GenericServlet有方法getServletConfig() /** * 1.getServletConfig()是父类GenericServlet的 * 2.返回的ServletConfig对象是GenericServlet的private transient ServletConfig config * 3.当一个属性被transient修饰,表示该属性不会被串行化(有些重要信息不希望保存到文件中) */ ServletConfig servletConfig = getServletConfig(); String username = servletConfig.getInitParameter("username"); String pwd = servletConfig.getInitParameter("pwd"); System.out.println("初始化参数username=" + username); System.out.println("初始化参数pwd=" + pwd); }}

浏览器访问DBServlet时,后台输出:

问题一:在doPost方法中可以得到servletConfig,在doGet方法也可以得到servletConfig,那么这两个servletConfig是同一个servletConfig吗?

答:是同一个servletConfig。

先来看一个例子

在上述的DBServlet中重写init方法,并且分别在init和doPost方法中输出ServletConfig对象

package servlet;import javax.servlet.*;import javax.servlet.http.*;import java.io.IOException;public class DBServlet extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { System.out.println("init()=" + config); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletConfig servletConfig = getServletConfig(); System.out.println("doPost()=" + servletConfig); String username = servletConfig.getInitParameter("username"); String pwd = servletConfig.getInitParameter("pwd"); System.out.println("初始化参数username=" + username); System.out.println("初始化参数pwd=" + pwd); }}

redeployTomcat,在浏览器重新访问DBServlet,会发现出现了500错误,这表明服务器内部运行出现错误

查看控制台输出,发现doPost方法竟然输出了null

在DBServlet中的init方法加上语句super.init(config);

redeployTomcat,重新访问浏览器,会发现访问DBServlet成功,后台输出变正常了

问题二:这是为什么呢?

我们先来梳理ServletConfig config的使用流程

当DBServlet对象初始化时,Tomcat会同时创建一个ServletConfig对象

如果DBServlet init()方法中调用了super.init(config);

就会调用父类GenericServlet的init方法:

public void init(ServletConfig config) throws ServletException {this.config = config;this.init();}

这时就会把Tomcat创建的ServletConfig对象赋给GenericServlet的属性config

因此如果要重写init()方法,记住如果你想在其他方法通过getServletConfig()获取ServletConfig,则一定要记住调用super.init(config);

回到问题二:

day15-Servlet04

如果没有把tomcat创建的ServletConfig,赋值给GenericServlet的属性config。那么GenericServlet的属性config的值就为null,而doPost或者doGet方法通过getServletConfig()拿到的就是GenericServlet的属性config,因此就会输出null。

侧面证实了方法中获取的servletConfig是同一个对象(问题一)

因此上面的例子中,浏览器访问DBServlet,发现出现了500错误的原因是,doPost方法中获取了为null的ServletConfig对象中的属性

13.ServletContext13.1为什么需要ServletContext

先来看一个需求:如果我们希望统计某个web应用的所有Servlet被访问的次数,怎么办?

方案一:使用DB

方案二:使用ServletContext

13.2ServletContext基本介绍

ServletContext是一个接口,它表示Servlet上下文对象

一个web工程中,只有一个ServletContext对象实例

ServletContext对象是在web工程启动的时候创建的,在web工程停止的时候销毁

可以通过ServletConfig.getServletContext方法获得对ServletContext对象的应用,也可以通过this.getServletContext()来获得其对象的引用

由于一个web应用中的所有Servlet共享一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现多个Servlet间的通信。ServletContext对象通常也被称为域对象。

13.3ServletContext可以做什么

获取web.xml文件中配置的上下文参数context-param [信息和整个web应用相关,而不是属于某个Servlet]

获取当前的工程路径,格式:/工程路径

获取工程部署后在服务器硬盘上的绝对路径

比如 D:\IDEA-workspace\servlet\out\artifacts\servlet_war_exploded

向Map一样存取数据,多个Servlet共享数据

13.4应用实例13.4.1应用实例1-获取工程相关信息

需求如下:

获取web.xml中配置的上下文参数context-param获取当前的工程路径,格式:/工程路径获取工程部署后在服务器硬盘上的绝对路径

配置ServletContext_: 在web.xml文件增加相关配置

<!--配置ServletContext_--><servlet> <servlet-name>ServletContext_</servlet-name> <servlet-class>com.li.servlet.servletcontext.ServletContext_</servlet-class></servlet><servlet-mapping> <servlet-name>ServletContext_</servlet-name> <url-pattern>/servletContext_</url-pattern></servlet-mapping><!--配置整个网站的信息--><context-param> <param-name>website</param-name> <param-value>http://www.lili.net</param-value></context-param><context-param> <param-name>company</param-name> <param-value>lili有限公司</param-value></context-param>

ServletContext_:

package com.li.servlet.servletcontext;import javax.servlet.*;import javax.servlet.http.*;import java.io.IOException;public class ServletContext_ extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取web.xml的context-parameter //1.获取到ServletContext对象 ServletContext servletContext = getServletContext(); //2.获取website String website = servletContext.getInitParameter("website"); String company = servletContext.getInitParameter("company"); System.out.println("website= " + website); System.out.println("company= " + company); //3.获取项目的工程路径 String contextPath = servletContext.getContextPath(); System.out.println("项目路径= " + contextPath);// /servlet_demo //4.得到项目发布后真正的工作路径 //这里的斜杠/表示我们的项目发布后的根路径 D:\IDEA-workspace\servlet_demo\out\artifacts\servlet_demo_war_exploded String realPath = servletContext.getRealPath("/"); System.out.println("项目发布后的绝对路径= " + realPath); }}

浏览器访问ServletContext_:

后台输出:

13.4.2应用实例2-简单的网站访问次数统计器

需求:完成一个简单的网站访问次数统计器

不管使用什么浏览器,每访问一次Servlet,就增加1访问次数,在后台输出,并将结果返回给浏览器显示

WebUtils.java:

package com.li.servlet.servletcontext;import javax.servlet.ServletContext;public class WebUtils { //该方法对访问网站的次数累加,同时返回次数 public static Integer visitCount(ServletContext servletContext) { //从servletContext获取 visit_count 属性 k-v Object visit_count = servletContext.getAttribute("visit_count"); //判断visit_count是否为空 if (visit_count == null) {//说明是第1次访问网站 servletContext.setAttribute("visit_count", 1); visit_count = 1; } else {//说明是第二次或之后访问 //visit_count+1 visit_count = Integer.parseInt(visit_count + "") + 1; //再将其放回servletContext servletContext.setAttribute("visit_count", visit_count); } return Integer.parseInt(visit_count + ""); }}

Servlet01.java:

package com.li.servlet.servletcontext;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.io.PrintWriter;@WebServlet(urlPatterns = {"/Servlet01"})public class Servlet01 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取到ServletContext对象 ServletContext servletContext = getServletContext(); Integer visit_count = WebUtils.visitCount(servletContext); //输出显示 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.print("<h1>该网站被访问的次数是" + visit_count + "</h1>"); writer.flush(); writer.close(); }}

Servlet02.java:

package com.li.servlet.servletcontext;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.IOException;import java.io.PrintWriter;@WebServlet(urlPatterns = {"/Servlet02"})public class Servlet02 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取到ServletContext对象 ServletContext servletContext = getServletContext(); Integer visit_count = WebUtils.visitCount(servletContext); //输出显示 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.print("<h1>该网站被访问的次数是" + visit_count + "</h1>"); writer.flush(); writer.close(); }}

redeployTomcat,在不同的浏览器分别访问Servlet01和Servlet02:

本文链接地址:https://www.jiuchutong.com/zhishi/311650.html 转载请保留说明!

上一篇:织梦dedecms手机站m目录下不生成index.html实现动态更新(织梦cms怎么样)

下一篇:织梦(dedecms)程序如何在后台添加新用户注册功能方法(织梦森林官网)

  • 新浪微博seo优化的技巧(微博营销优化)

    新浪微博seo优化的技巧(微博营销优化)

  • 从优惠券看怎么掌握运营策略(查看优惠券)

    从优惠券看怎么掌握运营策略(查看优惠券)

  • 浅谈未来几种网赚的可行性!(未来网络发展趋势有哪些)

    浅谈未来几种网赚的可行性!(未来网络发展趋势有哪些)

  • 支付宝分身怎么设置

    支付宝分身怎么设置

  • 为什么qq空间没有查看权限(为什么qq空间没人点赞)

    为什么qq空间没有查看权限(为什么qq空间没人点赞)

  • 计算机5大类分类标准(计算机大类分流有哪些)

    计算机5大类分类标准(计算机大类分流有哪些)

  • 如何查看sd卡内容(如何查看sd卡内存多大)

    如何查看sd卡内容(如何查看sd卡内存多大)

  • 即能向主机输入数据又能向主机输出数据(既能向主机输入数据又能接受主机输出数据的是)

    即能向主机输入数据又能向主机输出数据(既能向主机输入数据又能接受主机输出数据的是)

  • 朋友圈可以搜索内容吗(朋友圈可以搜索某年某月的内容吗?)

    朋友圈可以搜索内容吗(朋友圈可以搜索某年某月的内容吗?)

  • 腾讯视频怎样下载电视剧到手机上(腾讯视频怎样下载到本地视频)

    腾讯视频怎样下载电视剧到手机上(腾讯视频怎样下载到本地视频)

  • 电脑键盘百分比符号怎么打(电脑键盘百分比符号怎么打出来)

    电脑键盘百分比符号怎么打(电脑键盘百分比符号怎么打出来)

  • 能耗监测系统是干嘛的(能耗监测管理系统用途)

    能耗监测系统是干嘛的(能耗监测管理系统用途)

  • 微信换手机登录需要验证码吗(微信换手机登录怎么保留聊天记录)

    微信换手机登录需要验证码吗(微信换手机登录怎么保留聊天记录)

  • 苹果手机怎么看现在正在运行的应用(苹果手机怎么看海拔高度)

    苹果手机怎么看现在正在运行的应用(苹果手机怎么看海拔高度)

  • 步步高家教机忘记密码怎么解锁(步步高家教机忘记锁屏密码怎么办在没家长的情况下)

    步步高家教机忘记密码怎么解锁(步步高家教机忘记锁屏密码怎么办在没家长的情况下)

  • 华为畅享10e可以指纹解锁吗(华为畅享10E可以玩原神吗)

    华为畅享10e可以指纹解锁吗(华为畅享10E可以玩原神吗)

  • 淘宝店可以自己亲自装修吗(淘宝店可以自己买自己的东西吗)

    淘宝店可以自己亲自装修吗(淘宝店可以自己买自己的东西吗)

  • 打印机未指定是怎么回事(打印机未指定是怎么回事已经装了驱动了)

    打印机未指定是怎么回事(打印机未指定是怎么回事已经装了驱动了)

  • 微信新版本有什么新功能7.0.10(微信新版本有什么新功能主页)

    微信新版本有什么新功能7.0.10(微信新版本有什么新功能主页)

  • 金立s10c锁屏怎么关壁纸(金立s10锁屏时间设置)

    金立s10c锁屏怎么关壁纸(金立s10锁屏时间设置)

  • 获取手机imsi的方法(电话卡的imsi怎么获取)

    获取手机imsi的方法(电话卡的imsi怎么获取)

  • 小米6手机充电充不进去(小米6手机充电器)

    小米6手机充电充不进去(小米6手机充电器)

  • 不用笔记怎么发长视频(不用笔记怎么发微信)

    不用笔记怎么发长视频(不用笔记怎么发微信)

  • 桌面的文件怎么发QQ邮箱(桌面的文件怎么隐藏起来)

    桌面的文件怎么发QQ邮箱(桌面的文件怎么隐藏起来)

  • xr支持动态壁纸吗(xr动态壁纸按压没反应)

    xr支持动态壁纸吗(xr动态壁纸按压没反应)

  • excel恢复昨天的数据(excel怎样恢复历史记录)

    excel恢复昨天的数据(excel怎样恢复历史记录)

  • bak文件怎么打开(qqbak文件怎么打开)

    bak文件怎么打开(qqbak文件怎么打开)

  • 硬盘转速是什么意思(硬盘的转速有什么用)

    硬盘转速是什么意思(硬盘的转速有什么用)

  • 液晶显示器容易出现故障的部件(液晶显示器容易坏点)

    液晶显示器容易出现故障的部件(液晶显示器容易坏点)

  • 小规模纳税人和一般纳税人哪个划算
  • 税务制服的肩章是什么
  • 公司清理固定资产汽车怎么开票
  • 未填开发票怎么作废
  • 资产负债表的期初余额是年初余额吗
  • 什么情况下视同销售
  • 报表申报错误怎么作废重报
  • 2019城建税减半征收优惠政策解读
  • 普通发票申请表怎么填写
  • 出口货物的销售额怎么算
  • 行政单位拨给下属单位经费会计分录
  • 港币转人民币差额怎么平帐?
  • 核销贷款收回会计分录
  • 即征即退的增值税需要缴纳附加税吗
  • 本年累计应交税费需要加上年初数吗
  • 按期汇总缴纳印花税可以退税吗
  • 定额发票上的金额是什么
  • 个税负数怎么做账
  • 国家税务总局2017 11号
  • 关于个人所得税下列说法正确的是
  • 借款利息不能抵扣进项税
  • 分包开普通发票还是增值税专用发票?
  • 六大会计科目的关系
  • 增值税纳税申报表在哪里查询
  • 视同销售收入计入会计利润中吗
  • 财务费用年末有余额吗
  • 工程施工购买的材料费会计分录
  • 贴现利息计算器
  • 增值使用费可取消吗?
  • bioss设置
  • xp从做系统
  • 生产车间机器设备日常维修
  • 疫情期间企业贷款利率多少
  • 清理c盘清理
  • 程序员编程代码大全
  • 本月购买原材料怎么入账
  • 工程竣工的条件是什么
  • 土建工程付款方式比例
  • 如何写php守护进程数据
  • uniapp的css库
  • php调用其他php
  • php数组实现原理
  • 获取企业微信用户身份信息授权失败
  • js 数组remove
  • 清税证明怎么在网上申请
  • 印花税怎么计提记账
  • PostgreSQL 查看数据库,索引,表,表空间大小的示例代码
  • 应收票据贴现的会计处理
  • 行政单位基建管理办法
  • 长期应收款计提减值
  • 待认证进项税额月末怎么处理
  • 小微企业有什么优惠政策
  • 无形资产账面价值和账面余额的区别
  • 计提税金用什么附件
  • 未付工资挂什么科目
  • 买家退货少了犯什么法
  • 写字楼里的公司怎么赚钱
  • 贷款利息进项税额转出
  • 购买原材料还没发票
  • 资产负债表里包括应付利息吗
  • 应收账款折率
  • 商业承兑汇票到期不兑付怎么办
  • Windows Server 2008的节能降耗
  • win8系统无法开机如何备份数据
  • centos怎么备份
  • Nymse.exe - Nymse是什么进程 有何作用
  • win8界面什么样
  • 小马kms激活工具
  • win10系统edge浏览器打不开解决办法
  • 零磁道的重要性
  • unity3d打开
  • php获取当前脚本路径
  • nodejs中使用HTTP分块响应和定时器示例代码
  • [Unity3D]Unity3D游戏开发之塔防游戏项目讲解(上)
  • js 拍照
  • 通过jquery实现页面的动画效果(实例代码)
  • unity类库
  • 深圳国税电子税务局官网
  • 朝阳区第六税务所
  • 吉林省税务局发票流向查询系统
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设