day61_struts2_03.2:【值栈valueStack的笔记+代码】

Struts2值栈与OGNL详解
本文详细介绍了Struts2框架中的值栈(ValueStack)概念及其内部结构,并深入探讨了OGNL表达式语言的功能及应用。文章还涵盖了如何在Struts2中操作值栈以及OGNL的高级特性。

笔记:

					
					struts2_03

今日内容:
	   1 值栈内容
	   
	   2 ognl内容


技术分析:

ognl内容
	
	ognl:它是一种功能强大的表达式语言
		作用:
			1 获取对象的方法(了解)
			2 获取类的静态属性(了解)
			3 获取类的静态方法(了解)
			
			4 获取值栈中的数据(重点)

	其实ognl是一个单独存在的表达式语言,struts把ognl这门语言整合到了自己的框架中,
	所有:struts2的默认表达式语言就是--ognl


	入门:
	   条件: ognl在页面没办法单独使用,要结合struts2的内置标签来使用。
			===【引入标签库,prefix: s:前缀,uri:alter+/自动补全。】

	   <!-- ongl的入门操作 -->
		<!-- 获取对象的方法(了解)   <s:property value="ognl表达式了" />  -->
		字符串hello的长度是: <s:property value="'hello'.length()" /><br/>
		<!-- 获取类的静态属性(了解)  条件: @类的全限定名@静态属性 -->
		π的值是: <s:property value="@java.lang.Math@PI" /><br/>
		<!-- 获取类的静态方法(了解)   条件: 1 @类的全限定名@静态方法  2:要配置常量,允许获取类的静态方法 -->
		获取随机数:<s:property value="@java.lang.Math@random()" /><br/>
		

	
 
////////////////////////////////////////////////////////////////////////////////////////////////////

值栈内容:  

  
   
   一:	什么是值栈?
		值栈: ValueStack

		①在web阶段我们是使用域对象当存储数据的中转站   数据---域对象---页面展示
						存储数据的结构:map


		②在struts2中提供了值栈可以也当存储数据的中转站  数据---值栈中---页面或则配置文件展示
						存储数据的结构:很复杂
						有2个区:
							 root区:    存储数据的结构是 list
							 context区: 存储数据的结构是 map

		值栈用来存储数据的

		①在浏览器发送请求访问action的时候,会被struts2的前端控制器(StrutsPrepareAndExecuteFilte)拦截
		在过滤器中,会创建action对象,且会创建ValueStack对象(特点:访问一次,创建一次)

		②创建完成后,会将整个actio对象放在ValueStack中,且还会将页面数据,request,session,servletContext用来存储数据的
		map集合放在ValueStack中(ps:存放的是地址的引用)

		③当请求的action执行完毕,action对象会被销毁,且ValueStack对象也会被销毁
		下次再访问有是一个新的action对象,和ValueStack对象。
		所以:### ValueStack和action的生命周期是同步的,ValueStack会伴随着action的一生

		struts2提供了一个值栈的接口:ValueStack 实现类: OgnlValueStack


    二: 值栈的内部结构? 
			域对象底层,用来存储数据的结构:map
			代码断点查看:见图。
			struts标签的方式查看。页面标签<s:debug />。存到 值栈 的对象的属性 必须有get set,这里才能看见。

 

  
    
    三: ActionContext与值栈的关系? 【容易忘--理解:actionContext能够获取ValueStack】######	
			ActionContext为什么可以获取到ValueStack?
			======看源码
			结论: 【在过滤器中,会创建ActionContext对象,并且创建valueStack对象,
			将valueStack对象的引用给了ActionContext对象。】######【牢记】
		 

    
    四:  值栈的获取方式? 
		2种方式

		1 通过ActionContext对象获取(掌握)
				ActionContext.getContext().getValueStack()


		2 通过request对象获取(了解)
			 看源码   request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
				  ===<"struts.valueStack",ValueStack>
			 
			 结论:
				 valuestack会往request域中放一份

			
			
    
    五: 如何操作ValueStack? ######

	①怎么往root区存取数据? ###
				
		1 属性设置的方式
			直接在action的成员位置上设置属性。===并提供get set?

			因为整个action对象的引用就在root区中。######


		2 ValueStack对象API的方式
			set(String key, Object o) 
				底层会【自动创建一个map集合】,将set的key放在map的key中,将set的value放在map的value中
				最后将封装好的map放在root区中(list)

			push(Object o)  存放【单个对象】的数据
			
			
	②怎么往context区存取数据?  ??





