SeaSar2之struts2+ seasar2 + s2dao框架整合-yellowcong

来源:互联网 发布:linux 内存查询 编辑:程序博客网 时间:2024/04/28 20:45

说起来,整合这个玩意还挺费事的,由于jar的不对,导致许多莫名奇妙的问题,其中Maven的jetty插件不支持jsp,需要自己配置,当时我就想骂人了,整体来说,整合的步骤基本是先Seasar2,然后s2dao,最后是struts,没啥难度,就是资料少,不好弄,淡腾,整合框架源码地址:https://git.oschina.net/yellowcong/seasar

项目结构

这里写图片描述

环境搭建

pom.xml

我的数据库是mysql的,大家需要注意了,需要替换成自己的数据库版本

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>seasar</groupId>  <artifactId>demo</artifactId>  <packaging>war</packaging>  <version>0.0.1-SNAPSHOT</version>  <name>demo Maven Webapp</name>  <url>http://maven.apache.org</url>     <repositories>        <repository>            <id>aliyunmaven</id>            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>        </repository>        <repository>            <id>seasar</id>            <url>https://www.seasar.org/maven/maven2/</url>        </repository>        <repository>            <id>ojdbc6</id>            <url>http://www.datanucleus.org/downloads/maven2/</url>        </repository>    </repositories>  <dependencies>   <!-- 导入jsp -->    <dependency>        <groupId>javax.servlet.jsp</groupId>        <artifactId>jsp-api</artifactId>        <version>2.2.1-b03</version>        <scope>provided</scope>    </dependency>    <!-- 导入servlet -->    <dependency>        <groupId>javax.servlet</groupId>        <artifactId>servlet-api</artifactId>        <version>2.5</version>        <scope>provided</scope>    </dependency>    <!-- https://mvnrepository.com/artifact/taglibs/standard -->    <dependency>        <groupId>taglibs</groupId>        <artifactId>standard</artifactId>        <version>1.1.2</version>    </dependency>    <dependency>         <groupId>javax.servlet</groupId>         <artifactId>jstl</artifactId>         <version>1.2</version>     </dependency>     <!-- seasar框架 的容器  BEGIN-->    <dependency>        <groupId>org.seasar.container</groupId>        <artifactId>s2-framework</artifactId>        <version>2.4.12</version>    </dependency>    <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->    <dependency>        <groupId>aopalliance</groupId>        <artifactId>aopalliance</artifactId>        <version>1.0</version>    </dependency>    <dependency>        <groupId>commons-logging</groupId>        <artifactId>commons-logging</artifactId>        <version>1.1.1</version>    </dependency>    <!-- https://mvnrepository.com/artifact/ognl/ognl -->    <dependency>        <groupId>ognl</groupId>        <artifactId>ognl</artifactId>        <version>2.6.9-patch-20070624</version>    </dependency>    <!-- Jta需要加入,不然就会报java.lang.NoClassDefFoundError: javax/transaction/TransactionManager -->    <dependency>        <groupId>javax.transaction</groupId>        <artifactId>jta</artifactId>        <version>1.1</version>    </dependency>    <!-- https://mvnrepository.com/artifact/javassist/javassist -->    <dependency>        <groupId>javassist</groupId>        <artifactId>javassist</artifactId>        <version>3.4.GA</version>    </dependency>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.10</version>    </dependency>     <!-- seasar框架 的容器  END-->    <!--seasar框架 S2Dao BEGIN-->    <!-- 不同版本的s2-dao依赖的s2-framework不一样 -->    <dependency>        <groupId>org.seasar.dao</groupId>        <artifactId>s2-dao</artifactId>        <version>1.0.50</version>    </dependency>    <!-- https://mvnrepository.com/artifact/org.seasar.container/s2-extension -->    <dependency>        <groupId>org.seasar.container</groupId>        <artifactId>s2-extension</artifactId>        <version>2.3.23</version>    </dependency>    <!-- 注解需要,对于实体类,需要这个包 -->    <dependency>        <groupId>org.seasar.dao</groupId>        <artifactId>s2-dao-tiger</artifactId>        <version>1.0.47</version>    </dependency>    <!-- https://mvnrepository.com/artifact/log4j/log4j -->    <dependency>        <groupId>log4j</groupId>        <artifactId>log4j</artifactId>        <version>1.2.13</version>    </dependency>    <dependency>        <groupId>commons-beanutils</groupId>        <artifactId>commons-beanutils</artifactId>        <version>1.7.0</version>    </dependency>        <!-- https://mvnrepository.com/artifact/oracle/ojdbc6 --><!--    <dependency>        <groupId>oracle</groupId>        <artifactId>ojdbc6</artifactId>        <version>11.2.0.3</version>    </dependency> -->    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->    <!-- 通过mysql 数据连接,我不想用oracle,因为是公司的数据,怕整错了 -->    <dependency>        <groupId>mysql</groupId>        <artifactId>mysql-connector-java</artifactId>        <version>5.1.39</version>    </dependency>    <!--seasar框架 S2Dao End-->    <!-- Struts START -->    <dependency>        <groupId>org.apache.struts</groupId>        <artifactId>struts2-core</artifactId>        <version>2.3.3</version>    </dependency>    <dependency>        <groupId>org.seasar.struts2</groupId>        <artifactId>struts2-seasar-plugin</artifactId>        <version>1.0.0</version>    </dependency>    <dependency>        <groupId>org.seasar.mayaa</groupId>        <artifactId>mayaa</artifactId>        <version>1.1.26</version>    </dependency>    <dependency>        <groupId>velocity</groupId>        <artifactId>velocity</artifactId>        <version>1.4</version>    </dependency>    <dependency>        <groupId>velocity-tools</groupId>        <artifactId>velocity-tools</artifactId>        <version>1.1</version>    </dependency>    <dependency>        <groupId>commons-digester</groupId>        <artifactId>commons-digester</artifactId>        <version>1.8</version>    </dependency>    <!-- Struts END -->  </dependencies>  <build>    <finalName>demo</finalName>     <plugins>        <plugin>          <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-war-plugin</artifactId>            <version>2.6</version>            <configuration>                <!-- 配置war包的名称 -->               <warName>hello</warName>            </configuration>          </plugin>            <plugin>                <groupId>org.eclipse.jetty</groupId>                <artifactId>jetty-maven-plugin</artifactId>                <version>9.4.6.v20170531</version>                <configuration>                      <scanIntervalSecond>10</scanIntervalSecond>                      <webApp>                          <contextPath>/demo</contextPath>                      </webApp>                      <connectors>                          <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">                              <port>8080</port>                              <maxIdleTime>60000</maxIdleTime>                          </connector>                      </connectors>                  </configuration>            </plugin>             <plugin>                     <artifactId>maven-compiler-plugin</artifactId>                     <version>2.3.2</version>                     <configuration>                         <source>1.7</source>                         <target>1.7</target>                         <encoding>UTF-8</encoding>                     </configuration>              </plugin>     </plugins>  </build></project>

