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.最后运行的结果如下,当改变房间号时,对应的房间类型和房间价格也会相应的改变。