<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    不急不徐,持之以恒。

    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 方寒
    換包有用么 我這怎么沒反應啊 還是一樣 的錯誤。。求解。  回復  更多評論
      

    主站蜘蛛池模板: 国产一级理论免费版| 日本中文字幕免费高清视频| 在线观看的免费网站| 亚洲精品美女在线观看| 99精品免费观看| 亚洲美女aⅴ久久久91| 日本XXX黄区免费看| 亚洲中文字幕一区精品自拍| 成人片黄网站色大片免费| 亚洲精品亚洲人成在线| 波多野结衣视频在线免费观看| 美女被免费视频网站| 在线观看亚洲精品福利片| 精品国产麻豆免费人成网站| 内射干少妇亚洲69XXX| av免费不卡国产观看| 亚洲色少妇熟女11p| 亚洲A丁香五香天堂网| 黄色网页在线免费观看| 亚洲尹人香蕉网在线视颅| 中国在线观看免费国语版| 国产精品亚洲lv粉色| 中文字幕亚洲综合久久菠萝蜜 | 亚洲精品午夜在线观看| 国产福利在线免费| 国产亚洲精品美女久久久久 | 亚洲av日韩av高潮潮喷无码| 7x7x7x免费在线观看| 亚洲国产精品99久久久久久| 亚洲人成无码www久久久| 小草在线看片免费人成视久网| 亚洲人成在线免费观看| 亚洲AⅤ视频一区二区三区| 久久国产免费一区二区三区| 亚洲一区二区三区乱码在线欧洲| 亚洲国产成人久久一区久久| 九九精品成人免费国产片| 亚洲最大无码中文字幕| 亚洲精品无码专区在线在线播放 | 欧亚精品一区三区免费| 一级日本高清视频免费观看 |