文档章节

Struts2学习笔记(2)值传递

夜店小新新
 夜店小新新
发布于 2014/08/15 09:01
字数 1337
阅读 235
收藏 9

Struts2中的传值实现


1.action接收jsp传过来的值:
 a.定义一个User类   有name  pwd属性,  添加相应的get,set方法
  
 b.<!-- 方式1 普通java类 -->
  在UserAction中
   添加: private User user;  并添加相应的get,set方法

  <!-- 方式2 实现ModelDriven<T>接口-->

  在UserAction中
  @Override
  public User getModel() {
   return user;
  }

  
  <!--方式3 在UserAction中 直接写属性>
  

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是否为空判断
 

 <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是否为空判断

  <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)解耦合:间接使用
 

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
 
 

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)直接使用  耦合方式

  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
  

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中有显示):
  

  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/>
   

<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中无显示)
  

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的取值界面

   <s:iterator value="[0]">

    <s:property/>

   </s:iterator>

   
  
  
3. s标签调用方法

 <!--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标签可以调用类的方法

<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>

© 著作权归作者所有

夜店小新新
粉丝 1
博文 4
码字总数 4418
作品 0
朝阳
程序员
私信 提问
day25_Struts2学习笔记_01

一、框架概述   把重复性的繁琐的代码起来。使程序员在编码中把更多的精力放业务需求的和上面。   :封装了很多细节,程序员在使用的时候会非常简单。 三大框架:Struts2、Spring、Hiberna...

黑泽明军
2018/06/23
0
0
Struts2的学习笔记(3)

很久没发表了,不代表我没在学习struts2啊,对吧?好,下面还是把我的一些笔记供出来给大家参考指正吧? 1、Struts2应用的分层体系架构: 2、Struts2的模型驱动(Model Driven),之前所学的...

larch
2012/04/13
220
0
ognl-值栈基本操作

一 OGNL概述 1 之前web阶段,学习过EL表达式,EL表达式在jsp中获取对象里面的值 2 OGNL是一种表达式,这个表达式功能更加强大 (1)在Struts2里面操作值栈数据 (2)一般在Struts2里操作ogn...

Bbigbug
2017/10/16
0
0
【学习笔记6】Result配置的各种视图转发类型

<action name="helloworld" class="cn.itcast.action.HelloWorldAction"> </action> result配置类似于struts1中的forward,但struts2中提供了多种结果类型,常用的类型有: dispatcher(默认值......

张超
2013/04/11
110
0
Struts2 校验框架学习笔记

truts2 校验框架 Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插件,而是已经内置到了Struts2中,而且配置起来更为简单方便,功能也更强大。 下面以一个例子...

jxlgzwh
2014/03/18
234
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
31分钟前
4
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
41分钟前
4
0
《DNS攻击防范科普系列3》 -如何保障 DNS 操作安全

引言 前两讲我们介绍了 DNS 相关的攻击类型,以及针对 DDoS 攻击的防范措施。这些都是更底层的知识,有同学就来问能否讲讲和我们的日常操作相关的知识点,今天我们就来说说和我们日常 DNS 操...

Mr_zebra
41分钟前
4
0
zk中ServerCnxn

实现接口Stats, Watcher 内部类 DisconnectReason CloseRequestException EndOfStreamException(流关闭) 属性 方法 getSessionTimeout 获取session失效时间 sendResponse 发送回复数据 se......

writeademo
46分钟前
4
0
如何将 Redis 用于微服务通信的事件存储

来源:Redislabs 作者:Martin Forstner 翻译:Kevin (公众号:中间件小哥) 以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也...

中间件小哥
49分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部