首页 > 代码库 > Struts2学习笔记(2)值传递

Struts2学习笔记(2)值传递

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

 注意:下面的jsp在取到值时会自动的new User()对象。所以在methodXXX中必须判断属性而不能用User是否为空
  
 
 c.jsp界面中添加form表单

  <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=http://www.mamicode.com/"注册"/>> 

  
 表单提交之后到UserAction的register中直接用user就可以了。
  框架直接将数据存如user中了  已经

 如果action中class未定义  则调用框架里面默认的action

 <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />

---------------------------------以上内容在g:codespace/Struts2代码区间中 Test中--------------------------

2.action传值jsp中接受
 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=http://www.mamicode.com/"#request.reqValue"/>
>

 
  
 (4)不知道怎么说----------------------------此处有待改进
  
  ValueStack 由 OGNL框架实现,可以把它简单的看作一个栈(List)
  Stack Context(保存方式是map类型):stack的上下文,它包含一系列对象,包括
  request,session,attr,application,map 等ValueStack中保存的值可以直接取,而stack中的需要在前面加#(request,session,application)
  
 

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

  <h1>
   <s:property value=http://www.mamicode.com/"#request.user.name"/>
>

注意:s:property标签可以调用类的方法