说起来,整合这个玩意还挺费事的,由于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服务器的原因导致的