1. 程式人生 > >maven+struts2+spring+mybatis基礎配置記錄2018-8-14

maven+struts2+spring+mybatis基礎配置記錄2018-8-14

IDE環境:Intellij IDEA

pom.xml內容:

<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion
>
<groupId>專案路徑</groupId> <artifactId>ASTest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>ASTest Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url
>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <springframework.version>3.0.5.RELEASE</springframework.version
>
</properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-core --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-spring-plugin --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-web --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.4.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${springframework.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/com.opensymphony/xwork --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.1_3</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency> </dependencies> <build> <finalName>ASTest</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <!-- 設定 JDK 版本以及編碼 --> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf-8</encoding> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>

project structure配置:

Project

SDK:1.8

Modules

點選中間部分進行如下配置:

  • 專案根目錄
    source folders:src\main\java(右鍵Sources)
    resource folders:src\main\resources(右鍵Resources)
    excludedFolders:target(右鍵Excluded)

  • Spring
    選擇src/main/resources/applicationContext.xml(可先建立,下面會提到內容)

    • Web
      上方:專案路徑\src\main\webapp\WEB-INF\web.xml
      下方:專案路徑\src\main\webapp

Facets

勾選下方兩個source roots

Artifacts

新增一個Web Application Exploded
我配置的target位置是專案路徑\target\專案名稱

選擇apply和ok完成配置

tomcat配置,選擇右上角run按鈕左邊的小箭頭選擇Edit Configuration,新增一個本地的tomcat

Server

  • Open browser
    我選了chrome(注意此處default和chrome看起來圖示相同,單default實際會開啟IE)

  • VM options
    -Dfile.encoding=UTF-8

Deployment

新增一個Artifact,選擇專案名:war exploded,此時可以配置Application context二級目錄
如訪問網址為http://localhost:8080,此處若配置/則不變,配置為/a則根目錄變為http://localhost:8080/a

然後Apply OK即可。

web.xml配置

注意,此處修改的為src/main/webapp/WEB-INF/web.xml,如果有另一個外部的web目錄,可以刪掉那個目錄(沒有用,干擾)。

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<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_3_0.xsd"
         id="WebApp_ID" version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  <welcome-file-list>
    <welcome-file>/admin/test.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2 </filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
    <!-- 指定需要載入的Spring配置檔案 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- spring偵聽器,該偵聽器負責載入contextConfigLocation中指定的配置檔案 -->
</web-app>

spring配置

目錄:src/main/resources/applicationContext.xml
注意,此處配置,需同時配置上方提到的web.xml,和project structure裡面的Modules-spring配置一致,建立時最好右鍵同時,建立New->Xml Configuration File->Spring Config,這樣的好處是,如果project structure沒配置會進行提示,而且有spring葉子標誌。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 配置Annotation支援 -->
    <context:annotation-config/>
    <!-- 配置AspectJ註解支援 -->
    <aop:aspectj-autoproxy />
    <context:component-scan base-package="專案根目錄包名如com.a.b">

    </context:component-scan>
</beans>

struts.xml配置

@Scope("prototype")
@Controller("testAction")
public class TestAction extends ActionSupport {
    public String test(){
        System.out.println("login");
        return SUCCESS;
    }
}

此處controller需與上方class名相同

mybatis配置

目錄:src/main/resources/mybatis/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 資料庫連線配置,配置連線字串、使用者名稱、密碼或快取、懶載入、語句執行超時時間等這裡目前只配置了基本的資料庫連線屬性 -->
    <environments default="cybatis">
        <environment id="cybatis">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:埠/資料庫" />
                <property name="username" value="使用者名稱" />
                <property name="password" value="密碼" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mybatis/mapper/mem-mapper.xml" />
    </mappers>

</configuration>

mapper(此處用幾個表就幾個mapper的xml和mapper的類):
此處用的mem表路徑:src/main/resources/mybatis/mapper/mem-mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="專案路徑.mapper.MemberMapper">
    <resultMap id="memMap" type="專案路徑.bean.Member">
        <result column="id" property="id" jdbcType="INTEGER" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="email" property="email" jdbcType="VARCHAR" />
    </resultMap>
    <sql id="selectFragment">
  <![CDATA[
    select
         *
     from mem
  ]]>
  </sql>
    <sql id="pageFragment">
        <if test="page_start!=null">
            <if test="per_page!=null">
                <![CDATA[limit #{page_start},#{per_page}]]>
            </if>
        </if>
  </sql>

    <select id="selectAll" resultMap="memMap" parameterType="Map">
        <include refid="selectFragment" />
        <include refid="pageFragment" />
    </select>

    <select id="selectCount" resultType="java.lang.Integer">
        <![CDATA[
        select
            count(1)
        from mem
        ]]>
    </select>
</mapper>

幾個屬性:
sql-id <-> include-refid(相當於把sql放在此處)
resultMap-id<->select-resultMap
select-parameterType(引數傳入的引數型別,一般是類或Map)
select-resultType(如果是列表型別可以不用寫,如果是單count可以寫java.lang.Integer)

mapper介面:
public interface MemberMapper {
List selectAll(Map

public class BaseDao {

    private SqlSessionFactory getSqlSessionFactory() {
        Reader reader = null;
        SqlSessionFactory sqlSessionFactory = null;
        try {
            reader = Resources.getResourceAsReader("mybatis/mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sqlSessionFactory;
    }

    protected SqlSession openSession(){
        return getSqlSessionFactory().openSession();
    }

    protected SqlSession openSession(boolean autoUpdate){
        return getSqlSessionFactory().openSession(autoUpdate);
    }

    protected  void closeSession(SqlSession session){
        session.close();
    }
}

MemberDao.java`

@Component("memberDao")
public class MemberDao extends BaseDao {
 public List<Member> getAll(Map<String,Object> data){
        SqlSession session = openSession();
        try {
            MemberMapper mapper = session.getMapper(MemberMapper.class);
            if(data == null){
                data = new HashMap<>();
            }
            return mapper.selectAll(data);
        } finally {
            closeSession(session);
        }
    }

    public int getTotalNum(){
        SqlSession session = openSession();
        try {
            MemberMapper mapper = session.getMapper(MemberMapper.class);
            Integer count = mapper.selectCount();
            return getSafeInt(count);
        } finally {
            closeSession(session);
        }
    }

    public int getSafeInt(Integer value){
        if(value == null)
            return 0;
        return value.intValue();
    }
}

MemberAction.java

@Scope("prototype")
@Controller("memberAction")
public class MemberAction extends BaseAction {
    @Resource
    private MemberService memberService;
    private List<Member> memberList;


    public String listMemeber(){
        int count = memberService.getItemCount();
        pageHelper = PageHelper.getPageHelper(ServletActionContext.getRequest(),count);
        memberList = memberService.getAll(pageHelper);
        return SUCCESS;
    }

    public void setMemberList(List<Member> memberList){
        this.memberList = memberList;
    }

    public List<Member> getMemberList(){
        return this.memberList;
    }
}
public interface MemberService {
    List<Member> getAll(PageHelper pageHelper);
    int getItemCount();
}
@Service
@Transactional
public class MemberServiceImpl implements MemberService {
    @Resource
    private MemberDao memberDao;


    @Override
    public List<Member> getAll(PageHelper pageHelper) {
        Map<String,Object> items = new HashMap<>();
        if(pageHelper==null){
            items.putAll(PageHelper.getDefaultData());
        }else{
            items.putAll(pageHelper.getMapData());
        }
        return memberDao.getAll(items);
    }

    @Override
    public int getItemCount() {
        return memberDao.getTotalNum();
    }
}

這裡struts.xml要配action,還有分頁相關的程式碼就不寫了。總之,呼叫思路是:
url /a/b.action
->struts.xml,找到對應類和方法
->XXAction.java呼叫相應方法
->service層進行資料處理XXService.java(介面)
->單類實現XXServiceImpl.java
->相應資料庫呼叫處理XXDao
->XXMapper.java(mapper,xml配置方法介面)
->xx-mapper.xml(資料庫sql對映整合)
->返回到XXAction.java
->struts.xml顯示合適的頁面

其實XXService.java和XXMapper.java這兩個介面只相當於方法列表,只是簡單的介面。j2ee開發各種環境搭建很繁複,而且報錯不太容易看,特此記錄一下,方便以後的環境搭建。