Struts2中值栈的理解

Struts2中值栈的理解 




一、拦截器的初始化

     如图所示呢,在一次请求过程中,拦截器首先会创建以及初始化一个值栈对象以供使用。初始化过程中,在Map对象里面放了request=,session=,application=,sttr=,parameters=,....;在Stack里放了action对象和其他一些对象(注意对象栈是先进后出,类似弹匣)。由此可见值栈的生命周期是一次请求

    另外的拦截器,比如说ModelDriven和Params也会对值栈对象进行操作。ModelDriven的初始化会把model压到栈顶

Params的初始化会把参数设置到值栈对象里,从栈顶开始先查找对象栈里对象的属性,找到就初始化进去,找不到再放到Map的parameters里面。    例如参数是这样:xx.action?id=3&name=ab&age=20&aaa=100,而栈中从栈顶的对象初始化依次为model(id=3 name=ab)、action(id age=20),而aaa参数会放到Map的parameters里面。

二、操作值栈

   1.在action类中对值栈的操作

     操作Map:  ActionContext.getContext()

                       .put(k, v)

                       .get(k)  

                      或者

                       ActionContext.getContext().getValueStack()

                       .put(k, v)

                       .get(k)

 

     操作Stack: ActionContext.getContext.getValueStack()

                          .push(obj)

                         .pop()


      2.在Result中操作值栈(大多在jsp文件中的操作)

      通过使用OGNL表达式操作值栈

       格式:struts.xml中,格式如${ognl}

                   Jsp文件中,格式如%{ognl},而且必须写在struts2的自定义标签的属性中,在外面不会被解析

       语法 user                 = findValue("user") *

                   #user               = map.get("user")

                   #user.name     = map.get("user").getName()

         * findValue()的查找顺序

        ①从对象栈的栈顶开始查找对象的属性,找到返回

        ②如果对象栈中找不到,进Map查找对应key,返回value,找到返回

    

例子:                  

<span style="font-size:18px;background-color: rgb(255, 255, 255);"><s:iterator value="#roleList">
	<s:property value="id"/>,
	<s:property value="name"/>,
	<s:property value="description"/>,
	<s:a action="role_delete?id=%{id}" οnclick="return confirm('确定要删除吗?')">删除</s:a>
	<s:a action="role_editUI?id=%{id}">修改</s:a>
	<br/>
</s:iterator></span>

 

    在值栈的Map里面有roleList的List,取出来循环

    循环标签还有个特定的功能,循环一次开始后,会把对象拿到栈顶,因此id,name,dedcription会取到当前对象的属性,这里的“%{}”可以省略。


看官看到这里会有一问:

EL表达式可以使用值栈吗?

       EL表达式原本的查找顺序为:

    page,request,session,application,找到返回。

    值栈并不在EL表达式的作用范围之内,因此不能使用。但是


    struts2对request对象进行了增强,即StrutsRequestWrapper对象,里面重写了getAttribute()方法:在request找不到之后到值栈里面找,因此

EL表达式的查找顺序变为:page,request,valueStack.findValue(),session,application。

所以上述例子也可以写为:

<s:iterator value="#roleList">
	${id},
	${name},
	${description},
	<s:a action="role_delete?id=%{id}" οnclick="return confirm('确定要删除吗?')">删除</s:a>
	<s:a action="role_editUI?id=%{id}">修改</s:a>
	<br/>
</s:iterator>

 

 

 

 

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
   1. struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件(通常为/WEB-INF/struts-config.xml)将各个请求分别分配给不同的action去处理。    一个扩展知识点:struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀;    2. ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(就是一个java类,这个类的每个属性对应一个请求参数),封装成一个什么样的formbean对象呢?看配置文件。    3.要说明的是, ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后才将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面由input属性指定,(看配置文件)作者为什么将这里命名为input属性,而不是error属性,我们后面结合实际的运行效果进行分析。    4.action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionforward对象通过struts-config.xml配置文件的配置关联到某个jsp页面,因为程序使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。
在OpenCV滤波是一种非线性滤波方式,用于减少图像的噪声。与线性滤波方式不同,滤波不是通过加权求均的方式计算滤波结果,而是用邻域内所有像素来替代当前像素点的像素。在OpenCV,可以使用`cv.medianBlur()`函数来实现滤波。该函数的参数`ksize`表示滤波核的大小,需要注意的是,滤波核大小必须是比1大的奇数,比如3、5、7等。 下面是一个使用滤波的示例代码: ```python import cv2 as cv def cv_show(name, img): cv.imshow(name, img) cv.waitKey(0) cv.destroyAllWindows() # 添加椒盐噪声 def add_peppersalt_noise(image, n=10000): result = image.copy() # 测量图片的长和宽 w, h = image.shape[:2] # 生成n个椒盐噪声 for i in range(n): x = np.random.randint(1, w) y = np.random.randint(1, h) if np.random.randint(0, 2) == 0: result[x, y = 0 else: result[x, y = 255 return result img = cv.imread('D:\\dlam.jpg') if img is None: print('Failed to read the image') # 添加椒盐噪声 img1 = add_peppersalt_noise(img) cv_show('after', img1) # 滤波,可对灰色图像和彩色图像使用 img2 = cv.medianBlur(img1, 3) cv_show('after1', img2) # ksize变大图像变模糊 img3 = cv.medianBlur(img1, 9) cv_show('after2', img3) ``` 这段代码首先读取一张图片,并使用`add_peppersalt_noise()`函数添加椒盐噪声。然后,分别使用`cv.medianBlur()`函数对添加了椒盐噪声的图像进行滤波处理。可以通过调整`ksize`的大小来观察滤波效果的变化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Opencv之图像滤波:5.滤波(cv2.medianBlur)](https://blog.csdn.net/qq_49478668/article/details/123485382)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值