spring+struts2+mybatis整合

总结完springmvc+mybatis整合后,再总结下struts2的。

首先jar包为3个部分之和,外加struts2-spring-plugin、mybatis-spring、commons中logging,io等、log4j(二点几的版本)、mysql-connector-java等。

pojo、dao和mapper不再赘述。controller变成了由action控制,主要就是配置文件了。

首先提一下表单提交数据问题,之前的文章提到过,action继承ActionSupport后,设置同名参数和相应set方法,可以将表单数据传入,springmvc其实差不多,只是放在方法参数里了。当然还有其他如模型驱动等参数绑定方式。

配置文件需要数据库连接配置db.properties,struts.xml,application.xml,log4j2.xml,还有就是web.xml了。

首先是struts.xml
<struts>
    <!-- 文件名为struts.xml不能错,因为它不需要主动加载,放src目录下 -->
    <constant name="struts.i18n.encoding" value="utf-8"></constant>
    <package name="exercise" namespace="/" extends="struts-default">
        <action name="LoginAction" class="com.cl.action.ActionDemo1"
            method="login">
            <result name="success" type="dispatcher">/WEB-INF/jsp/loginSucceed.jsp</result>
            <result name="error" type="dispatcher">/WEB-INF/jsp/error.jsp</result>
        </action>
    </package>
</struts>

这里jsp放在WEB-INF下jsp文件夹里,路径要从WEB-INF开始写起,暂时不知如何像springmvc一样设置前缀和后缀,WEB-INF前的斜杠可不写。

然后是application.xml

<context:property-placeholder location="classpath:db.properties" />
    <context:component-scan base-package="com.cl.service"/>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="mapperLocations" value="classpath:com/cl/mapper/*.xml"></property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.cl.dao"></property>
    <!-- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> -->
    </bean>

这里需要注意的是mybatis.xml文件可以不写,使用自动生成不需要设置别名,mapper文件这里也有注入。然后是粗体部分,这部分在springmvc里可以配置,但是这里不写没错,写了反而出错,暂时不知道原因。

然后是log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="1800">
    <properties>
        <!-- 这样写会默认在D盘(eclipse所在盘)建立文件夹MyLogs/ssm_log -->
        <property name="LOG_HOME">/MyLogs/ssm_log</property>
        <property name="FILE_NAME">mylog</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>

        <RollingRandomAccessFile name="running-log"
            fileName="${LOG_HOME}/${FILE_NAME}.log"
            filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"
            immediateFlush="true">
            <PatternLayout
                pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="30" />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
             <!-- <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
              </Filters> -->
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console" />
            <AppenderRef ref="running-log" />
        </Root>
    </Loggers>
</Configuration>

关于这个配置具体详情,请参考http://blog.csdn.net/autfish/article/details/51203709

因为log4j的Log4jConfigListener过期了,在spring5中可以用log4j2代替,但是需要上面这个xml文件配置。这里需要注意的是粗体部分,在Root中设置较低级别trace,在控制台设置info及以上级别,日志文件也可以设置想要的级别,这样可以使得控制台只输出简要error或者warning,而日志文件可以详细记录。关于不同文件设置不同日志级别,请参考http://blog.csdn.net/seven_zhao/article/details/42172441

最后是web.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:configs/application.xml</param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:configs/log4j2.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
    </listener>
    <filter>
    <filter-name>log4jServletFilter</filter-name>
    <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>log4jServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
         <dispatcher>REQUEST</dispatcher>
         <dispatcher>FORWARD</dispatcher>
         <dispatcher>INCLUDE</dispatcher>
         <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    
    <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>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>/WEB-INF/jsp/index.jsp</welcome-file>
    </welcome-file-list>

这里就是将log4j.properties换成xml文件,listener换一下,过滤器也可以设置下。

最后看一下action:

public class ActionDemo extends ActionSupport {
    //首先在xml配置中找myLog,找不到以LogManager.ROOT_LOGGER_NAME代替
    //只是打印的时候用的是myLog名称
     private static Logger logger=LogManager.getLogger("myLog");
    @Autowired
    private UserService us;
    private String username;
    private String password;

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String login() {
        List<User> users = us.findAll();
        for (User u : users) {
            if (username.equals(u.getUsername()) && password.equals(u.getPassword())) {
                 logger.info("找到目标用户,准备登录");
                 logger.trace("just test");
                return "success";
            }
        }
         logger.info("用户名或密码错误");
        return "error";
    }



猜你喜欢

转载自blog.csdn.net/qq_26567507/article/details/79118026
今日推荐