监听器详解与实例演练

   创建监听器时,只要创建一个实现监听器接口的java类即可

监听器接口有ServletContextListener,HttpSessionListener,HttpSessionBindingListener,ServletRequestListener等接口,下面那进行详细解读



在Servlet3.0中,有两种方法创建


@webListener

public class ListenerClass implements ListenerInterface(){

}


第二种方法时在web.xml部署描述符中使用一个listener元素

</listener>

<listener-class>listener class name</listener-class>

</listener>


一,Servlet Context监听器


ServletContext有两个监听器:ServletContextListener和ServletContextAttributeListener


1ServletContextListener会对ServletContext的初始化和解构做出响应,下面通过一个实例来演示,

一旦ServletContext被初始化,它会将属性map保存在ServletContext属性中

import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class AppListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub

	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		ServletContext servletContext=sce.getServletContext();
		
		Map<String, String> countries=new HashMap<String, String>();
		countries.put("ca", "Canada");
		countries.put("cn", "China");
		servletContext.setAttribute("countries", countries);

	}

}

2,ServletContextAttributeListener

   每当ServletContext中添加,删除,替换了某个属性,ServletContextAttributeListener分别

会运行  void attributeAdded(ServletContextAttributeEvent event)

             void attributeRemoved(ServletContextAttributeEvent event)

             void attributeReplaced(ServletContextAttributeEvent event)方法


ServletContextAttributeEvent类派生与ServletContetAttribute,并添加了下面两个方法


java.lang.String getName()

java.lang.Object getValue()



二,Session监听器

1,HttpSessionListener

当有httpSession被创建或者销毁,Servlet容器就会调用所有已注册的HttpSessionListener


下面通过一个十分实用的例子来演示,用了一个AtomicInteger作为计数器,并保存为ServletContext属性

每当创建HttpSession时,这个计数器就会递增,每当销毁HttpSession时,计数器就会递减,可以用于显示在线人数

import java.util.concurrent.atomic.AtomicInteger;
import javax.print.attribute.standard.Severity;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class SessionListener implements HttpSessionListener,
		ServletContextListener {
	int userCount;

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		// TODO Auto-generated method stub
		ServletContext servletContext=arg0.getServletContext();
		servletContext.setAttribute("userCounter", new AtomicInteger());

	}

	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		HttpSession session=arg0.getSession();
		ServletContext servletContext=session.getServletContext();
		AtomicInteger userCounter= (AtomicInteger) servletContext.
				getAttribute("userCounter");
		int userCount=userCounter.incrementAndGet();
		System.out.println("userCount incremented to :"+userCount);

	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		// TODO Auto-generated method stub
		HttpSession session=arg0.getSession();
		ServletContext servletContext=session.getServletContext();
		AtomicInteger userCounter= (AtomicInteger) servletContext.
				getAttribute("userCounter");
		int userCount=userCounter.decrementAndGet();
		System.out.println("userCount incremented to :"+userCount);

	}

}

2,HttpSessionBindingListener

当HttpSessionBindingListener绑定到HttpSession,或者解除绑定时,都会收到通知



3,HttpSessionAttributeListener 

当HttpSession中有添加,删除,替换属性的时候它才会被调用,如ServletContextAttributeListener中一样


4,HttpSessionActivationListener

在分布式中,多个Servlet容器会被配置成可伸缩的,为了节省内存,Servlet容器可以对session属性进行迁移或者序列化。

一般来说,当内存比较时,相对较少访问的对象可以序列化到备用设备中,这个接口定义了两个方法

 

void sessionDidActive(HttpSessionEvent event)

void sessionWillPassivate(HttpSessionEvent event)



三,ServletRequest监听器

ServletRequestListener对ServletRequest的创建和销毁做出响应


下面通过一个实例,来计算完成一个HTTP请求要花费的时间。通过比较运行requestInitiallized 和requestDestroyed

方法中间所隔的时间差,得知完成一个HTTP所花的时间

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
@WebListener
public class PerfStatListener implements ServletRequestListener {

