# 下載
[http://struts.apache.org/downloads.html](http://struts.apache.org/downloads.html) 可能需要VPN。
我們下載2.3.31版本。

同時,我們將下載后壓縮包放在了tower中的『夢云智』項目中,這意味著你可以直接登陸tower來下載教程使用的struts。
## 引入
在JAVA開發的世界中,我們可以使用很多的第三方包來擴充我們的應用。這就像是在搭積木。我們想要什么的時候,直接去下載個積木包(一個包中包括了很多種積木),然后使用從這個積木包中找到一些我們需要的積木,引入進來就可以了。
struts下載后,默認給我們了所有的積木,但按項目需求的不同,我們可能只需要部分積木就能達到我們學習的目的。當然了,你也可以把所有的積木都拿過來使用,這僅僅只會增加項目的占用空間而已。在此,我們抱著學習的目的,只引struts中最核心的包(積木)。
> 查看struts的基本jar包,請參考:[http://www.imooc.com/video/9022](http://www.imooc.com/video/9022)
在這,我們已經為大家分解好,并放在團隊的tower中

我們下載解壓,并將其放置到如下位置:

### 使用Struts JAR包
將在eclipse中,通過Java Build Path中的Libraries進行第三方庫(jar包)的引入
在項目文件夾上點右鍵 -> Build path -> configure Build Path -> Libraries -> add JARS
然后選擇上面lib文件夾中的所有jar文件,最后點確定。此時struts已經被我們成功引用到項目中,并可以在項目中使用他們了。我們此時打開Java Resources -> Libraries 能夠查看到我們剛剛引入的包,視為正常。

# 配置web.xml
下面,我們共同將struts配置至項目中:
```
<display-name>Java EE study</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
```
我們新配置了兩項信息:
* 定義了一個過濾器,名字叫做:struts2, 它位于:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
* 指定了過濾規則(路由)。
* 在此規則下的所有請求,請交給指定的過濾器來處理。
* 即:所有的請求都會交給我們在上面定義好的struts2過濾器(類).
## 測試:
重啟tomcat,控制臺無報錯.即成功加了struts。
如果未成功引入的話,將報找不到 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter的錯誤。此時請檢查:
* 是否將struts基本jar包復制到了項目的指定位置。
* tomcat在啟動時,將復制這些jar包。
* 是否在Libraries中,由上面的位置添加了這些jar包。
* 添加后,我們將在左側的 src中的Libraries中找到它們。

在其包上點右鍵,點擊屬性,文件的位置應該如下:

加入注釋后如下:
```
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>java ee study!</display-name>
<!-- 指定過濾器 -->
<filter>
<!-- 定義過濾器的名字:struts2 -->
<filter-name>struts2</filter-name>
<!-- 過濾器對應的類 該類位于Java Resources -> Libraries -> struts2-core-2.3.31.jar ->org.apache.struts2.dispatcher.ng.filter -> StrutsPrepareAndExecuteFilter -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 為過濾器指定路由 -->
<filter-mapping>
<!-- 指定過濾器名稱:struts2 -->
<filter-name>struts2</filter-name>
<!-- 路由規則 /* 代表全部 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
```
配置信息的關系如下:
# 
## V:helloStruts.jsp
struts能夠找到WebContent下的jsp文件渲染。但人們更習慣將一些模板文件建立在WebContent下的WEB-INFO目錄下。沒錯,web.xml也在這個目錄下,這更多的是出于安全角度來考慮的,因為tomcat的策略是:用戶無法直接訪問WEB-INFO目錄下的任何文件,所以做為V層的模板文件放在此,當然最合適不過了。
在WebContent/WEB-INFO中新建jsp/helloStruts.jsp, 并輸入以下內容。
```
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>hello struts!</h2>
</body>
</html>
```
有了jsp文件,下面,我們通過配置struts,來達到展示該V層文件的目的。
# 初始化struts.xml
在web.xml配置好struts后,它會自動加載src文件夾中的struts.xml文檔,以達到配置struts的目的。
在src中,我們新建struts.xml文檔,并寫入標準的文件頭,來告知此文件的編碼及遵循的dtd格式。
> 我們只需要知道:不同的dtd格式,解析的方式會不同
同時,寫入基本的struts標簽。
> 在前期,我們其實可以完全的不去關心這到底是什么,又是為什么要這樣寫,僅管這樣寫就好了。
```
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
</struts>
```
保存后,注意看eclipse的提示,在文件名上是否有紅色的X產生,如果有的話,檢查拼寫。
重啟Tomcat,以使得我們剛剛建立的配置文件生效。注意看控制臺信息,發生拼寫錯誤時,會報錯。
# 新建hellostruts路由
```
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 聲明包名,并指定命名空間/hello,同時繼承于struts-default。 這與我們定義一個class相類似 -->
<package name="default" namespace="/hello" extends="struts-default">
<!-- 設置hellostruts Action -->
<action name="struts">
<!-- 設置V層,相對于WebContent的絕對路徑 -->
<result>/WEB-INF/jsp/helloStruts.jsp</result>
</action>
</package>
</struts>
```
# 測試
重啟Tomcat
訪問以下url
[http://localhost:8080/javaee/hello/struts](http://localhost:8080/javaee/hello/struts)

## 代碼分析:

## 未找到路由:

系統未找到路由時,會報如上錯誤。現在,我們啟用開發模式,來查看錯誤的詳細信息:
## 開發模式
```
<struts>
<!-- 開發模式 - ture -->
<constant name="struts.devMode" value="true" />
```
重啟tomcat后,我們再測試

此時,我們發送前臺為我們自動打印了命名空間及action名等信息。有了以上信息,我們去配置struts的xml文件就會變得輕松很多。
> 不僅如此,在開發模式下,當我們再次更改struts.xml時,會被時時的重新加載,從而不再需要重新啟動tomcat了。
## 作業
使用以下URL來顯示hellostruts
[http://localhost:8080/javaee/hellostruts](http://localhost:8080/javaee/hellostruts)
使用如下信息定義XML,文件如何存放,前臺如何訪問:
```
<!-- 聲明包名,并指定命名空間\hello,同時繼承于struts-default。 這與我們定義一個class相類似 -->
<package name="default" namespace="/mengyunzhi" extends="struts-default">
<!-- 設置hellostruts Action -->
<action name="welcome">
<!-- 設置V層,相對于WebContent的絕對路徑 -->
<result>/jsp/helloStruts.jsp</result>
</action>
</package>
```
> 當使用struts做為過濾器后,WebContent下的所有文件,用戶都無法直接訪問到了,這無疑提升了系統的安全性。
- README
- 第一章:準備
- 第二章:Hello World!
- 第一節:查看工程文件
- 第二節:JDK、JRE與環境變量
- 第三節:index.jsp
- 第三章:Hello Struts
- 第一節:Web.xml
- 第二節:單入口
- 第三節:Hello Struts
- 第四節:觸發C層
- 第四章:建立數據表
- 第一節:建立實體類
- 第二節:測試一
- 第三節:測試二
- 第四節:引入Hibernate
- 第五節:配置Hibernate
- 第六節:建立連接
- 第七節:實體類映射數據表
- 第八節:完善數據表
- 第五章:教師管理
- 第一節:增加數據--add
- 第二節:增加數據--save
- 1 獲取傳入數據數據
- 2 數據寫入測試
- 3 對接C層
- 第三節:數據列表
- 1 獲取數據
- 2 重構代碼
- 3 C層對接--初始化
- 4 C層添加數據
- 5 V層顯示數據
- 6 獲取數據庫中數據
- 7 顯示性別
- 8 分頁
- 9 條件查詢
- 第四節:修改數據
- 1 edit
- 2 update
- 第五節:刪除數據
- 第六節:總結
- 第六章:重構C層
- 第一節:繼承ActionSupport類
- 第二節:數據驗證
- 第七章:前臺分離(前臺)
- 第一節:環境搭建
- 第二節:運行環境
- 第三節:共享開發環境
- 第四節:生產環境
- 第八章:前臺開發(前臺)
- 第一節:本地化
- 第二節:教師列表
- 1 引入M層
- 2 模擬后臺返回數據
- 3 C與M對接
- 4 C與V對接
- 第九章:前后臺對接(前后臺)
- 第一節:后臺輸出json(后臺)
- 第二節:對接前臺(全棧)
- 第二節:對接API(前臺)
- 第二節:跨域請求(后臺)
- 第三節:重構代碼(前臺)
- 第十章:重構后臺M層
- 第一節:數據訪問DAO層
- 第二節:項目整體重構
- 第十一章:用戶登陸(前后臺)
- 第一節:制定規范
- 第二節:定制測試用例
- 第三節:后臺輸入測試代碼(后臺)
- 第四節:postman(后臺)
- 第五節:新建用戶登陸模塊(前臺)
- 第六節:代碼重構(前臺)
- 第十二章:班級管理(前后臺)
- 第一節:班級列表
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第二節:Add
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第三節:Save
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第四節:Edit
- 1 原型開發
- 2 制定規范
- 3 后臺對接開發
- 4 前臺對接開發
- 第五節:Update
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第六節:Delete
- 1 制定規范
- 2 后臺對接開發
- 3 前臺對接開發
- 第七節:小結
- 第十三章:班級管理(API)
- 第一節:ER圖
- 第二節:create
- 1 實體層
- 2 dao層
- 3 service(server)層
- 4 action層
- 第三節:ManyToOne
- 第四節:Read
- 1 service(server)層
- 2 action層
- 第五節:update
- 1 service(server)層
- 2 action層
- 第六節:update
- 第十四章:重構服務層