最近公司老板有一个想法,请大家一起讨论一下
老板想用SSH架构做基盘,在这个基础上封装一下.现在有这么一个功能
以前struts是这样做验证的,首先就是在struts.xml里配一下
然后就是validation.xml的内容,如下
</formset>
老板想这样多麻烦,他想把这个validation.xml的内容放到数据库里去,表的结构如下图
[img]/upload/attachment/93237/42e00b8f-0f33-39bd-ae5a-73cde3512153.bmp[/img]
功能还是要和以前STRUTS一样,表单提交里要先验证一下,但是这个validation.xml文件是没有的
要到数据库里去取。
这样的话就有多种实现,要么就改改org.apache.struts.validator.ValidatorPlugIn这个类,
要么就写这和这个类一样功能的类,但它原来是读validation.xml文件,现在是读数据库。
大家能否给点实现方式,最好是能贴上代码,谢谢了
[b]问题补充:[/b]
没办法,做员工的只能听老板的话,要么我就写一个类似于ValidatorPlugIn这样的类吧,代替原来的STRUTS验证,用SPRING的AOP可行吗?
[b]问题补充:[/b]
我打算改一下ValidatorPlugin相关类的源代码,我用的是struts2.1.6,我下载了源代码,我把它放到我的工程里面,但是现在报这个错:
2009-04-14 14:13:30,421 [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/sshdemo2]]-[ERROR] Exception starting filter struts2
Unable to load configuration. - bean - jar:file:/E:/apache-tomcat-5.5.17/webapps/sshdemo2/WEB-INF/lib/struts2-core-2.1.6.jar!/struts-default.xml:29:72
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:58)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:360)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:403)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:48)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:223)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:304)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:77)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3600)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4193)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
at org.apache.catalina.core.StandardService.start(StandardService.java:450)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
Caused by: Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar:file:/E:/apache-tomcat-5.5.17/webapps/sshdemo2/WEB-INF/lib/struts2-core-2.1.6.jar!/struts-default.xml:29:72
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:222)
at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:101)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:165)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55)
... 31 more
Caused by: Bean type class com.opensymphony.xwork2.ObjectFactory with the name xwork has already been loaded by bean - file:/E:/apache-tomcat-5.5.17/webapps/sshdemo2/WEB-INF/classes/struts-default.xml:29:72 - bean - jar:file:/E:/apache-tomcat-5.5.17/webapps/sshdemo2/WEB-INF/lib/struts2-core-2.1.6.jar!/struts-default.xml:29:72
at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:206)
... 34 more
说我找不到struts-default.xml这个文件,确实我下的源码里是没有这个文件,但我把这个文件放到SRC目录下了啊,为什么会报错?????
[b]问题补充:[/b]
我知道啊,我们公司用的是STRUTS2.1.6,这里面也有像1.X版本里的验证框架吧,
帮我看看吧,我现在有上面的异常
我把struts-default.xml放到WEB-INF/下面之后又报下面的异常
2009-04-14 14:30:44,453 [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/sshdemo2]]-[ERROR] Exception starting filter struts2
java.lang.RuntimeException: java.lang.RuntimeException: com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=java.lang.String, name='struts.objectFactory.spring.autoWire'] in public org.apache.struts2.spring.StrutsSpringObjectFactory(java.lang.String,java.lang.String,java.lang.String,javax.servlet.ServletContext).
at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:132)
at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:51)
at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:507)
at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:517)
at com.opensymphony.xwork2.inject.ContainerImpl$9.call(ContainerImpl.java:548)
at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:574)
at com.opensymphony.xwork2.inject.ContainerImpl.getInstance(ContainerImpl.java:546)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:182)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:55)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:360)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:403)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:69)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:48)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:223)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:304)
at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:77)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3600)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4193)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
at org.apache.catalina.core.StandardService.start(StandardService.java:450)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
Caused by: java.lang.RuntimeException: com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=java.lang.String, name='struts.objectFactory.spring.autoWire'] in public org.apache.struts2.spring.StrutsSpringObjectFactory(java.lang.String,java.lang.String,java.lang.String,javax.servlet.ServletContext).
at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:495)
at com.opensymphony.xwork2.inject.ContainerImpl$7.call(ContainerImpl.java:532)
at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:581)
at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:530)
at com.opensymphony.xwork2.config.impl.LocatableFactory.create(LocatableFactory.java:32)
at com.opensymphony.xwork2.inject.ContainerBuilder$4.create(ContainerBuilder.java:130)
... 39 more
Caused by: com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=java.lang.String, name='struts.objectFactory.spring.autoWire'] in public org.apache.struts2.spring.StrutsSpringObjectFactory(java.lang.String,java.lang.String,java.lang.String,javax.servlet.ServletContext).
at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.(ContainerImpl.java:345)
at com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:305)
at com.opensymphony.xwork2.inject.ContainerImpl$5.create(ContainerImpl.java:304)
at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76)
at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:116)
at com.opensymphony.xwork2.inject.ContainerImpl.getConstructor(ContainerImpl.java:594)
at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:491)
... 44 more
Caused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=java.lang.String, name='struts.objectFactory.spring.autoWire'] in public org.apache.struts2.spring.StrutsSpringObjectFactory(java.lang.String,java.lang.String,java.lang.String,javax.servlet.ServletContext).
at com.opensymphony.xwork2.inject.ContainerImpl.createParameterInjector(ContainerImpl.java:235)
at com.opensymphony.xwork2.inject.ContainerImpl.getParametersInjectors(ContainerImpl.java:225)
at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.constructParameterInjector(ContainerImpl.java:353)
at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.(ContainerImpl.java:337)
... 53 more
这是为什么啊?
[b]问题补充:[/b]
王者之剑你好
这个问题怎么解决啊
我肯定少了什么文件没加上去,但我不知道
我就是把STRUTS1.2.6的源码放到我的工程里了,然后删掉原来的struts2-core-2.1.6.jar这个包.
[b]问题补充:[/b]
STRUTS2.1.6源码,上面写错了
[b]问题补充:[/b]
对了还有,没替换这个包之前,我的项目是能跑通的
我的JAR包肯定都有的
只不过源码里没有struts-default.xml这个文件
我还少什么没加上?加在哪儿?
[b]问题补充:[/b]
嗯,改源码确实很难.
STRUTS2.1.6太复杂了,STRUTS1.3的话还可以考虑
大家说说,有什么解决方案吗?
给提供一下
[b]问题补充:[/b]
不会吧,我什么时候说过两个框架要一起用
哎~
能不能提点好的意见,真服了你
我打算用拦截器去做
在ACTION的方法调用前做一把处理
[b]问题补充:[/b]
兄弟,我没说我要一起用啊 大哥
我说的是STRUTS1.3的话,改STRUTS源码比较容易
但我现在用的是STRUTS2.1.6啊
我用拦截器差不多实现这个功能了
[b]问题补充:[/b]
嗯,现在你知道了
不过,你能不能提点好的建议啥的啊
不要只是路过啊
如果你用core-2.1.6.jar的时候能跑起来,那说明你源代码的编译路径有误,或者因为缺少某些包不能编译成功。
src\org\apache
struts的源码如果是放在这样的目录下,应该没问题,问题就是依赖的jar可能没加进来,编译没成功。
你要看一下WEB-INF/classes里面是不是有编译好的文件。
其实改个plugin没有必要这样兴师动众
你把源代码包解开,然后将要改动的java文件复制到src里来,struts2-core-2.1.6.jar这个不动。
因为class文件是先从WEB-INF/classes里找,再从WEB-INF/lib里找,所以并不会冲突。
如果你实在担心,可以将类名改一下。
既然你知道改ValidatorPlugIn这个类就好办,不过不要直接改它,看看他的基类或者接口是哪个,自己写一个实现就可以了。这个类的属性可以包括url,driver之类的或者一个datasource jndi的名字,如果可以访问spring,也可以是一个datasource bean的名字。
这些属性用类似 来设置。
如果考虑到性能,那么一定要吧validator的内容缓存起来。
至于其他实现细节,你得看struts源代码了。
你们老板自作聪明,其实这样比写xml一点也不简单。
没必要用AOP吧,读读ValidatorPlugin相关类的源代码,应该不难做到。
DB和xml都麻烦,不如偷懒用jquery validator做客户端验证,至于服务器端验证,可以用spring的validation框架,这个需要写代码,不过通过OO,可以复用。比xml和db都要优雅一些。Hibernate的验证也可以,推荐试试。
太强了,要我说的话赶紧走吧。
或者,你非要实现的话,你可以做成应用启动的时候将数据库里的东东生成.xml文件。
如果不能用struts 用js 控制一下不就是了 ??
ValidatorPlugins是struts1里面的,你下载struts2干嘛?
另外绝对不要修改源代码,应该用继承,否则你会很麻烦的。
你目前的水平一时半会儿实现不了这个功能。
No mapping found for dependency [type=java.lang.String, name='struts.objectFactory.spring.autoWire'] in public
这个提示已经相当清楚了。
你依赖了autoWire,但这个定义并不存在。
真多 代码 实在是不想看! :(
Struts 1, Struts 2 混用,你也太牛B了吧。。。
没办法了,你们公司不可能sturts1和2同时使用,你可能连这两个框架的区别都不知道。建议你先弄清楚一下,到底用什么。
Struts 1, Struts 2 混用,强人,居然没出问题~~
不管你用1还是2,修改代码都是错误的做法。你前面说ValidatorPlugin,这个是1里面的,后面又说用2.1.6,现在答题者全乱了,哼。
你说:[b]我知道啊,我们公司用的是STRUTS2.1.6,这里面也有像1.X版本里的验证框架吧[/b]
STRUTS2有自己的验证框架,可以是XML也可以是Annotation,STRUTS2通过一个plugin可以整合STRUTS1,但是绝对不是直接用STRUTS1的验证框架。
你的异常是因为:在STRUTS2.1.6中,用一个plugin集成Spring,所以如果你的ObjectFacotry是spring,那么应该在classpath中加入struts-spring-plugin-1.2.6.jar
下面的是配置:
[code="xml"]
[/code]
也可以把它们写在struts.properties中。
这个异常与你的老板要求的东西完全没有关系,你应该另开一个问题来提问,这个问题已经乱套了。