Strus2概览
目錄
1.Struts2框架 2
1. Struts2與Servlet區(qū)別: 2
2.Struts2的使用步驟: 2
3.Struts2里用到的主要jar包: 3
4.Action類作用: 3
5.Struts2執(zhí)行的流程:【重點(diǎn)】 3
2.action類實(shí)現(xiàn)接收和處理頁面的信息 3
1. 將頁面的input標(biāo)簽的name值設(shè)為action類的屬性,然后生成該屬性的getter、setter方法,然后就可直接引用屬性得到頁面的值 3
2. 聲明一個(gè)JavaBean對(duì)象來當(dāng)做action類里的屬性來接收或處理頁面?zhèn)鱽淼男畔?#xff1a;對(duì)象.屬性名,與之前一樣,頁面的name則也需寫成:對(duì)象.屬性名 4
3. jsp頁面接收值 4
4.通配符 4
4.插多表 5
5. 查多表 5
6. 走完一個(gè)方法,如何走另一個(gè)方法【result的type屬性】 5
7.關(guān)于struts配置里不能快捷生成的問題及其他 6
8.struts全局頁面的配置及用法【配在package里,action外】 6
9.struts的訪問頁面的動(dòng)態(tài)結(jié)果 7
10.通過Struts可以訪問Sevlet API(主要是request,response,session,application) 7
11.xml配置文件里,action傳值到另一個(gè)action里 7
12.Struts里的標(biāo)簽及ognl表達(dá)式 7
12.ognl表達(dá)式 8
13.用Struts標(biāo)簽實(shí)現(xiàn) 地區(qū)-街道 的二級(jí)聯(lián)動(dòng)[實(shí)在不理解用之前學(xué)的] 8
14. 用Struts驗(yàn)證,了解 8
15.配置文件里的開發(fā)模式 8
16. struts與jquery的異步操作【重點(diǎn)】 8
17.Struts攔截器 10
18.用Struts實(shí)現(xiàn)文件的上傳與下載【重點(diǎn)】 11
1.文件上傳的步驟: 11
2.文件下載的實(shí)現(xiàn)步驟: 12
19.Struts國際化 13
1.Struts2框架
是基于MVC的web應(yīng)用框架的 ,作用于C層 (相當(dāng)于以前的Servlet層)
1. Struts2與Servlet區(qū)別:
1. Struts是由servlet發(fā)展而來的
2. servlet里接收值返回信息到頁面:用的是request 、session 。Struts2的action層通過屬性或?qū)ο蟮男问絹斫邮枕撁娴闹祷蚍祷匦畔⒌巾撁?在Struts2的Action層一般都是聲明一個(gè)JavaBean對(duì)象來當(dāng)做action里的屬性來接收或處理信息的)
3. Struts2也有自己的一套體系標(biāo)簽
4. 它是通過配置文件的形式來跳轉(zhuǎn)頁面的 (便于咱們維護(hù)管理)
5. 與Servlet API松耦合(降低了耦合性), 便于測試維護(hù)
2.Struts2的使用步驟:
a) 實(shí)現(xiàn)Action接口
b) 繼承ActionSupport類 【可以實(shí)現(xiàn)國際化化(各國都能看懂),數(shù)據(jù)校驗(yàn)等一些功能】
Sturts默認(rèn)方法是execute(); 返回值類型是String類型。
4.創(chuàng)建配置文件struts.xml (頁面進(jìn)到action類,是由它引進(jìn)去的 ;返回到哪個(gè)頁面也是由它決定的) struts.xml:起到橋梁作用,它位于src文件目錄下。在struts.xml中配置、及
package:是配置的空間
action:是決定走哪個(gè)action類,及其里面的哪個(gè)方法
result:決定走完action類里的某個(gè)方法后跳轉(zhuǎn)到哪去,可以是跳到另一個(gè)action,也可以是一個(gè)jsp頁面
默認(rèn)空間時(shí)jsp頁面的form表單的路徑寫法:post提交不會(huì)有頁面?zhèn)鞯闹形膩y碼問題
<form action="<%=basePath %>save" method="post">指定空間時(shí)jsp頁面的form表單的路徑寫法:
<form action="<%=basePath %>spaceName/save" method="post">3.Struts2里用到的主要jar包:
struts2-core-2.3.4.1.jar Struts2的核心包
xwork-core-2.3.1.jar xwork的核心包
commons-io-2.0.1.jar 支持IO流讀寫的操作包
ognl-3.0.1.jar 支持struts2里的ognl表達(dá)式
…………………
4.Action類作用:
處理請(qǐng)求 、實(shí)現(xiàn)業(yè)務(wù)邏輯 、 返回result中決定的是哪個(gè)視圖
5.Struts2執(zhí)行的流程:【重點(diǎn)】
jsp頁面(提交form表單,<a>標(biāo)簽,js提交)—>Struts2的過濾器(配在web.xml里)—>符合條件的話(提交到struts.xml里的配置文件)–>根據(jù)配置文件找到相應(yīng)的action類 –>進(jìn)入相應(yīng)的方法–>返回到struts.xml配置文件(根據(jù)方法的返回值來決定返回到哪個(gè)頁面)
2.action類實(shí)現(xiàn)接收和處理頁面的信息
1. 將頁面的input標(biāo)簽的name值設(shè)為action類的屬性,然后生成該屬性的getter、setter方法,然后就可直接引用屬性得到頁面的值
接收頁面的都是字符串形式,之所以能用double型的屬性接收數(shù)字,是因?yàn)橛袕?qiáng)制轉(zhuǎn)換;前提是要符合強(qiáng)轉(zhuǎn)規(guī)則。
public class LibratyAaction extends ActionSupport{private String bookName; //將jsp頁面里input標(biāo)簽里name值設(shè)為屬性@Override//execute()是默認(rèn)方法,返回值是字符串 public String execute() throws Exception {System.out.println(bookName);//打印接收到的頁面的值return "flager";//返回的字符串flager用來標(biāo)記在配置文件里走哪個(gè)頁面} //必須生成getter、setter方法,不然取不到值public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}}2. 聲明一個(gè)JavaBean對(duì)象來當(dāng)做action類里的屬性來接收或處理頁面?zhèn)鱽淼男畔?#xff1a;對(duì)象.屬性名,與之前一樣,頁面的name則也需寫成:對(duì)象.屬性名
對(duì)象名是起的屬性名
public class Movie2Action extends ActionSupport{MovieService service=new MovieService();//屬性必須生成get set方法,這樣才能存取值private Movie movie;//struts2通過JavaBean對(duì)象來接收頁面的值private Seat seat; //座位號(hào)的javaBean private List<Movie> listMovies;//用來存放查回來的數(shù)據(jù) private String msg; //存返回信消息//插入public String insertMovie(){System.out.println(movie); //可用movie.getMname()取值if(movie!=null&&movie.getMname()!=null&&!"".equals(movie.getMname())){service.insertMovie(movie,seat);return this.SUCCESS;//相當(dāng)于返回的字符串:success}else{msg="請(qǐng)完善所有信息!!";return this.ERROR; //相當(dāng)于返回的字符串:error}}//查詢所有public String queryAllMovie(){listMovies=service.queryAllMovie();return "queryMovie";} //生成的getter和setter方法省略…… }頁面?zhèn)髦禃r(shí),需將name屬性的值也設(shè)成:對(duì)象名.屬性名 的形式,如給影片名賦名:movie.mname
<tr><td>影片名:</td> <td><input name="movie.mname"/></td></tr>復(fù)選框的值:可以自動(dòng)接收拼接成逗號(hào)隔開的字符串,不需要我們自己拼接。我們只需要在action類里聲明一個(gè)屬性來接收拼接字符串,而在頁面的復(fù)選框的name值需要全部寫成那個(gè)屬性名
3. jsp頁面接收值
頁面接收值也可用EL表達(dá)式:下面的employeeList是action類里存員工信息的屬性名
<c:forEach var="e" items="${employeeList }" varStatus="status">${status.count }----${e.name }---${e.getSalary()}<br/> </c:forEach>可以用:e.name,也可用e.getName();
這種接收值有個(gè)好處是,不用值回寫,它是根據(jù)action類里的屬性自動(dòng)獲取的
4.通配符
1.通配符:將配置文件里的action標(biāo)簽的name的值寫成:名字+*的形式。代表頁面訪問路徑里的actionName里沒有顯示完的單詞(這里寫的是action類里的方法名),由于1代表取的第一個(gè)號(hào)的內(nèi)容,這樣就取到了傳來的方法名。* : 其實(shí)就代表了省略的內(nèi)容,method里的數(shù)字相當(dāng)于取省略的第幾個(gè)內(nèi)容
2.優(yōu)點(diǎn):訪問路徑需要走不同的方法時(shí),可以只配置一個(gè)action
3.例子
對(duì)應(yīng)頁面的訪問路徑:
<a href="<%=basePath%>addMovie/movieActionqueryMovie">查看影片信息</a>4.多個(gè)通配符:可用下劃線區(qū)分開,一般沒有多個(gè)*的。一個(gè)時(shí),最好也用“_”區(qū)分開
對(duì)應(yīng)配置:這里走的是第二個(gè)方法
對(duì)應(yīng)訪問路徑:走的就是insertMovie方法
<a href="<%=basePath%>addMovie/movieActionqueryMovie_insertMovie">查看影片信息</a>4.插多表
首先寫另一張的Hibernate持久類,以及相關(guān)的配置信息,用以操作數(shù)據(jù)庫
然后在action類里多寫一個(gè)屬性,用來存另一張表的信息;
再在dao層寫一個(gè)類,用來寫操作另一張表的方法
在action層多傳一個(gè)表對(duì)應(yīng)的javabean對(duì)象
再在service層調(diào)用dao層的兩個(gè)類的插入方法。當(dāng)然可以判一下空
MovieDao mdao=new MovieDao();SeatDao sdao=new SeatDao();public void insertMovie(Movie m,Seat se){mdao.insertMovie(m);sdao.insertSeat(se);}5. 查多表
多表聯(lián)查
6. 走完一個(gè)方法,如何走另一個(gè)方法【result的type屬性】
1.實(shí)現(xiàn)1:首先要將result里的type定義成redirectAction;然后將param的name屬性設(shè)為actionName,用來指定進(jìn)入到action里的哪個(gè)方法;再將另一個(gè)param標(biāo)簽的name屬性的值設(shè)為namespace,用來指定進(jìn)入到哪個(gè)空間
2.例子
3.實(shí)現(xiàn)2:將result的type屬性設(shè)置為”redirectAction”;result標(biāo)簽之間是要跳去的action名與方法名。這種方式適用于要跳轉(zhuǎn)去的另一個(gè)action與當(dāng)前的在同一個(gè)空間里,所以不用指定namespace
<action name="movie2Action_*" class="com.zrgk.action.Movie2Action" method="{1}"><result type="redirectAction">movie2Action_queryAllMovie</result> </action>注意的是:如果跳到的另一個(gè)action不是通配符的形式,則不需要指定方法
4.result的屬性:
1). redirectAction轉(zhuǎn)向跳入另一個(gè)action,可接收一個(gè)參數(shù)
2 ) . redirect重定向,跳入頁面。 不能帶參數(shù)到頁面
3).dispatcher轉(zhuǎn)發(fā)到另一頁面。可帶參數(shù)到頁面
4).stream表示處理流相關(guān)的信息(文件的上傳與下載)
5).chain:表示跳轉(zhuǎn)到另一個(gè)action和對(duì)應(yīng)的方法,可接收到前一個(gè)action里的所有值
7.關(guān)于struts配置里不能快捷生成的問題及其他
首先,在src目錄下放入 文件,
然后,將所有配置文件的頭部分(struts標(biāo)簽以上)改成:
不解決時(shí),當(dāng)有網(wǎng)時(shí),也可以快捷生成
1. Tomcat要放在英文目錄下,不然在Struts里配置幾個(gè)配置文件時(shí),運(yùn)行就會(huì)報(bào)錯(cuò)
2. form表單要post提交,不然提交中文會(huì)亂碼
3. struts有多個(gè)配置文件時(shí),先走的是總配置文件,然后走里面導(dǎo)入的配置文件;至于要走哪一個(gè),根據(jù)頁面的路徑里的空間名稱與action名字查找,所以,幾個(gè)分配置文件里不能有相同的空間名。也可這樣解釋,所有分配置的代碼導(dǎo)入到總配置里后,形成了一個(gè)配置文件,那么,空間名稱肯定不能重復(fù)啦。
4. 有時(shí)候,我們改了工程名,再次運(yùn)行時(shí)會(huì)出問題,是因?yàn)楦拿?#xff0c;tomcat里發(fā)布的還是原來的工程。我們可以鼠標(biāo)右擊改名后的工程——>屬性——>輸入Web搜索——>如果運(yùn)行不成功,可發(fā)現(xiàn)web Context-root里的工程名還是改名之前的名字,我們可以在這里改成我們要改的名字——>OK
8.struts全局頁面的配置及用法【配在package里,action外】
<!-- 配置全局轉(zhuǎn)向頁面 --> <global-results><!-- 里面可配置多個(gè)result --><result name="errorPage">/error/errorPage.jsp</result> </global-results><!-- struts處理異常信息 --> <!-- result的值errorPage是要跳轉(zhuǎn)到的全局頁面里的name的值,exception的值是異常類全稱 --> <global-exception-mappings><!-- 里面可配置多個(gè) --><exception-mapping result="errorPage" exception="java.lang.NullPointerException"></exception-mapping> </global-exception-mappings>exception=”javar.lang.OutOfMemoryError” 是內(nèi)存溢出錯(cuò)誤
9.struts的訪問頁面的動(dòng)態(tài)結(jié)果:最好不用,項(xiàng)目完成后不能修改跳轉(zhuǎn)路徑
優(yōu)點(diǎn):要訪問哪個(gè)頁面,直接在action類里給出地址,不用再去配置里做更改了
缺點(diǎn):在生成.class文件后,不能更改跳轉(zhuǎn)頁面了。最好還是跳轉(zhuǎn)路徑寫在配置文件里,因?yàn)榕渲梦募强筛牡摹?
1. 在action類里聲明一個(gè)存jsp頁面路徑的屬性jspPath,然后生成getter、setter方法,可寫個(gè)默認(rèn)頁面
private String jspPath=”/index.jsp”;
2. action類里的方法里給jspPath屬性賦值:jsp頁面路徑+jsp文件名全稱,包括后綴.jsp
jspPath=”/addMovie/saveMovie2.jsp”;
3.在配置里的result里獲取jspPath屬性:${jspPath}
10.通過Struts可以訪問Sevlet API(得到request,response,session,application)
在action里的方法里面可使用Servlet里的一些作用域,跟之前在serlvet里使用一樣:
//1.從容器里獲取request
HttpServletRequest request=ServletActionContext.getRequest();
//2.得到session
HttpSession session= ServletActionContext.getRequest().getSession();
//3.得到response
HttpServletResponse response=ServletActionContext.getResponse();
//4.得到application:作用域?yàn)檎麄€(gè)工程
Map<String,Object> application=ServletActionContext.getContext().getApplication();
存值:application.put(“myinfo”, “this is my information”);
在jsp頁面取值:也可有EL表達(dá)式:${key},有了值后,關(guān)閉瀏覽器再打開,還是有值,
11.xml配置文件里,action傳值到另一個(gè)action里
1.action跳action傳的寫法用?mag=值 這樣追加值再到另一個(gè)action里接收 (這個(gè)類擬于get提交的方式,應(yīng)避免傳中文)
<result type="redirectAction">movie2Action_queryAllMovie?msg=${msg}</result>該方式不能傳中文,只適合傳Id這種整形或是字母的,類似get提交,好像也不能傳多個(gè)值
2.一種更好的傳值方式
將result的type屬性的值改為:chain
能傳中文,能將上一個(gè)action里的所有屬性的值都傳給下一個(gè)action 。如果一個(gè)參數(shù)都不想傳,最好不用這種方式,因?yàn)檫@種方式是將所有的都要傳過去,這里做的準(zhǔn)備工作比較多,所以這時(shí)性能會(huì)有些不好。
12.Struts里的標(biāo)簽及ognl表達(dá)式
使用struts標(biāo)簽要先導(dǎo)包:<%@ taglib uri=”/struts-tags” prefix=”s”%>
使用ajax標(biāo)簽要導(dǎo)另一個(gè)包:<%@taglib uri=”/struts-dojo-tags” prefix=”sx”%>
詳細(xì)見:Struts2標(biāo)簽
1. 標(biāo)簽的分類:
1) 通用標(biāo)簽【默認(rèn)前綴s】
a) 數(shù)據(jù)標(biāo)簽
b) 控制標(biāo)簽
2) UI標(biāo)簽【默認(rèn)前綴s】
3) ajax標(biāo)簽【默認(rèn)前綴sx】
2. 數(shù)據(jù)標(biāo)簽:提供對(duì)各種數(shù)據(jù)的訪問
輸出相關(guān)屬性的值
在頁面上生成一個(gè)鏈接,單擊可以輸出容器的一些信息(可能包含錯(cuò)誤信息)
格式化輸出一個(gè)日期
生成一個(gè)url地址
生成html里的標(biāo)簽
為其它標(biāo)簽添加參數(shù)信息
把其它頁面包含到當(dāng)前頁面上
3.控制標(biāo)簽:用來完成對(duì)分支流程的控制 相當(dāng)java中的 if eseif else等
判斷的標(biāo)簽
循環(huán)標(biāo)簽
4.UI標(biāo)簽:用來生成UI界面元素表單這些信息
對(duì)應(yīng)的是html里表單標(biāo)簽
對(duì)應(yīng)的文本框的標(biāo)簽
提交的標(biāo)簽
下拉框的標(biāo)簽
生成一個(gè)二級(jí)聯(lián)動(dòng)的下拉框
5.ajax標(biāo)簽
<sx:datetimepicker>生成一個(gè)日歷控件12.ognl表達(dá)式
ognl表達(dá)式簡介
13.用Struts標(biāo)簽實(shí)現(xiàn) 地區(qū)-街道 的二級(jí)聯(lián)動(dòng)
參見代碼。
14. 用Struts驗(yàn)證,了解
好處:當(dāng)瀏覽器不支持js時(shí)可用它
1. 在action層里寫一個(gè)校驗(yàn)器文件:UserAction-registerAction-validation.xml
命名規(guī)則:action類名-action名字- validation.xml
2.所以該驗(yàn)證是要走后臺(tái)的,后臺(tái)通過后才走action
具體參見代碼
15.配置文件里的開發(fā)模式
<!-- 設(shè)置Struts簡單的主題模式 --> <constant name="struts.ui.theme" value="simple"/> <!-- 設(shè)置struts為開發(fā)模式:修改該struts.xml文件后,不用重啟服務(wù),也可生效 --> <constant name="struts.devMode" value="true" /><!-- true表示啟用開發(fā)模式 -->16. struts與jquery的異步操作【重點(diǎn)】
struts與jquery的異步操作步驟:
1.寫action里的異步方法
public class TestAction extends ActionSupport {private String username;//{"username":"salmon"} private String msg;// {"msg":"1"}public String execute(){if(username!=null&&username!=""){if("picluo".equals(username)){this.setMsg("重名了");}else{this.setMsg("可用");}}else{this.setMsg("用戶名不能為空");}return this.SUCCESS;}/*以流的形式實(shí)現(xiàn)異步public String execute() throws Exception{ HttpServletResponse response=ServletActionContext.getResponse();response.setContentType("text/html;charset=utf-8");PrintWriter out=response.getWriter();if("picluo".equals(username)){out.print("true");}else{out.print("false");}out.close();return null; }*///生成的getter、setter方法,此處省略…… }2.配置異步的返回信息
<!--引用的json一個(gè)文件--><package name="ajax" namespace="/" extends="json-default"><action name="test" class="com.salmon.action.TestAction"><result type="json">index.jsp</result><!--指定返回類型的json格式--></action> <!-- <action name="test" class="com.salmon.action.TestAction">以流的形式實(shí)現(xiàn)異步的配置</action> --></package>也可以不引有json文件,我們?cè)赼ction里直接return null;在方法里面將數(shù)據(jù)寫入流里:
如:PrintWriter out=response.getWriter();
out.print(sb.toString());//把字符串寫入流里面【重點(diǎn)】
3.在jsp頁面導(dǎo)入jquery的js文件
<script type="text/javascript" src="<%=basePath%>js/jquery-1.8.2.js"></script>或者是:
<script type="text/javascript" src="<%=basePath %>js/jquery-2.0.2.js"></script>4. 寫jsp頁面及js的異步信息【4個(gè)參數(shù)】
<script type="text/javascript" src="<%=basePath %>js/jquery-2.0.2.js"></script><script type="text/javascript">function checkName() { var usernameValue = document.getElementById("userName").value; var today = new Date(); $.ajax({ //后面跟一個(gè)時(shí)間的參數(shù)是為了防止有時(shí)候不提交的問題【沖破緩存,也可跟個(gè)隨機(jī)數(shù)】 url:"test?time="+today.getTime(),//test是配置里的action名字type:"post",//提交方式data:"username="+usernameValue,//username是action類里的屬性success:function(data){//回調(diào)函數(shù):返回的是json串,屬性都封裝在里面 var username = data.username;//得到actoin類里的屬性值 $("#ms").html(data.msg);//將提示結(jié)果放進(jìn)span標(biāo)簽里,span標(biāo)簽不是表文件框,所以沒有value,只能用html接收值 }});}function clears() { document.getElementById("userName").value="";$("#ms").html("莫亂輸哈");}</script></head> <body>用戶名:<input type="text" name="userName" id="userName" onblur="checkName();" value="請(qǐng)輸入用戶名" onfocus="clears();"><span id="ms" name="ms"></span></body>17.Struts攔截器
1.工作流程:
struts.xml——>攔截器1——>攔截2——>…攔截器n——>調(diào)用Action里的method——>再返回到攔截器n——>…攔截器2——>攔截器1——>struts.xml的
2.實(shí)現(xiàn)攔截器的步驟:
a.寫一個(gè)普通的類,通過實(shí)現(xiàn)Interceptor接口或繼承AbstractInterceptor抽象類,或者繼承MethodFilterInterceptor類來變成一個(gè)攔截器的類,即攔截器。MethodeFilterInterceptor類,在只攔截部分的action里的方法里用
b.在struts.xml中定義攔截器(將攔截器配置到struts容器里去)
c.在中引用配置的攔截器
3.Struts自帶大量的攔截器,它們定義在struts-default.xml文件中
自帶的攔截器實(shí)現(xiàn)了獲取更多的參數(shù)信息,為action注入session 、異常處理、 國際化,數(shù)據(jù)驗(yàn)證等
4.常用 的自帶攔截器的一些參數(shù)信息:
params: 負(fù)責(zé)將請(qǐng)求參數(shù)設(shè)置到action類中對(duì)應(yīng)的屬性中去
SevletConfig :將源于ServletAPI的各種對(duì)象注入到Action中去????不太理解????
validation: 調(diào)用驗(yàn)證框架進(jìn)行的數(shù)據(jù)校驗(yàn)
exception : 進(jìn)行異常處理 ,將異常映射為結(jié)果
i18n : 提供國際化支持
5.把一組攔截器定義在一起叫做 攔截器棧
struts2的默認(rèn)攔截器棧是defaultStack ,它里面會(huì)有多個(gè)攔截器。
18.用Struts實(shí)現(xiàn)文件的上傳與下載【重點(diǎn)】
1.文件上傳的步驟:
1) 在jsp頁面寫上傳文件的標(biāo)簽<input name="movieFile" type="file"/>
2) 給form標(biāo)簽加上傳輸文件的編碼方式:enctype=”multipart/form-data”
enctype默認(rèn)值認(rèn)為application/x-www-form-urlencoded,還有一個(gè)選項(xiàng)是:text/plain
3) 給action起一個(gè)存文件類型的屬性名, 如果要用到文件名則這樣起名:文件類型的屬性別名+FileName (區(qū)分大小寫問題) 如果想得到上傳的文件后綴則:文件類型的屬性別名+ContentType
4) 配置struts.xml文件
<action name="movie2Action_*" class="com.zrgk.action.Movie2Action" method="{1}"><!—引用上傳文件的攔截器 --><interceptor-ref name="fileUpload"> <!-- 設(shè)置上傳的文件大小問題 單位:字節(jié) --><param name="maximumSize">10000000</param> <!-- 也可以使用allowedTypes來控制上傳的文件類型,以下是允許傳的文件格式 --> <param name="allowedExtensions">jpg,jpeg,gif,png,txt,sql</param> </interceptor-ref><interceptor-ref name="defaultStack"/> </action>由于上付文件的攔截器是系統(tǒng)的,所以引用時(shí),里面的name值都是來源于系統(tǒng),所以都不能寫錯(cuò)了
2.文件下載的實(shí)現(xiàn)步驟:
1.寫一個(gè)下載的action類,里面寫一個(gè)存文件名的屬性并生成get、set方法,寫一個(gè)action默認(rèn)走的方法execute, 然后寫一個(gè)走完execute方法返回后在result里調(diào)的getInputStream()方法(把服務(wù)器的文件讀到輸入流里去)。getInputStream方法一定是struts.xml里的inputStream對(duì)應(yīng)的getter方法
public class DownloadAction extends ActionSupport{ private String fileName;//傳過來的要下載的文件名 /**讀取文件的流對(duì)象返回,Web服務(wù)器會(huì)讀取流對(duì)象中的數(shù)據(jù)并封裝到response中,然后發(fā)送到客戶端 */public InputStream getInputStream() throws FileNotFoundException, UnsupportedEncodingException{System.out.println("走完默認(rèn)方法返回后,在result里才調(diào)用的這個(gè)方法");InputStream is = null;//把URL路徑轉(zhuǎn)化為服務(wù)器的本地路徑String realPath = ServletActionContext.getServletContext().getRealPath("/upload/"+this.fileName);is = new FileInputStream(realPath); return is;//返回流}//默認(rèn)的方法public String execute(){System.out.println("因配置里沒有寫方法,所以走這個(gè)默認(rèn)方法:下載的業(yè)務(wù)方法");return this.SUCCESS;}//存文件名的getter方法,里面解決了中文亂碼問題public String getFileName() throws UnsupportedEncodingException {//解決中文文件名的亂碼問題return java.net.URLEncoder.encode(fileName, "UTF-8"); //該編碼方式在IE6下可能有該問題:文件名長度不能超過16個(gè)字符//return new String(this.fileName.getBytes("UTF-8"),"ISO-8859-1"); //該編碼方式可兼容IE6,但GBK不利于實(shí)現(xiàn)國際化}//存文件名的屬性的setter方法public void setFileName(String fileName) {this.fileName = fileName;} }2.在struts.xml配置下載文件的一些信息
將result的屬性改為stream
在result里參數(shù)調(diào)用getInputStream方法得到流???這兒沒有實(shí)現(xiàn),老報(bào)錯(cuò)?
指定瀏覽器彈出窗口,讓用戶選擇保存位置;并得到文件名
指定緩沖區(qū)的大小
3.在頁面用超鏈接調(diào)用下載的action(注意的是,要傳一個(gè)服務(wù)器上存在的文件名)
<form action="<%=basePath %>download/downloadAction" method="post"><input type="hidden" name="fileName" value="${movieFileFileName}"><input type="submit" value="點(diǎn)擊下載"> </form>注意的是,提交路徑或是用a標(biāo)簽的路徑里,都不能傳參,因?yàn)橹形臅?huì)亂碼。可用上面的隱藏域傳過去
19.Struts國際化
國際化就是使頁面根據(jù)不同的國家選擇不同的語言展示方式,實(shí)現(xiàn)步驟如下:
1.在src下加載國際化資源配置文件,一個(gè)國家對(duì)應(yīng)一個(gè):下面是美國與中國的兩種語言
配置文件名是的第一個(gè)單詞可變,后面的是根據(jù)不同國家,起的固定格式,
美式英語的配置里內(nèi)容為:
title_label = register
user_name = USERNAME
password = PASSWORD
age_lable = AGE
submit =SUBMIT
中文里的配置內(nèi)容為:
title_label = \u6CE8\u518C
user_name = \u7528\u6237\u540D
password = \u5BC6\u7801
age_lable = \u5E74\u9F84
submit = \u63D0\u4EA4
增加字段時(shí),先選擇properties窗口,然后點(diǎn)添加。添加后就會(huì)出現(xiàn)如上的格式
2.寫國際化的action類,雖沒內(nèi)容,但也要寫:
public class I18nAction extends ActionSupport { public String execute(){//這里什么也沒寫,但必須寫這個(gè)類和這個(gè)默認(rèn)方法return this.SUCCESS;} }3.配置struts.xml文件
<struts> <!-- 后綴修改: 代表訪問的action要加上.action的后綴 --> <constant name="struts.action.extension" value="action"/><!-- 開發(fā)模式:設(shè)為開發(fā)模式后,若配置發(fā)現(xiàn)改變不重新啟動(dòng)也可生效 --><constant name="struts.devMode" value="true" /><!-- 國際化資源文件: lanaguage表示引用的src下以這個(gè)單詞開頭的.properties文件--><constant name="struts.custom.i18n.resources" value="lanaguage"></constant><package name="test" namespace="/" extends="struts-default"><!-- i18n的action類的位置路徑,雖然里面什么也沒有,但必須寫 --><action name="i18n" class="com.zrgk.action.I18nAction" ><result name="success">index.jsp</result></action></package> </struts>4.在頁面引用國際化語言
<script type="text/javascript">function i18n(local){ location.href="i18n.action?request_locale="+local; //配置里設(shè)了修改后綴為要加.action所以這里要加 } </script></head> <body> <!--括號(hào)里傳的是指定的語言 --><a href="javascript:i18n('zh_CN')">中文</a><a href="javascript:i18n('en_US')">English</a><hr/><s:form action="i18n.action" method="post"><!-- key里的值是對(duì)應(yīng)的國際化資源文件里的key --><s:textfield key="user_name" name="username"></s:textfield><s:password key="password" name="userps"></s:password><s:textfield key="age_lable" name="age"></s:textfield><s:submit key="submit"></s:submit> </s:form></body>5.實(shí)現(xiàn)效果如下:
6.可通過瀏覽器的工具里的Internet選項(xiàng)進(jìn)行設(shè)置,可實(shí)現(xiàn)打開瀏覽器時(shí)默認(rèn)以哪種語言打開可添加其他語言
總結(jié)
- 上一篇: Hiernate 笔记
- 下一篇: 宜信(刘志波)技术培训