SSM+nginx+tomcat+maven+mysql+redis環境搭建及工程全套配置,實現前後端動靜分離

目錄

 

前言

服務器環境搭建

windows開發環境

SSM搭建

加入redis(註解形式)

nginx與tomcat關聯配置,完成前後端連接


前言

本次採用前後端分離模式,前端以html、css、js爲組成模式,後端以spring全家桶的"手動擋"模式SSM作爲基礎。nginx啓動前端,並管理靜態文件,tomcat啓動後端,管理動態數據,mysql作爲應用數據庫。開發環境後端工程採用maven工程,並在後端加入redis緩存。

服務器環境搭建

本次是阿里雲服務器,操作系統爲ubuntu16.04,JDK和tomcat的安裝可參照:

https://blog.csdn.net/qq_36632174/article/details/102461743

一、安裝nginx

nginx可以在線安裝,也可以離線安裝。在線安裝簡單,直接。離線裝主要針對有些內網環境準備的,且可自定義安裝路徑。

1.在線安裝nginx

sudo apt-get update
sudo apt-get install nginx
sudo apt-get upgrade
配置文件:/etc/nginx/nginx.conf
程序文件:/usr/sbin/nginx
日誌:/varlog/nginx
默認虛擬主機:/var/www/html
啓動:sudo /etc/init.d/nginx start
停止:sudo /etc/init.d/nginx stop
重啓:sudo /etc/init.d/nginx restart
狀態:sudo /etc/init.d/nginx status
查看端口占用:lsof -i:80

2.離線安裝nginx

①準備環境

