傳統(tǒng)的mvc模式
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的struts案例
實(shí)現(xiàn)步驟
- 創(chuàng)建一個(gè)javaweb工程,并選中struts2,
- 創(chuàng)建jsp頁(yè)面(創(chuàng)建視圖)
- 創(chuàng)建action類(lèi)(Action 類(lèi)是 Struts 2 應(yīng)用程序的關(guān)鍵暮顺,并且我們?cè)?action 類(lèi)中實(shí)現(xiàn)大部分的業(yè)務(wù)邏輯)
- 配置文件
創(chuàng)建一個(gè)javaweb工程乖篷,并選中struts2,
完整項(xiàng)目路徑
創(chuàng)建index.jsp頁(yè)面
<%--
Created by IntelliJ IDEA.
User: pc
Date: 17-5-22
Time: 上午8:05
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello!
</body>
</html>
成功時(shí)撕蔼,會(huì)在jsp中顯示一句話hello!
創(chuàng)建action類(lèi) UserAction
package action;
import com.opensymphony.xwork2.ActionSupport;
/**
* Created by pc on 17-5-22.
*/
public class UserAction extends ActionSupport {
//action中業(yè)務(wù)處理方法
public String login() {
System.out.println("User.action");
return "success";
}
public String register() {
System.out.println("User.action User.action");
return "success";
}
}
1.Action映射:
action映射是Struts2框架中的基本” 工作單元”豁鲤,action映射就是將一個(gè)請(qǐng)求URL(即action的名字)映射到一個(gè)action類(lèi),當(dāng)一個(gè)請(qǐng)求匹配某個(gè)action的名字時(shí)鲸沮,框架就使用這個(gè)映射來(lái)確定如何處理請(qǐng)求琳骡。
屬性 是否必須 說(shuō)明
name 是 action的名字,用于匹配URL
class 否 Action實(shí)現(xiàn)類(lèi)的完整類(lèi)名
method 否 執(zhí)行Action類(lèi)時(shí)調(diào)用的方法
convert 否 應(yīng)用于action的類(lèi)型轉(zhuǎn)換的完整類(lèi)名
2.使用method屬性
在配置action時(shí)讼溺,我們可以通過(guò)action元素的method屬性來(lái)指定action調(diào)用的 方法楣号,所指定的方法,必須遵循與execute方法相同的格式怒坯。
配置文件
- 在web.xml中需要如下配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<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>
</web-app>
- 在action包下需要再次創(chuàng)建一個(gè)struts.xml
<?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-default炫狱,因?yàn)樵摪心J(rèn)的攔截器等東西 -->
<!--namespace:命名空間,考慮到可能出現(xiàn)相同的action敬肚,如果有命名空間就可以解決 -->
<package name="config" namespace="/user" extends="struts-default" abstract="false">
<!-- 定義一個(gè)action -->
<!--對(duì)應(yīng)UserAction中l(wèi)ogin方法-->
<action name="login" class="action.UserAction" method="login">
<!-- 返回一個(gè)String常量毕荐,轉(zhuǎn)發(fā)至對(duì)應(yīng)的JSP頁(yè)面-->
<result name="success">/index.jsp</result>
</action>
<!--對(duì)應(yīng)UserAction中register方法-->
<action name="register" class="action.UserAction" method="register">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
常量配置:用到 constant 標(biāo)簽 ,name 和 value 兩屬性
命名空間: namespace=”/user”,http://localhost:8080/user/login.action 查找條件是優(yōu)先到指定命名空間尋找對(duì)應(yīng)的action,如果找到就用不再繼續(xù)找艳馒,如果找不到憎亚,則到默認(rèn)的命名空間找,否則報(bào)錯(cuò)弄慰。
在大部分應(yīng)用里第美,隨著應(yīng)用規(guī)模的增加,系統(tǒng)中Action的數(shù)量也會(huì)大量增加陆爽,導(dǎo)致struts.xml配置文件變得非常臃腫什往。為了避免struts.xml文件過(guò)于龐大、臃腫慌闭,提高struts.xml文件的可讀性别威,我們可以將一個(gè)struts.xml配置文件分解成多個(gè)配置文件躯舔,然后在struts.xml文件中包含其他配置文件。
- 在src根目錄下面找到struts.xml,這個(gè)文件稱(chēng)為總配置文件省古,作用是引入其他所有配置文件
<?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>
<!--全局配置-->
<!--1.修改struts默認(rèn)的訪問(wèn)后綴-->
<constant name="struts.action.extension" value="action,do,"/>
<!--總配置文件粥庄,引入其他所有配置文件-->
<include file="action/struts.xml"></include>
</struts>
struts2的工作流程
- 客戶(hù)端提起一個(gè)(HttpServletRequest)請(qǐng)求,在瀏覽器中輸入http://localhost:8080/user/login就是提起一個(gè)(HttpServletRequest)請(qǐng)求。其中user就是namespace="/user"豺妓,login<action name="login" class="action.UserAction" method="login">
- 在web.xml文件中定義核心Filter攔截用戶(hù)請(qǐng)求惜互。
- 通過(guò)post或get提交請(qǐng)求。
- 定義處理用戶(hù)請(qǐng)求的Action類(lèi)琳拭。在MVC框架中训堆,控制器C實(shí)際上是由攔截所有用戶(hù)請(qǐng)求,處理請(qǐng)求的通用代碼兩個(gè)部分共同組成的白嘁,實(shí)際的業(yè)務(wù)邏輯則由Action來(lái)處理坑鱼。
struts.xml中常用到的標(biāo)簽
1、<include>
利用include標(biāo)簽絮缅,可以將一個(gè)struts.xml配置文件分割成多個(gè)配置文件姑躲,然后在struts.xml中使用<include>標(biāo)簽引入其他配置文件。
3盟蚣、<package>
1、包
在Struts2框架中是通過(guò)包來(lái)管理action卖怜、result屎开、interceptor、interceptor-stack等配置信息的马靠。包屬性如下:
屬性 是否必需 描述
name 是 包名奄抽,作為其它包應(yīng)用本包的標(biāo)記
extends 否 設(shè)置本包繼承其它包
namespace 否 設(shè)置包的命名空間
abstact 否 設(shè)置為抽象包
<package name="config" namespace="/user" extends="struts-default" abstract="false">
<action name="login" class="action.UserAction" method="login">
<result name="success">/index.jsp</result>
</action>
<action name="register" class="action.UserAction" method="register">
<result name="success">/index.jsp</result>
</action>
</package>
2、extends
當(dāng)一個(gè)包通過(guò)配置extends屬性繼承了另一個(gè)包的時(shí)候甩鳄,該包將會(huì)繼承父包中所有的配置逞度,包括action、result妙啃、interceptor等档泽。
由于包信息的獲取是按照配置文件的先后順序進(jìn)行的,所以父包必須在子包之前被定義揖赴。
通常我們配置struts.xml的時(shí)候馆匿,都繼承一個(gè)名為“struts-default.xml”的包,這是struts2中內(nèi)置的包燥滑。
<package name="config" namespace="/user" extends="struts-default" abstract="false">
3渐北、namespace
namespace主要是針對(duì)大型項(xiàng)目中Action的管理,更重要的是解決Action重名問(wèn)題铭拧,因?yàn)椴辉谕粋€(gè)命名空間的Action可以使用相同的Action名的赃蛛。
namespace="/user"
4恃锉、<action>與<result>
1、<action>屬性介紹
屬性名稱(chēng) 是否必須 功能描述
name 是 請(qǐng)求的Action名稱(chēng)
class 否 Action處理類(lèi)對(duì)應(yīng)具體路徑
method 否 指定Action中的方法名
converter 否 指定Action使用的類(lèi)型轉(zhuǎn)換器
如果沒(méi)有指定method則默認(rèn)執(zhí)行Action中的execute方法呕臂。
2破托、<result>屬性介紹
屬性名稱(chēng) 是否必須 功能描述
name 否 對(duì)應(yīng)Action返回邏輯視圖名稱(chēng),默認(rèn)為success
type 否 返回結(jié)果類(lèi)型诵闭,默認(rèn)為dispatcher