app.dicon

需要添加对Action的自动注入

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN""http://www.seasar.org/dtd/components.dtd"><components >    <!--dao.dicon  我们必须配置这个dao.dicon,而且还必须有j2ee这个dao文件,这个是s2-dao-1.0.50.jar包下面默认配置的,我草,真尼玛是坑啊-->    <include path="dao.dicon"/>  <!-- ==================================================================== -->  <!-- Interceptor Chains                                                   -->  <!-- ==================================================================== -->  <!-- DAO Interceptor Chain -->  <component name="daoChain" class="org.seasar.framework.aop.interceptors.InterceptorChain">    <!-- <initMethod name="add"><arg>arkfw.timerInterceptor</arg></initMethod> -->    <!-- 调用dao.dicon下的interceport拦截器, -->    <initMethod name="add"><arg>dao.interceptor</arg></initMethod>  </component>    <!-- ==================================================================== -->    <!-- Component Auto Register                                              -->    <!-- ==================================================================== -->    <!-- Component Auto Register -->    <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">        <!-- DAO -->        <initMethod name="addClassPattern" >          <arg>"com.yellowcong.dao"</arg>          <arg>".*Dao"</arg>        </initMethod>        <!-- Business Logic -->         <initMethod name="addClassPattern" >          <arg>"com.yellowcong.service"</arg>          <arg>".*Impl"</arg>        </initMethod>        <!-- Action -->        <initMethod name="addClassPattern" >          <arg>"com.yellowcong.action"</arg>          <arg>".*Action"</arg>        </initMethod>      </component>      <!-- ==================================================================== -->      <!-- Aspect Auto Register                                                 -->      <!-- ==================================================================== -->      <!-- S2Dao Interceptor Auto Register -->      <component class="org.seasar.framework.container.autoregister.AspectAutoRegister">        <property name="interceptor">daoChain</property>        <initMethod name="addClassPattern" >          <arg>"com.yellowcong.dao"</arg>          <arg>".*Dao"</arg>        </initMethod>      </component></components>

