非常奇怪的问题,使用spring注入后,ext json失效!

网络科技 2010-11-20 08:36:27
我的代码框架是由spring+struts2+ext组成,我就模拟一个简单的登录功能,我发现,在action中,我若使用spring注入的属性时,return SUCCESS;就无效的了,一旦注释掉,就正常,很是费解。那位高人知道,这是什么原因不?
主要代码还没整理,这样一两句可能 也说不清楚,不知道,有没人遇到过这种问题呢?如何解决呢。若实在无法理解,我整理完后,再贴上主要代码吧。

先谢过各位了。顶者有分吧。
...全文
213 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljs8764 2011-12-24
  • 打赏
  • 举报
回复
我也遇见同样的问题,也解决了,呵呵,同进步啊。
网络科技 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wenyeji 的回复:]
lz用的是struts2的默认json插件吧?
LoginAction 去掉getUserBO() 试试,或者给getUserBO()方法加@JSON(serialize=false)的注释
[/Quote]

还真的可以啊,牛人啊,终于解决了,太感谢你了,只是没想到,会是这样的原因啊。
但不知为为何会这样呢?
还有,如果不用它默认的json插件是否就没这个问题呢?
可以结贴了,这样的小问题搞了半天,哎

wenyeji 2010-11-21
  • 打赏
  • 举报
回复
lz用的是struts2的默认json插件吧?
LoginAction 去掉getUserBO() 试试,或者给getUserBO()方法加@JSON(serialize=false)的注释
网络科技 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bjtu1005 的回复:]
楼主也是高人
[/Quote]
呵,你见笑了,刚学spring与struts2,ext整合,就遇到了这个莫名妙的问题的了,哎,还是技术没学到家啊。
对了,不知道是不是不能传资源了?还有,要有一段时间的审核通过后才显示呢?不然,怎么提示上传成功了,我进去看下,还是空白的呢?
bjtu1005 2010-11-21
  • 打赏
  • 举报
回复
楼主也是高人
网络科技 2010-11-21
  • 打赏
  • 举报
回复
晕,上传了,怎么还没显示出来?
网络科技 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 heartwasnot 的回复:]
好长呀···
[/Quote]
是呀,有点长,我准备整理下,弄个Demo出来,上传到资源库去吧,
有兴趣的同学可以去下载下来,直接导入myeclipse就可以测试使用的了。
数据库用ms2000或20005的都可以,随便指定一个存在数据库即可,因为逻辑没具体的用到数据库,只是获取数据源而已。为了代码好看,我省掉了好多无关的,只剩两个action类了,分别为:LoginAction.java和LoginAtion2.java,测试时,打开两个IE或其它,分别输入:http://127.0.0.1:8080/SSETest/index.jsp和http://127.0.0.1:8080/SSETest/index2.jsp,
输入完点登录,就可以知道,差别的了,表现在,前者正常,能返回值,后者,由于注入了数据源,所以不正常,不往回,点击后无响应。
那要做什么事呢?要在LoginAction2.java注入数据源的前提下,也能返回值, 这样就大功告成了。
HeartWasNot 2010-11-21
  • 打赏
  • 举报
回复
好长呀···
网络科技 2010-11-21
  • 打赏
  • 举报
回复
感谢楼上
补充下吧,发现并非所有的注入都不行,但若跟数据库相关的注入就出问题的了,比如,我直接把userDAO或把dataSource注入到action中就不行的了。还有就是,注入后,action中的方法还是可以执行得到,只是,不能返回值而已,而并非不认识action方法的了。
由此可见,应该跟数据库有关,是配置写法有误吗?是数据库jar版本问题吗?是驱动类问题吗?还是,少了些什么设置呢?或者是spring或struts2的bug?(bug这个应该不至于吧,但也是一种可能)
有待进一步研究。。。。
psuqqvfp 2010-11-21
  • 打赏
  • 举报
回复
呵呵
网络科技 2010-11-21
  • 打赏
  • 举报
回复
没人,顶下
wenyeji 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 xzy88 的回复:]
引用 17 楼 wenyeji 的回复:
lz用的是struts2的默认json插件吧?
LoginAction 去掉getUserBO() 试试,或者给getUserBO()方法加@JSON(serialize=false)的注释


还真的可以啊,牛人啊,终于解决了,太感谢你了,只是没想到,会是这样的原因啊。
但不知为为何会这样呢?
还有,如果不用它默认的json插件是否就没这个……
[/Quote]
struts2默认的插件会默认把所有的getter方法序列化成json格式,你这里显然不能序列化dao的注入,所以需要对不序列化的get方法加注释
xzy88mark 2010-11-20
  • 打赏
  • 举报
回复
今天是周未,看来也没什么人的了,都去玩的了,希望,过些天,能有高人给予解答吧,自己也只能先再找找原因的了。
xzy88mark 2010-11-20
  • 打赏
  • 举报
