java struts spring_[Java web]Spring+Struts2+Hibernate整合过程

本文详细记录了在Java Web环境下,使用Idea搭建Spring+Struts2+Hibernate(SSH)整合项目的步骤,包括项目创建、三层架构配置、Struts2的配置问题及解决、Spring的加载配置、Hibernate的整合,以及在整合过程中遇到的错误和解决方案。
摘要由CSDN通过智能技术生成

摘要

最近一直在折腾java web相关内容,这里就把最近学习的spring+struts2+hibernate进行一个整合,也就是大家经常说的ssh。

环境

工具IDE :Idea 2018

数据库:Mysql

关于如何安装tomcat、mysql、idea,请自行查找。

1、使用idea创建spring项目

c85d5892221f3cdd1281ec901eb99383.png

2、创建项目SSHDemo,项目结构如下

dd0cc72b54161bed34544ac6bc5fdb9c.png

3、添加三层的包。

这里采用三层的架构进行项目的设计

4c853ed2a74fa7bedce80f457f2985d8.png

action存放struts2的action类

dao 数据库操作

service业务层

test单元测试

domain javabean

4、配置struts2

在web.xml中你会看到下面的红字提示,引起这个的原因是因为struts2 版本>=2.5 需要使用另外的方式进行配置

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

/*

修改后的配置如下

struts2

org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter

其他内容不变

在action包 添加一个UserAction

packagecom.ssh.action;importcom.opensymphony.xwork2.ActionSupport;importcom.opensymphony.xwork2.ModelDriven;importcom.ssh.domain.User;/*** user相关action*/

public class UserAction extends ActionSupport implements ModelDriven{private User user = newUser();

@OverridepublicUser getModel() {returnuser;

}publicString login() {

System.out.println(user);returnNONE;

}

}

配置struts.xml

添加一个登录页面login.jsp测试

User: sunwyDate:2018/6/6

Time:10:23

Tochange this template use File | Settings | File Templates.--%>

登录

用户名:密码:

启动

在启动时发现如下内容

严重: Context [] startup failed due to previous errors

[2018-06-06 10:25:36,908] Artifact SSHDemo:war exploded: Error during artifact deployment. See server log for details.

打开project structure修复出现的问题

033f8ecac22b43fe6a8a434eb25026b1.png

重启Tomcat发现如下错误

六月 06, 2018 10:57:12 上午 org.apache.catalina.startup.TldConfig execute

信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...

ERROR Dispatcher Dispatcher initialization failed

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:289)

at com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector.construct(ContainerImpl.java:422)

at com.opensymphony.xwork2.inject.ContainerBuilder$5.create(ContainerBuilder.java:231)

at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:52)

at com.opensymphony.xwork2.inject.ContainerBuilder$3.create(ContainerBuilder.java:106)

at com.opensymphony.xwork2.inject.ContainerBuilder$7.call(ContainerBuilder.java:584)

at com.opensymphony.xwork2.inject.ContainerBuilder$7.call(ContainerBuilder.java:581)

at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:560)

at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:581)

at com.opensymphony.xwork2.config.impl.DefaultConfiguration.createBootstrapContainer(DefaultConfiguration.java:287)

at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:162)

at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)

at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:957)

at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:463)

at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:496)

at org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:73)

at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:61)

at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:285)

at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:266)

at org.apache.catalina.core.ApplicationFilterConfig.(ApplicationFilterConfig.java:108)

at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4997)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5699)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1017)

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:993)

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1900)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:618)

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:565)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)

at sun.rmi.transport.Transport$1.run(Transport.java:200)

at sun.rmi.transport.Transport$1.run(Transport.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:196)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:835)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

Caused by: java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(ContainerImpl.java:287)

... 64 more

Caused by: java.lang.ExceptionInInitializerError

at com.opensymphony.xwork2.ognl.OgnlValueStackFactory.setContainer(OgnlValueStackFactory.java:88)

... 69 more

Caused by: java.lang.IllegalArgumentException: Javassist library is missing in classpath! Please add missed dependency!

at ognl.OgnlRuntime.(OgnlRuntime.java:169)

... 70 more

