`
wangkebin
  • 浏览: 74856 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

Spring+Struts+ibatis下配置数据读写分离及事务(四)

阅读更多

接 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项目结构下的持久层优化)

整个整合配置过程到此全部结束,有写的不好的地方大家多给点意见和多多包涵,我在继续优化,也方便小弟近一步提高,

小弟在此先行谢过。

 

 

分享到:
评论

相关推荐

    Spring+Struts+ibatis下配置数据读写分离及事务(一)

    在数据读写分离的场景下,Struts可以配合Spring进行事务控制,通过Action的配置来决定事务的边界。例如,一个Action可能对应一个数据库的写操作,另一个Action则负责多个读操作。这样,Struts可以在Spring的事务管理...

    ibatis+spring+struts完整例子数据同步程序

    这个"ibatis+spring+struts完整例子数据同步程序"就是一个典型的Java EE应用程序,它整合了三个关键的开源框架:Struts、Spring和iBatis。这些框架分别负责表现层、业务层和服务层的管理,提供了一个强大的开发工具...

    SSi(Struts2+Spring+iBatis)实现文件上传下载功能

    而iBatis则作为一个持久层框架,简化了SQL操作,实现了数据访问层与业务逻辑的分离。 在这个项目中,"SSi实现文件上传下载功能"主要是利用Struts2的Action类和拦截器来处理HTTP请求,Spring来管理服务层对象,以及...

    struts2 spring2 ibatis整合代码完整项目

    Struts2、Spring2 和 iBatis 是三个在Java Web开发中非常重要的开源框架,它们分别负责MVC模式中的Action层、依赖注入及业务层的数据访问。本项目整合了这三个框架,提供了一个完整的代码实现,方便开发者快速搭建...

    mvc框架整合示例

    在`spring事务处理.txt`中,可能会详细阐述Spring的声明式事务管理,包括基于注解和基于XML的配置,如何处理事务异常,以及如何实现事务的隔离级别和读写策略。 3. **Spring + Hibernate + Struts2整合** 这种...

    SpringMvc+Ibatis包

    这个包包含了一系列与这两个框架相关的库文件,为开发者提供了集成Spring MVC和iBATIS的便捷途径,以实现高效、灵活的业务逻辑处理和数据访问。 Spring MVC是Spring框架的一部分,它是一个基于模型-视图-控制器...

    跟我学spring3(8-13).pdf

    1. **10.1 概述**:Spring可以通过Servlet监听器、DispatcherServlet、MVC配置等方式与其他Web框架如Struts、JSF集成,实现业务逻辑和展示层的分离。 2. **10.2 集成Struts1.x**:Spring可以作为Struts的动作处理器...

    iBATIS实战

    9.6.2 高速缓存可读写数据 169 9.6.3 高速缓存旧的静态数据 170 9.7 小结 172 第10章 iBATIS数据访问对象 173 10.1 隐藏实现细节 173 10.1.1 为何要分离 174 10.1.2 一个简单示例 175 10.2 配置DAO 177 10.2.1 ...

    ssi框架入门详解

    Spring还提供了事务管理、数据源配置等企业级服务,以及对其他框架(如Hibernate、MyBatis)的集成。 **Ibatis**是一个轻量级的ORM(对象关系映射)框架,它的主要作用是简化SQL操作,将数据库查询与Java代码解耦。...

    JAVA技术体系.pdf

    - **具体框架**:Struts1和2提供表现层支持,Spring提供业务层服务,Hibernate和iBATIS处理数据持久化。 4. **Java高级软件工程师**: - **开源技术与框架**:如工作流引擎、规则引擎、搜索引擎、缓存、任务调度...

    面试JAVA程序员常遇到的一些问题.pdf,这是一份不错的文件

    1. Spring事务的隔离性:Spring提供了四种隔离级别,分别是READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。它们主要解决并发情况下数据一致性的问题,例如脏读、不可重复读和幻读。 2. Spring...

    MyEclipse中涵盖知识点.pdf

    Spring框架中的声明式事务管理,允许开发者在配置文件中声明事务边界,而不是在代码中显式处理。这种方式降低了事务管理对业务逻辑的影响,提高了代码的可维护性。 11. 数据持久化: 数据持久化是将内存中的数据...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    读写分离 性能优化架构能力 代码级别 关联代码优化 cache对其 分支预测 copy on write 内联优化 系统优化 cache 延迟计算 数据预读 异步 轮询与通知 内存池 模块化 工程架构能力 开发语言 运维与...

    java初学者的比较好的学习路线(转)

    - **Spring框架**:掌握Spring的核心容器、AOP、事务管理等技术。 ##### 实战项目 - **OA系统**:基于Spring + Struts + Hibernate开发办公自动化系统。 - **CRM系统**:实现客户关系管理系统,涉及客户信息管理、...

    java必备知识点大全.pdf

    字节流与字符流的区别:字节流用于读写二进制数据,字符流用于读写文本数据。 final、finally、finalize三者区别:final用于声明常量,finally用在try-catch-finally语句中表示必须执行的代码块,finalize是Object...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题72:数据库的读写分离 Java面试题73:数据库优化之缓存 Java面试题74:sql语句优化小技巧 Java面试题75:批量插入几百万条数据 Java面试题76:有没有使用过redis Java面试题77:redis的使用场景 Java面试...

    常用jar包说明

    8. **spring-orm.jar**:提供对各种ORM框架的支持,包括Hibernate、iBATIS、JDO、OJB和TopLink。 9. **spring-test.jar**:为测试Spring应用程序提供了便利,包括单元测试和集成测试的工具。 10. **spring-tx.jar**...

    java资料集

    而`ibatis配置.txt`可能涉及的是MyBatis框架的配置和使用,它是一个轻量级的持久层框架,简化了数据库操作。 面向切面编程(AOP)是另一种提升代码组织和复用性的技术。`aop`标签暗示了这个资料集可能包含AOP的基本...

Global site tag (gtag.js) - Google Analytics