-----------------------------------------------------------------------------------------------
el也可以获取到值栈中的数据(了解---看得懂别人代码。---工作自己不会用)
		el ${属性名} 以前依次从 pageContext,request,session,application查找
			###### 在struts中是以上没有找到,还会去root区和context区查找
	
	
	
	底层:
		之前的el的${username} 
			先调用pageContext.getAttribute(..)
				获取到,立即返回
				获取不到,继续调用
					request.getAttribute(..)
				------【会有一个现象:EL取request域对象值的方式,也可以取到值栈里put方法存的数据。】
				------【解释:源码:找不到,会再去值栈去找(先Root区,再Context区---不深究):因为struts2封装增强了servlet request。】
						获取到,立即返回
						获取不到,继续调用
							session.getAttribute(..)
								获取到,立即返回
								获取不到,继续调用
									application.getAttribute(..)
										获取到,立即返回
										获取不到,返回""
										
	
	在struts中的el的底层:装饰者模式
		包装了request.=== 对request.getAttribute方法进行了增强.
			先依次以以前的方式查询
			若都没有查询到,调用了 valueStack.findValue(..)从值栈中查找
				

-----------------------------------------------------------------------------------------------


ognl中的3个特殊符号:	#  %  $       =====###### 【常用,容易忘 容易错】


① #的作用:
	  1 获取context区域中的数据。===ok(页面取值用)【常用,容易忘 容易错】
	
	  2 可以手动构建一个集合 ===

		<!-- 手动构建的list集合 -->
		<s:iterator value="{'aa','bb','cc'}" var="aa">
				<s:property value="#aa"/>
		</s:iterator>

		<!-- 手动构建的map集合 -->
		<s:iterator value="#{'aa':'111','bb':'222','cc':'333'}" var="mm">
					<s:property value="#mm.key"/>----><s:property value="#mm.value"/><br/>
		</s:iterator>

		<s:radio list="{'男','女'}" name="sex"></s:radio> 
		<s:radio list="#{'1':'男','2':'女'}" name="sex"></s:radio>
		===struts2的页面标签。(暂时不深究)


② %的作用:
	强制将标签内容转换成ognl表达式。=====【常用,容易忘 容易错】
	<s:textfield value="%{#request.abcd}"></s:textfield>
	


③ $的作用: 
	  可以在配置文件中获取值栈的数据。=====【常用,容易忘 容易错】

		例如文件下载:
			<a href='/crm/download.action?filename=1.jpg'>下载图片</a>
			返回逻辑视图
			在action中提供其中一个属性 filename。====提供get set吗?
				
			配置文件中
				<action name="download" class="..." method="">
					<result type="stream">
						<param name="content-disposition">filename=${filename}</param>
					</result>
				</action>

	

案例 
list



代码(值栈实用知识点 总结):######

