一.軟件開發常識
(1)項目開發流程
1. 立項
項目可實施性分析:(某項目)100W項目,開發週期預計6個月,需要10人,運營(人力)成本2W/人
產品經理入住銀行,進行需求調研《需求設計說明書》
需求研討會:團隊所有成員參加2. 設計
UI/UE工程師:《頁面原型》
架構師:統一開發環境,項目技術選項,項目架構設計,數據庫設計等等《概要設計說明書》
產品經理:接口規範、方法規範、參數規範、步驟要求等等《詳細設計說明書》3. 開發
coding(編碼),碼農4. 測試
白盒測試:代碼邏輯和性能
黑盒測試:用戶體驗
灰盒測試:黑+白5. 部署
運維人員產品部署上傳維護....
(2)UML統一建模語言
統一建模語言(UML,UnifiedModelingLanguage)是面向對象軟件的標準化建模語言。
簡單來說:通過一些專業化的圖形,直觀的展示項目需求(用例圖、時序圖、類圖)等等。
用例圖: user case
-
圖形化的形式展示項目中的所有功能,以及功能的參與者
設計工具PowerDesigner(PD)
-
繪製用例圖、數據庫等
(3)開發環境:
jdk版本1.8
maven版本:3.5.2
mysql版本:5.7
(4)創建新的工作空間
設置sdk,以及其他:
整體項目編碼的設置
maven的設置
二.Maven:
(1)基礎回顧
Maven項目管理工具
依賴管理,項目構建
(2)Maven的依賴傳遞
什麼是依賴傳遞
在maven中,依賴是可以傳遞的,假設存在三個項目,分別是項目A,項目B以及項目C。假設A依賴B,B依賴C,那麼我們可以根據maven項目依賴的特徵不難推出項目A也依賴C。
如果我們項目直接依賴的座標過多,可能就會產生版本衝突問題:
(3) 如何解決依賴衝突問題?
1.依賴調節原則:
第一聲明優先原則:
在 pom 文件中定義依賴,誰先聲明就用誰
路徑近者優先原則
在pom 文件中定義依賴,誰的路徑近就用誰
2.排除依賴
通過在pom文件中排除不需要的依賴jar包
3.版本鎖定
在pom文件中,直接指定項目依賴的所有版本號,導入依賴的時候就不需要指定版本
-
properties中定義所有的公共版本號常量
-
通過dependencyManagement鎖定版本號:不會導入依賴jar包
-
dependencies導入依賴:不需要指定版本號
<!--1.定義版本號常量-->
<properties>
<spring.version>5.2.5.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
<!--2.版本鎖定-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--3.依賴管理-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
三.Maven構建ssm項目
基於maven構建ssm工程,規範依賴管理。場景:查詢所有企業信息
(1)創建數據庫
(2)創建web模塊“
(3)導入相關依賴:
<!--統一版本號-->
<properties>
<spring.version>5.0.5.RELEASE</spring.version>
<springmvc.version>5.0.5.RELEASE</springmvc.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<!--鎖定依賴版本-->
<dependencyManagement>
<dependencies>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- springMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springmvc.version}</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</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>
<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>
</dependencies>
</dependencyManagement>
<!--添加依賴-->
<dependencies>
<!-- Mybatis和mybatis與spring的整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- MySql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!-- druid數據庫連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- springMVC核心-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<!-- spring相關 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<!-- junit測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 設置編譯版本爲1.8 -->
<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>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
注意:自動導入
(3)搭建MyBatis
Company實體類:
@Data
public class Company implements Serializable {
private String id; // 企業id
private String name; // 企業名稱
private Date expirationDate; //到期時間
private String address; // 企業地址
private String licenseId; // 營業執照編號
private String representative; // 法人代表
private String phone; // 手機號
private String companySize; // 企業規模
private String industry; // 行業
private String remarks; // 備註
private Integer state; // 狀態
private Double balance; // 餘額
private String city; // 城市
}
CompanyDao接口和映射文件
public interface CompanyDao {
// 查詢所有
List<Company> findAll();
}
同時在resources文件夾創建映射文件“
<?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="com.wsl.dao.company.CompanyDao">
<resultMap id="BaseResultMap" type="com.wsl.domain.company.Company">
<id column="id" property="id"></id>
<!--把不一樣的字段,改一下-->
<result column="expiration_date" property="expirationDate"></result>
<result column="license_id" property="licenseId"></result>
<result column="company_size" property="companySize"></result>
</resultMap>
<select id="findAll" resultMap="BaseResultMap">
SELECT * FROM ss_company
</select>
</mapper>
spring整合MyBatis
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/saas?characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=root
applicationContext-dao.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"
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">
<!--druid連接池-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 數據庫連接池 -->
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.wsl.domain"></property>
</bean>
<!-- mapper掃描器 :用來產生代理對象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.wsl.dao"></property>
</bean>
</beans>
測試:
@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-dao.xml")
public class MyBatisTest {
@Autowired
private CompanyDao companyDao;
@Test
public void testFindAll()throws Exception{
List<Company> list = companyDao.findAll();
System.out.println(list);
}
}
(4)搭建spring
CompanyService接口和實現
public interface CompanyService {
// 查詢所有
List<Company> findAll();
}
applicationContext-service.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:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--開啓註解組件掃描-->
<context:component-scan base-package="com.wsl.service"/>
</beans>
applicationContext-tx.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:tx="http://www.springframework.org/schema/tx"
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/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--配置事務-->
<!--1.事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--2.事務通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="save*" read-only="false" propagation="REQUIRED"/>
<tx:method name="update*" read-only="false" propagation="REQUIRED"/>
<tx:method name="delete*" read-only="false" propagation="REQUIRED"/>
<tx:method name="*" read-only="false" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--3.aop-->
<aop:config>
<aop:pointcut id="pt" expression="execution( * com.wsl.service..*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"></aop:advisor>
</aop:config>
</beans>
測試:
@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:spring/applicationContext-*.xml")
public class SpringTest {
@Autowired
private CompanyService companyService;
@Test
public void testFindAll()throws Exception{
List<Company> list = companyService.findAll();
System.out.println(list);
}
}
(5)搭建SpringMVC
1.頁面資源導入“
2.CompanyController和頁面
@Controller
@RequestMapping(value = "/company", name = "企業管理")
public class CompanyController {
@Autowired
private CompanyService companyService;
@RequestMapping(value = "/list", name = "查詢列表")
public String list(HttpServletRequest request) {
List<Company> list = companyService.findAll();
request.setAttribute("list", list);
return "company/company-list";
}
}
3.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:aop="http://www.springframework.org/schema/aop"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--開啓註解組件掃描-->
<context:component-scan base-package="com.wsl.web"/>
<!--mvc註解支持-->
<mvc:annotation-driven/>
<!--視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
4.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"
version="2.5">
<!--前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加載的配置文件 ,通過參數contextConfigLocation加載-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 監聽器監聽其他的spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--
classpath:掃描當前工程類路徑下的配置文件
classpath*:掃描當前工程和依賴工程類路徑下的配置文件
-->
<param-value>classpath*:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 解決post亂碼 -->
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
5.部署測試
完整的項目結構見開始
四.Maven分模塊構建:
什麼是分模塊構建
常見的拆分方式有兩種:
-
按照業務模塊進行拆分,每個模塊拆分成一個maven工程,例如將一個項目分爲用戶模塊、訂單模塊、購物車模塊等,每個模塊對應就是一個maven工程
-
按照層進行拆分,例如持久層、業務層、表現層等,每個層對應就是一個maven工程
不管是上面哪種拆分方式,通常都會提供一個父工程,將一些公共的代碼和配置提取到父工程中進行統一管理和配置。
(1)Maven工程繼承
在Java語言中,類之間是可以繼承的,通過繼承,子類就可以引用父類中非private的屬性和方法。
同樣,在maven工程之間也可以繼承,子工程繼承父工程後,就可以使用在父工程中引入的依賴。繼承的目的是爲了消除重複代碼。
創建父工程
創建子模塊
(2)Maven工程聚合
在maven工程的pom.xml文件中可以使用<modules>標籤將其他maven工程聚合到一起,聚合的目的是爲了進行統一操作。
注意,不是子工程也可以聚合在一起,統一管理...
一般情況下,父工程都會作爲聚合工程,管理自己的子模塊...
五.分模塊構建SSM工程
改造剛纔的ssm工程爲分模塊開發
(1)創建一個父工程
(2)export_commons
(3)export_domain
(4) export_dao
(5)export_system_dao
(6)export_manager_web
子模塊之間的傳遞依賴思想
測試:
同樣配置服務器部署
六.Maven私服
說明:
maven倉庫分爲本地倉庫和遠程倉庫,而遠程倉庫又分爲maven中央倉庫、其他遠程倉庫和私服。
maven私服就是公司局域網內的maven遠程倉庫,每個員工的電腦上安裝maven軟件並且連接maven私服,程序員可以將自己開發的項目打成jar併發布到私服,其它項目組成員就可以從私服下載所依賴的jar。私服還充當一個代理服務器的角色,當私服上沒有jar包時會從maven中央倉庫自動下載。
例如:進入企業開發,不同的項目組開發不同的工程
-
A團隊:export_dao工程開發完畢,發佈到私服。
-
B團隊:export_system_service從私服下載export_dao
(1)nexus 搭建私服環境
nexus 是一個maven倉庫管理器(其實就是一個軟件),nexus可以充當maven私服,同時nexus還提供強大的倉庫管理、構件搜索等功能
- 下載:
http://www.sonatype.org/nexus/archived/
- 安裝:
1.解壓:nexus-2.14.10-01-bundle.zip
2.進入解壓後的bin目錄,打開cmd窗口
3.執行nexus.bat install
注意:需要以管理員身份運行cmd命令
- 卸載:
cmd進入bin目錄執行nexus.bat uninstall
注意:需要以管理員身份運行cmd命令
- 啓動:
方式一:cmd進入bin目錄,執行nexus.bat start
方式二:在Windows系統服務中啓動nexus
- 訪問:
http://localhost:8081/nexus
用戶名:admin
密碼:admin123
(2)倉庫類型
通過前面的倉庫列表可以看到,nexus默認內置了很多倉庫,這些倉庫可以劃分爲4種類型,每種類型的倉庫用於存放特定的jar包,具體說明如下:
1. hosted,宿主倉庫
部署自己的jar到這個類型的倉庫,包括Releases和Snapshots兩部分
Releases爲公司內部發布版本倉庫、 Snapshots爲公司內部測試版本倉庫
2. proxy,代理倉庫
用於代理遠程的公共倉庫,如maven中央倉庫,用戶連接私服,私服自動去中央倉庫下載jar包或者插件
3. group,倉庫組
用來合併多個hosted/proxy倉庫,通常我們配置自己的maven連接倉庫組
4. virtual(虛擬):兼容Maven1版本的jar或者插件
(3)將項目發佈到私服
在maven的setting.xml文件中配置:
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
在需要發佈工程的pom.xml文件中配置:
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
在需要發佈的工程執行deploy
在部署之前,一定要安裝到本地倉庫,才能上傳到私服
(4)從私服下載jar包
在maven的setting.xml文件中配置
<profile>
<id>dev</id>
<repositories>
<repository>
<id>nexus</id>
<!--倉庫地址,即nexus倉庫組的地址-->
<url>
http://localhost:8081/nexus/content/groups/public/</url>
<!--是否下載releases構件-->
<releases>
<enabled>true</enabled>
</releases>
<!--是否下載snapshots構件-->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件倉庫,maven的運行依賴插件,也需要從私服下載插件 -->
<pluginRepository>
<id>public</id>
<name>Public Repositories</name>
<url>
http://localhost:8081/nexus/content/groups/public/
</url>
</pluginRepository>
</pluginRepositories>
</profile>
激活
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
注意,要想實現私服的下載,必須先刪除本地倉庫jar包.
資料:
私服搭建:https://www.cnblogs.com/knowledgesea/p/11190579.html
https://blog.csdn.net/gyshun/article/details/79297460
maven分模塊搭建項目:https://blog.csdn.net/javanotes/article/details/81128020