2018.2IDEA+Struts2 2.5+hibernate5

自己在新版本的IDEA上面不熟SS2H框架的时候,出现了一些问题,在这里总结下。

首先,我们打开IDEA,新建一个项目,如图:

 同时选中hibernate,然后我们点击next,新建项目名称,这里我们命名为SS2H。

我们打开项目web.xml看到有一行错误,是StrutsPrepareAndExecuteFilter类的包名错了,在这里,新版的struts2包名为org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter,我们自己修改下。

接下来,我们先来测试struts2是否配置好。

在src下面创建action包,然后在包内创建UserAction.java:

public class UserAction {
    public String test() {
        return "success";
    }
}

在struts.xml中如下配置:

<struts>
    <package name="ssh" namespace="/" extends="struts-default">
        <action name="user" class="action.UserAction">
            <result name="success">success.jsp</result>
        </action>
    </package>
</struts>

在web下面创建success.jsp,随意编写任何内容,接下来,我们部署项目,使用Tomcat启动,注意Tomcat中的访问路径配置,然后我们在流量器输入地址localhosst:8080/{项目名(根据配置来)}/user!test,如果跳转了自己配置的success.jsp界面则配置正确。

我这里启动后出现了如下错误:

java.lang.ClassNotFoundException:org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter,这里提示我们类没有被找到,这里查阅资料,其实是我们的jar包没有被部署到WEB-INF/lib的文件夹内,所以,我们如下图操作:

之后继续输入连接,会出现There is no Action mapped for namespace [/] and action name [user!test] associated with context path [].这个问题,根本匹配不到,在网上搜索,找到如下一段话:

使用Struts2.3.16 出现There is no Action mapped for namespace [/user] and action name [user!add] associated with context path错误,原因是(1)DMI可能导致安全问题(2)DMI与通配符方法功能有重叠,因此该版本Struts2默认关闭DMI,需要在struts.xml中加一句<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 来打开动态方法调用。动态方法调用官方推荐的做法是,使用通配符的形式。不要使用actionName!methodName的方式。

于是我么在struts.xml上加上

<constant name="struts.enable.DynamicMethodInvocation" value="true" /><!--动态方法配置-->

再启动,接下来出现了Method test for action user is not allowed!的错误,在网页https://blog.youkuaiyun.com/qq_29407009/article/details/51474118我找到了解决方法,在struts.xml中package标签下加入了这样一条:

<global-allowed-methods>test</global-allowed-methods><!--解决方法,添加要处理的方法-->

再启动,这下终于可以成功访问了。接下来,我们让spring接管struts2。

引入struts2-spring-plugin-2.5.16.jar,放置lib下,然后右击->add as library,同样的将其部署WEB-INF/lib文件夹下,在WEB-INF下添加spring的配置文件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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--将UserAction交给Spring容器管理-->
    <bean name="userAction" class="action.UserAction"></bean>

</beans>

将struts.xml中的UserAction完整包名改成userAction,接下来,配置web.xml文件

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/applicationContext.xml</param-value>
    </context-param>

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

启动项目,访问成功,在这里,我们就将spring和struts配置好了,接下来,我们来配置hibernate:

添加hibernate的配置文件:

 接下来我们来使用hibernate来逆向生成实体类和xml文件:

 

 

上面,如果没有entity的包,则自己先在项目中创建包, 成功之后,我们会看到在entity包下生成了实体类和xml文件,接下来,我们将mysql-connector-java-5.1.44.jar引入进来,然后我们来创建dao层,UserDao

public class UserDao extends HibernateDaoSupport {
    public List<TbUserEntity> getUserList() {
        Session session = this.currentSession();
        Query query = session.createQuery("from TbUserEntity ");
        List<TbUserEntity> list = query.list();
        return list;
    }
}

 在我们之前的UserAction中添加如下代码

    //这里我们需要将UserDao交给spring管理,所以需要添加getter、setter方法
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public String getUserList(){
        List<TbUserEntity> list = userDao.getUserList();
        for (TbUserEntity userEntity : list){
            System.out.println(userEntity.getUserName());
        }
        return "success";
    }

applicationContext.xml添加

    <!--将UserAction交给Spring容器管理-->
    <bean name="userAction" class="action.UserAction">
        <property name="userDao" ref="userDao"></property>
    </bean>

    <!--配置sessionFactory,让spring管理hibernate-->
    <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    </bean>

    <bean name="userDao" class="dao.UserDao">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

然后启动,会抛出org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread的错误,在网上查阅资料,发现hibernate5+spring4需要配置事物,所以这里,我们在dao层的方法上加上@Transactional,接着在applicationContext.xml文件内配置事务:

    <bean class="org.springframework.orm.hibernate5.HibernateTransactionManager" name="transactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>

然后启动,会抛出要我们配置DataSource的错误,所以我们引入c3p0,配置数据源:

<!--配置连接池-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl"
                  value="jdbc:mysql://localhost:3306/examstack?useUnicode=true&amp;characterEncoding=UTF-8" />
        <property name="user" value="root" />
        <property name="password" value="123456" />

        <property name="maxPoolSize" value="50"></property>
        <property name="minPoolSize" value="10"></property>
        <property name="initialPoolSize" value="10"></property>
        <property name="maxIdleTime" value="25000"></property>
        <property name="acquireIncrement" value="1"></property>
        <property name="acquireRetryAttempts" value="30"></property>
        <property name="acquireRetryDelay" value="1000"></property>
        <property name="testConnectionOnCheckin" value="true"></property>
        <property name="idleConnectionTestPeriod" value="18000"></property>
        <property name="checkoutTimeout" value="5000"></property>
        <property name="automaticTestTable" value="t_c3p0"></property>
    </bean>

    <bean class="org.springframework.orm.hibernate5.HibernateTransactionManager" name="transactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
        <property name="dataSource" ref="dataSource"></property>
    </bean>

这次,绝地一连接,终于成功了,不容易啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值