	@Override
	public void requestDestroyed(ServletRequestEvent arg0) {
		// TODO Auto-generated method stub
		ServletRequest servletRequest=arg0.getServletRequest();
		long start=(Long) servletRequest.getAttribute("start");
//nanoTime方法返回一个表示任意时间的long,在同一台JVM得到两个返回值可以用于所间隔的时间差
		long end=System.nanoTime();
		HttpServletRequest httpServletRequest=(HttpServletRequest)
				arg0.getServletRequest();
		String url=httpServletRequest.getRequestURI();
		System.out.println("time taken to execute"+url+":"+
		(end-start)/1000+" microseconds");

	}

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
		// TODO Auto-generated method stub
		ServletRequest servletRequest=arg0.getServletRequest();
		servletRequest.setAttribute("start", System.nanoTime());

	}

}

已标记关键词 清除标记
相关推荐
书名:《Android开发应用实战详解》(中国铁道出版社.张元亮) PDF格式扫描版,全书分为8章,共538页。2011年2月出版。 (注:原书没有书签。为了方便阅读,本人添加了完整详细的书签) 全书压缩打包成2部分,这是第1部分。 内容简介   循序渐进地讲解了Android技术在各个领域中具体应用的典型范例,详细介绍了各个范例的具体实现过程。本书内容新颖、知识全面、讲解详细,全书分为8章,第1~2章是基础知识,讲解了Android的发展前景和开发环境的搭建过程;第3章详细讲解了Android在设备界面领域典型实例的设计过程;第4章详细讲解了Android控件范例的实现过程;第5章详细讲解了Android交互式应用的实现过程;第6章讲解了Android在手机自动服务领域中的应用实例及其实现过程;第7章讲解了Android在娱乐和多媒体领域具体应用的实现过程;第8章讲解Android在互联网领域应用范例的实现过程。书中每个范例先提出设计思路及涉及的知识点,在实例最后补充总结知识点并引导读者举一反三。 本书定位于Android的中、高级用户,适合有一定基础的Android开发、编程及设计人员,也可作为初学者进一步学习.Android的参考书。 目 录 第1章 androi简介 1.1 初识android 1.1.1 历史背景 1.1.2 android特性 1.1.3 android组件结构 1.1.4 android应用程序框架 1.1.5 android的竞争优势 1.1.6 android模拟器 1.2 搭建android开发环境 1.2.1 准备工作 1.2.2 windows系统下的搭建过程 1.2.3 linux系统下的搭建过程 1.3 常见问题汇总 1.4 使用本书的配套实例 1.5 小结 第2章 android开发必备 2.1 android体系结构 2.1.1 各种库和android运行环境 2.1.2 应用程序框架 2.1.3 操作系统层 2.1.4 应用程序 2.2 android应用程序组成 2.2.1 activity 2.2.2 intent和intent filter 2.2.3 service介绍 2.2.4 broadcastintentreceiver 2.2.5 contentprovider 2.3 android应用项目文件组成 2.3.1 androidmanifest.xml文件 2.3.2 src目录 2.3.3 常量的定义文件 2.4 程序生命周期 2.4.1 android周期 2.4.2 android进程 2.5 activity的生命周期 2.5.1 activity状态 2.5.2 剖析activity 2.6 android进程和线程 2.6.1 进程 2.6.2 线程 2.6.3 远程调用(remote procedure calls) 2.7 intent消息传递 2.8 intent广播事件 2.8.1 广播事件 2.8.2 使用broadcast receiver监听广播 2.8.3 android本地广播 2.9 小结 第3章 设备界面演练 3.1 文字标签处理 3.2 改变屏幕窗口元素的背景颜色 3.3 改变textview的文字颜色 3.4 实现textview文字的替换 3.5 获取手机分辨率 3.6 样式修饰处理 3.7 按钮事件响应 3.8 页面间的转换 3.9 activity调用 3.10 多个activity间的数据传递 3.11 将数据返回到前一个activity 3.12 对话框交互处理 3.13 文字颜色置换 3.14 文字字体设置 3.15 拖动相片特效 3.16 简易计算器 3.17 about信息 3.18 加载中的程序 3.19 选择对话框 3.20 主题变换 3.21 小结 第4章 andfosd控件演练 4.1 实现文本处理 4.2 将背景图片作为按钮 4.3 用toast实现提示 4.4 用checkbox实现一个简单的物品清单 4.5 实现同意条款效果 4.6 radiogroup选择 4.7 imageview相框 4.8 spinner选择处理 4.9 gallery相簿 4.10 用.iava.io.file实现文件搜索 4.11 置换imagebutton按钮 4.12 实现autocompletetextview输入提示 4.13 实现analogclock时钟 4.14 时间选择 4.15 progressbar和handler进度条 4.16 动态排版处理 4.17 listactivity布局- 4.17.1 listactivity介绍 4.17.2 使用listactivity 4.18 matrix实现图片缩放 4.19 bitmap和matrix图片旋转 4.20 加载手机存储卡中的文件 4.21 小结 第5章 交互式服务 5.1 textview的花样 5.2 拨打电话程序 5.3 短信发送程序 5.4 e-mail发送程序 5.5 实现手机震动效果 5.6 图文提醒效果 5.7 状态栏提醒 5.8 检索通讯录 5.8.1 实现原理 5.8.2 contentprovider介绍 5.8.3 具体实现 5.9 文件管理 5.10 还原手机桌面 5.11 置换背景图 5.12 修改和删除文件 5.12.1 实现原理 5.12.2 java i/o基本类库介绍 5.12.3 具体实现 5.13 获取file和cache的路径 5.14 wi-fi服务 5.14.1 wi-fi简介 5.14.2 实现原理 5.14.3 具体实现 5.15 获取sim卡内信息 5.15.1 sim卡简介 5.15.2 实现原理 5.15.3 具体实现 5.16 触屏拨号 5.17 获取正在运行的程序 5.18 变换屏幕的方向 5.19 获取设备信息 5.20 小结 第6章 手机自动服务 6.1 实现短信提醒 6.2 剩余电量提醒 6.3 短信群发 6.4 短信e-mail通知 6.5 来电提醒 6.5.1 实现原理 6.5.2 telephonymanager和phonestatelistener 6.5.3 具体实现 6.6 存储卡容量 6.7 来电邮件通知 6.8 内存和存储卡 6.9 实现定时闹钟 6.10 黑名单 6.11 桌面背景图片轮换 6.12 监听发送短信状态 6.13 修改默认开机显示 6.14 小结 第7章 娱乐和多媒体应用 7.1 获取图片的宽和高 7.1.1 实现原理 7.1.2 位图操作的基本知识 7.1.3 具体实现 7.2 绘制几何图形 7.3 手机屏保 7.4 照片拖动效果 7.5 存储卡中的图片 7.6 获取内置媒体文件 7.7 调节音量 7.8 播放mp3资源文件 7.9 录制音频 7.10 实现相机拍照功能 7.10.1 实现原理 7.10.2 编程思想 7.10.3 具体实现 7.11 自制3gp影片播放器 7.12 小结 第8章 网络编程 8.1 http参数传递 8.2 浏览网页 8.3 使用html代码 8.4 用浏览器打开网页 8.5 将网络照片放入gallery中显示 8.6 网络音乐播放 8.7 远程下载铃声 8.8 远程下载背景 8.9 上传服务器 8.10 简易rss阅读器 8.11 远程下载安装android程序 8.11.1 apk简介 8.11.2 下载apk程序 8.11.3 安装apk程序 8.11.4 移除apk程序 8.11.5 本实例原理 8.11.6 具体实现 8.12 下载并观看视频 8.13 小结
第1章 androi简介 1.1 初识android 1.1.1 历史背景 1.1.2 android特性 1.1.3 android组件结构 1.1.4 android应用程序框架 1.1.5 android的竞争优势 1.1.6 android模拟器 1.2 搭建android开发环境 1.2.1 准备工作 1.2.2 windows系统下的搭建过程 1.2.3 linux系统下的搭建过程 1.3 常见问题汇总 1.4 使用本书的配套实例 1.5 小结 第2章 android开发必备 2.1 android体系结构 2.1.1 各种库和android运行环境 2.1.2 应用程序框架 2.1.3 操作系统层 2.1.4 应用程序 2.2 android应用程序组成 2.2.1 activity 2.2.2 intent和intent filter 2.2.3 service介绍 2.2.4 broadcastintentreceiver 2.2.5 contentprovider 2.3 android应用项目文件组成 2.3.1 androidmanifest.xml文件 2.3.2 src目录 2.3.3 常量的定义文件 2.4 程序生命周期 2.4.1 android周期 2.4.2 android进程 2.5 activity的生命周期 2.5.1 activity状态 2.5.2 剖析activity 2.6 android进程和线程 2.6.1 进程 2.6.2 线程 2.6.3 远程调用(remote procedure calls) 2.7 intent消息传递 2.8 intent广播事件 2.8.1 广播事件 2.8.2 使用broadcast receiver监听广播 2.8.3 android本地广播 2.9 小结 第3章 设备界面演练 3.1 文字标签处理 3.2 改变屏幕窗口元素的背景颜色 3.3 改变textview的文字颜色 3.4 实现textview文字的替换 3.5 获取手机分辨率 3.6 样式修饰处理 3.7 按钮事件响应 3.8 页面间的转换 3.9 activity调用 3.10 多个activity间的数据传递 3.11 将数据返回到前一个activity 3.12 对话框交互处理 3.13 文字颜色置换 3.14 文字字体设置 3.15 拖动相片特效 3.16 简易计算器 3.17 about信息 3.18 加载中的程序 3.19 选择对话框 3.20 主题变换 3.21 小结 第4章 andfosd控件演练 4.1 实现文本处理 4.2 将背景图片作为按钮 4.3 用toast实现提示 4.4 用checkbox实现一个简单的物品清单 4.5 实现同意条款效果 4.6 radiogroup选择 4.7 imageview相框 4.8 spinner选择处理 4.9 gallery相簿 4.10 用.iava.io.file实现文件搜索 4.11 置换imagebutton按钮 4.12 实现autocompletetextview输入提示 4.13 实现analogclock时钟 4.14 时间选择 4.15 progressbar和handler进度条 4.16 动态排版处理 4.17 listactivity布局- 4.17.1 listactivity介绍 4.17.2 使用listactivity 4.18 matrix实现图片缩放 4.19 bitmap和matrix图片旋转 4.20 加载手机存储卡中的文件 4.21 小结 第5章 交互式服务 5.1 textview的花样 5.2 拨打电话程序 5.3 短信发送程序 5.4 e-mail发送程序 5.5 实现手机震动效果 5.6 图文提醒效果 5.7 状态栏提醒 5.8 检索通讯录 5.8.1 实现原理 5.8.2 contentprovider介绍 5.8.3 具体实现 5.9 文件管理 5.10 还原手机桌面 5.11 置换背景图 5.12 修改和删除文件 5.12.1 实现原理 5.12.2 java i/o基本类库介绍 5.12.3 具体实现 5.13 获取file和cache的路径 5.14 wi-fi服务 5.14.1 wi-fi简介 5.14.2 实现原理 5.14.3 具体实现 5.15 获取sim卡内信息 5.15.1 sim卡简介 5.15.2 实现原理 5.15.3 具体实现 5.16 触屏拨号 5.17 获取正在运行的程序 5.18 变换屏幕的方向 5.19 获取设备信息 5.20 小结 第6章 手机自动服务 6.1 实现短信提醒 6.2 剩余电量提醒 6.3 短信群发 6.4 短信e-mail通知 6.5 来电提醒 6.5.1 实现原理 6.5.2 telephonymanager和phonestatelistener 6.5.3 具体实现 6.6 存储卡容量 6.7 来电邮件通知 6.8 内存和存储卡 6.9 实现定时闹钟 6.10 黑名单 6.11 桌面背景图片轮换 6.12 监听发送短信状态 6.13 修改默认开机显示 6.14 小结 第7章 娱乐和多媒体应用 7.1 获取图片的宽和高 7.1.1 实现原理 7.1.2 位图操作的基本知识 7.1.3 具体实现 7.2 绘制几何图形 7.3 手机屏保 7.4 照片拖动效果 7.5 存储卡中的图片 7.6 获取内置媒体文件 7.7 调节音量 7.8 播放mp3资源文件 7.9 录制音频 7.10 实现相机拍照功能 7.10.1 实现原理 7.10.2 编程思想 7.10.3 具体实现 7.11 自制3gp影片播放器 7.12 小结 第8章 网络编程 8.1 http参数传递 8.2 浏览网页 8.3 使用html代码 8.4 用浏览器打开网页 8.5 将网络照片放入gallery中显示 8.6 网络音乐播放 8.7 远程下载铃声 8.8 远程下载背景 8.9 上传服务器 8.10 简易rss阅读器 8.11 远程下载安装android程序 8.11.1 apk简介 8.11.2 下载apk程序 8.11.3 安装apk程序 8.11.4 移除apk程序 8.11.5 本实例原理 8.11.6 具体实现 8.12 下载并观看视频 8.13 小结
书名:《Android开发应用实战详解》(中国铁道出版社.张元亮) PDF格式扫描版,全书分为8章,共538页。2011年2月出版。 (注:原书没有书签。为了方便阅读,本人添加了完整详细的书签) 全书压缩打包成2部分,这是第2部分。 内容简介   循序渐进地讲解了Android技术在各个领域中具体应用的典型范例,详细介绍了各个范例的具体实现过程。本书内容新颖、知识全面、讲解详细,全书分为8章,第1~2章是基础知识,讲解了Android的发展前景和开发环境的搭建过程;第3章详细讲解了Android在设备界面领域典型实例的设计过程;第4章详细讲解了Android控件范例的实现过程;第5章详细讲解了Android交互式应用的实现过程;第6章讲解了Android在手机自动服务领域中的应用实例及其实现过程;第7章讲解了Android在娱乐和多媒体领域具体应用的实现过程;第8章讲解Android在互联网领域应用范例的实现过程。书中每个范例先提出设计思路及涉及的知识点,在实例最后补充总结知识点并引导读者举一反三。 本书定位于Android的中、高级用户,适合有一定基础的Android开发、编程及设计人员,也可作为初学者进一步学习.Android的参考书。 目 录 第1章 androi简介 1.1 初识android 1.1.1 历史背景 1.1.2 android特性 1.1.3 android组件结构 1.1.4 android应用程序框架 1.1.5 android的竞争优势 1.1.6 android模拟器 1.2 搭建android开发环境 1.2.1 准备工作 1.2.2 windows系统下的搭建过程 1.2.3 linux系统下的搭建过程 1.3 常见问题汇总 1.4 使用本书的配套实例 1.5 小结 第2章 android开发必备 2.1 android体系结构 2.1.1 各种库和android运行环境 2.1.2 应用程序框架 2.1.3 操作系统层 2.1.4 应用程序 2.2 android应用程序组成 2.2.1 activity 2.2.2 intent和intent filter 2.2.3 service介绍 2.2.4 broadcastintentreceiver 2.2.5 contentprovider 2.3 android应用项目文件组成 2.3.1 androidmanifest.xml文件 2.3.2 src目录 2.3.3 常量的定义文件 2.4 程序生命周期 2.4.1 android周期 2.4.2 android进程 2.5 activity的生命周期 2.5.1 activity状态 2.5.2 剖析activity 2.6 android进程和线程 2.6.1 进程 2.6.2 线程 2.6.3 远程调用(remote procedure calls) 2.7 intent消息传递 2.8 intent广播事件 2.8.1 广播事件 2.8.2 使用broadcast receiver监听广播 2.8.3 android本地广播 2.9 小结 第3章 设备界面演练 3.1 文字标签处理 3.2 改变屏幕窗口元素的背景颜色 3.3 改变textview的文字颜色 3.4 实现textview文字的替换 3.5 获取手机分辨率 3.6 样式修饰处理 3.7 按钮事件响应 3.8 页面间的转换 3.9 activity调用 3.10 多个activity间的数据传递 3.11 将数据返回到前一个activity 3.12 对话框交互处理 3.13 文字颜色置换 3.14 文字字体设置 3.15 拖动相片特效 3.16 简易计算器 3.17 about信息 3.18 加载中的程序 3.19 选择对话框 3.20 主题变换 3.21 小结 第4章 andfosd控件演练 4.1 实现文本处理 4.2 将背景图片作为按钮 4.3 用toast实现提示 4.4 用checkbox实现一个简单的物品清单 4.5 实现同意条款效果 4.6 radiogroup选择 4.7 imageview相框 4.8 spinner选择处理 4.9 gallery相簿 4.10 用.iava.io.file实现文件搜索 4.11 置换imagebutton按钮 4.12 实现autocompletetextview输入提示 4.13 实现analogclock时钟 4.14 时间选择 4.15 progressbar和handler进度条 4.16 动态排版处理 4.17 listactivity布局- 4.17.1 listactivity介绍 4.17.2 使用listactivity 4.18 matrix实现图片缩放 4.19 bitmap和matrix图片旋转 4.20 加载手机存储卡中的文件 4.21 小结 第5章 交互式服务 5.1 textview的花样 5.2 拨打电话程序 5.3 短信发送程序 5.4 e-mail发送程序 5.5 实现手机震动效果 5.6 图文提醒效果 5.7 状态栏提醒 5.8 检索通讯录 5.8.1 实现原理 5.8.2 contentprovider介绍 5.8.3 具体实现 5.9 文件管理 5.10 还原手机桌面 5.11 置换背景图 5.12 修改和删除文件 5.12.1 实现原理 5.12.2 java i/o基本类库介绍 5.12.3 具体实现 5.13 获取file和cache的路径 5.14 wi-fi服务 5.14.1 wi-fi简介 5.14.2 实现原理 5.14.3 具体实现 5.15 获取sim卡内信息 5.15.1 sim卡简介 5.15.2 实现原理 5.15.3 具体实现 5.16 触屏拨号 5.17 获取正在运行的程序 5.18 变换屏幕的方向 5.19 获取设备信息 5.20 小结 第6章 手机自动服务 6.1 实现短信提醒 6.2 剩余电量提醒 6.3 短信群发 6.4 短信e-mail通知 6.5 来电提醒 6.5.1 实现原理 6.5.2 telephonymanager和phonestatelistener 6.5.3 具体实现 6.6 存储卡容量 6.7 来电邮件通知 6.8 内存和存储卡 6.9 实现定时闹钟 6.10 黑名单 6.11 桌面背景图片轮换 6.12 监听发送短信状态 6.13 修改默认开机显示 6.14 小结 第7章 娱乐和多媒体应用 7.1 获取图片的宽和高 7.1.1 实现原理 7.1.2 位图操作的基本知识 7.1.3 具体实现 7.2 绘制几何图形 7.3 手机屏保 7.4 照片拖动效果 7.5 存储卡中的图片 7.6 获取内置媒体文件 7.7 调节音量 7.8 播放mp3资源文件 7.9 录制音频 7.10 实现相机拍照功能 7.10.1 实现原理 7.10.2 编程思想 7.10.3 具体实现 7.11 自制3gp影片播放器 7.12 小结 第8章 网络编程 8.1 http参数传递 8.2 浏览网页 8.3 使用html代码 8.4 用浏览器打开网页 8.5 将网络照片放入gallery中显示 8.6 网络音乐播放 8.7 远程下载铃声 8.8 远程下载背景 8.9 上传服务器 8.10 简易rss阅读器 8.11 远程下载安装android程序 8.11.1 apk简介 8.11.2 下载apk程序 8.11.3 安装apk程序 8.11.4 移除apk程序 8.11.5 本实例原理 8.11.6 具体实现 8.12 下载并观看视频 8.13 小结
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页