关于struts2传参的一些看法

以下是我刚接触struts不久(一天不到)之后,对struts2传参数的一些看法,求拍砖,求指导。

请先移步到OGNL官方文档解释

再看看以下的例子:

<a href="<%=request.getContextPath()%>/show.do?id=1&name=bin" >我是连接</a>


struts.xml

<action name="show" class="action.ShowAction" method="show"> 
<result name="success" >/next.jsp</result> 
<result name="error">/index.jsp</result>
</action> 


ShowAction类的show方法:

public String show() throws Exception {

ActionContext ac=ActionContext.getContext();
String id=((String[])ac.getParameters().get("id"))[0];
String name=((String[])ac.getParameters().get("name"))[0];
ac.getSession().put("test", "just a test");//讲test放入ActionContext的session里面
ac.put("id", id);//将name放入ActionContext的valuestack
ac.put("name",name);//将name放入ActionContext的valuestack
return "success";

}


Next.jsp:

 <p>id:<s:property value="id" /> </p> 
 <p>name:<s:property value="name"/></p> 

 <p>name:<s:property value="#session.test"/></p> 


下面说说我自己的看法:

对于每一个req(请求),服务器有有一条对应线程去处理。ActionContext.getContext()会得到一个线程的安全Action上下文。这个Action上下文里面有request,valuestack,parameter等servlet对象(其实servlet的对象是继续这个类的)。

The framework sets the OGNL context to be our ActionContext, and the value stack to be the OGNL root object. (The value stack is a set of several objects, but to OGNL it appears to be a single object.) Along with the value stack, the framework places other objects in the ActionContext, including Maps representing the application, session, and request contexts. These objects coexist in the ActionContext, alongside the value stack (our OGNL root).

                     |--application
                     |
                     |--session
       context map---|
                     |--value stack(root)
                     |
                     |--request
                     |
                     |--parameters
                     |
                     |--attr (searches page, request, session, then application scopes)
                     |
那么我们访问这些参数其实都是通过OGNL方式去获得他们。上面的id,name是放在valuestack里面,test是放在session里面。至于为什么呢,因为OGNL context是ActionContext,而valuestack是OGNL的根元素,所以valuestack是ActionContext的根元素(看英文解释)。所以我们可以直接取得,而不需要“#”( In expression, the properties of the root object can be referenced without any special "marker" notion. References to other objects are marked with a pound sign (#).

---------------------华丽的分割线-----------------------------------------------------

下面从

 <p>id:<s:property value="id" /> </p> 
 <p>name:<s:property value="name"/></p> 

 <p>name:<s:property value="#session.test"/></p> 

说起:

当服务器遇到struts2的标签的时候,服务器首先解释他们,然后就会按照OGNL去寻找这些value,那么就会去ActionContext的valuestack,request,session等寻找这些value。那么我们如何将这些值放到ActionContext里面呢?有两个方法:

第一:设置对应的属性的get,set方法;

第二:ActionContext.getContext.put(key,value);

对于第一种,一般都是form提交,

<form action="login/hello.do" method="post">
用户名:
               <!-- 参数名和action中的属性名一样  -->
<input type=text name=userName>
<br>
密码:
<input type=password name=passWord>
<br>
<input type=submit name=subm value="提交">
<input type=reset name=reset value="取消">
</form>

对于第二种,多用于前台使用 <p>id:<s:property value="id" /> </p> 

但是以上的原理都是一致的,就是在ActionContext里面寻找对应的值。


下面再看看这种:

struts.xml

<action name="show" class="action.ShowAction" method="show"> 
<param name="tt"></param>
<result name="success" type="chain">next</result> 
<result name="error">/index.jsp</result>
</action> 


<action name="next" class="action.NextAction" method="next"> 
<result name="success" >/next.jsp</result> 
<result name="error">/index.jsp</result>
</action> 


Next.jsp:

 <p>id:<s:property value="id" /> </p> 
 <p>name:<s:property value="name"/></p> 

 <p>name:<s:property value="#session.test"/></p> 

  <p>tt:<s:property value="tt"/></p> 


ShowAction类的show方法:

private String tt;

public void setTt(String tt){
this.tt=tt;
}
public String getTt(){
return this.tt;
}

public String show() throws Exception {

ActionContext ac=ActionContext.getContext();
String id=((String[])ac.getParameters().get("id"))[0];
String name=((String[])ac.getParameters().get("name"))[0];
ac.getSession().put("test", "just a test");//讲test放入ActionContext的session里面
ac.put("id", id);//将name放入ActionContext的valuestack
ac.put("name",name);//将name放入ActionContext的valuestack

tt=“I am tt";

return "success";

}

NextAction类的next方法:

public String next() throws Exception {

return SUCCESS;
}


用show.action传参数到next.action。由以上可以看出,使用<result name="success" type="chain">next</result> 的chain,showAction的ActionContext的所有内容会复制到NextAction的ActionContext里面,所以id,name,session可以直接有值的。那么<param>标签呢?网上给的大多数是<param name="param1">${param1}</param> 但是在我机器上  <p>param1:<s:property value="param1"/></p>是取得 ${param1}这个字符串,而不是里面的内容,而直接<param name="param1"></param>即可取得里面的内容。


总结:

以上逻辑乱说可能表达不出我想说的话。现在试一下总结

  不管往前台往后台传参数,还是后台往前台传参数,本质是一样的。都是从ActionContext里面的valuestack,request,parameter里面取得。使用set,get方法可以用ActionContext里面放入值,使用ActionContext.getContext().put(key,value)也可以往ActionCo里面放入值。

那么在前台可以使用OGNL表达式取得ActionContext的对象,后台使用set,get方法取得ActionContext的对象


请大神们拍砖!


PS:以form形式提交的参数,是后台是这样获取的:

<form action="login/hello.do" method="post">
用户名:
               <!-- 参数名和action中的属性名一样  -->
<input type=text name=userName>
<br>
密码:
<input type=password name=passWord>
<br>
<input type=submit name=subm value="提交">
<input type=reset name=reset value="取消">
</form>

String username=((String[])ActionContext.getContext().getParameters().get("userName"))[0];

String password=((String[])ActionContext.getContext().getParameters().get("passWord"))[0];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值