怎样将jsp页面中的提交参数读入到Action中?

(1)setorder.jsp页面

填写顾客信息

姓名:
地址:

(2) Struts2中配置的对应配置如下

    <action name="orderok" class="edu.njupt.action.OrderBookAction">
        <result name="success">/shopjsp/orderok.jsp</result>
        <result name="input">/shopjsp/setorder.jsp</result> 
         <interceptor-ref name="adlogininterceptor"/>       
    </action>

Adlogininterceptor是自定义的一个拦截器,用于区分登录用户与非登录用户。
(3)OrderBookAction类的excute()成员方法代码如下:
public String execute() throws Exception {
//不用判断用户是否登录,由Struts拦截器来判断
//生成订单,确认用户信息,添加至数据库-订单表
Order order = new Order();//Order是个订单类
Map request = (Map)ActionContext.getContext().get("request");
realname = (String)request.get("realname");
System.out.println(realname);
address = (String)request.get("address");
System.out.println(address);
order.setRealname(realname);
order.setAddress(address);

//添加到数据库
bookcontrol.CreateOrder(order);
return "success";
}
(4)问题:

后台会报错,realname,address都显示为null,在OrderBookAction类中已定义了realname,address变量,并提供了get/set方法,也传递了参数orderok.action? realname=%B0%A2%C4%AC&address=%D0%C2%C4%A3%B7%B6%C2%ED%C2%B766%BA%C5,为什么在excute()方法中读取不到页面提交的数据呢?怎样解决?谢谢!

(1)将method设为“get”以及excute()方法中添加那些打印参数语句是为了调试用的。在实际的setorder.jsp中提交的不只是realname,address两个参数,还提交了另外一些参数,有些参数并不是Order类的属性,请问这是否影响结果?是否还能在setorder.jsp中用order.address?
答:
1.Order类的属性直接使用我说方法
2.不是Order类的属性,是其他PO类的属性,只要在action中有该PO的set,get方法即可将值设置到该po的属性中
3.是其他值
a.作为action的变量并 设置get,set方法;
b。不作为action的变量。使用request.getParameter("");获得该值。

(2)在数据库中order表的属性为name,address,并非setorder.jsp对应的realname,address,并且在Order.hbm.xml中配置的也是name,address,请问这是否也是可能不能得到正确结果的原因?

答: 上面的第3中情况。
是可以获得正确的结果的

拦截器设置的有问题吧? 先去掉拦截器试试??

第一步:
(1)setorder.jsp页面


改为:

第二步:
(2) Struts2中配置的对应配置如下 。。
在execute()方法中:
Map request = (Map)ActionContext.getContext().get("request");
realname = (String)request.get("realname");
System.out.println(realname);
address = (String)request.get("address");
System.out.println(address);

不需要这样。你只要提供了realname,address的get,set方法。struts2会根据ognl将之设置到realname,address。
即 直接:
order.setRealname(realname);
order.setAddress(address);

当然以上只是根据你的需求来实现的解决方案

最好的做法是:

1.在jsp页面:

姓名:


改为:

姓名:


2.在action类提供:
private Order order;和它的get,set方法。

那么在excute中直接
//添加到数据库
bookcontrol.CreateOrder(order); 即可

我记得我曾经为谁解释过这个问题,你用了自定义的拦截器,那么在你的请求被自定义拦截器拦截之后,就等于是走了你的路线,那么在那里面即使你将它放过了,但是请求去哪里了呢?结束了。。修改方法


/shopjsp/orderok.jsp
/shopjsp/setorder.jsp
解释一下,首先过你的拦截器,通过之后,把请求再次抛给struts2默认拦截器,然后返回结果。。。

姓名:



地址:

在你的action里面声明两个私有变量,
private String realname;
private String address;
之后再get和set这两个变量(sturts2的字段驱动)
在调用方法的时候后,
如:
public String sendMsg()
{
xxx.sendMsg(realname,address);
}
不行就照着写,然后调式跟踪下,或者out一下