j2ee.dicon

基本没啥改动,就是数据库注意点

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN""http://www.seasar.org/dtd/components.dtd"><components namespace="j2ee">    <component name="transactionManager"        class="org.seasar.extension.jta.TransactionManagerImpl"/>    <component name="requiredTx"        class="org.seasar.extension.tx.RequiredInterceptor"/>    <component name="requiresNewTx"        class="org.seasar.extension.tx.RequiresNewInterceptor"/>    <component name="mandatoryTx"        class="org.seasar.extension.tx.MandatoryInterceptor"/>    <component name="notSupportedTx"        class="org.seasar.extension.tx.NotSupportedInterceptor"/>    <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>    <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>    <component name="xaDataSource"        class="org.seasar.extension.dbcp.impl.XADataSourceImpl">        <property name="driverClassName">            "com.mysql.jdbc.Driver"        </property>        <!--    数据库配置-->        <!--         <property name="URL">"jdbc:oracle:thin:@10.0.7.170:1522:ORCL5"</property>        <property name="user">"SOFINAM_HENSEI"</property>        <property name="password">"SOFINAM_HENSEI"</property>         -->        <property name="URL">"jdbc:mysql:///seasar2"</property>        <property name="user">"root"</property>        <property name="password">"root"</property>    </component>    <component name="connectionPool"        class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">        <property name="timeout">600</property>        <property name="maxPoolSize">10</property>        <property name="allowLocalTx">true</property>        <destroyMethod name="close"/>    </component>    <component name="dataSource"        class="org.seasar.extension.dbcp.impl.DataSourceImpl"/></components>

log4j.xml

<?xml version="1.0" encoding="Shift_JIS" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">    <!-- STDOUT -->    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">        <param name="target" value="System.out" />        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%d{yyyy/MM/dd HH:mm:ss}] %-5p [%c{1}]: %m%n"/>        </layout>    </appender>    <category name="org.seasar" additivity="false">        <priority value="DEBUG"/>        <appender-ref ref="CONSOLE"/>    </category><!--    <category name="jp.co.arksystems.sys.arkfw" additivity="false">        <priority value="DEBUG"/>        <appender-ref ref="CONSOLE"/>    </category> -->    <category name="com.yellowcong" additivity="false">        <priority value="DEBUG"/>        <appender-ref ref="CONSOLE"/>    </category>     <root>        <priority value ="INFO" />        <appender-ref ref="CONSOLE" />    </root></log4j:configuration>

struts.xml

struts文件,需要注意的地方是,s2componentStack这个拦截器配置的时候,下面默认的拦截器,有些不好使,有可能是struts的版本问题,解决办法是看struts包下面的 struts-defualt.xml配置中的默认拦截器

<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd"><struts>    <!-- 修改后缀名称 ,填写空,就表示去掉默认后缀操作-->    <constant name="struts.action.extension" value=""/>    <package name="default" extends="seasar-default">        <interceptors>            <interceptor-stack name="s2componentStack">                <interceptor-ref name="alias" />                <interceptor-ref name="prepare" />                <interceptor-ref name="i18n" />                <interceptor-ref name="chain" />                <interceptor-ref name="s2component" />                <interceptor-ref name="modelDriven" />                 <interceptor-ref name="fileUpload" />                <interceptor-ref name="staticParams" />                <interceptor-ref name="params" />                <interceptor-ref name="conversionError" />                <interceptor-ref name="validation">                    <param name="excludeMethods">                        input,back,cancel,browse                    </param>                </interceptor-ref>                <interceptor-ref name="workflow">                    <param name="excludeMethods">                        input,back,cancel,browse                    </param>                </interceptor-ref>            </interceptor-stack>        </interceptors>        <default-interceptor-ref name="s2componentStack" />        <action name="list"  method ="list" class="com.yellowcong.action.UserAction">            <result type="velocity"  name="success">                 page/user/list.jsp            </result>        </action>    </package></struts>

