Struts2使用JSON插件实现异步刷新功能

1.说起这个Json插件实现异步刷新的功能折腾了我两天了,本想使用Juery来实现,可是在Jsp页面中始终无法获取json数据,最终无奈之下只能选择了最原始的方式。

2.首先是需要加载struts2-json-plugin-2.3.20.1.jar(因为我用的struts的版本是2.3.20.1)到项目中,接下来就是配置struts.xml配置文件了,而在这个过程中我有遇到一个非常烦恼的事,就是在我配置json的时候,需要继承json-default,始终都报错,这个问题已经在我之前的博客"SSH使用json插件实现AJAX的问题"中有具体的阐述,所以在这里我就不复述了。

3.首先是定义一个MyJson.java的Action类,其代码如下:

public class MyJson extends BaseAction{
    public String getRno() {
        return Rno;
    }

    public void setRno(String rno) {
        Rno = rno;
    }

    private String Rno;

    public RoomBiz getRoomBiz() {
        return roomBiz;
    }

    public void setRoomBiz(RoomBiz roomBiz) {
        this.roomBiz = roomBiz;
    }

    RoomBiz roomBiz;

    public List<RoomInfo> getRoomList() {
        return roomList;
    }

    public void setRoomList(List<RoomInfo> roomList) {
        this.roomList = roomList;
    }

    private List<RoomInfo> roomList;

    public String getRoomByRnoByJson() throws Exception {
        roomList=new ArrayList<RoomInfo>();
        System.out.println("Rno=================="+Rno);
        roomBiz=serviceManager.getRoomBiz();
        RoomInfo roomInfo=roomBiz.getRoomByRno(Rno);
        roomList.add(roomInfo);
        System.out.println("roomList=============" + roomList.get(0).getRtel());
        return "success";
    }
}

4.具体在struts.xml配置文件中写的配置代码是:

<package name="myjson" namespace="/myjson" extends="json-default">

  <action name="SZQJson" class="com.hibtest3.action.MyJson" method="getRoomByRnoByJson">

    <result type="json"/>

  </action>

</package>

5.struts.xml配置好之后,接下来是页面中的调用,这js方法是当改变房间号的下拉菜单时,触发这个事件,返回一个json的数据格式。

 <tr>
   <td>房间号</td>
   <td><select class="selectStyle" name="rno" id="rno"
        onchange="jsonClick(this.options[this.options.selectedIndex].value)">
   <%for(int i=0;i<roomList.size();i++){
         RoomInfo roomInfo=roomList.get(i);
   %>
   <option value="<%=roomInfo.getRno()%>"><%=roomInfo.getRno()%></option>
   <%}%>
   </select></td>
</tr>

function jsonClick(obj) {
            var url = "/HibTest3/myjson/SZQJson?Rno=" + obj;
            if(window.XMLHttpRequest) {
                //IE7, Firefox, Opera支持
                req = new XMLHttpRequest();
            }else if(window.ActiveXObject) {
                //IE5,IE6支持
                req = new ActiveXObject("Microsoft.XMLHTTP");
            }

            req.open("POST", url, true);
            //onreadystatechange属性存有处理服务器响应的函数,有5个取值分别代表不同状态
            req.onreadystatechange = callback;
            //send函数发送请求
            req.send(null);
        }

        function callback() {
            if(req.readyState == 4 && req.status == 200) {
                var check = req.responseText;
                show (check);
            }
        }

        function show(str) {
            var rstyle = document.getElementById('rstyle');
            var rprice = document.getElementById('rprice');
            var lens=str.length;
            var str1=str.substring(2,lens-5);
            var str2=str1.split(',');
            for(var i=0;i<str2.length;i++){
                var obj=str2[i].split(':');
                if(obj[0]=='"rstyle"'){
                    rstyle.value=obj[1];
                }else if(obj[0]=='"rprice"'){
                    rprice.value=obj[1];
                }

            }
        }

6.最后运行的结果如下,当改变房间号时,对应的房间类型和房间价格也会相应的改变。

posted @ 2015-10-07 22:53  限时的遗忘  阅读(265)  评论(0编辑  收藏  举报