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="注册"/> </form>
表单提交之后到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="#request.reqValue"/><br/> session的值:${sessionScope.sessionValue }<br/> session的值:s标签---<s:property value="#session.sessionValue"/><br/> ... </h1>
(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="#request.user.name"/><br/> <s:property value="[0].name"/><br/> <s:property value="[1].name"/><br/> <s:property value="[1].toString()"/><br/> </h1> <s:debug/>
注意:s:property标签可以调用类的方法
Struts2学习笔记(2)值传递