struts-xx.jar包下面,有一个struts-defualt.xml配置文件,里面写了一堆默认的拦截器配置
这里写图片描述

web.xml

<?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"    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>Archetype Created Web Application</display-name>    <welcome-file-list>        <welcome-file>index.jsp</welcome-file>    </welcome-file-list>    <!-- Seasar容器管理 -->    <filter>        <filter-name>s2filter</filter-name>        <filter-class>            org.seasar.framework.container.filter.S2ContainerFilter        </filter-class>    </filter>    <filter-mapping>        <filter-name>s2filter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>    <!-- struts配置 -->    <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>    </filter-mapping>    <!-- seasar容器监听器 -->    <listener>        <listener-class>            org.seasar.framework.container.servlet.S2ContainerListener        </listener-class>    </listener>    <servlet>        <servlet-name>s2servlet</servlet-name>        <servlet-class>            org.seasar.framework.container.servlet.S2ContainerServlet        </servlet-class>        <init-param>            <param-name>debug</param-name>            <param-value>false</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>s2servlet</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>    <!-- 设置编码 -->    <filter>    <filter-name>encodingfilter</filter-name>        <filter-class>org.seasar.extension.filter.EncodingFilter</filter-class>        <init-param>          <param-name>encoding</param-name>          <param-value>UTF-8</param-value>        </init-param>      </filter>  <filter-mapping>   <filter-name>encodingfilter</filter-name>   <url-pattern>/*</url-pattern> </filter-mapping></web-app>

到这里,基本上都配置完成了,下一步,就是实际案例了

案例

通过请求来跳转到页面

Uesr

数据库实体类

package com.yellowcong.action;import java.util.List;import com.opensymphony.xwork2.ActionSupport;import com.yellowcong.service.UserService;import com.yellowcong.service.entity.User;/****作者:yellowcong*日期:2017/08/30*時間:13:36:53*描述:*/public class UserAction extends ActionSupport {    private UserService userService ;    public void setUserService(UserService userService) {        this.userService = userService;    }    public  String list() {        List<User> users = this.userService.list();        for(User uesr:users) {            System.out.println(uesr.getUsername());        }        return SUCCESS;    }}

UserDao

操作数据库数据

package com.yellowcong.dao;import java.util.List;import org.seasar.dao.annotation.tiger.S2Dao;import org.seasar.dao.annotation.tiger.Sql;import com.yellowcong.service.entity.User;/****作者:yellowcong*日期:2017/08/29*時間:16:16:38*描述:用户操作的Dao*/@S2Dao(bean=User.class)public interface UserDao {    /**     * 获取用户名称     * @param username     * @return     */    @Sql("SELECT * FROM USER ")    List<User> list();}

UserService

package com.yellowcong.service;import java.util.List;import com.yellowcong.service.entity.User;/****作者:yellowcong*日期:2017/08/29*時間:16:48:46*描述:*/               public interface UserService {    /**     * 获取用户名称     * @param username     * @return     */    List<User> list();}

UserServiceImpl

package com.yellowcong.service.impl;import java.util.List;import com.yellowcong.dao.UserDao;import com.yellowcong.service.UserService;import com.yellowcong.service.entity.User;/****作者:yellowcong*日期:2017/08/29*時間:16:49:32*描述:*/public class UserServiceImpl implements UserService{    private UserDao userDao;    public void setUserDao(UserDao userDao) {        this.userDao = userDao;    }    @Override    public List<User> list() {        return this.userDao.list();    }}

UserAction

package com.yellowcong.action;import java.util.List;import com.opensymphony.xwork2.ActionSupport;import com.yellowcong.service.UserService;import com.yellowcong.service.entity.User;/****作者:yellowcong*日期:2017/08/30*時間:13:36:53*描述:*/public class UserAction extends ActionSupport {    private UserService userService ;    public void setUserService(UserService userService) {        this.userService = userService;    }    public  String list() {        List<User> users = this.userService.list();        for(User uesr:users) {            System.out.println(uesr.getUsername());        }        return SUCCESS;    }}

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>用户列表</body></html>

测试

访问没问题,就是反悔的结果中, <%%>代码没有被解释,这是我使用jetty服务器的原因导致的

这里写图片描述

原创粉丝点击