简单理解struts中的ValueStack(VS)+实例
来源:互联网 发布:plc与单片机应用场合 编辑:程序博客网 时间:2024/04/30 03:26
1.值栈入门
下面我们建立struts_study项目来练习ognl的使用。
步骤一、搭建strust2的开发环境
步骤二、建立LoginAction,主要代码如下:
package com.yanglic.action;
public class LoginActionextends ActionSupport{
private Useruser;
public String execute()throws Exception {
return SUCCESS;
}
...省略user的get/set方法
}
步骤三、配置此Action,struts.xml的主要内容如下:
<struts>
<constant name="struts.devMode"value="true"></constant>
<package name="ognl"extends="struts-default">
<action name="login"class="com.yanglic.action.LoginAction">
<result>/loginSuc.jsp</result>
</action>
</package>
</struts>
步骤四、编写login.jsp页面,主要代码如下:
<body>
<form action="<%=request.getContextPath()%>/login.action" method="get">
用户名:<inputtype="text"name="user.username"><br>
密 码:<inputtype="password"name="user.password"><br>
<input type="submit"value="login">
</form>
</body>
步骤五、编写loginSuc.jsp页面,主要代码如下:
<body>
调试:<s:debug></s:debug>
获取值栈中的username属性:<s:propertyvalue="user.username"/> <br>
</body>
注意:在此需要导入Struts-tags标签
<%@taglib prefix="s" uri="/struts-tags" %>
步骤六、发布测试及说明
当我们输入用户名并成功跳到logSuc.jsp页面后,会得到登录时输入的用户名信息。下面简要说明这一过程:
(1).login.jsp登录提交登录信息给login.action
(2).struts2监听到客户端的login.action请求,按配置文件要求,把此请求交给LoginAction处理。这表示会去new LoginAction(), 当struts2 new出此Action对象后会把这个对象放在context map中,只是这个Action非常特殊,所以放在值栈中,而放在值栈中的对象是可以直接引用的,放在其它context map中的对象引用时会要求加#。
(3).当new LoginAction时,表示它也会初始化此类中的对象,比如这里会去初始化User对象,但是要注意的是如果我们在用户名和密码什么都不输,再来用debug来看值栈中的user是,发现它仍会new此对象,因为尽管我们没用输入值,但是后台的set方法还是要被调用,所以会new出此对象,但是如果我们直接输入.../struts2ognl/login.action时我们会发现跳转到loginSuc.jsp页面时,用debug来看值栈中此User user,发现它的值为null。第二点要注意的是我们必须为User类提供默认的构造方法,否则将会出现如下错误: java.lang.InstantiationException: com.asm.vo.User
总结:1.Action会在请求时被创建,且会把创建的对象放到值栈中。
2.Action中的对象字段只有在需要时才会以new的形式初始化,而且这些对象字段必须提供默认的构造方法。
3.ValueStack对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(vs对象相当于一个栈)。
补充:值栈(根)对象也可以直接使用EL表达式访问,比如这里可以直接通过${user.username}来获取username的值,我们知道el表达式只能访问四种scope范围内的对象,那为什么这里能访问到值栈对象呢?原因是struts2对HttpServletRequet进行了一次封装,封装的代码主要是重写了getAttribute方法,简述重写此方法的核心代码:首先在原始的HttpServletRequest对象中查找el表达式中的属性,如果找不到再通过ActionContext获取值栈对象,进而再从值栈对象中查找el表达式中要访问的属性。
- 简单理解struts中的ValueStack(VS)+实例
- Struts用的ognl和valueStack(vs)的理解+实例
- Struts2中的ValueStack理解
- 简单理解OGNL、ActionContext、ValueStack
- struts.valueStack
- Struts--valueStack
- (十一)Struts2中ognl中的ValueStack理解
- ValueStack 理解
- struts.valueStack讲解
- struts,ognl,valuestack
- struts ValueStack 取值
- Struts valueStack.getParameter()
- Struts源码之ValueStack
- Struts OGNL and ValueStack
- struts ValueStack 详解
- 【Struts】ValueStack对象
- Struts ValueStack解析
- 简单的struts实例
- C#中对byte类型的处理还是很特殊的。
- POJ2389 FFT 大数乘法
- Mysql 常用函数总结(其他函数)
- 微信公众号【客服接口】
- iOS NSFileHandle详解
- 简单理解struts中的ValueStack(VS)+实例
- OkHttp基本使用方式
- 临时保存文件
- 杭电 2068 ( RPG的错排 ) 排列组合+错排
- IP 地址和 Int 型之间的转换
- hibernate的执行流程
- 部分的缩写规范
- android-studio如何获取调试版和正式版sha1值
- JS常用函数集合