1:搭建Struts工程的步驟
A:加載Struts的jar包。通過struts-blank.war包中,拷貝最基礎運行的jar包。
B:在web.xml中配置Strtuts的核心控制器
<filter>
<filter-name>struts2</filter-name>
<filterclass>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
C:在src目錄下,創建struts.xml框架的配置文件。
<?xmlversion="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constantname="struts.enable.DynamicMethodInvocation" value="false"/>
<constantname="struts.devMode" value="true" />
<package name="default" namespace="/"extends="struts-default">
</package>
</struts>
D: 創建Struts的Action類。並且添加一個名爲execute(只能命名爲execute)的方法。
package com.action;
public class FirstAction {
public String execute() throwsException {
return null;
}
}
E:在Struts.xml中,對Action類做路徑的映射。
WEB頁面訪問是URL路徑。
<action name="xx"class="com.action.FirstAction"></action>
對FirstAction的路徑命名爲xx
F:頁面中訪問xx的請求路徑。
<a href="${pageContext.request.contextPath}/xx">訪問FirstAction</a>
G:設定Action執行完成之後,返回的Result結果。
public String execute() throws Exception {
System.out.println("FirstAction中的Execute方法被執行....");
return "error";
}
<action name="xx"class="com.action.FirstAction">
<result name="succ">/test_succ.jsp</result>
<result name="error">/test_error.jsp</result>
</action>
根據execute方法中返回的字符串,對應Action配置中的result的名稱。
如果匹配的話,那麼就會跳轉到相應的jsp頁面或者freemarker頁面。
2:Struts 2框架的大致處理流程如下:
A:瀏覽器發送請求,例如請求/xx、等。
B: Control中的核心控制器StrutsPrepareAndExecuteFilter根據請求路徑(/xx與struts.xml中配置的action的name
進行匹配),調用相應的業務邏輯控制器(Action)。
C:Struts2的攔截器棧自動對請求應用通用功能,如數據校驗和文件上傳等功能。
D:回調Action中的execute()方法,並在方法體內調用業務邏輯組件來處理請求(Model)。
既可以是將數據保存到數據庫,也可以從數據庫中檢索信息。
實際上,因爲Action只是一個控制器,它會調用業務邏輯組件來處理用戶的請求。
E:execute()方法將調用業務邏輯組件(Model)得到的數據返還並更新視圖層(View),
此時支持的視圖技術非常多,既支持JSP,也支持FreeMarker等模板技術。
3:struts工程中可以運行Servlet
3.1:Struts核心控制器,默認攔截/*的請求。(攔截的是無後綴名或者後綴名爲action的請求。)
把servlet的後綴名,進行變更。
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/FirstServlet.svt</url-pattern>
</servlet-mapping>
那麼訪問路徑:
<a href="${pageContext.request.contextPath}/servlet/FirstServlet.svt">2:運行FirstServlet</a>
3.2:重寫Struts的過濾器,如果是SErvlet的請求路徑的話,則不進行處理。
public class StrutsFilter extendsStrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throwsIOException, ServletException {
HttpServletRequest request =(HttpServletRequest) req;
String requestURI =request.getRequestURI();
if (requestURI.indexOf("/servlet") != -1) {
/**
* 表示訪問的路徑是一個Servlet
*/
chain.doFilter(req, res);
} else {
/**
* 調用Struts的核心控制器繼續處理
*/
super.doFilter(req, res, chain);
}
}
}
web.xml中重新配置。
<filter>
<filter-name>struts2</filter-name>
<filter-class>com.filter.StrutsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4:struts核心配置文件(struts.xml)
4.1:constrant的配置,常量可以配置在以下的文件列表中。最後面的配置會覆蓋前面的配置。
1.struts-default.xml \WEB-INF\lib\struts2-core-2.3.28.jar\struts-default.xml。一般不進行配置。
3.struts.xml \src目錄下
<constantname="struts.devMode" value="true" />
4.struts.properties \src目錄下,手工進行創建
struts.devMode = false
5.web.xml \WEB-INF目錄下。
<filter>
<filter-name>struts2</filter-name>
<filter-class>com.filter.StrutsFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>struts.enable.DynamicMethodInvocation</param-name>
<param-value>true</param-value>
</init-param>
</filter>
4.2:常用的常量配置。
Struts中所有的常量定義:\struts2-core-2.3.28.jar\org.apache.struts2\default.properties
struts.i18n.encoding=UTF-8 //設定編碼
struts.multipart.maxSize=2097152 //設定上傳文件的大小
struts.action.extension=action,, //設定Struts的後綴名
struts.enable.DynamicMethodInvocation =false //是否開啓Struts的動態方法調用
struts.devMode = false //是否處於開發模式
struts.ui.theme=xhtml //設定UI控件的主題
struts.ognl.allowStaticMethodAccess=false //是否允許ONGL表達式調用靜態方法。
4.3:include配置。
包含其他的配置文件,用於團隊項目。
規則:不同的配置文件中,package與namespace的名稱不能重複。
<package name="default" namespace="/"extends="struts-default">
<include file="struts-user.xml"></include>
4.4:package配置
<package
name="" package的命名,不能重複。用於package之間的繼承。
namespace="" action訪問的命名空間。
extends="" 繼承哪一個package,默認繼承struts-default
abstract="true|false" true:表示是一個抽象包。抽象包中不能定義action
></package>
完整的Action訪問路徑:
命名空間 + action的名稱
路徑中的訪問命名空間>=struts.xml中定義的命名空間。
/aa/bb/cc/dd/ee/XXXAction /aa/bb
4.5:action的配置。
<action name="" action的名稱
class="" action類的路徑
method="" 默認執行execute方法,
但是可以通過method屬性來指定調用哪一個方法。
></action>
4.6:result的配置。
<result
name="" result的名稱
type=""> result類型。
請求轉發到Action : chain"
請求轉發到頁面 dispatcher"
重定向到頁面: redirect"
重定向到Action redirectAction"
返回的result是一個流類型:用於文件下載:stream"
</result>
<result name="forward_jsp"type="dispatcher">/forward_jsp.jsp</result>
<resultname="redirect_jsp" type="redirect">/redirect_jsp.jsp</result>
<resultname="forward_action" type="chain">
<param name="namespace">/</param>
<paramname="actionName">xx</param>
<paramname="methodName">execute</param>
</result>
<result name="redirect_action"type="redirectAction">
<param name="namespace">/</param>
<paramname="actionName">xx</param>
<paramname="methodName">execute</param>
</result>