总结完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";
}