前言:
最近沒什么事做,搭個框架寫成博客記錄下來,拉通一下之前所學知識.
話不多說,我們直接步入正題。
準備工作:
1/安裝并配置java運行環境
2/數據庫的安裝配置(mysql)
3/安裝并配置服務器(tomcat)
4/maven
5/ intellijidea的安裝配置(本人使用的主要軟件是intellijidea,沒用eclipse什么的)
6/ 使用intellijidea創建一個web app項目。
貌似就這些了吧
導包
不同于以往的導包,由于我們創建的是maven的webapp項目,所以現在只需配置下pomxml這個配置文件,系統會自動到maven的中央倉庫去下載相應的包.
本人的pom.xml配置文件如下(都寫有說明的哈):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
<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>xrog</groupid> <artifactid>ssh</artifactid> <packaging>war</packaging> <version> 1.0 -snapshot</version> <name>ssh maven webapp</name> <url>http: //maven.apache.org</url> <!-- 本人將配置包的版本信息都統一放入此處,方便以后管理--> <properties> <springversion> 4.3 . 1 .release</springversion> <hibernateversion> 4.3 . 5 . final </hibernateversion> <jstlversion> 1.2 </jstlversion> <taglibversion> 1.1 . 2 </taglibversion> <servletversion> 3.0 -alpha- 1 </servletversion> <jsonversion> 1.9 . 13 </jsonversion> <jacksonversion> 2.5 . 0 </jacksonversion> <mysqlversion> 6.0 . 3 </mysqlversion> <c3p0version> 0.9 . 1.2 </c3p0version> <log4jversion> 1.2 . 17 </log4jversion> <fileuploadversion> 1.3 . 1 </fileuploadversion> <lombokversion> 1.16 . 10 </lombokversion> </properties> <dependencies> <!-- 單元測試 --> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version> 3.8 . 1 </version> <scope>test</scope> </dependency> <!-- spring--> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-beans</artifactid> <version>${springversion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-core</artifactid> <version>${springversion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-context</artifactid> <version>${springversion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-orm</artifactid> <version>${springversion}</version> </dependency> <!-- spring web + spring mvc--> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-web</artifactid> <version>${springversion}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>${springversion}</version> </dependency> <!-- hibernate配置--> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-core</artifactid> <version>${hibernateversion}</version> </dependency> <!-- hibernate 緩存, 視情況添加--> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-ehcache</artifactid> <version>${hibernateversion}</version> </dependency> <!-- jsp頁面使用的jstl支持--> <dependency> <groupid>jstl</groupid> <artifactid>jstl</artifactid> <version>${jstlversion}</version> </dependency> <dependency> <groupid>taglibs</groupid> <artifactid>standard</artifactid> <version>${taglibversion}</version> </dependency> <dependency> <groupid>javax.servlet</groupid> <artifactid>servlet-api</artifactid> <version>${servletversion}</version> <scope>provided</scope> </dependency> <!-- database數據庫連接 mysql包--> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>${mysqlversion}</version> </dependency> <!-- 數據庫連接池--> <dependency> <groupid>c3p0</groupid> <artifactid>c3p0</artifactid> <version>${c3p0version}</version> </dependency> <!-- json數據 使springmvc可以返回json值 ,視情況添加--> <dependency> <groupid>org.codehaus.jackson</groupid> <artifactid>jackson-mapper-asl</artifactid> <version>${jsonversion}</version> </dependency> <!-- jackson可以輕松的將java對象轉換成json對象和xml文檔,同樣也可以將json、xml轉換成java對象--> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-core</artifactid> <version>${jacksonversion}</version> </dependency> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-annotations</artifactid> <version>${jacksonversion}</version> </dependency> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>${jacksonversion}</version> </dependency> <!-- log4j配置, 視情況添加--> <dependency> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version>${log4jversion}</version> </dependency> <!--文件 上傳--> <dependency> <groupid>commons-fileupload</groupid> <artifactid>commons-fileupload</artifactid> <version>${fileuploadversion}</version> </dependency> <!-- lombok插件導包--> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>${lombokversion}</version> <scope>provided</scope> </dependency> </dependencies> <build> <finalname>ssh</finalname> </build> </project> |
ok,配置后運行下maven,就會自動向中央倉庫下載相應的包啦!(這個就不多說了)。
springmvc配置
我現在在這里把我配置后的結構拿出來給你們看下
我們先配置下springmvc的配置:resources/meta-inf/spring-mvc.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<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-4.1.xsd http: //www.springframework.org/schema/context http: //www.springframework.org/schema/context/spring-context-4.1.xsd http: //www.springframework.org/schema/mvc http: //www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 啟動注解驅動的spring mvc功能,注冊請求url和注解pojo類方法的映射--> <mvc:annotation-driven /> <!-- 對模型視圖名稱的解析,在請求時模型視圖名稱添加前后綴 --> <context:component-scan base- package = "com.ssh" /> <bean id= "viewresolver" class = "org.springframework.web.servlet.view.internalresourceviewresolver" > <property name= "viewclass" value= "org.springframework.web.servlet.view.jstlview" /> <property name= "prefix" value= "views/" /> <!-- 前綴 --> <property name= "suffix" value= ".jsp" /> <!-- 后綴 --> </bean> <!--這里是對靜態資源的映射--> <mvc:resources mapping= "/js/**" location= "/resources/js/" /> <mvc:resources mapping= "/css/**" location= "/resources/css/" /> <mvc:resources mapping= "/img/**" location= "/resources/img/" /> </beans> |
好了,我們現在修改下web.xml這個配置文件,完善下springmvc的配置, web.xml配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?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" > <!-- 地址為http: //localhost:8080/ 顯示的默認網頁--> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> <!-- spring mvc config start--> <servlet> <servlet-name>spring</servlet-name> <servlet- class >org.springframework.web.servlet.dispatcherservlet</servlet- class > <init-param> <param-name>contextconfiglocation</param-name> <!-- 此處指向的的是springmvc的配置文件 --> <param-value>classpath:meta-inf/spring-mvc.xml</param-value> </init-param> <!--配置容器在啟動的時候就加載這個servlet并實例化--> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- spring mvc config end--> </web-app> |
ok,springmvc配置完成,現在我們進行一下測試吧
在controller層新建一個maincontroller,內容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.ssh.controller; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; /** * created by xrog * on 2/1/2017.12:36 am */ @controller public class maincontroller { @requestmapping (value = "test" , method = requestmethod.get) public string test(){ // 實際返回的是views/test.jsp ,spring-mvc.xml中配置過前后綴 return "test" ; } } |
test.jsp網頁如下:
1
2
3
4
5
6
7
|
<html> <body> <center> <h2 style= "color: #ff261a;" > this is my test page!</h2> </center> </body> </html> |
重啟tomcat服務器, 然后瀏覽器訪問如下圖所示:
ps: tomcat默認端口是8080,我更改了端口號,如若你們為更改,正確的訪問地址是localhost:8080/test
ok,成功訪問。
springmvc+spring整合
這個就十分簡單了, 配置applicationcontext.xml這個spring的配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<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-4.1.xsd http: //www.springframework.org/schema/context http: //www.springframework.org/schema/context/spring-context-4.1.xsd http: //www.springframework.org/schema/mvc http: //www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 自動掃描 --> <context:component-scan base- package = "com.ssh" > <!-- 掃描時跳過 @controller 注解的java類(控制器) --> <context:exclude-filter type= "annotation" expression= "org.springframework.stereotype.controller" /> </context:component-scan> </beans> |
完善web.xml配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<?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" > <!-- 地址為http: //localhost:8080/ 顯示的默認網頁--> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> <!--加載spring的配置文件到上下文中去--> <context-param> <param-name>contextconfiglocation</param-name> <param-value> classpath:meta-inf/applicationcontext.xml </param-value> </context-param> <!-- spring mvc config start--> <servlet> <servlet-name>spring</servlet-name> <servlet- class >org.springframework.web.servlet.dispatcherservlet</servlet- class > <init-param> <param-name>contextconfiglocation</param-name> <!-- 此處指向的的是springmvc的配置文件 --> <param-value>classpath:meta-inf/spring-mvc.xml</param-value> </init-param> <!--配置容器在啟動的時候就加載這個servlet并實例化--> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- spring mvc config end--> <!-- spring監聽器 --> <listener> <listener- class >org.springframework.web.context.contextloaderlistener</listener- class > </listener> <!-- 字符集過濾 --> <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> <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> </web-app> |
web.xml配置文件中更改了三處:引入spring配置文件 spring的監聽器 以及 字符集過濾
ok,spring+springmvc配置完成,下面我們開始測試:
在service寫一個testserviceimpl實現testservice接口并實現其test()方法, 代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package com.ssh.service.impl; import com.ssh.service.testservice; import org.springframework.stereotype.service; /** * created by xrog * on 2/1/2017.12:58 am */ @service public class testserviceimpl implements testservice { public string test() { return "test" ; } } |
ps:這里注意寫@service注解
maincontroller控制器更改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.ssh.controller; import com.ssh.service.testservice; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.responsebody; /** * created by xrog * on 2/1/2017.12:36 am */ @controller public class maincontroller { @autowired private testservice testservice; @requestmapping (value = "test" , method = requestmethod.get) public string test(){ // 實際返回的是views/test.jsp ,spring-mvc.xml中配置過前后綴 return "test" ; } @requestmapping (value = "springtest" , method = requestmethod.get) public string springtest(){ return testservice.test(); } } |
控制器這里我們運用了spring的依賴注入自動裝配。
在瀏覽器中輸入地址調用springtest方法
yes,成功返回,說明我們之前的配置沒問題
spring+springmvc+hibernate整合
好了,現在就缺hibernate這個框架了。。 我先給大家看些我搭建好之后的結構圖吧
我們想來編寫config.properties這個配置文件,里面存放的是hibernate的一些配置
1
2
3
4
5
6
7
8
9
10
|
#database connection config jdbc.driver = com.mysql.jdbc.driver jdbc.url = jdbc:mysql: //?????:3306/ssh?useunicode=true&characterencoding=utf-8 jdbc.username = root jdbc.password = ??? #hibernate config hibernate.dialect = org.hibernate.dialect.mysqldialect hibernate.show_sql = true hibernate.format_sql = true hibernate.hbm2ddl.auto = update |
這里連接數據庫的參數由于我是連接我晚上的數據庫,因此我數據庫地址和密碼打了“???”,你們連接時改成自己本地的就ok了
下面配置hibernate,這里我為了方便,就直接寫進applicationcontext.xml里面。配置后的applicationcontext.xml如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<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-4.1.xsd http: //www.springframework.org/schema/context http: //www.springframework.org/schema/context/spring-context-4.1.xsd http: //www.springframework.org/schema/mvc http: //www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!--********************************************配置spring***************************************--> <!-- 自動掃描 --> <context:component-scan base- package = "com.ssh" > <!-- 掃描時跳過 @controller 注解的java類(控制器) --> <context:exclude-filter type= "annotation" expression= "org.springframework.stereotype.controller" /> </context:component-scan> <!--********************************************配置hibernate********************************************--> <!--掃描配置文件(這里指向的是之前配置的那個config.properties)--> <context:property-placeholder location= "classpath:/config.properties" /> <!--配置數據源--> <bean id= "datasource" class = "com.mchange.v2.c3p0.combopooleddatasource" destroy-method= "close" > <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= "40" /> <!--最大連接數--> <property name= "minpoolsize" value= "1" /> <!--最小連接數--> <property name= "initialpoolsize" value= "10" /> <!--初始化連接池內的數據庫連接--> <property name= "maxidletime" value= "20" /> <!--最大空閑時間--> </bean> <!--配置session工廠--> <bean id= "sessionfactory" class = "org.springframework.orm.hibernate4.localsessionfactorybean" > <property name= "datasource" ref= "datasource" /> <property name= "packagestoscan" value= "com.ssh.entity" /> <property name= "hibernateproperties" > <props> <prop key= "hibernate.hbm2ddl.auto" >${hibernate.hbm2ddl.auto}</prop> <!--hibernate根據實體自動生成數據庫表--> <prop key= "hibernate.dialect" >${hibernate.dialect}</prop> <!--指定數據庫方言--> <prop key= "hibernate.show_sql" >${hibernate.show_sql}</prop> <!--在控制臺顯示執行的數據庫操作語句--> <prop key= "hibernate.format_sql" >${hibernate.format_sql}</prop> <!--在控制臺顯示執行的數據哭操作語句(格式)--> </props> </property> </bean> <!-- 事物管理器配置 --> <bean id= "transactionmanager" class = "org.springframework.orm.hibernate4.hibernatetransactionmanager" > <property name= "sessionfactory" ref= "sessionfactory" /> </bean> </beans> |
ok,到了這里,配置結束。下面進入測試階段
實體類(entity):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.ssh.entity; import lombok.data; import javax.persistence.*; /** * created by xrog * on 2/2/2017.2:03 pm */ @data @entity @table (name = "person" ) public class person { @id @generatedvalue private long id; @column (name = "created" ) private long created = system.currenttimemillis(); @column (name = "username" ) private string username; @column (name = "address" ) private string address; @column (name = "phone" ) private string phone; @column (name = "remark" ) private string remark; } |
ps:我這里用了一個@data注解,此注解會自動生成get方法,set方法,tostring方法等一系列方法,功能十分強大,不過需要安裝插件以及導包, 有興趣的可以百度下
當然,你也可以手動編寫get/set/構造方法。
數據庫訪問層(repository):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package com.ssh.repository; import java.io.serializable; import java.util.list; /** * created by xrog * on 2/2/2017.2:28 pm */ public interface domainrepository<t,pk extends serializable>{ t load(pk id); t get(pk id); list<t> findall(); void persist(t entity); pk save(t entity); void saveorupdate(t entity); void delete(pk id); void flush(); } |
1
2
3
4
5
6
7
8
|
package com.ssh.repository; import com.ssh.entity.person; /** * created by xrog * on 2/2/2017.2:25 pm */ public interface personrepository extends domainrepository<person, long > { } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package com.ssh.repository.impl; import com.ssh.repository.personrepository; import com.ssh.entity.person; import org.hibernate.session; import org.hibernate.sessionfactory; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.repository; import java.util.list; /** * created by xrog * on 2/2/2017.2:30 pm */ @repository public class personrepositoryimpl implements personrepository { @autowired private sessionfactory sessionfactory; private session getcurrentsession() { return this .sessionfactory.opensession(); } public person load( long id) { return (person)getcurrentsession().load(person. class ,id); } public person get( long id) { return (person)getcurrentsession().get(person. class ,id); } public list<person> findall() { return null ; } public void persist(person entity) { getcurrentsession().persist(entity); } public long save(person entity) { return ( long )getcurrentsession().save(entity); } public void saveorupdate(person entity) { getcurrentsession().saveorupdate(entity); } public void delete( long id) { person person = load(id); getcurrentsession().delete(person); } public void flush() { getcurrentsession().flush(); } } |
ps:我這里顯示寫了一個比較通用的接口,其他所有接口皆繼承此接口, 再編寫實現類
注意:我這里寫的session產生是調用的sessionfactory的opensession()這個方法。之前使用getcurrentsession()一直報錯,后來百度了一下才知道,hibernate3版本可以使用getcurrentsession()來創建session,而hibernate4版本則不行。
服務層(service):
1
2
3
4
5
6
7
8
9
|
package com.ssh.service; import com.ssh.entity.person; /** * created by xrog * on 2/2/2017.2:39 pm */ public interface personservice { long saveperson(); } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package com.ssh.service.impl; import com.ssh.entity.person; import com.ssh.repository.personrepository; import com.ssh.service.personservice; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.service; /** * created by xrog * on 2/2/2017.2:40 pm */ @service public class personserviceimpl implements personservice { @autowired private personrepository personrepository; public long saveperson() { person person = new person(); person.setusername( "xrog" ); person.setphone( "18381005946" ); person.setaddress( "chendu" ); person.setremark( "this is xrog" ); return personrepository.save(person); } } |
控制層(controller):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.ssh.controller; import com.ssh.entity.person; import com.ssh.service.personservice; import com.ssh.service.testservice; import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.responsebody; /** * created by xrog * on 2/1/2017.12:36 am */ @controller public class maincontroller { @autowired private personservice personservice; @requestmapping (value = "saveperson" , method = requestmethod.get) @responsebody public string saveperson(){ personservice.saveperson(); return "success!" ; } } |
ok,編寫完畢,我們重啟下服務器然后測試:
我們在看下數據庫,跟我們插入的數據對比下
ok,測試完畢,十分成功
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!
原文鏈接:http://www.cnblogs.com/xrog/p/6359706.html