Caused by: java.lang.ClassNotFoundException: javassist.ClassPool

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1928)

at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1771)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Class.java:264)

at ognl.OgnlRuntime.(OgnlRuntime.java:166)

... 70 more

六月 06, 2018 10:57:12 上午 org.apache.catalina.core.StandardContext startInternal

严重: One or more Filters failed to start. Full details will be found in the appropriate container log file

六月 06, 2018 10:57:12 上午 org.apache.catalina.core.StandardContext startInternal

严重: Context [] startup failed due to previous errors

好吧,解决问题吧

Caused by: java.lang.ClassNotFoundException: javassist.ClassPool

这个问题,是由于没有引入javassist-3.11.0.GA.jar包引起的,那么找到该包,引入即可

58c7d70ad8ae0d4737741fcfaac78f95.png

3d74c28ed18169f3b4846f918a03930c.png

重新发布,输入用户名和密码

HTTP Status 404 - There is no Action mapped for namespace [/] and action name [user_find] associated with context path [].

注意

在struts2.3之前的版本,正常的配置就可以了,但在struts2.3版本之后,使用通配符调用方法时,内部会验证是否允许访问该方法,所以要加上

方法名1,方法名2…代码。

最后struts.xml文件内容,这种配置也是一种安全设置,通配符,如果该action有其他不想被别人访问到的方法,如果通过通配符的方式,直接暴漏出来了,通过这种配置,可以配置允许访问哪些方法,对其它隐私的方法进行保护。

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"

"http://struts.apache.org/dtds/struts-2.5.dtd">

login

测试struts2

84b53375de18d26b721d03224516e118.png

后台action能收到数据

cd9ebb769fd813ba031af626a71cefd1.png

好了,到这里,struts2 算是配置成功了,发现还是不容易的。

整合spring

在src目录下添加applicationContext.xml配置文件

我们希望在服务器启动的时候加载该配置文件,那么需要在web.xml添加如下内容

org.springframework.web.context.ContextLoaderListener

contextConfigLocation

classpath:applicationContext.xml

这里需要添加spring-web-3.2.0.RELEASE.jar包

8cf2774720198936474fe22584134d45.png

成功加载

整合Hibernate

添加jar包

607ef70c712c730101e34d24136506f6.png

在src目录下添加hibernate配置文件hibernate.cfg.xml

/p>

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

com.mysql.jdbc.Driver

jdbc:mysql:///sshdemo

root

abcd

org.hibernate.dialect.MySQLDialect

true

true

update

org.hibernate.connection.C3P0ConnectionProvider

5

20

120

3000

在domain包下添加映射配置User.hbm.xml

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

在applicationContext.xml中添加如下配置

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

userDao

packagecom.ssh.dao;importcom.ssh.domain.User;importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;public class UserDao extendsHibernateDaoSupport {public voidsave(User user) {this.getHibernateTemplate().save(user);

}

}

userService

packagecom.ssh.service;importcom.ssh.dao.UserDao;importcom.ssh.domain.User;importorg.springframework.transaction.annotation.Transactional;

@Transactionalpublic classUserService {privateUserDao userDao;public voidsetUserDao(UserDao userDao) {this.userDao =userDao;

}public voidsave(User user) {

userDao.save(user);

}

}

userServiceTest

packagecom.ssh.test;importcom.ssh.domain.User;importcom.ssh.service.UserService;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;importjavax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")public classUserServiceTest {

@Resource(name= "userService")privateUserService userService;

@Testpublic voidsaveTest() {

User user= newUser();

user.setId(1);

user.setName("wolfy");

user.setPassword("1234");

userService.save(user);

}

}

测试

1b6e287d4196304d886963efd892e297.png

fedd8e1dfceca5f37b393849d444643f.png

总结

1、配置过程很麻烦,很可能会缺包。

2、在保存数据的时候发现,执行了,但数据库中没有数据,原因是因为没有配置事务管理器,还要注意开启注解的方式管理事务。

3、当然仍然可以进一步的整合,比如去掉hibernate.cfg.xml文件,在applicationContext.xml进行配置

4、注意如果使用hibernate4需要下载hibernate4.2+的jar包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值