接 Spring+Struts+ibatis下配置数据读写分离及事务(三)
10.配置log4j.properties,方便打印ibatis执行信息
# Global logging configuration log4j.rootLogger=ERROR, stdout,Rlogfile # SqlMap logging configuration log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.org.springframework=ERROR log4j.logger.org.apache.struts=ERROR log4j.logger.org.apache.cxf=ERROR # Console output log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %5p [%t] - %m%n #logfile log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.DatePattern=yyyy-MM-dd log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - <%m>%n log4j.appender.logfile.File=${webRoot}/logs/myweb.log log4j.appender.logfile.MaxFileSize=2048KB #Rlogfile log4j.appender.Rlogfile=org.apache.log4j.RollingFileAppender log4j.appender.Rlogfile.layout=org.apache.log4j.PatternLayout log4j.appender.Rlogfile.layout.ConversionPattern=%d %p [%c] - <%m>%n log4j.appender.Rlogfile.File=${webRoot}/logs/myweb.log log4j.appender.Rlogfile.MaxFileSize=2048KB log4j.appender.Rlogfile.MaxBackupIndex=10
11.配置Struts对应的action的配置(配置Struts+Json并实现了页面跳转)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="system" namespace="/" extends="json-default"> <action name="admin" class="adminAction"> <result type="json" name="ajaxSuccess"> <param name="root">result</param> </result> <result name="success" type="dispatcher">index.jsp</result> </action> </package> </struts>
12.配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.objectFactory" value="spring" /> <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" /> <!--导入后台系统Struts配置--> <include file="config/struts/bg/struts-system.xml"></include> <!--导入前台系统Struts配置--> </struts>
13.配置web.xml<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/spring.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--系统启动初始化BEGIN--> <listener> <listener-class>com.ssi222.wilr.util.listener.SystemInitListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!--系统启动初始化END--> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>config</param-name> <param-value>struts-default.xml,struts-plugin.xml,/config/struts.xml</param-value> </init-param> </filter> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <display-name></display-name> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
以上配置中还涉及到了一些java文件,如SystemInitListener,这个只是做测试,所以没有做什么操作,各位可以自己根据需求去写,SystemInitListener代码如下:
package com.ssi222.wilr.util.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SystemInitListener implements ServletContextListener { private static Log log = LogFactory.getLog(SystemInitListener.class); @Override public void contextDestroyed(ServletContextEvent arg0) { } @Override public void contextInitialized(ServletContextEvent sce){ this.SystemStarup(sce.getServletContext()); } public void SystemStarup(ServletContext servletContext){ log.info("系统启动初始化..."); log.info("系统正在初始化服务容器..."); try { new ClassPathXmlApplicationContext(new String[] { "config\\spring.xml" }); } catch (Exception ex) { log.error("初始化服务容器发生错误,请仔细检查您的配置文件!\n" + ex.getMessage()); ex.printStackTrace(); System.exit(0); } } }
涉及到的Action如下:
public class AdminAction extends ActionSupport { private IAdminService adminService; private AdminInfo admin; private String result; public AdminInfo getAdmin() { return admin; } public void setAdmin(AdminInfo admin) { this.admin = admin; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } public void setAdminService(IAdminService adminService) { this.adminService = adminService; } public String login() { AdminInfo adminInfo=adminService.checkAdminLogin(admin.getAccount()); Map<String, String> map=new HashMap<String, String>(); if(adminInfo==null) map.put("msg","您输入的用户名不存在"); else { if(Utils.validateStrIsEquals(adminInfo.getPassword(), new MD5().getMD5ofStr(admin.getPassword()))) map.put("msg", "success"); else map.put("msg", "您输入的密码错误"); } result =Utils.getJson(map, "obj"); return "ajaxSuccess"; } public String index(){ return "success"; } }
涉及的service层相关代码如下:
/**
* @author Wilr * @function 基础业务模型接口 */ public interface IBaseService { } /** * @author Wilr * @function 业务基础模型实现基类 */ public class BaseServiceImpl implements IBaseService { protected IPresentation presentation; public void setPresentation(IPresentation presentation) { this.presentation = presentation; } } /** * @author Wilr * @function 管理员业务层接口 */ public interface IAdminService { /** * @author Wilr * @param loginAccount 登录账号(account/email) * @function 检查用户登录 * @return 符合条件的用户 */ public AdminInfo checkAdminLogin(String account); } /** * @author Wilr * @function 管理员业务层接口实现 */ public class AdminServiceImpl extends BaseServiceImpl implements IAdminService { private static final String NAMESPACE="System"; //对应Ibatis中配置的命名空间 @Override public AdminInfo checkAdminLogin(String account) { return (AdminInfo)presentation.queryForObject(NAMESPACE+".loadLoginAdmin",account); } }
jsp页面采用AJAX提交并跳转页面的javascript代码清单如下:
function errorShow(msg,tagart){ $('#username').removeClass('username').addClass('errorusername'); $('#msgTip>div').text(msg); $('#msgTip').show(); $(tagart).focus(); } $(document).ready(function(){ $('#account').focus(); $('#login').bind("click",function(){ var $account=$('#account').val(); var $password=$('#password').val(); if($account.length<=0){ errorShow('请输入用户名','#account'); return false; } if($password.length<=0){ errorShow('请输入密码','#password'); return false; } $.post("admin!login",{"admin.account":$account,"admin.password":$password},function(data){ var $result=$.parseJSON(data).msg; if($result=="success") window.location.href = "admin!index"; else errorShow($result,'#account'); }); }); });
涉及到的javabean类我就不列举清单了,涉及的数据持久层请看我的博客:
http://wilr.iteye.com/admin/blogs/1189330(浅谈Spring+Struts+Ibatis项目结构下的持久层优化)
整个整合配置过程到此全部结束,有写的不好的地方大家多给点意见和多多包涵,我在继续优化,也方便小弟近一步提高,
小弟在此先行谢过。