不急不徐,持之以恒。

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 老林 阅读(5622) 评论(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 方寒
换包有用么 我这怎么没反应啊 还是一样 的错误。。求解。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: