天天看點

java web 項目搭建

這篇部落客要介紹 java web 環境以及項目搭建

适用于一些小的項目或者大學作業使用。

Sping + MyBatis + SpringMVC + Maven + MySQL

管理界面推薦 Vue 單頁面

開發第一步 環境配置

  1. jdk //運作 java 必備 ,oracle 官網下載下傳 。須注冊,
  2. git // 代碼版本管理,防止誤删,把值得儲存的項目上傳到 gitee 或 github
  3. mysql // 資料存儲 , 我一般用 wampserver , 內建了我所需要的
  4. maven // maven 項目需要的 ,不是必須的 ,也是解壓即可用的,搭建項目
  5. nodejs // 前後端分離開發時需要使用
  6. idea / eclipse //內建開發工具 ,推薦使用 idea , idea收費的,但是學生免費
  7. vscode //一個強大的文本編譯器,跨平台,易用
  8. tomcat // java web 伺服器環境, 下載下傳解壓即可用,如果是 maven 項目,會有一個tomcat 插件。tomcat 則不需要安裝
maven 和 node 預設的存儲倉庫是在 c 盤使用者目錄檔案夾下 需要修改, 以及預設的下載下傳源都是國外的需要修改,一般的話,node 下載下傳使用 cnpm 而不是 npm , maven 也是使用 淘寶的鏡像 。

maven 優點

在這邊介紹一下為什麼使用 maven , 在正常的一個 javaweb 項目(servlet)中,我們需要導入 jdbc 、 json 所需要的包,

至于 SSM 架構所需要的包就更多了,當少一個包就會各種報錯,而每個項目的包都差不多,每次這樣的導入。懶人是不能容忍的,需要自動導入,另外一個原因,就是統一了目錄,友善開發。還有 分布式 開發。

項目搭建

?idea很好用,是以我采用了 idea 作為開發環境。

項目的目錄結構 ,先上截圖 :

java web 項目搭建

這裡面我使用了mybatis 逆向工程, 就是将表建好之後,通過官方的 jar 包,手寫一個類自動生成 pojo ,mapper 下的所有代碼。

運作環境我采用了tomcat 插件,可以在本地運作,也可以熱部署到遠端伺服器上。

需要自己手寫的是幾個配置檔案。

  • pom.xml 這個相當于導入jar包
  • web.xml
  • main/resources 包下,除了 mapper 檔案夾下的(這個是自動生成的 )
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>site.suimu</groupId>
  <artifactId>mybatisGe</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>mybatisGe 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>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- spring版本号 -->
    <spring.version>4.3.5.RELEASE</spring.version>
    <!-- mybatis版本号 -->
    <mybatis.version>3.4.1</mybatis.version>
  </properties>

  <dependencies>
    <!-- java ee -->
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-api</artifactId>
      <version>7.0</version>
    </dependency>

    <!-- 單元測試 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <!-- 實作slf4j接口并整合 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.2</version>
    </dependency>

    <!-- JSON -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.8.7</version>
    </dependency>


    <!-- 資料庫 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.41</version>
      <scope>runtime</scope>
    </dependency>

    <!-- 資料庫連接配接池 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

    <!-- MyBatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>

    <!-- mybatis/spring整合包 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>

    <!-- Spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
    <!--MyBatis 官方提供了一種名為 “逆向工程” 的機制,其可以針對資料庫中的單表自動生成 MyBatis 執行所需要的代碼
        包括:
        Java 實體類、Mapper映射配置、Mapper代理接口-->
    <dependency>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-core</artifactId>
      <version>1.3.7</version>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <!-- tomcat插件 -->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <!-- 控制tomcat端口号 -->
          <port>8080</port>
          <!-- 項目釋出到tomcat後的名稱 -->
          <!-- / 相當于把項目釋出名稱為ROOT -->
          <!-- /abc -->
          <path>/mavenSSM</path>
          <!--配置熱部署-->
          <!--<username>tomcat</username>
          <password>tomcat</password>
          <url>http://ip:port/manager/text</url>-->
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

           
web.xml

// tomcat 自動加載的檔案,需要在這裡配置加載 mybatis 和 spring 的配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

  <!-- 編碼過濾器 -->
  <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>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- 配置DispatcherServlet -->
  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置springMVC需要加載的配置檔案-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 比對所有請求 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

           
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
#資料庫位址
jdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8
#使用者名
jdbc.username=ssmUser
#密碼
jdbc.password=123456
#最大連接配接數
c3p0.maxPoolSize=30
#最小連接配接數
c3p0.minPoolSize=10
#關閉連接配接後不自動commit
c3p0.autoCommitOnClose=false
#擷取連接配接逾時時間
c3p0.checkoutTimeout=10000
#當擷取連接配接失敗重試次數
c3p0.acquireRetryAttempts=2
           
