Struts2中的传值实现
1.action接收jsp传过来的值:
a.定义一个User类 有name pwd属性, 添加相应的get,set方法
b.<!-- 方式1 普通java类 -->
在UserAction中
添加: private User user; 并添加相应的get,set方法
<!-- 方式2 实现ModelDriven<T>接口-->
1 2 3 4 5 | 在UserAction中 @Override public User getModel() { return user; } |
<!--方式3 在UserAction中 直接写属性>
1 2 3 4 5 6 | private String name; private String pwd; public String methodxxx() { User user= new User(); ...xxx; } |
注意:表单里面name定义的方式,根据name更改Action中方法的判断方式
c.jsp界面中添加form表单
(方式1)
jsp中input 属性中name="user.name"这么写框架就会自动new user();所以Action不能用user是否为空判断
1 2 3 4 5 6 | < form action = "User_register" method = "post" > < label style = "color:red;" >${errorMsg }</ label >< br /> 注册用户名< input type = "text" name = "user.name" />< br /> 注册密码< input type = "password" name = "user.pwd" />< br /> < input type = "submit" value = "注册" /> </ form > |
(方式2)
name="name"这么写如果没有值""则不会自动new User();可用user是否为空判断
1 2 3 4 5 6 | < form action = "User_register" method = "post" > < label style = "color:red;" >${errorMsg }</ label >< br /> 注册用户名< input type = "text" name = "name" />< br /> 注册密码< input type = "password" name = "pwd" />< br /> < input type = "submit" value = "注册" /> </ form > |
表单提交之后到UserAction的register中直接用user就可以了。
框架直接将数据存如user中了 已经
如果action中class未定义 则调用框架里面默认的action
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
---------------------------------以上内容在g:codespace/Struts2代码区间中 Test中--------------------------
2.action传值:
3种方式都是在action处理
(1)解耦合:间接使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public String execute(){ //获得Action的上下文 ActionContext ac=ActionContext.getContext(); //①获取传值对象 Map<String,Object> request=(Map<String, Object>) ac.get( "request" ); Map<String,Object> session=ac.getSession(); Map<String,Object> application=ac.getApplication(); //②存储值 request.put( "reqValue" , "这是通过request解耦合方式设置的值" ); session.put( "sessionValue" , "这是通过session解耦合方式设置的值" ); application.put( "applicationValue" , "这是通过application解耦合方式设置的值" ); return "success" ; } |
(2)实现RequestAware,SessionAware,ApplicationAware
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class TestAction02 implements RequestAware,SessionAware,ApplicationAware{ private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application; public String execute(){ //2.存储值 request.put( "reqValue" , "这是通过request解耦合RequestAware方式设置的值" ); session.put( "sessionValue" , "这是通过session解耦合SessionAware方式设置的值" ); application.put( "applicationValue" , "这是通过application解耦合ApplicationAware方式设置的值" ); return "success" ; } @Override public void setApplication(Map<String, Object> application) { this .application=application; } @Override public void setSession(Map<String, Object> session) { this .session=session; } @Override public void setRequest(Map<String, Object> request) { this .request=request; } } |
(3)直接使用 耦合方式
1 2 3 4 5 6 7 8 9 10 11 12 | public String execute(){ //耦合:直接使用 HttpServletRequest request=ServletActionContext.getRequest(); HttpSession session=request.getSession(); ServletContext application=ServletActionContext.getServletContext(); //2.存储值 request.setAttribute( "reqValue" , "这是通过request耦合方式设置的值" ); session.setAttribute( "sessionValue" , "这是通过session耦合方式设置的值" ); application.setAttribute( "applicationValue" , "这是通过application耦合方式设置的值" ); return "success" ; } |
------以上三种传值的同一实现的jsp
1 2 3 4 5 6 7 8 | jsp的取值界面 < h1 > request的值:${requestScope.reqValue }< br /> request的值:s标签---< s:property value = "#request.reqValue" />< br /> session的值:${sessionScope.sessionValue }< br /> session的值:s标签---< s:property value = "#session.sessionValue" />< br /> ... </ h1 > |
以上三种存值方式都是将值存放在Stack Context中
(4)值栈的使用
ValueStack 由 OGNL框架实现,可以把它简单的看作一个栈(List)
Stack Context(保存方式是map类型):stack的上下文,它包含一系列对象,包括
request,session,attr,application,map 等ValueStack中保存的值可以直接取,而stack中的需要在前面加#(request,session,application)
for example ①:(s:debug中有显示):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public String execute(){ ActionContext ac=ActionContext.getContext(); //vs将值推入Value Stack Contents 由ognl框架实现 ValueStack vs=ac.getValueStack(); user.setName( "张三" ); user.setPwd( "abc" ); vs.push(user); User u1= new User(); u1.setName( "李四" ); u1.setPwd( "2345" ); vs.push(u1); //这里将值传入Stack Context(保存方式是map类型)stack的上下文,它包含一系列对象 Map<String,Object> request=(Map<String,Object>)ac.get( "request" ); //2.存储值 request.put( "reqValue" , "这是通过request耦合方式设置的值" ); request.put( "user" , user); return "success" ; } |
jsp的取值界面
request中取值:<s:property value="#request.user.name"/><br/>
1 2 3 4 5 | < s:property value = "name" />< br /> <!-- 默认从栈顶开始找数据 --> < s:property value = "[0].name" />< br /> <!-- [0]值栈位置 --> < s:property value = "[1].name" />< br /> < s:property value = "[1].toString()" />< br /> <!--User类型中重写toString方法--> |
for example ②:(s:debug中无显示)
1 2 3 4 5 6 7 8 9 10 11 | public String execute() { ActionContext ac = ActionContext.getContext(); ValueStack vs = ac.getValueStack(); List<String> ls = new ArrayList<String>(); ls.add( "s1" ); ls.add( "s2" ); ls.add( "s3" ); vs.push(ls); return "success" ; } |
jsp的取值界面
1 2 3 4 5 | < s:iterator value = "[0]" > < s:property /> </ s:iterator > |
3. s标签调用方法
1 2 3 4 5 6 7 8 9 | <!--s:set设定值var 定义名字,value定义值 --> < s:set var = "n" value = "200" /> <!--s:property 调用值 详解请看http://blog.csdn.net/lfp0202/article/details/6188484 --> < s:property value = "#n" /> |
注意:s:property标签可以调用类的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | < s:property value = "[1].toString()" />< br /> <!--调用user类中的toString()方法--> <!-- 这个是调用静态方法的写法 --> <!-- 调用静态方法要开启:<constant name="struts.ognl.allowStaticMethodAccess" value="true"/> --> < s:property value = "@java.lang.Math@PI" />< br /> <!-- 调用jdk自带的静态方法,就可以省略类名 --> < s:property value = "@@PI" />< br /> < s:property value = "@com.yc.bean.User@add(3,6)" default = "没有调到" /> <!-- 普通值的存取 --> < s:set var = "n" value = "200" /> < s:property value = "#n" />< br /> <!-- 数组或者list对象的存取 --> < s:set var = "list" value = "{'lll','sss','ddd'}" />< br /> < s:iterator value = "list" > < s:property /> </ s:iterator >< br /> <!-- map对象的存取 --> < s:set var = "maps" value = "#{'aaa':'AAA','bbb','BBB','ccc','CCC' }" /> < s:property />< br /> < s:iterator value = "#maps" > < s:property value = "key" />------< s:property value = "value" /> </ s:iterator > <!--map<String,Object>这种样子的对象--> < s:iterator value = "profileMap" id = "entry" > < s:iterator value = "#entry.value" > < tr > < td >< s:property value = "id" /></ td > < td >< s:property value = "name" /></ td > < td >< s:property value = "birthday" /></ td > < td >< s:property value = "gender" /></ td > < td >< s:property value = "career" /></ td > < td >< s:property value = "address" /></ td > < td >< s:property value = "mobile" /></ td > </ tr > </ s:iterator > </ s:iterator > |