不急不徐,持之以恒。

          http://blog.gopersist.com/

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            24 隨筆 :: 0 文章 :: 52 評論 :: 0 Trackbacks

          五、整合Struts2、Extjs

          將struts-2.1.6\lib目錄下的struts2-codebehind-plugin-2.1.6.jar、struts2-core-2.1.6.jar、struts2-spring-plugin-2.1.6.jar、xwork-2.1.2.jar、ognl-2.6.11.jar、freemarker-2.3.13.jar、commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar復制到項目WebContent\lib下。

          另外還需jsonplugin-0.34.jar包,使struts2 action返回json類型。


          新建一個entity接口,action層需使用該接口調用實體主鍵。

          package com.xy.entity;

          public interface BaseEntity {
              
          public long getId();
          }
          修改Demo實體,使其實現BaseEntity接口
          package com.xy.entity.demo;

          import javax.persistence.Column;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          import javax.persistence.SequenceGenerator;
          import javax.persistence.Table;
          import javax.persistence.TableGenerator;

          import com.xy.entity.BaseEntity;

          @Entity
          @Table(name
          ="HSSEA_DEMO")
          public class Demo implements BaseEntity {
              @Id
              @GeneratedValue(strategy
          =GenerationType.TABLE, generator="hssea_demo")
              @TableGenerator(name 
          = "hssea_demo",
                              table
          ="OBJECT_ID",
                              pkColumnName
          ="NAME",
                              valueColumnName
          ="VALUE",
                              pkColumnValue
          ="HSSEA_DEMO_PK",
                              initialValue
          =1,
                              allocationSize
          =1
              )
              @SequenceGenerator(name
          ="hssea_demo_seq", sequenceName="seq_hssea_demo", allocationSize=1)
              
          private long id;
              @Column(name
          ="CODE")
              
          private String code;
              @Column(name
          ="DESCRIPTION")
              
          private String description;
              
          public long getId() {
                  
          return id;
              }
              
          public void setId(long id) {
                  
          this.id = id;
              }
              
          public String getCode() {
                  
          return code;
              }
              
          public void setCode(String code) {
                  
          this.code = code;
              }
              
          public String getDescription() {
                  
          return description;
              }
              
          public void setDescription(String description) {
                  
          this.description = description;
              }
          }

          增加struts2與extjs交互抽象類,完成分頁、排序、增刪改查。
          package com.xy.action;

          import java.util.HashSet;
          import java.util.List;
          import java.util.Set;

          import org.apache.log4j.Logger;
          import org.apache.struts2.config.ParentPackage;
          import org.apache.struts2.config.Result;
          import org.apache.struts2.config.Results;
          import org.hibernate.criterion.Criterion;
          import org.hibernate.criterion.Order;
          import org.springframework.context.annotation.Scope;
          import org.springframework.stereotype.Controller;

          import com.googlecode.jsonplugin.JSONResult;
          import com.opensymphony.xwork2.ActionSupport;
          import com.xy.service.BaseServiceForHibernate;
          import com.xy.entity.BaseEntity;

          /**
           * struts2與extjs交互抽象類
           * 完成基本增刪改查分頁等功能,子類繼承時只需設置entity中屬性的set。
           * 
          @author xy
           * @date 2009-12-31
           * 
          @param <T extends BaseEntity, X extends BaseHibernateDao<T>> entity和service
           
          */
          @Controller
          @Scope(
          "prototype")
          @ParentPackage(value
          ="json-default")
          @Results({
              @Result(name
          ="success", value="", type=JSONResult.class, params={"ignoreHierarchy""false"})
          })
          public abstract class Struts2ExtjsBaseAction<extends BaseEntity, X extends BaseServiceForHibernate<T>> extends ActionSupport{
              
          static Logger logger = Logger.getLogger(Struts2ExtjsBaseAction.class.getName());
              
              
          private static final long serialVersionUID = 2863769505963567954L;
              
              
          // Extjs 使用,成功與否,返回信息
              protected boolean success = false;
              
          protected String message;
              
          // Extjs 使用,分頁、排序信息
              protected int start;
              
          protected int limit;
              
          protected String sort;
              
          protected String dir;
              
              
          // Service類
              protected X service;
              
              
          // 返回的數據列表和記錄總數
              protected List<T> list;
              
          protected int total;
              
              
          // entity對象,用于提交保存,更新前取個別數據
              protected T entity;
              
              
          // 記錄選中記錄的id
              protected String ids;

              
          /**
               * 取列表
               
          */
              
          public String list() {
                  logger.debug(
          "取數據列表!start:"+this.start+",limit:"+this.limit+",sort:"+this.sort+",dir:"+this.dir);
                  
                  Set
          <Criterion> criterionSet = new HashSet<Criterion>();
                  Set
          <Order> orderSet = new HashSet<Order>();
                  
          if(this.dir.equals("ASC")){
                      orderSet.add(Order.asc(
          this.sort));
                  }
          else{
                      orderSet.add(Order.desc(
          this.sort));
                  }
                  list 
          = service.query(criterionSet, orderSet, this.start, this.limit);
                  total 
          = service.totalSize(criterionSet);
                  success 
          = true;
                  
          return SUCCESS;
              }
              
          /**
               * 根據ID取數據
               
          */
              
          public String get() {
                  logger.debug(
          "根據id取數據明細!id:"+entity.getId());
                  
                     entity 
          = service.get(entity.getId());
                     success 
          = true;
                  
          return SUCCESS;
              }
              
          /**
               * 保存
               
          */
              
          public String save() {
                  logger.debug(
          "保存數據!entity:"+entity);

                  service.save(entity);
                  success 
          = true;
                  
          return SUCCESS;
              }
              
          /**
               * 刪除
               
          */
              
          public String delete() {
                  logger.debug(
          "根據ids刪除數據!ids:"+ids);
                  
                  
          for(String s : ids.split(",")){
                      service.delete(Long.parseLong(s));
                  }
                  success 
          = true;
                  
          return SUCCESS;
              }

              
          // 對象T內部信息的讀取均在子類中進行
              
              
          // getter,setter方法
              
          // struts2需get方法將數據轉換成json
              public List<T> getList() {
                  
          return list;
              }
              
          public int getTotal() {
                  
          return total;
              }
              
          public boolean isSuccess() {
                  
          return success;
              }
              
          public String getMessage() {
                  
          return message;
              }

              
          // 讀取extjs傳來的分頁和排序信息    
              public void setStart(int start) {
                  
          this.start = start;
              }
              
          public void setLimit(int limit) {
                  
          this.limit = limit;
              }
              
          public void setSort(String sort) {
                  
          this.sort = sort;
              }
              
          public void setDir(String dir) {
                  
          this.dir = dir;
              }
              
          // 讀取extjs傳來的選中記錄id
              public void setIds(String ids) {
                  
          this.ids = ids;
              }
              
              
          public T getEntity() {
                  
          return entity;
              }
          }

          新增DemoAction類
          package com.xy.action.demo;

          import javax.annotation.Resource;

          import org.apache.struts2.config.Namespace;

          import com.xy.action.Struts2ExtjsBaseAction;
          import com.xy.entity.demo.Demo;
          import com.xy.service.demo.DemoService;

          @Namespace(value
          ="/demo")
          public class DemoAction extends Struts2ExtjsBaseAction<Demo, DemoService>{

              
          private static final long serialVersionUID = 7796054923782630546L;

              
          // 注入service
              @Resource(name="demoService")
              
          public void setDemoService(DemoService demoService){
                  
          super.service = demoService;
              }
              
              
          public DemoAction(){
                  
          super.entity = new Demo();
              }
              
              
          // entity對象中的set方法
              public void setId(long id) {
                  entity.setId(id);
              }
              
          public void setCode(String code) {
                  entity.setCode(code);
              }
              
          public void setDescription(String description) {
                  entity.setDescription(description);
              }
          }

          在WebContent下新增extjs和demo目錄,將ext-3.0.0目錄下的ext-all.js和resources整個目錄、ext-3.0.0\adapter\ext目錄下ext-base.js復制到新建的extjs目錄下。
          在demo目錄下新建list.jsp
          <%@ page language="java" pageEncoding="UTF-8"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
          <head>
              
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
              
          <title>HSSEADemo</title>
              
          <link rel="stylesheet" type="text/css" href="../extjs/resources/css/ext-all.css" />
              
          <script type="text/javascript" src="../extjs/ext-base.js"></script>
              
          <script type="text/javascript" src="../extjs/ext-all.js"></script>
              
          <script type="text/javascript" src="list.js"></script>
          </head>
          <body bottommargin="0" leftmargin="0" rightmargin="0" topmargin="0" marginheight="0" marginwidth="0">
              
          <div id="listWin"></div>
              
          <div id="addDicWin"></div>
          </body>
          </html>

          在demo目錄下新建list.js
          Ext.onReady(function() {
                      
          // 加載快速菜單
                      Ext.QuickTips.init();
                      
          var actionUrl = "demo";

                      
          // 加載分頁數據
                      var store = new Ext.data.Store({
                                  proxy : 
          new Ext.data.HttpProxy({
                                              url : actionUrl
          +'!list'
                                          }),
                                  reader : 
          new Ext.data.JsonReader({
                                              root : 'list',
                                              totalProperty : 'total',
                                              id : 'id',
                                              fields : ['id','code', 'description']
                                          }),
                                  remoteSort : 
          true
                              });
                      
          // 設置默認的排序字段和升降序
                      store.setDefaultSort('code', 'asc');
              
                      
          // 設置復選框
                      var sm = new Ext.grid.CheckboxSelectionModel();
                      
          // 設置列
                      var cm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(),sm, 
                              {header : 
          "編碼", width: 120,dataIndex : 'code',sortable : true}, 
                              {header : 
          "名稱", width: 280,dataIndex : 'description',sortable : true}
                      ]);
                      
          // 默認排序設置為可排序
                      cm.defaultSortable = true;
                      
          // 創建GridPanel
                      grid = new Ext.grid.GridPanel({
                                  el : 'listWin',
                                  width : 
          900,
                                  height : 
          650,
                                  title : '演示',
                                  store : store,
                                  cm : cm,
                                  sm : sm,
                                  animCollapse : 
          false,
                                  trackMouseOver : 
          false,
                                  loadMask : {
                                      msg : '載入中,請稍候'
                                  },
                                  
          // 上方工具條
                                  tbar : [{
                                              id : 'addDicButton',
                                              text : '增加',
                                              tooltip : '添加一條記錄'
                                          }, '
          -', {
                                              id : 'updateDicButton',
                                              text : '修改',
                                              tooltip : '修改所選擇的一條記錄'
                                          }, '
          -', {
                                              id : 'deleteDicButton',
                                              text : '刪除',
                                              tooltip : '刪除所選擇的記錄'
                                          }],
                                  bbar : 
          new Ext.PagingToolbar({
                                              pageSize : 
          20,
                                              store : store,
                                              displayInfo : 
          true,
                                              displayMsg : '顯示 {
          0- {1} 共 {2} 條',
                                              emptyMsg : 
          "沒有數據顯示!",
                                              beforePageText : 
          "頁碼 ",
                                              afterPageText : 
          "共 {0} 頁",
                                              firstText : 
          "首頁",
                                              lastText : 
          "末頁",
                                              nextText : 
          "下一頁",
                                              prevText : 
          "上一頁",
                                              refreshText : 
          "刷新"
                                          })
                              });
                      
          // 加載grid
                      grid.render();
                      
          // 設置分頁數據
                      store.load({
                          params : {
                                  start : 
          0,
                                  limit : 
          20
                              }
                      });
                      
                      
          // 添加
                      var addDicWin;
                      
          var addButton = Ext.get('addDicButton');
                      addButton.on('click', addButtonClick);
                      
          function addButtonClick() {
                          
          if (!addDicWin) {
                              addDicWin 
          = new Ext.Window({
                                          el : 'addDicWin',
                                          title : '演示',
                                          layout : 'fit',
                                          width : 
          450,
                                          height : 
          180,
                                          closeAction : 'hide',
                                          plain : 
          true,
                                          modal : 
          true,
                                          items : addForm
                                      });
                          }
                          addForm.getForm().reset();
                          addDicWin.show(
          this);
                      }

                      
          // 添加form
                      var addForm = new Ext.FormPanel({
                                  frame : 
          true,
                                  labelAlign : 'right',
                                  waitMsgTarget : 
          true,
                                  autoScroll : 
          true,
                                  buttonAlign : 'center',
                                  method : 'POST',
                                  url : actionUrl 
          + '!save',
                                  items :[{    
                                              xtype: 'textfield',
                                              fieldLabel: '編碼',
                                              name: 'code',
                                              allowBlank : 
          false,
                                              style : 'ime
          -mode:disabled',
                                              maxLength : 
          20,
                                              width : 
          50
                                          },{    
                                              xtype: 'textfield',
                                              fieldLabel: '描述',
                                              name: 'description',
                                              allowBlank : 
          true,
                                              maxLength : 
          100,
                                              width : 
          250
                                          },{    
                                              xtype : 'hidden',
                                              name : 'id'
                                          }]
                      });
                      
          // 驗證數據并提交
                      addForm.addButton('提交', function() {
                              
          if(addForm.form.isValid()){
                                  addForm.getForm().submit({
                                              waitMsg : '保存數據',
                                              success : 
          function() {
                                                  store.reload();
                                                  Ext.MessageBox.alert('提示', '提交成功!');
                                                  addDicWin.hide();
                                              },
                                              failure : 
          function() {
                                                  Ext.MessageBox.alert('提示', '提交失敗!');
                                                  addDicWin.hide();
                                              }
                                          });
                              }
                      });

                      addForm.addButton('關閉', 
          function() {
                              addDicWin.hide();
                      });

                      
          // 刪除
                      var deleteButton = Ext.get('deleteDicButton');
                      deleteButton.on('click', 
          function() {
                                  
          if (grid.getSelectionModel().getSelections().length > 0)
                                      Ext.MessageBox.confirm('消息', '確認要刪除所選記錄
          ?', doDelProc);
                                  
          else
                                      Ext.MessageBox.alert('警告', '最少需要選擇一條記錄
          !');
                      });

                      
          function doDelProc(btn) {
                          
          if (btn == 'yes') {
                              
          if (grid.getSelectionModel().hasSelection()) {
                                  
          var ids = '';
                                  
          var records = grid.getSelectionModel().getSelections();
                                  
          for (var i = 0; i < records.length; i++) {
                                      
          if (i == 0) {
                                          ids 
          = records[0].data["id"];
                                      } 
          else {
                                          ids 
          += ',' + records[i].data["id"];
                                      }
                                  }
                  
                                  Ext.Ajax.request({
                                              method : 'POST',
                                              url : actionUrl 
          + '!delete',
                                              params: {ids: ids}, 
                                              success : 
          function() {
                                                  Ext.MessageBox.alert('提示', '數據刪除成功!');
                                                  store.reload();
                                              },
                                              failure : 
          function() {
                                                  Ext.MessageBox.alert('提示', '數據刪除失敗!');
                                                  store.reload();
                                              }
                                          });
                              }
                          }
                      };

                      
          // 修改
                      var updateButton = Ext.get('updateDicButton');
                      updateButton.on('click', 
          function() {
                          
          var records = grid.getSelectionModel().getSelections();
                          
          if (records.length > 1) {
                              Ext.MessageBox.alert('提示', '一次不能修改多條記錄
          !');
                              
          return;
                          } 
          else if (records.length == 0) {
                              Ext.MessageBox.alert('提示', '選擇需要修改的一條記錄
          !');
                              
          return;
                          } 
          else {
                              Ext.Ajax.request({
                                  method : 'POST',
                                  url : actionUrl 
          + '!get',
                                  params: {id: records[
          0].id},
                                  success : 
          function(response, options) {
                                      
          var obj = Ext.decode(response.responseText);
                                      
          if(Ext.isIE){
                                          document.getElementById(
          "addDicButton").click();
                                      }
          else{
                                          addButtonClick();
                                      }
                                      addForm.getForm().setValues(obj.entity);
                                  },
                                  failure : 
          function() {
                                      Ext.MessageBox.alert('提示 ', '提取數據失敗!');
                                  }
                              });
                          }
                      });
          });

          修改web.xml文件
          <?xml version="1.0" encoding="UTF-8"?>
          <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
            
          <display-name>HSSEADemo</display-name>

            
          <!-- 修改Spring配置文件的路徑 -->
            
          <context-param>
              
          <param-name>contextConfigLocation</param-name>
              
          <param-value>classpath*:config/applicationContext-*.xml</param-value>
            
          </context-param>
              
            
          <!-- 配置Spring -->
            
          <listener>
              
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            
          </listener>

            
          <!-- 配置Struts 2.0 -->
            
          <filter>
              
          <filter-name>struts2</filter-name>
              
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
              
          <init-param>
                
          <param-name>actionPackages</param-name>
                
          <param-value>com.xy.action</param-value>
              
          </init-param>
            
          </filter>
            
          <filter-mapping>
              
          <filter-name>struts2</filter-name>
              
          <url-pattern>/*</url-pattern>
            
          </filter-mapping>

            
          <welcome-file-list>
              
          <welcome-file>index.html</welcome-file>
            
          </welcome-file-list>
          </web-app>

          到此完成所有演示代碼,右擊項目,Run As -> Run on Server,用之前設置的tomcat啟動,服務啟動后,瀏覽器http://localhost:8080/HSSEADemo/demo/list.jsp,進行增刪改查操作。


          最終項目結構如下:



          注:日志打印中會報一個如下ERROR,但程序工作一切正常,望知道如何解決這個報錯信息的大俠不吝賜教!
          2010-01-09 20:14:42,911 ERROR [com.opensymphony.xwork2.ObjectFactory] - <Unable to set parameter [location] in result of type [com.googlecode.jsonplugin.JSONResult]>
          Caught OgnlException 
          while setting property 'location' on type 'com.googlecode.jsonplugin.JSONResult'- Class: ognl.ObjectPropertyAccessor
          File: ObjectPropertyAccessor.java
          Method: setProperty
          Line: 
          132 - ognl/ObjectPropertyAccessor.java:132:-1
              at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java:
          392)
              at com.opensymphony.xwork2.ognl.OgnlUtil.setProperty(OgnlUtil.java:
          143)
              at com.opensymphony.xwork2.ognl.OgnlReflectionProvider.setProperty(OgnlReflectionProvider.java:
          91)
              at com.opensymphony.xwork2.ObjectFactory.buildResult(ObjectFactory.java:
          221)
              at com.opensymphony.xwork2.DefaultActionInvocation.createResult(DefaultActionInvocation.java:
          208)
              at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:
          355)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          265)
              at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:
          163)
              at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:
          87)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:
          249)
              at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:
          68)
              at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:
          87)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:
          122)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:
          195)
              at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:
          87)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:
          195)
              at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:
          87)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:
          148)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:
          93)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:
          235)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:
          89)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:
          128)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:
          104)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:
          267)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:
          126)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:
          138)
              at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:
          87)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:
          148)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:
          164)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:
          128)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:
          176)
              at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:
          236)
              at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:
          52)
              at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:
          468)
              at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:
          395)
              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
          235)
              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
          206)
              at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
          233)
              at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
          175)
              at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
          128)
              at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
          102)
              at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
          109)
              at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
          263)
              at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
          844)
              at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:
          584)
              at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
          447)
              at java.lang.Thread.run(Thread.java:
          619)
          Caused by: ognl.NoSuchPropertyException: com.googlecode.jsonplugin.JSONResult.location
              at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:
          132)
              at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:
          28)
              at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:
          1656)
              at ognl.ASTProperty.setValueBody(ASTProperty.java:
          101)
              at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:
          177)
              at ognl.SimpleNode.setValue(SimpleNode.java:
          246)
              at ognl.Ognl.setValue(Ognl.java:
          476)
              at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:
          192)
              at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java:
          385)
               
          63 more

          posted on 2010-01-10 12:41 老林 閱讀(5633) 評論(5)  編輯  收藏 所屬分類: 開發框架

          評論

          # re: Hibernate3.3.2+Spring2.5.5+Struts2.1.6+Extjs3.0.0 Annotations方式快速開發框架(下) 2010-01-10 19:54 范璐
          把jsonplugin-0.34.jar換成json-lib-2.1.jar跟struts2-json-plugin-2.1.8.1.jar試一下  回復  更多評論
            

          # re: Hibernate3.3.2+Spring2.5.5+Struts2.1.6+Extjs3.0.0 Annotations方式快速開發框架(下) 2010-01-11 15:35 kvtest
          在做新增操作時,頁面上提示保存成功,可是后臺會報下邊的錯誤:
          2010-01-11 15:32:09,479 WARN [com.opensymphony.xwork2.ognl.OgnlValueStack] - <Error setting expression 'id' with value '[Ljava.lang.String;@171b246'>
          ognl.MethodFailedException: Method "setId" failed for object com.cdj.action.demo.DemoAction@33c78b [java.lang.NoSuchMethodException: com.xyaction.demo.DemoAction.setId([Ljava.lang.String;)]
          at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1265)
          at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1454)

          不知道什么原因?如何解決?期待中!謝謝  回復  更多評論
            

          # re: Hibernate3.3.2+Spring2.5.5+Struts2.1.6+Extjs3.0.0 Annotations方式快速開發框架(下) 2010-01-12 10:22 xy.lin
          @kvtest
          檢查一下action層的setId方法,看看這里接收了什么值  回復  更多評論
            

          # re: Hibernate3.3.2+Spring2.5.5+Struts2.1.6+Extjs3.0.0 Annotations方式快速開發框架(下) 2010-01-29 23:00 xy.lin
          @范璐
          多謝了!  回復  更多評論
            

          # re: Hibernate3.3.2+Spring2.5.5+Struts2.1.6+Extjs3.0.0 Annotations方式快速開發框架(下) 2011-06-01 16:00 方寒
          換包有用么 我這怎么沒反應啊 還是一樣 的錯誤。。求解。  回復  更多評論
            

          主站蜘蛛池模板: 黎川县| 开阳县| 抚远县| 隆化县| 彰化县| 济宁市| 乐都县| 太保市| 乳山市| 襄城县| 盐城市| 手游| 图木舒克市| 绥中县| 金堂县| 宣恩县| 靖州| 东莞市| 汽车| 南漳县| 开远市| 无锡市| 绵阳市| 比如县| 浑源县| 海宁市| 广水市| 巴塘县| 阜康市| 阿巴嘎旗| 福建省| 原阳县| 姚安县| 杭锦旗| 基隆市| 清流县| 徐汇区| 卫辉市| 曲阜市| 沛县| 水富县|