介绍下struts2中json和prototype比较不错的搭配:
struts2的xml中
<constant name="struts.action.extension" value="v"/>
<package name="jsonPackage" extends="json-default,struts-default" namespace="/ajax/json">
<action name="listUsers" class="jsonAction" method="listUsers">
    <result type="json"></result>
</action>
</package>
上面的jsonAction是在spring中定义过的,listUsers是该action中的方法;

JsonAction.java
public class JsonAction {
        
         private transient UserServiceImp userService;
        private List<UserInfo> users;//UserInfo是一个pojo
        
        
        @SuppressWarnings("unchecked")
        public String listUsers(){
                users = userService.findAll();
                return Action.SUCCESS;
        }

        //所有和响应数据无关的信息都要用JSON声明一下
        @JSON(serialize = false)
        public UserServiceImp getUserService() {
                return userService;
        }

        public void setUserService(UserServiceImp userService) {
                this.userService = userService;
        }

        public List<UserInfo> getUsers() {
                return users;
        }

        public void setUsers(List<UserInfo> users) {
                this.users = users;
        }
}

json.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
  String path = request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<body>
  <s:form id="jsonForm" name="jsonForm">
    <table>
      <tr>
        <td>
              <s:select id="selectId" list="{'第一个元素','第二个元素','第三个元素'}" headerKey="" headerValue="请选择"/>
        </td>
        <td>
          <input type="button" value="JSON来了" />
        </td>
      </tr>
    </table>
  </s:form>
</body>
上面是一个select控件和button按钮 当点击按钮触发requestJSON(id)事件
参数是select控件的id

下面是最重要脚本实现:
<script src="prototype.js" type="text/javascript"></script>
<script>
  function requestJSON(selectId){
    var responseObject;
    var url = "<%=path%>/ajax/json/listUsers.v?"+
     $("saveForm").serialize(); //这里的参数是序列化的表单
    new Ajax.Request(url,{
       method: 'get';
       onSuccess: function(transport){
         //以JSON格式返回action中定义的users集合         
       responseObject = transport.responseText.evalJSON().users;
         //调用刷新的方法
         refreshSelectElement(responseObject,selectId,"请选择","");      
       }
   });
  }
  //刷新
  function refreshSelectElement(responseObject,selectId,headerKey,headerValue){
    var selectObject = document.getElementById(selectId);
    clearSelectOption(selectObject);//清空的方法
    selectObject.options[0] = new Option(headerKey,headerValue);
    for(var i=0;i<selectObject.length;i++){
      //添加新项 username和uid是UserInfo中的属性
      //responseObject中每一项就是一个UserInfo
      //所以可以使用responseObject.username的形
            
      selectObject.options[i+1] =
new Option(responseObject.username,responseObject.uid);
    }
  }
    //清空
    function clearSelectOption(selectObject){
      while(selectObject.options.length>0){
            selectObject.remove(0);
      }
    }</script>
该过程主要实现了当点击按钮的时候,selecet控件中的值全部换成了新的值
即形成了select控件的局部刷新,从而获取最新的数据