spring-mybatis.xml
<?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:tx="http://www.springframework.org/schema/tx"
       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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 掃描service包下所有使用注解的類型 -->
    <context:component-scan base-package="site.suimu.service"/>

    <!-- 配置資料庫相關參數properties的屬性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 資料庫連接配接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
    </bean>

    <!-- 配置SqlSessionFactory對象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入資料庫連接配接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 掃描pojo包 使用别名 -->
        <property name="typeAliasesPackage" value="site.suimu.pojo"/>
        <!-- 掃描sql配置檔案:mapper需要的xml檔案 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 配置掃描Dao接口包,動态實作Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 給出需要掃描Dao接口包 -->
        <property name="basePackage" value="site.suimu.mapper"/>
    </bean>

    <!-- 配置事務管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入資料庫連接配接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置基于注解的聲明式事務 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

           
spring-mvc.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
       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/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- 掃描web相關的bean -->
    <context:component-scan base-package="site.suimu.controller"/>

    <!-- 開啟SpringMVC注解模式 -->
    <mvc:annotation-driven/>

    <!-- 靜态資源預設servlet配置 -->
    <mvc:default-servlet-handler/>

    <!-- 配置jsp 顯示ViewResolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

           
logback.xml 日志配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
           
mybatis-generatorConfig.xml 逆向工程配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <context id="DB2Tables" targetRuntime="MyBatis3">

        <!-- 是否去除自動生成的代碼中的注釋 true:是 false:否-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 資料庫連接配接資訊:驅動類、連接配接位址、使用者名、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://47.100.116.143/ssm"
                        userId="ssmUser"
                        password="123456">
        </jdbcConnection>

        <!-- 預設 false,把 JDBC DECIMAL 和 NUMERIC 類型解析為 Integer
             為 true 時解析為 java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- targetProject:生成 POJO 類的位置 -->
        <javaModelGenerator targetPackage="site.suimu.pojo"
                            targetProject="src/main/java">
            <!-- enableSubPackages:是否讓 schema 作為包的字尾-->
            <property name="enableSubPackages" value="false"/>
            <!-- trimStrings:從資料庫傳回的值被清理前後的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- targetProject:生成xml映射檔案存放位置 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources">
            <!-- enableSubPackages:是否讓 schema 作為包的字尾-->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- targetProject:生成mapper接口存放位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="site.suimu.mapper"
                             targetProject="src/main/java">
            <!-- enableSubPackages:是否讓 schema 作為包的字尾-->
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!--生成對應表及類名
            tableName:要生成的表名
            domainObjectName:生成後的執行個體名
            enableCountByExample:Count語句中加入where條件查詢,預設為true開啟
            enableUpdateByExample:Update語句中加入where條件查詢,預設為true開啟
            enableDeleteByExample:Delete語句中加入where條件查詢,預設為true開啟
            enableSelectByExample:Select多條語句中加入where條件查詢,預設為true開啟
            selectByExampleQueryId:Select單個對象語句中加入where條件查詢,預設為true開啟
        -->

        <table tableName="airplane"
               domainObjectName="Airplane"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="true"
               selectByExampleQueryId="false">
            <property name="useActualColumnNames" value="true"/>
            <property name="my.isgen.usekeys" value="true"/>
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>

        <table tableName="menu"></table>
        <table tableName="t_user"></table>
    </context>
</generatorConfiguration>
           

TestMyBatisGenerator.java 檔案名随便,位置随便 運作 main 即可

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.api.ShellCallback;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;


public class TestMyBatisGenerator {

    public static void main(String[] args) throws Exception {
        // warnings 為用于放置生成過程中警告資訊的集合對象
        List<String> warnings = new ArrayList<String>();
        // 指定是否覆寫重名檔案
        boolean overwrite = true;
        // 加載配置檔案
        File configFile = new File(MyBatisGenerator.class.getClassLoader().getResource("mybatis-generatorConfig.xml").toURI());
        // 配置解析類
        ConfigurationParser cp = new ConfigurationParser(warnings);
        // 配置解析類解析配置檔案并生成 Configuration 配置對象
        Configuration config = cp.parseConfiguration(configFile);
        // ShellCallback 負責如何處理重複檔案
        ShellCallback callback = new DefaultShellCallback(overwrite);
        // 逆向工程對象
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        // 執行逆向檔案生成操作
        myBatisGenerator.generate(null);
        // 列印提示資訊
        System.out.println("MyBatis 逆向工程執行成功,重新整理項目檢視檔案!");
    }
}
           

OK 可以愉快的開發了

我本人比較懶,有什麼問題下面留言,佛系回複