amo_njupt
amo_njupt
2010-03-10 16:23

怎样将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()方法中读取不到页面提交的数据呢?怎样解决?谢谢!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

5条回答

  • xwz_adolf xwz_adolf 11年前

    (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中情况。
    是可以获得正确的结果的

    点赞 评论 复制链接分享
  • weixin_42522216 weixin_42522216 11年前

    姓名:



    地址:

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

    点赞 评论 复制链接分享
  • iteye_566 iteye_566 11年前

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


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

    点赞 评论 复制链接分享
  • xwz_adolf xwz_adolf 11年前

    第一步:
    (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); 即可

    点赞 评论 复制链接分享
  • xiaolongfeixiang 拽拽的初行者 11年前

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

    点赞 评论 复制链接分享