上学的时候 ,也没学什么 ,年底了 工作不忙 就开始自己研究S2SH了,刚能整合到一起就遇到了一个问题,先上代码:
package com.myclass.test.action;import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Controller;import com.myclass.test.dto.UserDTO;
import com.myclass.test.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
@Controller("UserAction")
public class UserAction extends ActionSupport {
@Resource
private UserService userService;
private String userName;
@Override
public String execute() throws Exception {
//System.out.println("---"+userName);
userService.addUser(new UserDTO(userName)); ActionContext ac=ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
System.out.println("@@"+request.getParameter("userName"));
ActionContext.getContext().put("message", userName);
return SUCCESS;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}}
我现在想问的时,userName 这个属性,是Struts2可以自己根据页面(JSP)传来的表单
给赋值进去的,那么我用
ActionContext.getContext().get("userName")
为什么取不到值呢,得到一个null但是
ActionContext ac=ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
System.out.println("@@"+request.getParameter("userName"));
这样就可以呢?而且这样也是可以的
ActionContext ac=ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
System.out.println("@@"+request.getAttribute("userName"));
那么 ActionContext.getContext().get("userName") 这样实在哪里取得的值呢?
package com.myclass.test.action;import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Controller;import com.myclass.test.dto.UserDTO;
import com.myclass.test.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
@Controller("UserAction")
public class UserAction extends ActionSupport {
@Resource
private UserService userService;
private String userName;
@Override
public String execute() throws Exception {
//System.out.println("---"+userName);
userService.addUser(new UserDTO(userName)); ActionContext ac=ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
System.out.println("@@"+request.getParameter("userName"));
ActionContext.getContext().put("message", userName);
return SUCCESS;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}}
我现在想问的时,userName 这个属性,是Struts2可以自己根据页面(JSP)传来的表单
给赋值进去的,那么我用
ActionContext.getContext().get("userName")
为什么取不到值呢,得到一个null但是
ActionContext ac=ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
System.out.println("@@"+request.getParameter("userName"));
这样就可以呢?而且这样也是可以的
ActionContext ac=ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
System.out.println("@@"+request.getAttribute("userName"));
那么 ActionContext.getContext().get("userName") 这样实在哪里取得的值呢?
解决方案 »
- 求一段正则表达式
- SoftReference 做缓存
- 中文乱码问题
- 找些JSP+TOMCAT+javaBeen方面的小项目练习
- 个人对 hibernate 的一点愚见。
- 向数据库添加商品总是报异常,不知道代码哪错了
- MyEclipse的package的问题??
- 求救高手,jdbc连接数据库问题。调试一百遍都出错。
- 关于Context.lookup()的问题 求救!
- 请问我的jbuilder7企业版,装上去后,找不到jframe是什么原因????
- 谁能帮我看一下@JoinColumns…这行代码里是什么意思?
- 用管理员身份登陆修改物品信息提示: Servlet.service() for servlet changeservlet threw exception
System.out.println("@@@@@@@@@@@"+ ServletActionContext.getRequest().getParameter("userName"));
System.out.println("@@@@@@@@@@@"+ ServletActionContext.getRequest().getAttribute("userName"));
以上都能取到值
而且
System.out.println("------"+((Map)(ActionContext.getContext().get("request"))).get("userName"));
和ActionContext ac=ActionContext.getContext();
HttpServletRequest request=(HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
System.out.println("request:"+request.getParameter("userName"));
应该是等价的那我就又有一个疑问了
ActionContext.getContext().get("userName") 这样取得不到值那么 在Action 中
[code]ActionContext.getContext().put("message", userName);[/code]刚进去的值 在JSP
[code]System.out.println(request.getAttribute("message")); [/code]这些写就能取到那ActionContext.getContext().put 就是放到了request中
但为什么ActionContext.getContext().get 就在request中取不到值呢纠结了
ActionContext中包含 ValueStack,request,session,application、 , 、 attr、parameters这些对象,而这些对象之后又包含了userName这个值的。
就像你一个房间里的一个衣柜里面放了一件衣服。
你直接打开房间而不打开衣柜是拿不到衣服的。。
另外给你一个建议,你可以把结果返回到一个jsp页面中,jsp页面中加上<debug></debug>,注意引入struts标签。
然后看返回给你的jsp页面,上面包含页面中所有的值,那个值在哪个对象下面都是很清楚的。
S2Sh 都是我自己看的 真的 没什么老师
这些技术一个来学吧。
你先找一些基本的Struts2例子做做吧。。感觉做完了基本学的就差不多了
ActionContext.getContext().put("message", userName);get时key变成了userName?
兄弟 你没买看明白吧 我没有那么二 userName 是我在页面传进来的参数。
别说那些没有用的。
要是不明白就别回答。
我最近没有时间,要不让我就自己下载源代码看了。
ActionContext.getContext().get("userName");
这是你代码里面拷出来的
我说点啥好呢 username 是我要在Action里取出来的东西
message 是我后续要放进去的 这个很好理解的吧
struts2自动放进去的userName好像并不在ActionContext这个大的对象里面
也在ActionContext 这里里面 但是不能直接取到
你用<s:debug/>看就行了
首先非常赞同2楼回答,例子也很形象。
我觉得ActionContext.getContext().put("xxx", yyy)是put进了context最下层,而request是在中间层,这样用request.getAttribute能取出put进去的值。
相同的是ActionContext.getContext().get首先会去request中间这一层找,发现找不到username所以取不出,而用ActionContext.getContext().request.get就到最下层去找到username自然就取出来啦.
ActionContext.getContext.put()方法将key-value存放在ActionContext中,该方法可用于向HttpServletRequest存入属性。 HttpServletRequest中的getAttribute(String s)和getParameter(String s)方法本质是不一样,不然为啥写两个方法呢。
一个是获取request范围内属性值,一个是获取请求参数值。
上述说明和LZ的实例验证的结果有出入,就是调用get方法可以拿到值,而调用request.getAttribute却拿到值了。因此本人同样
编写了简单的demo如下测试
ActionContext ac = ActionContext.getContext();
HttpServletRequest request =
(HttpServletRequest)ac.get(ServletActionContext.HTTP_REQUEST);
String para = (String)request.getAttribute("para");
logger.info("attribute[para]=" + para);
String par2 = (String)request.getParameter("para");
logger.info("parameter[para]=" + par2);
String par3 = (String)ac.get("para");
logger.info("context.get[para]=" + par3);
ac.put("mes", "putValue");
String mes = (String)request.getAttribute("mes");
logger.info("attribute[mes]=" + mes);
输出结果如下:
attribute[para]=null //requst属性中没有这个值。
parameter[para]=test //请求参数中的值
context.get[para]=null //同1
attribute[mes]=putValue //自行设置的属性值,可以获取
结果和最开始介绍的get,set方法保持一致,就是get,set方法其实是操作的HttpServletRequest中的属性。
lz的例子中通过getAttribute能获取到值,是不是在别的地方调用setAttribute方法了?
相比楼主传过来参数的形式是?xxx=xxVALUE吧
不能用get方法去取
它的内部结构是是一个OGNL值栈,本质上是一系列的MAP,所以楼主直接取一个键值对的值是取不到的。
对于页面请求所传的参数,Struts2会调用params拦截器压入值栈中的params map中,然后通过反射调用action里的set方法给属性赋值。所以想要通过get(key)的形式获取值,必须先获取params,即"getParameters()"。
另外,ActionContext的实现主要是为了与底层web解耦,所以不应该与底层web对象httprequest打交道。如果楼主实在是想实现类似于request.getParameter("userName"))的用法,可以使用ServletActionContext对象,它可以与servlet api打交道,可以通过ServletActionContext. getRequest()获取HttpRequest对象,实现楼主的用法。