http://pan.baidu.com/s/1qYjvHl6

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
<think>好的,用户现在的问题是关于如何解决dmesg中显示的pciehp和IPv6 ADDRCONF错误日志,以及第五步的具体操作。我需要结合之前的引用和之前的对话来给出解决方案。首先,回顾之前的引用,引用[1]提到了掉盘问题,dmesg中有qctimeout的错误,这可能与硬件或驱动有关。引用[2]则建议启用一些调试选项,比如CONFIG_DEBUG_KERNEL等,来获取更多信息。引用[3]是关于主机名管理的,可能和当前问题无关。引用[4]是代码片段,可能也不相关。用户之前的问题是关于内核配置的,现在转向了具体的错误日志解决。需要分析pciehp和IPv6的错误。pciehp错误通常和PCI Express热插拔有关,可能是硬件连接问题或驱动问题。IPv6的ADDRCONF错误一般和网络配置有关,比如重复地址或配置错误。首先,针对pciehp的Failed tocheck linkstatus错误,应该检查硬件连接,更新内核驱动,或者调整内核参数。可能需要升级内核或BIOS,或者禁用pciehp模块。然后,IPv6的错误可能需要检查网络配置,禁用IPv6或调整相关内核参数。第五步用户提到,可能是在之前的回答中提到的步骤中的第五步,但用户没有明确说明。需要根据上下文推断。之前的回答中,用户可能有一个解决问题的五步流程,第五步可能是应用补丁或更新系统。需要明确第五步的具体内容,可能需要结合之前的建议,比如更新内核或应用补丁。需要引用引用[2]中的调试选项,比如启用CONFIG_DEBUG_KERNEL来获取更多信息。同时,检查硬件和驱动,如引用[1]中的ATA错误可能与硬件有关,可能需要检查SATA线或电源。 另外,用户可能是在内核编译或配置后出现这些错误,因此可能需要检查内核配置是否正确,是否启用了必要的模块,如PCIe热插拔支持或IPv6相关选项。 总结解决步骤:1.检查硬件连接;2.更新驱动和内核;3.调整内核参数;4.网络配置调整;5.应用补丁或更新系统。需要详细说明每一步的具体操作,并引用相关引用中的调试方法。</think>### 解决`dmesg`中`pciehp`与IPv6错误日志的步骤及第五步操作 --- #### 一、`pciehp Failed to check link status`错误分析 **问题原因** 该错误通常与**PCIe热插拔控制器驱动**相关,可能由以下原因导致: 1. **硬件连接不稳定**:PCIe插槽接触不良或设备供电不足[^1] 2. **驱动兼容性问题**:内核模块`pciehp`未正确适配硬件 3. **固件/BIOS缺陷**:主板固件对PCIe热插拔支持不完善 **解决步骤** 1. **硬件检查** - 重新插拔PCIe设备(如显卡、NVMe SSD) - 检查PCIe插槽金手指是否氧化,使用无水酒精清洁 - 确保设备供电稳定(如12V/3.3V电压波动需小于$5\%$) 2. **驱动更新与调试** ```bash # 查看当前加载的pciehp模块参数 grep -i pciehp /boot/config-$(uname -r) # 若需禁用热插拔功能(临时) echo "N" | sudo tee /sys/bus/pci/slots/*/power ``` 3. **内核参数调整** 在`/etc/default/grub`的`GRUB_CMDLINE_LINUX`中添加: ```bash pcie_port_pm=off pcie_aspm=off ``` 更新GRUB后重启: ```bash sudo grub2-mkconfig -o /boot/grub2/grub.cfg ``` --- #### 二、IPv6 `ADDRCONF`错误处理 **问题特征** 日志示例: ```bash IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready ``` **原因**:网络接口在IPv6地址自动配置时检测到冲突或链路层未就绪[^3] **解决方案** 1. **禁用IPv6自动配置** ```bash # 临时关闭 sysctl -w net.ipv6.conf.all.disable_ipv6=1 # 永久生效 echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf ``` 2. **检查网络接口配置** ```bash # 确认网卡驱动状态 ethtool -i eth0 | grep driver # 更新驱动(以Intel网卡为例) modprobe -r e1000e && modprobe e1000e ``` 3. **调整内核网络参数** 在`/etc/sysctl.conf`中增加: ```bash net.ipv6.conf.default.accept_ra=0 net.ipv6.conf.eth0.accept_ra=0 ``` --- #### 三、第五步:**内核调试与日志分析** **操作目标**:通过启用调试功能定位深层问题[^2] 1. **重新编译内核时启用调试选项** 在`.config`文件中确保以下配置: ```bash CONFIG_DEBUG_KERNEL=y CONFIG_DETECT_HUNG_TASK=y CONFIG_DEBUG_PREEMPT=y CONFIG_DEBUG_INFO=y ``` 2. **捕获完整错误堆** ```bash # 触发错误后收集信息 dmesg -T -l err | grep -E 'pciehp|IPv6' # 生成内核转储文件 echo 1 > /proc/sys/kernel/sysrq echo c > /proc/sysrq-trigger ``` 3. **分析工具** ```bash crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux /var/crash/dump ``` --- ### 数学表达补充 在调试PCIe链路稳定性时,可量化信号质量: - 若信号误码率$P_e$满足$P_e \leq 10^{-12}$,则认为链路可靠 - 功率完整性需满足$\Delta V \leq V_{nominal} \times 5\%$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值