gcc:nginx編譯依賴gcc環境
apt-get install gcc -c++
pcre:(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx的http模塊使用pcre來解析正則表達式.
apt-get install -y pcre pcre-devel
# 查看zlib是否安裝
dpkg -l | grep zlib
# 解決依賴包openssl安裝
sudo apt-get install openssl libssl-dev
# 解決依賴包pcre安裝
sudo apt-get install libpcre3 libpcre3-dev
# 解決依賴包zlib安裝
sudo apt-get install zlib1g-dev

準備完前期環境後,去nginx官網下載nginx-1.14.0.tar.gz

安裝之前需要手動創建上面指定的nginx文件夾,否則make會出錯:mkdir /usr/local/nginx

②配置nginx

# 添加nginx組
groupadd unginx
# 創建nginx運行賬戶unginx並加入到unginx組,不允許unginx用戶直接登錄系統
useradd -g  unginx unginx -s /bin/false
配置防火牆
如果是使用的騰訊服務器,只需要在服務器管理平臺添加80端口的安全組就好
服務器則可以設置防火牆:
# 修改防火牆配置:
vi + /etc/sysconfig/iptables
# 添加配置項
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
# 重啓防火牆
service iptables restart
cd /usr/local/nginx-1.14.0
./configure --prefix=/usr/local/nginx
make && make install

cd /usr/local/nginx/sbin
檢查nginx是否安裝成功
./nginx -t
正確結果顯示:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

③啓動nginx

cd /usr/local/nginx
sbin/nginx
ps -ef | grep nginx

重啓nginx:sbin/nginx -s reload
停止:sbin/nginx -s stop

訪問:http://hadoop01
即可到nginx歡迎頁

二、安裝mysql

直接在線安裝:apt-get install mysql-server

輸入 y ,下載安裝時會出現要求設置密碼的界面:

輸入自己想設置的密碼,之後再次輸入確認密碼。完成之後如下圖:

啓動mysql:service mysql start,啓動後檢驗:ps -ef | grep mysql

打開數據庫,mysql -uroot -p,mysql -uroot -p,輸入設置的密碼

設置mysql允許遠程訪問,首先編輯文件/etc/mysql/mysql.conf.d/mysqld.cnf:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf,註釋掉bind-address = 127.0.0.1:

保存退出,然後進入mysql服務,執行授權命令:
grant all on *.* to root@'%' identified by '你的密碼' with grant option;
flush privileges;
然後執行quit命令退出mysql服務,執行如下命令重啓mysql:
service mysql restart
數據庫就可以被遠程連接了。

三、安裝redis

直接在線安裝redis:sudo apt-get install redis-server

安裝完成後,需要手動啓動下:redis-server,驗證啓動redis-cli,輸入命令:keys *

配置遠程訪問:vim /etc/redis/redis.conf,#bind 127.0.0.1註釋掉

配置密碼:requirepass abcd,設置密碼爲abcd

輸入密碼:auth 密碼

修改後重啓服務:/etc/init.d/redis-server restart

redis安裝完畢。

到此,服務器環境準備完畢。

windows開發環境

windows開發環境參照之前博客:https://blog.csdn.net/qq_36632174/article/details/101699311

eclipse配置maven庫參照:https://blog.csdn.net/qq_36632174/article/details/101704421

SSM搭建

首先確定,Maven工程結構,如圖:

創建一個maven web工程,在resources文件夾下創建框架文件(框架文件名可以自己定義)

spring-mybatis.xml:spring與mybatis結合;

spring-mvc.xml:spring與前端的結合;

redis.properties:redis基礎參數;

jdbc.properties:mysql基礎參數;

generatorConfig.xml:mybatis生成工具。

sqlmap文件夾下存放mybatis的SQL文件,其它幾個包分別是controller層、dao層、model(實例)層、service接口層和service實現類。

創建好以上工程結構後,首先在pom.xml中引入需要的maven包,jar包加載到指定的maven庫中:

<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>com.hjh.imip</groupId>
    <artifactId>harbour</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>harbour Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <spring.version>4.2.1.RELEASE</spring.version>
        <jackson.version>2.6.1</jackson.version>
        <fastjson.version>1.1.41</fastjson.version>
        <mybatis.version>3.4.1</mybatis.version>
        <mybatis-spring.version>1.3.0</mybatis-spring.version>
        <slf4j.version>1.7.7</slf4j.version>
        <log4j.version>1.2.17</log4j.version>
        <mysql.connector.version>5.1.30</mysql.connector.version>
        <freemark-version>2.3.20</freemark-version>
        <junit.version>4.11</junit.version>
        <jstl.version>1.2</jstl.version>
        <jcl.slf4j.version>1.7.21</jcl.slf4j.version>
        <jedis.version>2.7.3</jedis.version>
        <spring.data.redis.version>1.7.1.RELEASE</spring.data.redis.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <!-- 表示開發的時候引入,發佈的時候不會加載此包 -->
            <scope>test</scope>
        </dependency>
        <!-- @Resource註解包 -->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- json轉對象 ,對象轉json -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <!-- XML視圖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- PDF視圖 -->
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
        <!-- json工具 -->
        <dependency>
            <groupId>com.sdicons.jsontools</groupId>
            <artifactId>jsontools-core</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>
        <!-- Excel視圖 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <!-- view層的 jsp標準函數庫 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <!-- 日誌 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${jcl.slf4j.version}</version>
        </dependency>
        <!-- spring核心包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</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-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</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-jdbc</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-aop</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-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- freemark -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemark-version}</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>${mybatis-spring.version}</version>
        </dependency>
        <!-- 導入java ee jar 包 -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <!-- 導入Mysql數據庫鏈接jar包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.version}</version>
        </dependency>
        <!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- JSTL標籤類 -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- 日誌文件管理包 -->
        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!-- 格式化對象,方便輸出日誌 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->
        <!-- 映入JSON -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <!-- 上傳組件包 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>
        <!-- StringUtils -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.1</version>
        </dependency>
        <!-- redis start -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>${jedis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>${spring.data.redis.version}</version>
        </dependency>
        <!--quartz -->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>2.2.1</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>harbour</finalName>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.2</version>
                    <configuration>
                        <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                    <executions>
                        <execution>
                            <id>Generate MyBatis Artifacts</id>
                            <goals>
                                <goal>generate</goal>
                            </goals>
                        </execution>
                    </executions>
                    <dependencies>
                        <dependency>
                            <groupId>org.mybatis.generator</groupId>
                            <artifactId>mybatis-generator-core</artifactId>
                            <version>1.3.2</version>
                        </dependency>
                    </dependencies>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF8</encoding>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

在webapp/WEB-INF/下有個web.xml,它是整個spring web工程的的中樞,它連接着各種框架文件,其配置可參照如下(因爲本次是前後分離,沒有jsp文件,所以註釋掉jsp相關):

<?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_3_0.xsd"
    version="3.0">
    <display-name>Archetype Created Web Application harbour</display-name>
    
    <!-- Spring和mybatis的配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mybatis.xml</param-value>
    </context-param>
    <!-- 編碼過濾器 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--加載Spring容器配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 防止Spring內存溢出監聽器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <!-- 服務器處理靜態資源 -->
    <servlet>
        <servlet-name>harbour</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>
    <servlet-mapping>
        <servlet-name>harbour</servlet-name>
        <!-- 此處可以可以配置成*.do,對應struts的後綴習慣 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- <servlet-mapping>
        <servlet-name>default</servlet-name>
        此處可以可以配置成*.do,對應struts的後綴習慣
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping> -->
    <!-- session超時設置 -->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    <!-- <welcome-file-list>
        <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list> -->

</web-app>

配置mybatis,配置文件內容如下:

<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" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/task  
        http://www.springframework.org/schema/task/spring-task-4.0.xsd">
    <!-- spring+mybatis+redis緩存+redis自動清理整合 -->
    <!-- class annotation related... start -->
    <context:component-scan base-package="com.hjh.imip.harbour" />
    <!-- class annotation related... end -->
    <context:annotation-config />
    <!-- mybatis related... start -->
    <bean
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
                <value>classpath:redis.properties</value>
            </list>
        </property>
    </bean>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${driver}" />
        <property name="url" value="${url}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
        <!-- 從池中獲取連接前進行驗證 -->
        <property name="testOnBorrow" value="false" />
        <!-- 向池中還回連接前進行驗證 -->
        <property name="testOnReturn" value="false" />
        <!-- 連接空閒時驗證 -->
        <property name="testWhileIdle" value="true" />
        <!-- 運行判斷連接超時任務(evictor)的時間間隔,單位爲毫秒,默認爲-1,即不執行任務。 -->
        <property name="timeBetweenEvictionRunsMillis" value="300000" />
        <!-- 連接的超時時間,默認爲半小時。 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- 每次evictor啓動檢查的空閒連接數,-2標識1/2的總空閒連接 -->
        <property name="numTestsPerEvictionRun" value="-1"></property>
        <!-- 初始化連接大小 -->
        <property name="initialSize" value="${initialSize}"></property>
        <!-- 連接池最大數量 -->
        <property name="maxActive" value="${maxActive}"></property>
        <!-- 連接池最大空閒 -->
        <property name="maxIdle" value="${maxIdle}"></property>
        <!-- 連接池最小空閒 -->
        <property name="minIdle" value="${minIdle}"></property>
        <!-- 獲取連接最大等待時間 -->
        <property name="maxWait" value="${maxWait}"></property>
    </bean>
    <!-- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" /> <property name="configLocation"
        value="/WEB-INF/classes/mybatis-config.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.lyz.*.mapper"/> <property name="basePackage"
        value="com.hjh.imip.harbour.dao"></property> </bean> -->
    <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 自動掃描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath:sqlMap/*.xml"></property>
    </bean>
    <!-- DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.hjh.imip.harbour.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>

    <!-- mybatis related... end -->

    <!-- transaction config related... start -->
    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- transaction config related... end -->

    <!-- redis config start -->
    <!-- 配置JedisPoolConfig實例 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxTotal" value="${redis.maxActive}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>

    <!-- 配置JedisConnectionFactory -->
    <bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}" />
        <property name="port" value="${redis.port}" />
        <property name="database" value="${redis.database}" />
        <property name="timeout" value="${redis.timeout}" />
        <property name="poolConfig" ref="jedisPoolConfig" />
    </bean>

    <!-- 配置RedisTemplate -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
    </bean>

    <!-- 配置RedisCacheManager -->
    <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
        <constructor-arg name="redisOperations" ref="redisTemplate" />
        <property name="defaultExpiration" value="${redis.expiration}" /><!-- 自動清理緩存數據 -->
    </bean>

    <!-- 配置RedisCacheConfig -->
    <bean id="redisCacheConfig" class="com.hjh.imip.harbour.redis.RedisCacheConfig">
        <constructor-arg ref="jedisConnectionFactory" />
        <constructor-arg ref="redisTemplate" />
        <constructor-arg ref="redisCacheManager" />
    </bean>
    <!-- redis config end -->
    <!-- 定時清理緩存 start-->
    <!-- 開啓task任務掃描註解 -->
    <!-- <task:annotation-driven/>
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> -->
    <!-- 定時清理緩存end -->
</beans>

這是簡單版的mybatis配置,集成了mysql和redis數據庫,整合了mybatis的.xml文件格式的SQL,整合了Dao文件。企業版的配置請參照:SSM企業版:多數據源+activity+事務+定時任務()

配置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:p="http://www.springframework.org/schema/p"
    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-4.2.xsd    
                        http://www.springframework.org/schema/context    
                        http://www.springframework.org/schema/context/spring-context-4.2.xsd    
                        http://www.springframework.org/schema/mvc    
                        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
    <!-- 自動掃描該包,使SpringMVC認爲包下用了@controller註解的類是控制器 -->
    <context:component-scan base-package="com.hjh.imip.harbour" />
    <!-- mvc的註解,啓動mvc相關注解 -->
    <mvc:annotation-driven />
    <!--避免IE執行AJAX時,返回JSON出現下載文件 -->
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <!-- 啓動SpringMVC的註解功能,完成請求和註解POJO的映射 -->
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON轉換器 -->
            </list>
        </property>
    </bean>
    <!--JSP視圖解析器 -->
    <bean id="jspViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
        <property name="order" value="1"></property>
    </bean>
    <!--HTML視圖解析器 -->
    <bean id="freemarkerConfig"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath">
            <value>/WEB-INF/html/</value>
        </property>
    </bean>
    <bean id="htmlviewResolver"
        class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="suffix" value=".html" />
        <property name="order" value="0"></property>
        <property name="contentType" value="text/html;charset=UTF-8"></property>
    </bean>
    <!-- 配置文件上傳,如果沒有使用文件上傳可以不用配置,當然如果不配,那麼配置文件中也不必引入上傳組件包 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默認編碼 -->
        <property name="defaultEncoding" value="utf-8" />
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000" />
        <!-- 內存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />
    </bean>
    <mvc:resources location="/WEB-INF/jsp/" mapping="/jsp/**" />
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />
    <mvc:resources location="/WEB-INF/html/" mapping="/html/**" />
    <mvc:resources location="/WEB-INF/images/" mapping="/images/**" />
    <mvc:resources location="/WEB-INF/css/" mapping="/css/**" />
    <mvc:resources location="/WEB-INF/fonts/" mapping="/fonts/**" />
    <mvc:resources location="/WEB-INF/json/" mapping="/json/**" />
</beans>

如果是前後端分離,由nginx管理前端文件,html視圖解析器、jsp視圖解析器及最下面的<mvc:resources **>可以去掉。

想操作generatorConfig.xml文件,先在eclipse的Marketplace(help->eclipse Marketplace)中下載小黑鳥工具

下載好之後,右鍵點擊generatorConfig.xml會出現小黑鳥標誌,在配置好文件以下內容後就可以通過此工具直接生成出實例、sql文件、Dao層的初始文件。

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>
    <!-- 數據庫驅動 -->
    <classPathEntry
        location="D:\Program Files\repository\mysql\mysql-connector-java\5.1.30\mysql-connector-java-5.1.30.jar" />
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true" />
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--數據庫鏈接URL,用戶名、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/harbour_db" userId="hjhmysql"
            password="hjhmysql" />
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- 生成模型的包名和位置 -->
        <javaModelGenerator targetPackage="com.hjh.imip.harbour.model"
            targetProject="harbour\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成映射文件的包名和位置 -->
        <sqlMapGenerator targetPackage="sqlMap"
            targetProject="harbour\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!-- 生成DAO的包名和位置 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.hjh.imip.harbour.dao" targetProject="harbour\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名 -->
        
        <table tableName="user_info" domainObjectName="UserInfo"
            enableCountByExample="false" enableUpdateByExample="false"
            enableDeleteByExample="false" enableSelectByExample="false"
            selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

jdbc.properties:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/harbour_db
username=user1
password=user1
#定義初始連接數
initialSize=0
#定義最大連接數
maxActive=50
#定義最大空間
maxIdle=300
#定義最小空間
minIdle=5
#定義最長等待時間
maxWait=60000

redis.properties:

#redis配置中心
redis.host=127.0.0.1
# server port
redis.port=6379
# server pass
redis.password=
# use dbIndex
redis.database=0
# 控制一個pool最多有多少個狀態爲idle(空閒的)的jedis實例
redis.maxIdle=300
# 表示當borrow(引入)一個jedis實例時,最大的等待時間,如果超過等待時間(毫秒),則直接拋出JedisConnectionException;  
redis.maxWait=60000
redis.maxActive=6000
# 在borrow一個jedis實例時,是否提前進行validate操作;如果爲true,則得到的jedis實例均是可用的  
redis.testOnBorrow=true
redis.testOnReturn=false
redis.testWhileIdle=true
redis.blockWhenExhausted=true
# 當 客戶端閒置閒置多少秒後,斷開連接,如果指定爲0,表示關閉該功能
redis.timeout=1800
#緩存清除的時間單位是秒,7776000s=90天,90天清理一次緩存
redis.expiration=7776000

log4j.properties:

#定義LOG輸出級別  
log4j.rootLogger=INFO,Console,File
#定義日誌輸出目的地爲控制檯  
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以靈活地指定日誌輸出格式,下面一行是指定具體的格式  
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
 
#文件大小到達指定尺寸的時候產生一個新的文件  
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定輸出目錄  
log4j.appender.File.File = logs/harbour.log
#定義文件最大大小  
log4j.appender.File.MaxFileSize = 10MB
# 輸出所以日誌,如果換成DEBUG表示輸出DEBUG以上級別日誌  
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

以上各種配置文件可以根據不同需求進行修改,以上後臺工程配置完成,在eclipse中配置好tomcat(參照之前博客:Java基礎-開發環境(windows+jdk+tomcat+maven+mysql)),啓動配置好的工程,控制檯不報錯表示配置正確。數據庫創建測試表,根據generatorConfig工具生成實例、Dao文件和sql文件後,寫好controller文件、service接口和service實現類,一般前後端分離的controller最終返回給前端的是json字符串數據,具體寫法網上很多,此篇不做介紹。

其次樣例的調用關係:controller->service接口>service實現類->Dao文件,傳參實例->映射sql文件,寫好後,可以用Postman工具,測試後臺配置的url是否能請求成功,例如後臺url爲:http://localhost:8080/user/login,login查詢用戶是否存在,如果用戶存在,則返回查詢到的數據。

controller.java樣例,查詢用戶:

@Controller
@RequestMapping("/user")
public class UserController {
    
    private final Log logger = LogFactory.getLog(this.getClass());


  @Resource
    private LoginService systemUserLoginService;

@RequestMapping(value = "/login", method = RequestMethod.POST)
    public void login(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {

 JSONObject response = new JSONObject();
        HttpSession session = httpServletRequest.getSession();
        String username = httpServletRequest.getParameter("username");
        String password = httpServletRequest.getParameter("password");
        String suDeviceSn = httpServletRequest.getParameter("suDeviceSn");
        String suClientId = httpServletRequest.getParameter("suClientId");
        JSONObject jsonObject = new JSONObject();
        String message = ParameterConstant.LOGIN_SUCCESS;
        try {
            jsonObject = systemUserLoginService.login(username, password, suDeviceSn, suClientId);
        } catch (Exception e) {
            logger.error(MessageConstant.LOGIN_FAILURE, e);
            e.printStackTrace();
            message = e.getMessage();
        }
        // 登錄成功保存session
        // 用戶名
        session.setAttribute(ParameterConstant.USERNAME, username);
        // 登錄用戶信息
        session.setAttribute(ParameterConstant.LOGIN_USER, jsonObject.getJSONObject(ParameterConstant.USER));
        // 前端權限
        session.setAttribute(ParameterConstant.FPERMISSION, jsonObject.getJSONArray(ParameterConstant.FPERMISSION));
        // 後臺權限
        session.setAttribute(ParameterConstant.BPERMISSION, jsonObject.getJSONArray(ParameterConstant.BPERMISSION));
        response.put(ParameterConstant.LOGIN_MESSAGE, message);
        response.put(ParameterConstant.CONTENT, jsonObject);
        // httpServletResponse.addHeader("Access-Control-Allow-Origin", "*");
        /*httpServletResponse.addHeader("Access-Control-Allow-Credentials", "true");*/
        logger.info(session.getAttribute(ParameterConstant.LOGIN_USER));
        CommonFunction.reponseResult(httpServletResponse, response.toString());

}

}

