Tomcat应用部署
一、Tomcat介紹
概述:Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個Servlet容器,按照Sun Microsystems提供的技術規范,實現了對Servlet和JavaServer Page(JSP)的支持,并提供了作為Web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。由于Tomcat本身也內含了一個HTTP服務器,它也可以被視作一個單獨的Web服務器
Apache與Tomcat的比較
相同點:
1、兩者都是Apache組織開發的
2、兩者都有HTTP服務的功能
3、兩者都是免費的
不同點:
1、Apache是專門用了提供HTTP服務的,以及相關配置的(例如虛擬主機、URL轉發等等),而Tomcat是Apache組織在符合Java EE的JSP、Servlet標準下開發的一個JSP服務器.
2、Apache是一個Web服務器環境程序,啟用他可以作為Web服務器使用,不過只支持靜態網頁。如果要在Apache環境下運行JSP的話就需要一個解釋器來執行JSP網頁,而這個JSP解釋器就是Tomcat
3、Apache側重于HTTPServer?,Tomcat側重于Servlet引擎,如果以Standalone方式運行,功能上與Apache等效,支持JSP,但對靜態網頁不太理想
4、Apache是Web服務器,Tomcat是應用(Java)服務器,它只是一個Servlet(JSP也翻譯成Servlet)容器,可以認為是Apache的擴展,但是可以獨立于Apache運行
Tomcat同類產品:
1、Resin 服務器
Resin是Caucho公司的產品,是一個非常流行的支持Servlet和JSP的服務器,速度非常快。Resin本身包含了一個支持HTML的Web服務器,這使它不僅可以顯示動態內容,而且顯示靜態內容的能力也毫不遜色,因此許多網站都是使用Resin服務器構建
2、Jetty 服務器
Jetty是一個純粹的基于Java的網頁服務器和Java Servlet容器。盡管網頁服務器通常用來為人們呈現文檔,但是Jetty通常在較大的軟件框架中用于計算機與計算機之間的通信。Jetty作為Eclipse基金會的一部分,是一個自由和開源項目
3、JBoss服務器
JBoss是一個種遵從JavaEE規范的、開放源代碼的、純Java的EJB服務器,對于J2EE有很好的支持。JBoss采用JML API實現軟件模塊的集成與管理,其核心服務又是提供EJB服務器,不包含Servlet和JSP的Web容器,不過它可以和Tomcat完美結合
4、WebSphere 服務器
WebSphere是IBM公司的產品,可進一步細分為 WebSphere Performance Pack、Cache Manager 和WebSphere Application Server等系列,其中WebSphere Application Server 是基于Java 的應用環境,可以運行于 Sun Solaris、Windows NT 等多種操作系統平臺,用于建立、部署和管理Internet和Intranet Web應用程序
5、WebLogic 服務器
WebLogic 是ORACLE公司的產品,可進一步細分為 WebLogic Server、WebLogic Enterprise 和 WebLogic Portal 等系列,其中 WebLogic Server 的功能特別強大。WebLogic 支持企業級的、多層次的和完全分布式的Web應用,并且服務器的配置簡單、界面友好。對于那些正在尋求能夠提供Java平臺所擁有的一切應用服務器的用戶來說,WebLogic是一個十分理想的選擇
二、Tomcat與jdk
JDK是開發人員開發使用,jre是用來運行java程序,就是java程序的運行環境,jvm是整個java實現跨平臺的最核心的部分,所有的java程序會首先被編譯為class的類文件,這種類文件可以在虛擬機上執行
JDK中包含JRE,在JDK的安裝目錄下有一個名為jre的目錄,里面有兩個文件夾bin和lib,在這里可以認為bin里的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib和起來就稱為jre。jdk是java語言編寫的,用來給java程序調用的,jvm因為與平臺進行交互,是用c/c++和匯編語言編寫的;
jdk是java運行和編譯的,tomcat是web項目的運行容器,java沒有jdk沒辦法編譯運行,java運行必須依賴jdk的環境,所以安裝tomcat前必須要安裝jdk環境
下載位置
Tomcat下載地址:Apache Tomcat? - Apache Tomcat 9 Software Downloads
jdk下載地址:Java 歸檔文件下載 - Java SE 8 (oracle.com)
解釋:
Java SE(Java Platform,Standard Edition):Java SE 是做電腦上運行的軟件
Java EE(Java Platform,Enterprise Edition):Java EE 是用來做網站的(我們常見的JSP技術)
Java ME(Java Platform,Micro Edition):Java ME 是做手機軟件的
對應關系:
?三、Tomcat內部工作原理及模型協議
?tomcat整體架構:
組件關聯:
1、Tomcat 的心臟是兩個組件:Connector 和 Container,Connector 組件是可以被替換,這樣顯得更加靈活,一個 Container 可以選擇對應多個 Connector。多個 Connector 和一個 Container 就形成了一個 Service,有了 Service 就可以對外提供服務了,但是 Service 還要一個生存的環境,必須要有人能夠給她生命、掌握其生死大權,那就非 Server 莫屬了。所以整個 Tomcat 的生命周期由 Server 控制
2、我們將 Tomcat 中 Connector、Container 作為一個整體比作一對情侶的話,Connector 主要負責對外交流,可以比作為 Boy,Container 主要處理 Connector 接受的請求,主要是處理內部事務,可以比作為 Girl。那么這個 Service 就是連接這對男女的結婚證了。是Service 將它們連接在一起,共同組成一個家庭。當然要組成一個家庭還要很多其它的元素說白了,Service 只是在 Connector 和 Container 外面多包一層,把它們組裝在一起,向外面提供服務,一個 Service 可以設置多個 Connector,但是只能有一個 Container 容器
Engine:負責處理所有請求,處理后,將結果返回給service,而connector是作為service與engine的中間媒介出現的。?作為交流者;一個engine下可以配置一個默認主機,每個虛擬主機都有一個域名。當engine獲得一個請求時,它把該請求匹配到虛擬主機host上,然后把請求交給該主機來處理。?Engine有一個默認主機,當請求無法匹配到任何一個虛擬主機時,將交給默認host來處理。Engine以線程的方式啟動Host。
Host:代表一個虛擬主機,每個虛擬主機和某個網絡域名(Domain Name)相匹配。?每個虛擬主機下都可以部署一個或多個web應用,每個web應用對應于一個context,有一個context path。?當Host獲得一個請求時,將把該請求匹配到某個Context上;
Wrapper: 代表一個 Servlet,它負責管理一個 Servlet,包括的 Servlet 的裝載、初始化、執行以及資源回收。Wrapper 是最底層的容器,它沒有子容器了
Tomcat Coyote支持的IO 模型與協議:
| 應用層? | 應用層協議? | 說明 |
| НТТP/1.1? | 這是大部分Web應用采用的訪問協議 | |
| AJP? | 用于和WX集成(如Apache) ,以實現對靜態資源的優化以及集群部署,當前支持AJP/1.3 | |
| HТIP/2 | HTTP 2.0大幅度的提升了Web性能。下一代HTTP協議, 自8.5以及9.0版本之后支持? | |
| 傳輸層? | IO模型? | 說明 |
| NIO? | 非阻塞I/O,采用Java NIO類庫實現非阻塞I/O,采用Java NIO類庫實現 | |
| NIO2?NIO2? | 異步I/O,采用JDK 7最新的NIO2類庫實現 | |
| APR? | 采用Apache可移植運行庫實現,是C/C++編寫的本地庫。如果選擇該方案,需要單獨安裝APR庫 |
應用層默認協議:HTTP/1.1
傳輸層默認IO模型:NIO
四、 tomcat配置說明
Tomcat的目錄:
| 目錄 | 說明 |
| bin | 存放啟動和關閉tomcat腳本 |
| conf | 存放不同的配置文件(server.xml和web.xml) |
| doc | 存放Tomcat文檔 |
| lib/japser/common | 存放Tomcat運行需要的庫文件(JARS) |
| logs | 存放Tomcat執行時的LOG文件 |
| src | 存放Tomcat的源代碼 |
| webapps | Tomcat的主要Web發布目錄(包括應用程序示例) |
| work | 存放jsp編譯后產生的class文件 |
| conf目錄中配置文件說明 | |
| server.xml | Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息 |
| web.xml | 遵循Servlet規范標準的配置文件,用于配置servlet,并為所有的Web應用程序提供包括MIME映射等默認配置信息 |
| tomcat-user.xml | Realm認證時用到的相關角色、用戶和密碼等信息;Tomcat自帶的manager默認情況下會用到此文件;在Tomcat中添加/刪除用戶,為用戶 指定角色等將通過編輯此文件實現 |
| catalina.policy | Java相關的安全策略配置文件,在系統資源級別上提供訪問控制的能力 |
| catalina.properties | Tomcat內部package的定義及訪問相關控制,也包括對通過類裝載器裝載的內容的控制;Tomcat在啟動時會事先讀取此文件的相關設置 |
| logging.properties | Tomcat6通過自己內部實現的JAVA日志記錄器來記錄操作相關的日志,此文件即為日志記錄器相關的配置信息,可以用來定義日志記錄的組 件級別以及日志文件的存在位置等 |
| context.xml | 所有host的默認配置信息 |
tomcat請求過程:
tomcat server處理一個HTT請求的過程
?
?tomcat中支持兩種協議的連接器:HTTP/1.1與AJP/1.3
HTTP/1.1協議負責建立HTTP連接,web應用通過瀏覽器訪問tomcat服務器用的就是這個連接器,默認監聽的是8080端口
AJP/1.3協議負責和其他HTTP服務器建立連接,監聽的是8009端口,比如tomcat和apache或者iis集成時需要用到這個連接器
五、構建Tomcat
| 系統 | 機器名稱 | ip | 服務 |
| CentOS Linux release 7.4.1708 | c7--10 | 192.168.2.10/24 | Tomcat |
?先上傳安裝包??apache-tomcat-10.0.13.tar.gz ?jdk-8u91-linux-x64.tar.gz
[root@C7-10 ~]# ls apache-tomcat-10.0.13.tar.gz jdk-8u91-linux-x64.tar.gz(一)、安裝jdk,部署java環境?
[root@C7-10 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz .......... ..... .. jdk1.8.0_91/jre/README jdk1.8.0_91/README.html[root@C7-10 ~]# mv jdk1.8.0_91/ /usr/local/java [root@C7-10 ~]# ls /usr/local/java/ bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt----下面直接復制粘貼cat <<END>>/etc/profile export JAVA_HOME=/usr/local/java export PATH=\$PATH:/usr/local/java/bin END----[root@C7-10 ~]# source /etc/profile [root@C7-10 ~]# java -version #查看java版本 java version "1.8.0_91" Java(TM) SE Runtime Environment (build 1.8.0_91-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)(二)、安裝Tomcat軟件程序
?這里安裝的是tomcat 10.0.13版本
注意: 如要做下面的項目二盡量安裝版本低一點的
[root@C7-10 ~]# tar zxvf apache-tomcat-10.0.13.tar.gz ................ .......... .... apache-tomcat-10.0.13/bin/startup.sh apache-tomcat-10.0.13/bin/tool-wrapper.sh apache-tomcat-10.0.13/bin/version.sh[root@C7-10 ~]# mv apache-tomcat-10.0.13 /usr/local/tomcat[root@C7-10 ~]# ls /usr/local/tomcat/ bin conf lib logs README.md RUNNING.txt webapps BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work[root@C7-10 ~]# /usr/local/tomcat/bin/startup.sh #啟動apache-tomcat服務 Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/java Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: Tomcat started. [root@C7-10 ~]# netstat -auptn|grep 8080 tcp6 0 0 :::8080 :::* LISTEN 14366/java訪問頁面測試
?安裝mariadb數據庫,提供數據庫服務
方法一:本地yum也安裝
[root@C7-10 ~]# yum install mariadb-server mariadb ................... .......... .....[root@C7-10 ~]# systemctl start mariadb [root@C7-10 ~]# mysqladmin -uroot password 123 [root@C7-10 ~]# mysql -uroot -p123 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec)MariaDB [(none)]> quit Bye方法二:可以使用網絡yum進行安裝
[root@C7-10 ~]# ping www.biadu.com #查看是否可以ping通外網 PING www.biadu.com (47.254.33.193) 56(84) bytes of data. 64 bytes from 47.254.33.193 (47.254.33.193): icmp_seq=1 ttl=50 time=185 ms [root@C7-10 ~]# wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm [root@C7-10 ~]# yum install mariadb-server mariadb #安裝 已加載插件:fastestmirror Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* extras: mirrors.aliyun.com* updates: mirrors.aliyun.com mariadb數據庫的相關命令是:systemctl start mariadb #啟動MariaDBsystemctl stop mariadb #停止MariaDBsystemctl restart mariadb #重啟MariaDBsystemctl enable mariadb #設置開機啟動 [root@C7-10 ~]# systemctl start mariadb [root@C7-10 ~]# mysqladmin -uroot password 123 [root@C7-10 ~]# mysql -uroot -p123 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 5.5.68-MariaDB MariaDB ServerCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec)MariaDB [(none)]> quit Bye項目一:配置tomcat的manager管理界面
[root@C7-10 ~]# vim /usr/local/tomcat/conf/tomcat-users.xml.............. ......... .. --> <role rolename="manager-gui"/> #添加定義的角色 <user username="tomcat" password="123" roles="manager-gui"/> #賬戶名:tomcat 密碼:123 </tomcat-users> #默認在最后有保存[root@C7-10 ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml ............ .......21 <Valve className="org.apache.catalina.valves.RemoteAddrValve"22 allow="^.*$" /> #修改 解釋:允許其他所有主機訪問 ... .注意:allow默認是:127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1[root@C7-10 ~]# /usr/local/tomcat/bin/shutdown.sh #關閉 Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/java Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: [root@C7-10 ~]# /usr/local/tomcat/bin/startup.sh #啟動 Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/java Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: Tomcat started.進行測試:客戶端訪問manager管理界面(客戶端啟用停止項目、測試服務端狀態查看)
?輸入之前設置的? ?用戶名?:tomcat?? ?密碼:123
?顯示出:Tomcat Web 應用程序管理者就說明項目一實驗成功了
?如果:提示我們403 拒絕訪問
?解決方案:添加manage.xml文件
[root@C7-10 ~]# vim /usr/local/tomcat/conf/Catalina/localhost/manager.xml<Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager"><Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" /> </Context>保存 添加以上內容[root@C7-10 ~]# /usr/local/tomcat/bin/startup.sh ...... ... [root@C7-10 ~]# /usr/local/tomcat/bin/shutdown.sh .... ..在進行訪問測試注意:如果出現401 說明你用戶密碼輸入錯誤只要輸入正確就可以了
?項目二:城市訂單管理系統,手動上線(創建項目中的數據庫或者導入數據庫文件),并進行授權
注意:此次使用??apache-tomcat-8.5.16.tar.gz? ?版本
上傳文件smbms_db.sql
[root@C7-10 ~]# ls smbms_db.sql[root@C7-10 ~]# mysql -uroot -p123<smbms_db.sql #導入數據庫中[root@C7-10 ~]# mysql -uroot -p123 ....... .... ... MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | smbms | | test | +--------------------+ 5 rows in set (0.00 sec)MariaDB [(none)]> grant all on smbms.* to 'aaa'@'192.168.2.10' identified by "123"; #給項目數據庫授權 Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec)MariaDB [(none)]> use smbms; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changed MariaDB [smbms]> show tables; +-----------------+ | Tables_in_smbms | +-----------------+ | smbms_address | | smbms_bill | | smbms_provider | | smbms_role | | smbms_user | +-----------------+ 5 rows in set (0.00 sec)MariaDB [smbms]> select * from smbms_user; #查看項目中的管理員賬戶 +----+-----------+-----------------+--------------+--------+------------+-------------+----------------------------------------------------+----------+-----------+---------------------+----------+---------------------+ | id | userCode | userName | userPassword | gender | birthday | phone | address | userRole | createdBy | creationDate | modifyBy | modifyDate | +----+-----------+-----------------+--------------+--------+------------+-------------+----------------------------------------------------+----------+-----------+---------------------+----------+---------------------+ | 1 | admin | 系統管理員 | 1234567 | 1 | 1983-10-10 | 13688889999 | 北京市海淀區成府路207號 | 1 | 1 | 2013-03-21 16:52:07 | NULL | NULL | | 2 | liming | 李明 | 0000000 | 2 | 1983-12-10 | 13688884457 | 北京市東城區前門東大街9號 | 2 | 1 | 2014-12-31 19:52:09 | NULL | NULL | ................. ...........MariaDB [smbms]> exit Bye城市訂單管理系統項目上線
[root@C7-10 ~]# cd /usr/local/tomcat/webapps/ [root@C7-10 webapps]# mkdir /root/webapps.bak [root@C7-10 webapps]# mv * /root/webapps.bak/ [root@C7-10 webapps]# ls #上傳 WebRoot 文件 WebRoot[root@C7-10 webapps]# vim /usr/local/tomcat/webapps/WebRoot/WEB-INF/classes/database.propertiesdriver=com.mysql.jdbc.Driver #在和mysql傳遞數據的過程中,使用unicode編碼格式,并且字符集設置為utf-8 url=jdbc:mysql://192.168.2.10:3306/smbms?useUnicode=true&characterEncoding=utf-8 #修改地址為自己的192.168.2.10 user=aaa #設置為之前在數據庫授權的用戶名 aaa password=123 #設置為之前在數據庫授權的密碼 123保存退出[root@C7-10 webapps]# /usr/local/tomcat/bin/shutdown.sh ..... [root@C7-10 webapps]# /usr/local/tomcat/bin/startup.sh .....?測試客戶端訪問項目二:http://192.168.2.10:8080/WebRoot
登錄后如若訪問不了,可以嘗試重啟tomcat
?注意:如果出現用戶名密碼錯誤說明連接不上數據庫需要查看數據庫是否給用戶aaa授權
部署tomcat的虛擬主機
?準備網頁
[root@C7-10 ~]# cd /usr/local/tomcat/webapps/ [root@C7-10 webapps]# mkdir benet biii[root@C7-10 webapps]# vim benet/index.jsp <%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"%> <h1>192.168.2.10 www.benet.com 今天特別冷</h1>保存[root@C7-10 webapps]# vim biii/index.jsp <%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"%> <h1>www.biii.com 今天我沒有看電視</h1>保存修改server.xml文件
[root@C7-10 webapps]# vim /usr/local/tomcat/conf/server.xml ........ ....</Host><Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" ><Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true"/></Host><Host name="www.biii.com" appBase="webapps" unpackWARs="true" autoDeploy="true" ><Context docBase="/usr/local/tomcat/webapps/biii" path="" reloadable="true"/></Host></Engine>........ ....保存注意:在文件最后添加內容的</Engine>上面添加
---##########---- HOST容器 介紹---#####<Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" > name="www.benet.com" :虛擬主機的名稱,Tomcat 通過在請求 URL 中的域名與 name 中的值匹配,用于查找能夠處理該請求的虛擬主機。如果未找到則交給在 Engine 中 defaultHost 指定的主機處理 appBase="webapps" :此 Host 的 webapps目錄,即指定存放 web 應用程序的目錄的路徑,默認指向 ROOT 目錄下的 index.jsp unpackWARs="true" :在啟用此 webapps 時是否對 WAR 格式的歸檔文件先進行展開;默認為 true autoDeploy="true" :在 Tomcat 處于運行狀態時放置于 appBase 目錄中的應用程序文件是否自動進行 部署,默認為 true ;開啟自動部署---#####<Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true"/> docBase="/usr/local/tomcat/webapps/benet" :設置項目存放路徑 path="" :tomcat把web應用程序映射為root URI路徑(相對路徑) reloadable="true" :在Tomcat運行時,如果WEB-INF/classes和WEB-INF/lib目錄中有改變,Tomcat會自動重新加載該WEB應用,但是開啟會加重服務器的負載(建議設置為false關閉),默認值為false,我們在調用可以打開,發布后再關閉;如果要更新可以更新完重啟tomcat服務 [root@C7-10 webapps]# /usr/local/tomcat/bin/shutdown.sh[root@C7-10 webapps]# /usr/local/tomcat/bin/startup.sh?中本機中修改hosts文件 192.168.2.10 www.benet.com www.biii.com
?c7--10上修改hosts文件
[root@C7-10 webapps]# vim /etc/hosts192.168.2.10 www.benet.com www.biii.com測試訪問:www.benet.com? www.biii.com
如果出現亂碼解決方法
(1)HTML頁面中:
<head> ......<meta http-equiv=Content-Type content="text/html;charset=utf-8"> ...... </head>(2)JSP頁面中:
<%@ page language="java" contentType="text/html;charset=utf-8"pageEncoding="utf-8"%>總結
以上是生活随笔為你收集整理的Tomcat应用部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸭子的故事
- 下一篇: 推杆如妻子,发球木如情人,短铁如父母,球