回复
我是楼主,还有一个没贴出来,居然不让我回了,只好注册了个新的ID了,
以下是登录界面,login.jsp文件:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<link rel="stylesheet" type="text/css" href="ext/resources/css/ext-all.css" />
<script type="text/javascript" src="ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="ext/ext-all.js"></script>
<script type="text/javascript" src="ext/ext-lang-zh_CN.js"></script>

<script type="text/javascript">
Ext.onReady(function(){

Ext.QuickTips.init();//使用表单提示
Ext.form.Field.prototype.msgTarget = "side";//错误显示在边上
//定义一个输入表单
var simple = new Ext.FormPanel({
labelWidth:40,
baseCls:"x-plain",
defaultType:"textfield",
defaults:{width:180},
items:[{
fieldLabel:"帐号",
name:"userid",
allowBlank:false,
blankText:"帐号不能为空"
},{
inputType:"password",
fieldLabel:"密码",
name:"password",
allowBlank:false,
blankText:"密码不能为空"
}],
buttons:[{
text:"提交",
type:"submit",
handler:function(){
if(simple.form.isValid()){
Ext.MessageBox.show({
title:"请稍等",
msg:"正在加载.....",
progressText:"加载过程文字说明",
width:300,
progress:true,
closable:false,
animEl:"loding"
});
var f = function(v) {
return function(){
var i = v / 11;

Ext.MessageBox.updateProgress(i, '');

}
}
for(var i = 1; i < 13; i++) {
setTimeout(f(i), i * 150);
}
//提交到服务器操作
simple.form.doAction("submit",{
url:"userLogin.action?userid=admin&password=admin",//用户名本来是为输入表单的值,但为了测试方面,这里用传参数代替,此时,显然是为登录成功的
method:"post",
success:function(form, action){
Ext.Msg.alert("登录成功!",action.result.message);//使用注入后,这个提示框就再也不出来了,怪死了
},
failure:function(form, action){
Ext.Msg.alert('登陆失败', action.result.message);
}
});
}
}
},{
text:"重置",
handler:function(){
simple.form.reset();
}
}]
});
//定义窗体
var _window = new Ext.Window({
//title:"登录窗口",
title:"测试窗口",
resizable: false,
modal : true,
layout:"fit",
width:280,
height:150,
plain:true,
bodyStyle:"padding:10px;",
maximizable:false,
closeAction:"close",
closable:false,
collapsible:true,
plain:true,
buttonAlign:"center",
items:simple
});
_window.show();
});
</script>
<body>
</body>
</html>

网络科技 2010-11-20
  • 打赏
  • 举报
回复
以下为:LoginAction.java文件:

public class LoginAction extends ActionSupport
{
private boolean success;
private String message;
private UserBOInterface userBO = null;//问题出在这句的了,如果我把这句注释掉,就正常的了,加了这句,和get,set方法后,就出问题的了

public UserBOInterface getUserBO()
{
return userBO;
}

public void setUserBO(UserBOInterface userBO)
{
this.userBO = userBO;
}

public boolean isSuccess()
{
return success;
}

public void setSuccess(boolean success)
{
this.success = success;
}

public String getMessage()
{
return message;
}

public void setMessage(String message)
{
this.message = message;
}


public String login() throws Exception
{
String userid = request.getParameter("userid");
String password = request.getParameter("password");

if (userid.equals("admin") && password.equals("admin"))
{
this.success = true;
this.message = "登录成功,您的ID:" + userid + " 密码:" + password;
}
else
{
this.success = false;
this.message = "未法操作,未授权用户不允许登录!";
}

return SUCCESS;
}
}
网络科技 2010-11-20
  • 打赏
  • 举报
回复
以下为:struts.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<package name="user" extends="json-default" namespace="">
<action name="userLogin" class="loginAction" method="login">
<result type="json"></result>
</action>
</package>
</struts>


以下为:applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!-- 连接数据库 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"></property>
<property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=DBtest"></property>
<property name="username" value="sa"></property>
<property name="password" value="123"></property>
</bean>

<!-- 声明性事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>

<bean id="userDAO" class="com.zuying.dao.UserDAO">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
</bean>

<bean id="userBO" class="com.zuying.bo.UserBO">
<property name="userDAO">
<ref local="userDAO"/>
</property>
</bean>

<bean id="loginAction" class="com.zuying.action.LoginAction" scope="prototype"><!--
<property name="userBO">
<ref bean="userBO"/>
</property> 如果我把这个注释掉,即不使用注入,当然,LoginAction中也要相应的注释掉,那就没问题,前面会返回提示框,我开启后,就不行了,没效果-->
</bean>
</beans>
网络科技 2010-11-20
  • 打赏
  • 举报
回复
整理好了,我上传主要代码吧,可能有些长,希望有兴趣的高人,能看些,会是那里出题呢。
以下是web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

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

  • 打赏
  • 举报
回复
你把代码发来看看
  • 打赏
  • 举报
回复
先顶下。。在想想

67,529

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