Struts2 屬于業務邏輯層架構 底層封裝的是Servlet
Servlet用于接收請求和處理響應的一套邏輯過程
隻能用于web項目 web project
架構學習特點:
側重整體流程步驟,再熟悉細節
架構隻要會用就行,至于底層無須了解或适當了解就行
每個架構某個功能子產品都需要一定的jar包支援 ,再使用中隻需調用響應jar包中響應類的相應方法
Api文檔來查找
架構各個類之間的設計方式 其實就是設計模式的内容
設計模式就相當與戰略戰術設計方式 三十六計
架構比如就是陣法
Struts2架構 和struts不同 ,很大的差別
Struts2實在struts和webwork在基礎上發展起來的
下載下傳struts2的驅動包 在官網
·https://struts.apache.org/
- struts-2.5.16-all.zip (65MB) [PGP] [MD5] 下載下傳這個
下載下傳好之後解壓 lib目錄底下所有的jar包 太多
Apps目錄底下是所有的例子
取某個例子解壓下 取裡面的lib所有的驅動包 大概13個左右
搭建架構:
1. 建立web project ,導入jar包
直接複制粘貼到wen-inf下的lib目錄裡面
2. 在web.xml裡面配置struts2的核心過濾器
<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>
/* 表示過濾所有 ,表示所有的邏輯都經過struts2過濾器,進入到struts2架構裡面
3. 建立業務邏輯層的業務類
Struts2裡面的基本單元就是Action,Action就是對servlet的封裝
建立方式:
a. 實作Action接口
publicclass HelloAction implements Action{
@Override
public String execute() throws Exception {
return"success";
}
}
b. 繼承ActionSupport類
publicclass HelloActionextends ActionSupport{
@Override
public String execute() throws Exception {
return"success";
}
}
實作接口和繼承都能建立Action,但是ActionSupport裡面可以實作校驗的功能
因為ActionSupport同時實作了Action, Validateable
Action裡面預設的執行方式是execute()方法
4. 配置Action 在struts.xml檔案裡面配置
注意: struts.xml一班寫在src根目錄底下 ,命名最好寫成struts.xml
建立struts.xml時候必須引入dtd檔案 ,否則不會自動提示
<struts>
<package name="default" namespace="/"extends="struts-default">
<action name="hello"class="com.mypack.struts.HelloAction">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
Package标簽:表示action所屬的包,可以有多個package,但是每個package name值時唯一的
Namespace代表浏覽器通路該包底下的action路徑問題
Namespace=”/” http://localhost:8080/項目名/hello
Namespace=”aaa” http://localhost:8080/項目名/aaa/hello
Extends 表示繼承某個配置檔案跟java繼承概念差不多,一般值都寫成 struts-default
Action配置:
Name表示的是該action的name值,表示通路該action時的資訊,不能重複
Class表示對應的包名+類名 對應的action類
Method:方法名 表示執行某類底下的某個方法不配表示執行預設方法 execute()
Result:name值表示該action方法執行最終的傳回值,如果是該傳回值,進入到相應的頁面或者邏輯
Type屬性值:
dispatcher: 請求轉發沒有配置預設值為dispatcher,請求轉發到另外頁面
redirect: 重定向 重定向到另外的一個頁面
redirectAction:重定向到另外一個Action
通過浏覽器url來通路該action 通過該Action配置的name值來通路:
http://ip位址:端口号/項目名 /action标簽的name屬性值
常用配置:
Struts接口裡面内置常量:
Action接口中定義了一些常量屬性:
public static final String | ERROR | "error" |
public static final String | INPUT | "input" |
public static final String | LOGIN | "login" |
public static final String | NONE | "none" |
public static final String | SUCCESS | "success" |
當某個action傳回值是上面常量值時,就可以互相替代
Return“success” 可以寫成 return SUCCESS;
Return “input” 可以寫成 return INPUT;
Struts.xml裡面配置的常量資訊
<constant name=" " value="">
在struts2中,配置檔案需要配置不少常量,其中常用的如下:
<constant name="struts.i18n.encoding" value="UTF-8"/>
struts.i18n.encoding:這個常量會作用于setCharacterEncoding方法和freemarker,velocity(這兩種為模闆技術)的輸出,POST方式送出的資料,可以交由這個常量去設定它的編碼格式。
<constant name="struts.configuration.xml.reload" value="true"/>
struts.configuration.xml.reload:當struts的配置檔案修改後,系統是否自動重新加載該檔案,預設值為false,開發階段最好打開,開發完後再關閉。
<constant name="struts.serve.static.browserCache" value="false"/>
truts.serve.static.browserCache:設定浏覽器是否緩存,預設值為true,開發階段最好關閉。
<constant name="struts.devMode" value="true"/>
struts.devMode:列印出更詳細的錯誤資訊,用于排錯,主要用于開發模式,做好了再關閉,在copysturts-blank中的stuts.xml中,裡面有這常量。
<constant name="struts.ui.theme" value="simple"/>
struts.ui.theme:标簽所使用的額外的自定義樣式,不太實用,最好設定成simple,且一般都不用到struts 2的标簽庫。
<constant name="struts.objectFactory" value="spring"/>
struts.objectFactory:與spring繼承時,指定由spring負責action對象的建立,在繼承spring時,會用到這個常量.
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
struts.enable.DynamicMethodInvocation:該屬性設定struts2是否支援動态方法調用,該屬性的預設值是true,如果需要關閉動态方法調用,則可設定該屬性為false,
注意:DMI的調用方式Struts2的文檔不建議使用,且下載下傳的struts2-2-X.jar中,它的sturts-blank中sturts.xml有這常量,并設其值為false。
<constant name="struts.multipart.maxSize" value="20971520"/>
struts.multipart.maxSize:設定上傳檔案的總大小限制,老楊說過它上傳無法傳太大的,可能是這裡沒設定。
注意:用HTML方式來上傳是無法上傳太大的檔案,很不穩定,可以說失敗率超高。解決方法是用socket編個插件用于上傳,而不能直接依賴。
<constant name="struts.action.extension" value="do,lz"/>
struts.action.extension:修改字尾名,預設是action,可以修改。若值有多個,可用逗号隔開,這對于常量的值都通用。
<constant name="struts.custom.i18n.resources" value="baseName"/>
struts.custom.i18n.resources:用于配置國際化全局XML資源檔案,須在指明該全局資源檔案的基礎名。
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
struts.ognl.allowStaticMethodAccess:如其名,用于設定OGNL是否允許靜态方法通路,預設為false。
方法調用:
publicclass HelloActionextends ActionSupport{
@Override
public String execute() throws Exception {
return"success";
}
public String login(){
returnSUCCESS;
}
}
Struts.xml
<struts>
<package name="default" namespace="/"extends="struts-default">
<action name="hello"class="com.mypack.struts.HelloAction">
<result name="success">index.jsp</result>
</action>
<action name="hello2"class="com.mypack.struts.HelloAction">
<result name="success">index.jsp</result>
</action>
<action name="hello3"class="com.mypack.struts.HelloAction" method="login">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
1. 沒有配置method屬性, 直接通路action,表示執行的是預設的方法execute()
http://localhost:8080/項目名/hello
執行的是execute()方法
2. 沒有配置method屬性,通路某個方法 action!方法名
http://localhost:8080/項目名/hello2!login
執行的是login方法
3. 配置method屬性,通路action就是通路配置的method方法
http://localhost:8080/項目名/hello3
執行的是login方法
4. 通配符
publicclass HelloAction extends ActionSupport{
public String addStu(){
returnSUCCESS;
}
public String delStu(){
returnSUCCESS;
}
}
<struts>
<package name="default"namespace="/" extends="struts-default">
<!--
<action name="add"class="com.mypack.struts.HelloAction" method="addStu">
<result name="success">index.jsp</result>
</action>
<action name="del"class="com.mypack.struts.HelloAction" method="delStu">
<result name="success">index.jsp</result>
</action>
-->
<!--通配符 下面這種效果就等效于上面效果 -->
<action name="{1}" class="com.mypack.struts.HelloAction" method="{1}Stu">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
<struts>
<package name="default"namespace="/" extends="struts-default">
<!--
<action name="addStu" class="com.mypack.struts.StuAction" method="addStu">
<result name="success">index.jsp</result>
</action>
<action name="delStu"class="com.mypack.struts.StuAction" method="delStu">
<result name="success">index.jsp</result>
</action>
<action name="addTea"class="com.mypack.struts.TeaAction" method="addTea">
<result name="success">index.jsp</result>
</action>
<action name="delTea"class="com.mypack.struts.TeaAction" method="delTea">
<result name="success">index.jsp</result>
</action>
-->
<!--通配符下面這種效果就等效于上面效果-->
<action name="{1}{2}"class="com.mypack.strut.{2}Action" method="{1}{2}">
<result name="success">index.jsp</result>
</action>
</package>
</struts>
Struts2校驗:
1. Validate()方法
2. ValidateXXX()方法
publicclass HelloAction extends ActionSupport{
public String login(){
returnSUCCESS;
}
publicvoid validate(){
System.out.println("校驗的邏輯");
}
publicvoid validateLogin() {
//手動背景校驗 隻校驗login方法
}
}
<action name="login" class="com.mypack.struts.HelloAction"method="login">
<result name="success">index.jsp</result>
<!-- 校驗的name值為input-->
<result name="input">login.jsp</result>
</action>
前台頁面如果要看到錯誤資訊:
頁面引入Struts标簽 login.jsp
<form action="login">
使用者名: <input type="text" id="username" name="user.username"/><s:fielderror fieldName="user.username"></s:fielderror><br>
<input type="submit" value="login" />
3. 校驗架構
Struts2内置了校驗架構,通過對應關系起作用
a. 校驗規則配置檔案與Action類必須在同一檔案夾下
b.校驗規則配置檔案檔案名必須是
Action類名-validation.xml
Action類名-别名-validation.xml
c. 别名對應的是Action配置中name屬性的值 ,也就是隻校驗一個action中的某個方法。
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
<validators>
</field>
</validators>
驗證規則:
required:必填校驗器
requiredstring:必填字元串校驗器
int:整數校驗器
double:雙精度浮點數校驗器
date:日期校驗器
expression:表達式校驗器
fieldexpression:字段表達式校驗器
email:電子郵件校驗器
url:網址校驗器
visitor:Visitor校驗器
conversion:轉換校驗器
stringlength:字元串長度校驗器
regex:正規表達式校驗器
例子:
</validators>
</validators>
</validators>
</validators>
</validators>
</validators>
</validators>
Struts标簽:
1. jsp引入struts2标簽庫
<%@ tagliburi="/struts-tags" prefix="s" %>
2. 使用
3. 表單标簽
4. 表單标簽的通用屬性
屬性名 | 主題 | 資料類型 | 說明 |
title | simple | String | 設定表單元素的title屬性 |
disabled | simple | String | 設定表單元素是否可用 |
label | xhtml | String | 設定表單元素的label屬性 |
labelPosition | xhtml | String | 設定label元素的顯示位置,可選值 : top 和 left(預設) |
name | simple | String | 設定表單元素的name屬性,與Action中的屬性名對應 |
value | simple | String | 設定表單元素的值 |
cssClass | simple | String | 設定表單元素的class |
cssStyle | simple | String | 設定表單元素的style屬性 |
required | xhtml | Boolean | 設定表單元素為必填項 |
requiredpositon | xhtml | String | 設定必填标記(預設為*)相對于label元素的位置,可選值:left 和right(預設) |
tabindex | simple | String | 設定表單元素的tabindex屬性 |
5.
6. <form>标簽的常用屬性及描述
屬性名 | 是否必填 | 類型 | 說明 |
action | 否 | String | 指定送出時對應的action,不需要action字尾 |
enctype | 否 | String | HTML表單enctype屬性 |
method | 否 | String | HTML表單method屬性 |
namespace | 否 | String | 所送出action的命名空間 |
7.
8. <s:submit>标簽的常用屬性
屬性名 | 是否必填 | 類型 | 說明 |
action | 否 | String | 指定送出時對應的action |
method | 否 | String | 指定action中調用的方法 |
9.
10.<s:password>标簽的常用屬性說明
屬性名 | 說明 |
Name | 用于指定密碼輸入框的名稱 |
Size | 用于指定密碼輸入框的顯示寬度,以字元數為機關 |
MaxLength | 用于限定密碼輸入框的最大輸入字元串個數 |
showPassword | 是否顯示初始值,即使顯示也仍為密文顯示,用掩碼代替 |
11.
12.<s:radio>标簽的屬性及說明
屬性名 | 是否必填 | 類型 | 說明 |
List | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成單選框中的集合 |
listKey | 否 | String | 指定集合對象中的哪個屬性作為選項的value |
listValue | 否 | String | 指定集合對象中的哪個屬性作為選項的内容 |
13.
14.<s:checkboxlist>标簽的常用屬性及說明
屬性名 | 是否必填 | 類型 | 說明 |
name | 否 | String | 指定該元素的name |
list | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成多選框的集合 |
listKey | 否 | String | 生成checkbox的value屬性 |
listValue | 否 | String | 生成checkbox後面顯示的文字 |
15.
16.select标簽的常用屬性及說明
屬性名 | 是否必填 | 類型 | 說明 |
list | 是 | Cellection、Map、Enmumeration、Iterator,array | 用于生成下拉框的集合 |
listKey | 否 | String | 生成選項的value屬性 |
listValue | 否 | Strmg | 生成選項的顯示文字 |
headerKey | 否 | String | 在所有的選項前再加額外的一個選項作為其标題的value值 |
headerValue | 否 | String | 顯示在頁面中header選項的内容 |
Multiple | 否 | Boolean | 指定是否多選,預設為 false |
emptyOption | 否 | Boolean | 是否在标題和真實的選項之間加一個空選項 |
size | 否 | Int | 下拉框的高度,即最多可以同時顯示多少個選項 |
Ognl表達式取值:
通過<s:debug>标簽來觀察取值是否使用#
正常點開debug标簽會有上下兩部分 ,上面部分為 屬性和對應的值;下面部分是鍵值對類型 ,map集合
如果取屬性值 直接取 不用加# <s:property value=”屬性”/>
如果取下面鍵值對值,需在前面加# <s:property value=”#鍵”/>
Struts2裡面的傳值取值:
前端頁面和背景邏輯的資料會自動對接,無須自己手動處理
要求:
通過屬性來對接的,是以屬性必須有對應的getter,setter方法
1前端
name=”username” name=”password”;
背景Action
Stringusername;
Stringpassword;
必須對應起來,并且getter,setter方法
2前端
name=”user.username” name=”user.password”;
實體類
classUser{
Stringusername;
Stringpassword;
//getter.setter方法
}
Action:
屬性: User user;
//getter,setter方法
3 前端
name=”username” name=”password”;
實體類
classUser{
Stringusername;
Stringpassword;
//getter.setter方法
}
ClassUserAction extends ActionSupport implements ModelDriven<User>{
//屬性:
User user;
//getter,setter方法
publicUser getModel(){
returnuser;
}
}
攔截器:
自定義過濾器:
1 自定義一個實作Interceptor接口(或者繼承自AbstractInterceptor)的類。
public class CheckLoginInterceptorextends AbstractInterceptor {
public String intercept(ActionInvocation actionInvocation) throwsException {
if (滿足條件) {
return actionInvocation.invoke();//放行
}
return login.jsp;//不滿足,傳回登入頁面
}
}
2 在strutx.xml中注冊上一步中定義的攔截器。
注冊攔截器
<interceptors>
<interceptor name="loginInter"class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>
</interceptors>
3 哪個Action需要被攔截直接配置就行了
<action name="login"class="xx.xx.xx.UserAction" method=”login”>
<result name="success">index.jsp</result>
<interceptor-refname=" loginInter "/>
</action>
國際化:
參考百度,直接搜
上傳和下載下傳:
Ajax:
異步處理: jquery裡面調用ajax 背景使用struts2來實作
其實跟servlet一樣,隻不過背景用action實作
Jquery easyUI:
封裝好的前端架構
參考官網,官方文檔
http://www.jeasyui.net/