struts2知识
一、?MVC
??Model 1:將所有的程序代碼,都寫(xiě)到JSP頁(yè)面中。
??Model 2:JSP(流程控制、數(shù)據(jù)顯示)?+ JavaBean
??改進(jìn)的Model2:Servlet(流程控制)?+ Jsp(數(shù)據(jù)顯示)?+ JavaBean(業(yè)務(wù)邏輯、數(shù)據(jù)處理)
??MVC:將整個(gè)應(yīng)用程序劃分為3大組件(Model、View、Controller)
注意:MVC和三層不是一回事。
二、?Struts2簡(jiǎn)介
struts2是一個(gè)典型的MVC框架。
struts2 = Struts1 + WebWork
struts2下載包的目錄結(jié)構(gòu):apps(示例程序)、docs(幫助文檔)、lib(jar包)、src(源碼)
一、?Struts2項(xiàng)目的開(kāi)發(fā)流程
1.?創(chuàng)建web項(xiàng)目
2.?導(dǎo)入struts2相關(guān)的Jar包
提示:可以解壓apps目錄下的struts-blank.war,從它的lib目錄中拷貝相關(guān)的jar包
3.?在web.xml文件中配置struts2的核心控制器(過(guò)濾器)
| <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> |
4.?在src中添加struts.xml文件
5.?創(chuàng)建Action類,并添加Action方法
l?方式一:實(shí)現(xiàn)接口Action
常量:INPUT(input)、SUCCESS(success)、ERROR(error)、LOGIN(login)、NONE(none)
l?方式二:繼承類ActionSupport
l?方式三:POJO類
6.?在struts.xml文件中配置action節(jié)點(diǎn)
7.?編寫(xiě)JSP頁(yè)面
一、?struts.xml配置詳解
1.?struts2的常量,可以在struts.xml的constant中設(shè)置,也可以單獨(dú)寫(xiě)到struts.properties中。
2.?result節(jié)點(diǎn)的type屬性
??dispatcher:轉(zhuǎn)發(fā)(JSP),默認(rèn)值
??redirect:重定向(JSP或外部url)
??redirectAction:重定向到其他的action
??chain:轉(zhuǎn)發(fā)到其他的action
??stream:文件下載
??json:ajax請(qǐng)求時(shí),一般以json格式串返回
3.?常見(jiàn)配置介紹
l?result的name屬性可以省略,默認(rèn)值為success
l?result的type屬性可以省略,默認(rèn)值為dispatcher
l?用戶訪問(wèn)的url地址,為namespace+actionName
| <?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> <!-- 設(shè)置struts2的常量 --> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- 可以有多個(gè)package節(jié)點(diǎn) --> <!-- name:每個(gè)package的name值都不能相同,必填 ?namespace:命名空間(URL地址的一部分) ?extends:一般都要繼承struts-default包 ?--> <package name="default" namespace="/" extends="struts-default"> <!-- 結(jié)果類型 --> <result-types> <result-type name="" class=""></result-type> </result-types> <!-- interceptors用戶聲明所有的攔截器 --> <interceptors> <!-- interceptor聲明攔截器 --> <interceptor name="" class=""></interceptor> <!-- 配置攔截器棧(多個(gè)攔截器可以構(gòu)成攔截器棧) --> <interceptor-stack name=""> <!-- 引用的攔截器,可以是一個(gè)攔截器棧 --> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 配置默認(rèn)的攔截器 --> <default-interceptor-ref name=""></default-interceptor-ref> <!-- 默認(rèn)的action。當(dāng)用戶在瀏覽器地址欄中沒(méi)有輸入任何action時(shí),將訪問(wèn)本節(jié)點(diǎn)配置的action --> <!-- http://localhost:8080/projectname/ --> <default-action-ref name="login"></default-action-ref> <!-- 默認(rèn)的action類(當(dāng)action節(jié)點(diǎn)省略時(shí),將使用本節(jié)點(diǎn)配置的類) --> <default-class-ref class=""></default-class-ref> <!-- 全局的result --> <global-results> <result name="login" type="dispatcher">/login.jsp</result> <result name="error" type="dispatcher">/error.jsp</result> </global-results> <!-- 全局的異常映射 --> <global-exception-mappings> <exception-mapping result="error" exception="Java.lang.Exception"></exception-mapping> <exception-mapping result="error" exception="java.sql.SQLException"></exception-mapping> <exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping> </global-exception-mappings> <!-- action可以有多個(gè)(name必填;class和method可以省略;method如果省略默認(rèn)為execute) --> <action name="login" class="" method=""> <!-- name可以省略,默認(rèn)值為success;type可以省略,默認(rèn)值是dispatcher --> <result name="" type=""></result> </action> </package> <!-- 導(dǎo)入其他的struts配置文件,不管有多少個(gè)struts的配置文件,struts2框架而言,只會(huì)加載struts.xml,所有需要將其他的配置文件導(dǎo)入到struts.xml文件中 --> <include file=""></include> </struts> |
二、?攔截器
1.?定義攔截器
實(shí)現(xiàn)接口:Interceptor
繼承類:AbstractInterceptor
2.?配置攔截器
首先,在Interceptors節(jié)點(diǎn)下添加Interceptor節(jié)點(diǎn);
其次,要么在action中通過(guò)interceptor-ref使用攔截器,要么配置default-interceptor-ref
3.?注意
一旦使用了自定義的攔截器,那么struts2提供的默認(rèn)的攔截器defaultStack將不再起作用。
怎么破?新添加一個(gè)攔截器棧,里面添加對(duì)自定義攔截器和defaultStack的引用,然后將這個(gè)攔截器棧設(shè)置為默認(rèn)的攔截器。
4.?struts2提供的攔截器
params攔截器
validation攔截器
fileUpload攔截器
workflow攔截器
…?…
三、?文件上傳
1.?jsp頁(yè)面的form標(biāo)記,method屬性值必須為post
2.?jsp頁(yè)面的form標(biāo)記,必須添加enctype=multipart/form-data屬性
3.?jsp頁(yè)面中使用type=file的文件域
4.?添加apache文件上傳的jar包:commons-fileupload、commons-io
5.?在Action類中添加三個(gè)屬性:
| private ?File ?xxx; private ?String ?xxxFileName; private ?String ?xxxContentType; |
6.?在action方法中實(shí)現(xiàn)文件的保存
避免文件名重名時(shí)文件被覆蓋:uuid作為文件名
數(shù)據(jù)庫(kù)中存儲(chǔ)的文件路徑一定要是相對(duì)路徑
如何獲取項(xiàng)目中指定目錄的絕對(duì)路徑
| String path = ServletActionContext.getServletContext().getRealPath(“files”); |
7.?限制文件大小和文件類型
通過(guò)設(shè)置fileUpload攔截器的參數(shù)即可實(shí)現(xiàn)。
maximumSize:限制文件上傳的大小
allowedTypes:限制文件上傳的類型
<constant name="struts.multipart.maxSize" value="1024000"></constant>
| <interceptor-ref?name="fileUpload"> <!--配置允許上傳的文件類型--> <param?name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param> <!--配置允許上傳的文件大小單位字節(jié)--> <param?name="maximumSize">5242880</param> </interceptor-ref> |
8.?多文件上傳
只需要將action中的那三個(gè)屬性設(shè)置為數(shù)組即可
| private ?File[] ?xxx; private ?String[] ?xxxFileName; private ?String[] ?xxxContentType; |
四、?文件下載
1.?在action中必須存在一個(gè)InputStream類型的屬性,并且該屬性具有get方法
2.?在struts.xml的action的result節(jié)點(diǎn)中,type屬性值為stream
| <result name=”xxx”?type=”stream”> ??<param name=”contentType”></param> <param name=”inputName”>類型為inputstream的屬性名</param> <param name=”contentDisposition”> ??attachment;filename=”${fileName}” </param> </stream> |
?
五、??struts2中如何使用servlet api
1.?方式一(耦合)
| HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = ServletActionContext.getRequest.getSession(); HttpServletResponse response = ServletActionContext.getResponse(); ServletContext application = ServletActionContext.getServletContext(); |
2.?方式二(非耦合)
| Map<String, Object> request = (Map<String, Object>) ActionContext.getContext().get(“request”); Map<String, Object> session = ActionContext.getContext().getSession(); Map<String, Object> application = ActionContext.getContext().getApplication(); |
3.?方式三(非耦合)
讓Action類實(shí)現(xiàn)接口:RequestAware、SessionAware、ApplicationAware
六、?OGNL
1.?ognl:對(duì)象圖導(dǎo)航語(yǔ)言
2.?ognl和el相似,都是用來(lái)簡(jiǎn)化jsp中的java代碼
3.?ongl可以從2個(gè)地方獲取數(shù)據(jù)
??ValueStack:值棧。一般值棧中只會(huì)存放當(dāng)前Action類的對(duì)象。
??ActionContext:application、session、request、pageContext、parameters、attr。
注意:值棧中的數(shù)據(jù)可以直接通過(guò)名字獲取;但是ActionContext中的數(shù)據(jù)則需要添加前綴#
#application
#session
#request
#pageContext
#paramteters
#attr
其中attr表示依次從pageContext、request、session、application中獲取數(shù)據(jù)。
七、?struts2的標(biāo)簽
1.?jstl-?JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)
??核心標(biāo)簽
forEach、choose、when、otherWise、if
??格式化標(biāo)簽
formatDate、formatNumber
2.?struts2提供的標(biāo)簽
form、iterator、if、else、select、checkbox、checkboxlist、radio、fielderror
八、?數(shù)據(jù)校驗(yàn)
1.?客戶端驗(yàn)證
通過(guò)JavaScript腳本驗(yàn)證用戶數(shù)據(jù)是否合法
| <form> ??<input type=”submit”?value=”save Data”?οnclick=”return checkFormData();”?/> </form> <script type=”text/javascript”> function checkFormData(){ ??…?… ??return true|false; } </script> |
注意:客戶端驗(yàn)證是不安全的。用戶可以通過(guò)禁用js腳本讓js代碼失效;用戶也可以使用HttpRequest來(lái)模擬用戶請(qǐng)求來(lái)避免js驗(yàn)證。
2.?服務(wù)器端驗(yàn)證
服務(wù)器端的驗(yàn)證不能省。
如果沒(méi)有通過(guò)數(shù)據(jù)校驗(yàn),那么默認(rèn)返回input。
如果數(shù)據(jù)類型轉(zhuǎn)換失敗了,那么仍然會(huì)執(zhí)行數(shù)據(jù)校驗(yàn)。
如果沒(méi)有通過(guò)數(shù)據(jù)校驗(yàn),那么肯定不再執(zhí)行目標(biāo)action方法。
??重寫(xiě)父類ActionSupport的validate方法
該Action類中所有的action方法都會(huì)被驗(yàn)證。
??在Action類中添加驗(yàn)證方法validateXxx方法
該驗(yàn)證方法只對(duì)xxx方法起作用。
??在Action類同一個(gè)包中添加xml驗(yàn)證文件
只對(duì)特定的action方法起作用。最大的好處就是不用再編寫(xiě)java驗(yàn)證代碼。
驗(yàn)證文件的格式:ActionClassName-actionAlias-validation.xml。
struts2內(nèi)置的校驗(yàn)器:
l?required:必填校驗(yàn)器
l?requiredstring:必填字符串校驗(yàn)器(trim)
l?int:整數(shù)校驗(yàn)器
l?stringlength:字符串長(zhǎng)度校驗(yàn)器(minLength、maxLength)
l?regex:正則表達(dá)式校驗(yàn)器
l?date:日期校驗(yàn)器
l?double:雙精度校驗(yàn)器
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC ????????"-//Apache Struts//XWork Validator 1.0.2//EN" ????????"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators> <field name="user.userName"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用戶名不能為空</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">6</param> <param name="maxLength">10</param> <message>用戶長(zhǎng)度必須介于${minLength}-${maxLength}之間</message> </field-validator> </field> <field name="user.password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密碼不能為空</message> </field-validator> </field> <field name="user.phone"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>手機(jī)號(hào)不能為空</message> </field-validator> <field-validator type="regex"> <param name="regex">^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$</param> <message>手機(jī)號(hào)碼格式錯(cuò)誤</message> </field-validator> </field> </validators> |
九、?國(guó)際化
1.?國(guó)際化
同一套應(yīng)用程序,針對(duì)不同語(yǔ)系、不同地區(qū)的用戶顯示特定的語(yǔ)言文字。
zh-CN、zh-HK、zh-TW、en-US、
2.?本地化
針對(duì)不同語(yǔ)系、不同地區(qū)添加不同的資源文件
3.?struts2中如何實(shí)現(xiàn)國(guó)際化
首先,在struts.xml文件中配置常量
| <constant name="struts.custom.i18n.resources" value="message"></constant> |
其次,添加名稱為message的資源文件
message_zh_CN.properties
message_en.properties
message.properties
最后,在JSP頁(yè)面中使用s:text來(lái)顯示文字,在數(shù)據(jù)驗(yàn)證文件中使用<message key=”key”>
十、?ajax
1.?ajax的定義
異步的javascript和xml。
2.?ajax的作用
異步請(qǐng)求,局部刷新
3.?ajax基本概念
ajax不是一種單獨(dú)的技術(shù),它涉及javascript、css、XMLHttpRequest等。它的核心組件是XMLHttpRequest,但是不同的瀏覽器對(duì)XMLHttpRequest的支持不同,所以在創(chuàng)建它的對(duì)象時(shí),要分別對(duì)瀏覽器做出判斷。因此在實(shí)際開(kāi)發(fā)過(guò)程中,我們很少編寫(xiě)原生的ajax代碼,而是使用jQuery等框架提供的ajax函數(shù)來(lái)快速實(shí)現(xiàn)ajax效果。
4.?XMLHttpRequest
l?open(method, url, async)
method:get|post請(qǐng)求發(fā)送的類型
l?onreadystatechange
請(qǐng)求狀態(tài)改變事件,需要掛載function。
readyState==4 ???status==200 ??表示成功
l?send(data)
向服務(wù)器正式發(fā)送請(qǐng)求
5.?jquery提供的ajax函數(shù)
l?load(url)
加載指定url請(qǐng)求的結(jié)果
l?$.get(url, parameter, callback, type)
以get方式向服務(wù)器發(fā)送請(qǐng)求
url:請(qǐng)求的地址
parameter:請(qǐng)求的參數(shù),一般是json格式的對(duì)象{id:5, name:”zhangsan”}
callback:回調(diào)函數(shù)function(data){},其中data代表服務(wù)器返回的結(jié)果
type:text|json|html|xml
l?$.post(url, parameter, callback, type)
以post方式向服務(wù)器發(fā)送請(qǐng)求。參數(shù)同$.get一樣。
l?$.getJSON(url, parameter, callback)
以get方式向服務(wù)器發(fā)送請(qǐng)求。返回的結(jié)果為json格式。
l?$.ajax({})
最底層的ajax函數(shù)。上面的所有函數(shù)都可以通過(guò)本函數(shù)實(shí)現(xiàn)。
$.ajax({
url:url地址,
type: “get|post”,
data:{id:5, name:”zhangsan”},
dataType: “json”,
success: ?function(data){},
error: function(xhr){}
});
轉(zhuǎn)載于:https://www.cnblogs.com/ws1313123/p/6424721.html
總結(jié)
- 上一篇: 灵锡app怎么注销身份信息
- 下一篇: sql插入临时表数据的方法