zoukankan      html  css  js  c++  java
  • 浅谈一下SSI+Oracle框架的整合搭建

    浅谈一下SSI+Oracle框架的整合搭建

    最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所做的项目没有一个用过ORM的框架,至于Struts2也只是平时自己做做Demo玩玩,毕竟才出校园,不懂得东西还有太多太多,经过这么几天的摸索,对这套环境的搭建还算比较熟悉了,因此写一篇日志全当自我总结,也可以给那些初次接触这些框架的朋友一点小小小小小小的建议,当然文中的不足还望各位大神指出,帮助小弟快速地成长。

    这个Demo的所有jar包我都上传上来了,有兴趣或者有需要的朋友可以直接下载。

    http://pan.baidu.com/share/link?shareid=582164770&uk=772999987

    开发环境是JDK1.6+Tomcat6.0

    好了,不多说了,先上个项目的结构图。

    让我先按照Action-Service-Dao的顺序把所有的层的代码贴出来。

    PS:这个Demo起初我是为了测试spring整合ibatis的事务管理,所以只有增删改的方法,并且测试数据都是写死在代码里的,有兴趣的朋友可以添加更多的方法和完善页面

    首先是Action层:

     TestAction.java

    接着是Service层的接口以及实现类:

     TestSvcIfc.java
     TestSvcImpl.java

    随机生成测试数据的工具类:

     TestUtil.java

    最后是Dao层接口以及其实现类:

     TestDaoIfc.java
     TestDaoImpl.java

    当然还有用于和数据库表映射的实体Bean:

     TestBean.java

    晕,好像把顺序搞错了,最先应该出场的应该是数据库,好吧,赶紧补上。

    在这里,我们建立了一个test的SEQUENCE和test的TABLE,具体Query如下:

    CREATE SEQUENCE seq_test
    INCREMENT BY 1
    START WITH 1
    NOMAXvalue
    NOCYCLE
    NOCACHE;
    复制代码
    CREATE TABLE tb_test(
    id int primary key,
    test_data1 varchar(12) not null,
    test_data2 varchar(12) not null,
    test_data3 varchar(12),
    flag varchar(1)
    );
    复制代码

    关于SEQUENCE中的各种参数的说明,请参考下面这位大神的博客。
    http://blog.sina.com.cn/s/blog_a3ffb91101011yjj.html

    OK,到目前为止,我们已经把基本要用到的类(除去一个Exception的类)都贴了出来,现在就是进行配置文件书写的时候了。

    首先咱们来个log4j的配置文件(仅仅为Demo,所以网上copy的,具体的配置大家可以根据自己的口味进行修改):

    复制代码
    log4j.rootLogger=info,Console,R 
    
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    
    #log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    
    log4j.appender.Console.layout.ConversionPattern=%d{yy-MM-dd HH:mm:ss} %5p %c{1}:%L - %m%n
    
    
    
    log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
    
    log4j.appender.R.File=${catalina.home}/logs/tomcat.log 
    
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    
    log4j.appender.R.layout.ConversionPattern=%d{yyyy.MM.dd HH:mm:ss} %5p %c{1}(%L):? %m%n 
    
    
    
    log4j.logger.org.apache=info,R
    
    log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=DEBUG, R 
    
    log4j.logger.org.apache.catalina.core=info,R
    
    log4j.logger.org.apache.catalina.session=info,R
    复制代码

    接下来,让我们先配置ibatis的配置文件SqlMapConfig.xml以及映射实体Bean和数据库表的Map文件TestMap.xml:

     SqlMapConfig.xml
     TestMap.xml

    关于更多关于ibatis的配置和参数使用说明,大家可以去问问“谷”大哥。

    配置完ibatis之后,大家可以配置spring的配置文件了,因为类和ibatis的文件都创建好了,所以这会儿配spring文件时很合适的,配置文件中有很多命名不是很规范的,所以大家请不要盲目效仿,应该遵循一些比较规范的命名规则:

     applicationContext.xml

    接着SSI就还差一个S了,那就是struts2的配置文件,由于是整合了spring,所以配置文件中

    <constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />

    这句话尤为关键,在action中的class那里直接输入spring中配置好的Action的id就好了,至于另外一句<constan ....>大家可以不管,这个只是为了取消Struts2标签自带的一些样式罢了:

     struts.xml

    接着,随便写两个页面,一个操作页面一个error页面,由于我的测试数据是在代码里生成的,所以页面上就三个按钮,直接触发后台的action:

    index.jsp

    复制代码
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://"
                + request.getServerName() + ":" + request.getServerPort()
                + path + "/";
    %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <base href="<%=basePath%>">
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    
    <!--
            <link rel="stylesheet" type="text/css" href="styles/styles.css">
            <script type="text/javascript" src="scripts/xx.js"></script>
            -->
    </head>
    <body>
        <h3>Add Test Data</h3>
        <s:form action="testAction!addTest" method="post">
            <s:submit value="Add Test" />
        </s:form>
        <hr />
        <h3>Delete Test Data</h3>
        <s:form action="testAction!deleteTest" method="post">
            <s:submit value="Delete Test" />
        </s:form>
        <hr />
        <h3>Update Test Data</h3>
        <s:form action="testAction!updateTest" method="post">
            <s:submit value="Update Test" />
        </s:form>
        <hr />
    </body>
    </html>
    复制代码

    error.jsp

    复制代码
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://"
                + request.getServerName() + ":" + request.getServerPort()
                + path + "/";
    %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <base href="<%=basePath%>">
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    
    <!--
            <link rel="stylesheet" type="text/css" href="styles/styles.css">
            <script type="text/javascript" src="scripts/xx.js"></script>
            -->
    </head>
    <body>
        <h3>
            <s:property value="#request.msg" />
        </h3>
    </body>
    </html>
    复制代码

    好了,所有的配置均已完成,让我启动万恶的Tomcat的吧,启动后的页面如下,哇靠,太丑了,不过将就了呗。

    接下来,让我们点击Add Test,如果你出现了空白页面,如下,恭喜你,你的数据插入成功了(因为插入成功返回了一个null,没有相对于的页面,当然是空白的,哈哈):

    为了添加更多的测试数据,让我们把url中action后面从冒号开始的字符串删掉,然后不停地点击再回车(重复提交这个action),这样就会向数据库插入若干的测试数据,在这里,就引申出如何防止重复提交的问题,关于这一点,还请大家继续咨询“谷”大哥。

    打开数据库,看看刚才的杰作吧:

    至此,一个SSI的Demo就算是搭建成功了,关于删除和更新,大家可以再去试试,因为是写死了,所以只会对id=2的这一条记录进行删除或更新的操作。

    那么是否就此结束了呢,当然没有,起初做这个demo的时候是为了测试一下事务管理的功能,所以,让我们修改一下Dao层的代码,就拿deleteTest方法做测试吧,我直接把原有的try{}catch{}代码块删除掉,在进行删除作业后直接抛出一个自定义的异常,如图所示:

        @Override
        public void deleteTest(TestBean test) throws TestException {
            sqlMapClientTemplate.delete("deleteQuery", test);
            throw new TestException("Database error");
        }

    这样子的话当我点击页面的Delete Test的时候,页面应该跳转至error.jsp,数据库被删除掉的数据应该回滚,也就是id为2的值应该还存在,so,如下:

    好的,事实证明一切都成功了,但在成功之前,我却先见过他妈咪,最开始页面也会跳转到error.jsp,但是数据库中的数据却被删除了,为什么呢,这个时候前文一直提到却没现身的Exception类该登场了。

    复制代码
    package com.ssi.test.exception;
    
    public class TestException extends RuntimeException {
        public TestException() {
    
        }
    
        public TestException(String msg) {
            super(msg);
        }
    }
    复制代码

    在这里,大家注意,我的异常类是继承了RuntimeException而不是Excepetion,各位基础扎实和有经验的朋友或许明白我之前犯了什么错了,因为在成功之前,我的这个Exception继承的是Excpeition而非现在的RuntimeException,所以出现了页面跳转正确,事务管理失败的情况,至于为什么,请参考下面这位大神。http://java.chinaitlab.com/configure/899978.html

    好了好了,不说了,都下班了,不足的还望大家指出。

    #####################################################################

    忘了还有个最关键的东西,当然,大家熟悉web开发的话应该都知道,那就是web.xml的配置,记得把Struts2的核心filter和spring容器的listener加上:

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xmlns="http://java.sun.com/xml/ns/javaee" 
             xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>ssiTest</display-name> 
        
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>
                org.apache.struts2.dispatcher.FilterDispatcher            
            </filter-class>
        </filter>
          
        <filter-mapping>     
            <filter-name>struts2</filter-name> 
            <url-pattern>/*</url-pattern> 
            <dispatcher>REQUEST</dispatcher> 
            <dispatcher>FORWARD</dispatcher> 
        </filter-mapping> 
        
        <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>
                
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    </web-app>
    复制代码
     
     
    分类: JavaEE
    标签: javaspringstrutsibatisSSIJ2EE整合Oracle
  • 相关阅读:
    Zuul路由转发规则
    logstash数据处理示例
    Spring Cloud问题分析
    Linux定时器工具
    线上系统问题定位
    spring-data-redis读写分离
    日志及参数的乱码问题
    Maven中使用本地jar包
    给数据库用户付权
    jira 跟工时有关的配置文件
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3187857.html
Copyright © 2011-2022 走看看