當後端controller定義爲http://localhost:8080/user/login時,前端ajax部分必須對應URL與controller相同以完成映射:

var localStorage = window.localStorage;
    $("#j-ipt-login").click(function() {
        var username = $("#j-ipt-une").val();
        var password = $("#j-ipt-pwd").val();
        if(!username) {
            alert("用戶名不能爲空");
        } else if(!password) {
            alert("密碼不能爲空");
        } else {
            $.ajax({
                type: "POST",
                url: "http://localhost:8080/user/login",
                data: {
                    username: username,
                    password: password
                },
                success: function(data) {
                    localStorage.clear();
                    if(data.message == 'success') {

                       以下省略··············

加入redis(註解形式)

在前面的spring-mybatis.xml配置文件中已經加入redis相關配置,還需要在Java中加入配置文件,如下:

/**
 * 以Spring與配置文件來管理的redis緩存配置類
 * @author wang
 *
 */
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
    private volatile JedisConnectionFactory mJedisConnectionFactory;
    private volatile RedisTemplate<String, String> mRedisTemplate;
    private volatile RedisCacheManager mRedisCacheManager;
    
    public RedisCacheConfig() {
        super();
    }

    public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplate<String,String> mRedisTemplate,
            RedisCacheManager mRedisCacheManager) {
        super();
        this.mJedisConnectionFactory = mJedisConnectionFactory;
        this.mRedisTemplate = mRedisTemplate;
        this.mRedisCacheManager = mRedisCacheManager;
    }

    public JedisConnectionFactory redisConnectionFactory() {
        return mJedisConnectionFactory;
    }

    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
        return mRedisTemplate;
    }

    public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
        return mRedisCacheManager;
    }
    
    @Bean
    public KeyGenerator customKeyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}

完成以上配置,在service實現類中,可通過@Cacheable註解完成緩存,示例如下:

@Service
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {

@Resource
    private UserInfoDao userInfoDao;

// 增加用戶數據
    @Override
    @CacheEvict(value = { "insert" }, allEntries = true)
    public Integer insert(UserInfo userInfo) {
        return userInfoDao.insertSelective(userInfo);
    }

    // 根據主鍵刪除用戶數據
    @Override
    @CacheEvict(value = {"selectByPrimaryKey"}, allEntries = true)//allEntries=true表示清理所有緩存
    public Integer delete(Integer uid) {
        return userInfoDao.deleteByPrimaryKey(uid);
    }

    // 根據主鍵選擇更新數據
    @Override
    /*@CachePut("updateByPrimaryKeySelective")*/
    @CacheEvict(value = {"selectByPrimaryKey" }, key="#userInfo.getId()")
    public Integer updateByPrimaryKeySelective(UserInfo userInfo) {
        return userInfoDao.updateByPrimaryKeySelective(userInfo);
    }

    // 根據主鍵查詢數據
    @Override
    @Cacheable(value="selectByPrimaryKey", key="#uid")
    public UserInfo select(Integer uid) {
        return userInfoDao.selectByPrimaryKey(uid);
    }

}

@Cacheable主要針對方法配置,能夠根據方法的請求參數對其結果進行緩存
@CacheEvict:即應用到移除數據的方法上,如刪除方法。@Cacheable和@CacheEvict,這兩個註解可以允許方法觸發緩存或者緩存抽取。
@CacheEvict:主要針對方法配置,能夠根據一定的條件對緩存進行清空
@CachePut():應用到寫數據的方法上,如新增/修改方法。@CachePut 註釋,這個註釋可以確保方法被執行,同時方法的返回值也被記錄到緩存中
@CachePut():主要針對方法配置,能夠根據方法的請求參數對其結果進行緩存,和 @Cacheable 不同的是,它每次都會觸發真實方法的調用

產生緩存數據後,可通過命令查看緩存,以下爲windows環境下查看:

啓動redis客戶端:redis-cli.exe -h 127.0.0.1 -p 6379

查看redis緩存:keys *

nginx與tomcat關聯配置,完成前後端連接

由於要做動靜分離,前端工程其實就是文件目錄,只包含html、js、css、圖片等靜態文件:

可根據實際情況,自定義文件名稱。

如果是本地環境可參照以下配置:

找到nginx目錄下nginx_home/conf路徑下nginx.conf文件,配置如下:

user  root;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 100M;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

     server {
        listen       80;
        server_name localhost;

#把前端工程,放到路徑D盤的HBuilderProject下,nginx就可以找到前端工程文件,並加載靜態文件,在瀏覽器能正常顯示

location ~ .*\.(html|js|css|ico|png|bmp|jpg|eot|jpeg|svg|ttf|woff|gif|swf|xlsx|docx|pdf|apk) {
        root D:/HBuilderProject/;
        expires 10d;
        }

# 映射後端tomcat下工程web_project_resources

location /web_project_resources/ {
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_connect_timeout 5;
                proxy_send_timeout 30;
                proxy_read_timeout 10;
                proxy_pass http://127.0.0.1:8080/web_project_resources/;
        }

}

}

配置完成後,在本地啓動nginx。

對maven打包,打成web_project_resources.war包後,放在tomcat路徑的webapps下,啓動tomcat,在瀏覽器訪問url,就可以完成前後端連接。當啓動nginx後,前端靜態文件就可以在瀏覽器顯示(比如:html、js實現的邏輯、css樣式和圖片、字體等),但是不啓動tomcat則無法連接到spring後臺,也無法連接到數據庫獲取數據。所以當啓動tomcat,前後端url映射完成後,數據庫數據才能傳到前端瀏覽器畫面正常顯示。如果是測試服務器,無需配置域名的,也可參照本地nginx配置,只需要更換ip即可。

以上就是個人版全套SSM+nginx+tomcat+mysql+redis配置與實現,實現前後端分離,動靜分離,並加入redis緩存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章