1.struts2訪問過程
a.客服端請求被web.xml中的filterdispatcher 攔截
b.filterdispatcher 讀取struts2中的struts.xml配置
c.請求經過interceptor攔截器,執行正式業務邏輯之前的操作
d.請求經過Action,執行正式業務邏輯,並返回指向頁面返回結果
e.顯示結果頁面
2.struts2開發流程
a.配置jar包
b.配置web.xml
c.配置struts.xml
d.配置ation
e.編寫代碼
f.運行驗證
3.jsp引用struts2標簽
<%@ taglib prefix="s" uri="/struts-tags" %>
4.配置web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsP
repareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
5.配置struts.xml
<struts>
<package name="example" extends="struts-default" >
<action name="login" class="com.insigma.action.UserLoginAction" method="execute">
<result name="success">/jsp/success.jsp</result>
<result name="fail">/jsp/fail.jsp</result>
</action>
</package>
<struts>
6.Action類的作用
Action
指struts配置中指明的Action條目,表示浏覽器的某類請求。比如,
關於用戶的管理。
Action類
實現業務邏輯,可配置為響應客戶端請求的JAVA類。可以擴展自
struts2預定義的類,也可以是POJO。
Action方法
Action類中的方法,被struts2調用,用來響應特定的客戶端請求。
該方法返回控制字符串,以確定要顯示的頁面
完成業務邏輯
是業務邏輯的入口,由此開始處理整個業務邏輯。
2. 提供數據傳遞中介
通過在action中定義屬性,及getter,setter方法,可以作為和頁面數
據交換的載體。
3. 幫助框架確定返回頁面
action方法,返回一個字符串,和struts.xml的配置匹配輸出頁面
7.Action類的三種編寫方式
1.
繼承ActionSupport
com.opensymphony.xwork2.ActionSupport。比較便利,
可以使用ActionSupport裡面已經實現的方法。
2.
普通Java類
實現業務邏輯,可配置為響應客戶端請求的JAVA類。可以擴
展自struts2預定義的類,也可以是POJO。
3.
實現Action接口
com.opensymphony.xwork2.Action。需要實現execute方
法。(ActionSupport也實現了此接口)
8.有2種方式可以訪問Servlet環境對象:ActionContext類和
ServletActionContext
ActionContext ctx = ActionContext.getContext();
Map<String, Object> request = (Map<String, Object>)ctx.get("request");
Map<String, Object> session = ctx.getSession();
Map<String, Object> application = ctx.getApplication();
HttpServletRequest req = ServletActionContext.getRequest();
HttpSession ses = req.getSession();
ServletContext app = req.getServletContext();
9.Action類的傳值
第一種,使用Action屬性傳遞數據。
Action類中有一個和頁面同名的屬性
接收客戶端的數據,需要提供該屬性setter方法
傳給頁面數據,需要提供該屬性getter方法
提供對象的getter,setter方法
對象丌需要建立,struts2通過反射自劢生成
在頁面的struts標簽中,使用“對象名.屬性名”引用
10.action中的result的轉發類型。
result name="success" type="dispatcher">/jsp/success.jsp</result>
常見的類型屬性有 dispatcher, redirect, redirectAction, stream
dispatcher
默認的屬性,相當於本站內的請求轉發
Redirect
相當於請求重定向:<result type="redirect">/success.jsp?user=${userName}</result>
redirectAction
相當於請求重定向,到本站的一個action:<result type="redirectAction">testAction</result>
stream
返回流給客戶端。
11.Action的查找次序。
定義:
命名空間:在struts.xml中的package節點裡配置的namespace屬性。
如果沒有配置namespace屬性,則認為是默認的命名空間。
交請求,struts2的查找次序:
按照就近原則的順序,分別到struts.xml中到namespace為:
“/path1/path2/path3”, “path1/path2”, “/path1”, “/”的package。
如果丌存在,繼續往上找;如果存在此package,則找對應的login.action, 如果找
丌到,則到默認的命名空間所在的package中去找。如果找丌到,則頁面顯示找丌
到對應的action。
簡單形容:以上四個加上默認的package,比作房間。就近開始找房間,找丌到繼
續往下找,一旦找到一個房間,後面丌再找其他房間。開始看房間裡面有沒有對應的
名字,如果沒有,找默認的,如果默認的也沒有,則提示找丌到
12.通配符訪問Action中的方法
通配符訪問Action中的方法。
一個Action中有多個業務方法,為了減少配置文件量,可以使用通配
符來配置:
<action name="user_*"
class="com.insigma.action.UserLoginAction" method="{1}">
如果使用 /abc/user_login 和 /abc/user_logout 分別會執行Action
中的login和logout方法
13.什麼是OGNL
OGNL,即Object Graph Navigation Language,對象導
航圖語言。是一個開源的,強大的表達式語言。用來讀取Java
對象的屬性。在Struts中對應的包是ognl-x.x.x.jar。
是Struts2的默認表達式語言,在Struts2中和標簽庫一起,用
來讀取執行業務後,從後台返回的數據。
整個OGNL對象,是一個map結構,包含2部分,根對象和非
根對象。
語法直觀易懂,比如對於一個Person類型的對象person,讀
取屬性的語法:
1.
在根對象中:person.name
2.
非根對象:#person.name
14.Struts2中OGNL結構
OGNL Map
application
session
root Value Stack
request
parameters
attr
Value Stack(值棧)為根對象,其他全部稱為ActionContext(上下文)
根對象可以直接訪問,上下文需要加“#”才能訪問
Struts2的Action中被植入值棧,也就是根對象中。
由於丌是根對象,所以訪問的時候需要加“#”
名稱 作用對象 OGNL 等效JSP腳本
parameters 當前http請求的頁面參數 #parameters.userName request.getParameter(“userName")
request 當前請求的HttpServletRequest對象 #request.userName request.getAttribute(“userName”)
session HttpSession對象 #session.userName session.getAttribute(“userName”)
application ServletContext #application.userName Application.getAttribute(“userName”)
attr 按parameters>request >session > application順序訪問 #attr.userName 依request,session,application順序查找,直到找到為止
15.OGNL結合標簽使用
16.Struts2標簽庫分類
控制標簽
if, else, elseif, iterator
數據標簽
property, action, url, a, set, date, debug
界面標簽-表單類
form, textfield, password, checkbox, checkboxlist , radio, select
界面標簽-非表單類
actionerror, actionmessage, fielderror
控制標簽 if else elseif
控制標簽 if else elseif 。用來判斷條件
<s:set name="type" value="2"></s:set>
<s:if test="#type == 1">
選擇的類型是1
</s:if>
<s:elseif test="#type == 2">
選擇的類型是2
</s:elseif>
<s:else>
選擇的類型是3
</s:else>
控制標簽 iterator
控制標簽 iterator。用來控制數據的迭代(遍歷)
<s:iterator value="#attr.myList" id="language" status="t st">
<font color="<s:if test="#st.even">red</s:if>"><s:property
value="language"/></font><br/>
</s:iterator>
常用屬性:
value:可選。被遍歷的列表。如果丌填則遍歷棧頂元素。
id:可選。指代遍歷循環中的其中一個對象。
status:可選。指代org.apache.struts2.views.jsp.IteratorStatus中的屬性。
boolean isEven()
boolean isOdd()
boolean isFirst()
boolean isLast()
數據標簽 property
數據標簽 property。用於輸出一個指定的數據值
<s:set name="pTest" value="'property test'"></s:set>
<s:property value="#pTest"/>
常用屬性:
value:可選。要輸出的值,默認顯示值棧棧頂元素。
default:可選。默認值,取丌到值的時候顯示。
escapeHtml:可選。是否原樣輸出帶有html標簽的值,默認為true,輸出的為帶標簽的值,
如value=‘abc<br/>’會原樣輸出。如果選擇false ,則輸出‘abc’並換行。
數據標簽 action
數據標簽 action。用於在頁面中調用一個action
<s:action name="login" namespace="" executeResult="true">
<s:param name="userName">abc</s:param>
<s:param name="password">123</s:param>
</s:action>
常用屬性:
name:必選。要執行的action。
namespace:可選。命名空間。
executeResult:可選。是否把返回結果嵌入到當前頁面
數據標簽 url
數據標簽 url 。用於在頁面中生成一個URL地址
<s:url action="login" namespace="/" id="loginUrl">
<s:param name="userName">abc</s:param>
<s:param name="password">123</s:param>
</s:url>
<s:a href="%{#loginUrl}">登錄</s:a>
最終生成的URL地址類似:
http://localhost:8199/MyStruts2/login.action?userName=abc&password=123
常用屬性:
action:可選。要執行的action。
namespace:可選。命名空間。
id:可選。被引用時候的名稱。
數據標簽 a
數據標簽 a。用於在頁面中生成一個URL地址
<s:a action="login" namespace="/" >
<s:param name="userName">abc</s:param>
<s:param name="password">123</s:param>
登錄
</s:a>
最終生成的URL地址類似:
http://localhost:8199/MyStruts2/login.action?userName=abc&password=123
常用屬性:
action:可選。要執行的action, 在value丌填的時候才使用。
namespace:可選。命名空間。
value:可選。目標請求,如果丌選使用action選頃。
onclick:可選。鼠標點擊事件執行的JS凼數。
數據標簽 set
數據標簽 set 。用於在頁面中生成一段數據,以備調用。
<s:set name="myList" value="{'Java', 'Android', 'C++', 'C#'}" ></s:set>
常用屬性:
name:可選。被引用的名字。
value:可選。數據,可以為List也可以為Map。
scope:可選。有效范圍。可以為application,session,request,page,action,默認為
action ,數據放入當前action的上下文中
數據標簽 date
數據標簽 date。用於格式化輸出一個日期數據。
request.setAttribute("now", new java.util.Date());
<s:date name="#attr.now" format="yyyy-MM-dd"/>
常用屬性:
name:必選。引用的日期屬性名字。
format:可選。要轉化的日期格式
數據標簽 debug
數據標簽 debug。用於在頁面上輸出當前頁面的所有數據,用於調試。
<s:debug></s:debug>
常用屬性:
無。
非常有用的標簽,建議在開發階段,碰到界面取丌到值,或者數據丌一致的情況打開使用。
界面標簽-表單類 form
界面標簽-表單類 form。用於創建一個HTML表單。
<s:form action="login" method="post">
<s:textfield label="用戶名" name="userName"></s:textfield>
<s:password label="密碼" name="password"></s:password>
<s:submit value="提交"></s:submit>
</s:form>
常用屬性:
action:可選。提交的目標action,默認為當前action。
namespace:可選。命名空間。默認為當前命名空間。
method:可選。提交方式get/post
界面標簽-表單類 textfield
界面標簽-表單類 textfield。用於創建一個輸入框。
<s:form action="login" method="post">
<s:textfield label="用戶名" name="userName"></s:textfield>
<s:password label="密碼" name="password"></s:password>
<s:submit value="提交"></s:submit>
</s:form>
常用屬性:
name:可選。action接收數據的名稱,即輸入框的name屬性。
label:可選。輸入框前面的顯示文本。
界面標簽-表單類 password
界面標簽-表單類 password。用於創建一個密碼輸入框。
<s:form action="login" method="post">
<s:textfield label="用戶名" name="userName"></s:textfield>
<s:password label="密碼" name="password"></s:password>
<s:submit value="提交"></s:submit>
</s:form>
常用屬性:
name:可選。action接收數據的名稱,即密碼輸入框的name屬性。
label:可選。密碼輸入框前面的顯示文本
界面標簽-表單類 checkbox
界面標簽-表單類 checkbox。用於創建一個復選框。
<s:checkbox name="checkbox" value="true" label="Java"
fieldValue="1"></s:checkbox>
<s:checkbox name="checkbox" value="false" label="C#"
fieldValue="2"></s:checkbox>
常用屬性:
name:可選。action接收數據的名稱,即name屬性。
value:可選。true/false。是否選中當前復選框。
label:可選。復選框的名稱。
fieldValue:可選。復選框的值,在form中提交後後台取到的數據
界面標簽-表單類 checkboxlist
界面標簽-表單類 checkboxlist。用於創建一組復選框,可以設置默認選
中項。
<s:checkboxlist list="students" name="stuCheck "
value="selected" listKey="id" listValue="name"></s:checkboxlist>
【後台代碼參考本PPT備注】
需要後台准備所有顯示的數據列表,和選中的數據列表。選中的數據列表需和listkey中的屬性
匹配。
常用屬性:
name:可選。action接收數據的名稱,即name屬性。
value:可選。屬性值列表。對應屬性值的復選框被選中。
list:必選。需要顯示的所有數據列表。
listkey:可選。復選框中的值。如果在value列表裡,則選中
listvalue:可選。復選框中的顯示名稱。
界面標簽-表單類 radio
界面標簽-表單類 radio。用於創建一組單選框,可以設置默認選中項。用
法和checkboxlist類似。
<s:radio list="students" name="stuRadio" listKey="id"
listValue="name" value="2"></s:radio>
【後台代碼參考checkboxlist】
需要後台准備所有顯示的數據列表,和選中的數據列表。選中的數據列表需和listkey中的屬性
匹配。
常用屬性:
name:可選。action接收數據的名稱,即name屬性。
value:可選。屬性值。對應屬性值的單選框被選中。
list:必選。需要顯示的所有數據列表。
listkey:可選。單選框中的值。如果設置,則選中。
listvalue:可選。單選框中的顯示名稱
界面標簽-表單類 select
界面標簽-表單類 select。用於創建一個下拉框,可以設置默認選中項。用
法和checkboxlist,radio類似。
<s:select list="students" name="stuSelect" listKey="id"
listValue="name" value="2"></s:select>
【後台代碼參考checkboxlist】
需要後台准備所有顯示的數據列表,和選中的數據列表。選中的數據列表需和listkey中的屬性
匹配。
常用屬性:
name:可選。action接收數據的名稱,即name屬性。
value:可選。屬性值。對應屬性值的下拉框選頃被選中。
list:必選。需要顯示的所有選頃列表。
listkey:可選。下拉框中的值。如果設置,則選中。
listvalue:可選。下拉框中選頃的顯示名稱。
界面標簽-表單類 token
界面標簽-表單類 token。用於防止數據被重復提交,
界面標簽-非表單類 actionerror
actionmessage
界面標簽-非表單類 actionerror, actionmessage。用於顯示action
級別的錯誤和普通的通知消息。
if("abc".equals(userName) && "123".equals(password)){
addActionMessage("登錄成功");
return "success";
}else{
addActionError("登錄失敗");
return "fail";
}
<s:actionerror/>
<s:actionmessage/>
界面標簽-非表單類 fielderror
界面標簽-非表單類 fielderror。用於顯示表單提交的數據錯誤問題,可顯
示所有消息,也可以指定某幾個消息。
<s:form action="login" method="post">
<s:fielderror>
<s:param>userNameNull</s:param>
</s:fielderror>
<s:textfield label="用戶名"
name="userName"></s:textfield>
<s:password label="密碼"
name="password"></s:password>
<s:submit value="提交"></s:submit>
</s:form >
常用屬性:
param:可選。指定的輸出消息
17.Struts2文件上傳
1. 准備好Struts2所需要的jar包 commons-fileupload-1.2.2.jar,
commons-o io-2.0.1.jar.(在最少需要的包裡面已經包含)
. 2. form表單中,enctype屬性設置為multipart/form-data
<s:form action="upload" method="post"
enctype="multipart/form-data">
<s:file label="請輸入文件名" name="uploadFile"></s:file>
<s:submit value="上傳"></s:submit>
</s:form>
3. Action中創建以下屬性:
private File uploadFile;
private String uploadFileFileName;
private String uploadFileContentType;
4. Action方法,把文件拷貝到目標路徑:
public String upload(){
//把保存在臨時文件夾下的文件,拷貝到目標路徑
String destPath =
ServletActionContext.getServletContext().getRealPath("/upload");
File destFile = new File(destPath);
destFile.mkdirs();
try {
FileUtils.copyFile(uploadFile, new File(destPath +
File.separator + uploadFileFileName));
} catch (IOException e) {
e.printStackTrace();
}
return "success";
文件大小限制
Struts2默認可以上傳的文件大小為2M,超過這個大小的文件, 需要在
struts.xml中做單獨配置:
<constant name="struts.multipart.maxSize" value="10000000" />
Struts2多文件上傳
關鍵步驟:
. 1. 准備好Struts2所需要的jar包 commons-fileupload-1.2.2.jar, commons-
o io-2.0.1.jar.(在最少需要的包裡面已經包含)
. 2. form表單中,enctype屬性設置為multipart/form-data
<s:form action="uploadFiles" method="post"
enctype="multipart/form-data">
<s:file label="請輸入文件名" name="uploadFiles"></s:file>
<s:file label="請輸入文件名" name="uploadFiles"></s:file>
<s:submit value="上傳"></s:submit>
</s:form>
3. Action中創建以下屬性:
private File[] uploadFiles;
private String[] uploadFilesFileName;
private String[] uploadFilesContentType;
4.public String uploads(){
//拷貝臨時文件到目標路徑當中
String destPath = ServletActionContext.getServletContext().getRealPath("/upload");
try {
for (int i = 0; i < uploadFiles.length; i++) {
FileUtils.copyFile(uploadFiles[i], new File(destPath + File.separator + uploadFilesFileName[i]));
}
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
18.Struts2攔截器
Struts2中的核心功能都由攔截器來實現,如:避免表單重復提交,國際化,
對象組裝,類型轉化,文件上傳,校驗等,都是由攔截器來完成的。
Struts2設計了很多的攔截器,而丌放在Action基類戒者其他地方的好處:
解耦。因為可以使用攔截器來組裝丌同的需求,使各功能模塊變得可插拔。
Struts2已經實現了的攔截器配置放在: struts2-core-2.x.x.jar中的struts-default.xml中
Struts2攔截器原理
工作原理:一個請求過來後,丌是
直接去執行action中的業務邏輯。
而是先要經過已經定義好的攔截器
棧,依次執行各個攔截器(比如攔
截器1,2,3)裡的業務,最後才到
action裡面執行。執行完action
的業務後,再依次執行攔截器裡的
業務(按照攔截器3,2,1的順序),
最後浏覽器才顯示最終的頁面。
任何一個攔截器的加入,都丌會影
響原有的業務邏輯的內部實現。而
是在原有的業務執行前後加了一段
操作。
我們編寫的最簡單的一個業務,實
際上已經經過了若干個攔截器的攔截
19.三種方式實現自定義攔截器
實現Interceptor接口
繼承AbstractInterceptor類,此類也實現了Interceptor接口。
繼承MethodFilterInterceptor,可以實現對方法的攔截(只有在執行Action某方法時攔截器才
做攔截)。
實現自定義攔截器的必須步驟:
編寫攔截器類(繼承或者實現以上3個中的一個)
重寫intercept方法
public class TimeCalInterceptor implements Interceptor {…
@Override
public String intercept(ActionInvocation ai) throws Exception{
long start = System.currentTimeMillis();
String result = ai.invoke(); //執行action的業務
long end = System.currentTimeMillis();
System.out.println("action:" + ai.getAction() + "執行的時間是:" + (end -
start) + " 毫秒");
return result;
配置struts.xml文件
<package name="example" extends="struts-default">
<interceptors>
<interceptor name="timeCal"
class="com.insigma.interceptor.TimeCalInterceptor"></interceptor>
</interceptors>
<action name="login" class="com.insigma.action.UserLoginAction"
method="execute">
<interceptor-ref name="timeCal"></interceptor-ref>
<result name="input">/jsp/login.jsp</result>
<result name="fail">/jsp/fail.jsp</result>
</action>
</package>
20.作用於方法的攔截器
struts.xml
<interceptors>
<interceptor name="methodFilter"
class="com.insigma.interceptor.MyMethodFilterInterceptor"></interce
ptor>
</interceptors>
<action name=“login" class="com.insigma.action.UserLoginAction"
method="execute">
<interceptor-ref name="methodFilter">
<param name="includeMethods">test1</param>
<param name="excludeMethods">test2</param>
</interceptor-ref>
<result name="input">/jsp/login.jsp</result>
<result name="success" >/jsp/success.jsp</result>
<result name="fail">/jsp/fail.jsp</result>
</action>
說明:當param參數一個都丌定義的時候,所有方法都被攔截;當只定義
includeMethods時, includeMethods內的方法被攔截;當只定義
excludeMethods時,除了excludeMethods的方法外,其余都會被攔截;兩者都
定義時,都生效,有沖突時,以include為准
21.默認攔截器
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<interceptors>
<interceptor name="timeCal"
class="com.insigma.interceptor.TimeCalInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="timeCal"></interceptor-ref>
</interceptor-stack>
</interceptors>
22.手工代碼方式實現指定方法校驗..
public void validateLogin(){
if(userName == null || "".equals(userName)){
this.addFieldError("userName", "請輸入用戶名");
}
if(password == null || "".equals(password)){
this.addFieldError("password", "請輸入密碼");
}
}
public String login(){ … return “success”;}
<action name="login" class="com.insigma.action.UserLoginAction"
method=“login">
基於XML配置文件方式的校驗
Action也要繼承自ActionSupport
編寫校驗配置文件xxx-validation.xml,xxx為Action類名,如
UserLoginAction。放在Action同級目錄下。
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="userName">
<field-validator type="requiredstring">
<message>請輸入用戶名</message>
</field-validator>
</field>
</validators>
field指的是要校驗的頁面屬性,field-validator指的是對應的校驗器,
requiredstring指的是系統已經實現的校驗器,類似的校驗器在xwork-core-
2.x.x.jar裡面的com.opensymphony.xwork2.validator.validators包中的
default.xml中有定義
以上是對於execute方法的配置,如果要配置其他方法,只需要把配置文件
的名字改成xxx-yyy-validation.xml,其中yyy是Action中對應的業務方法名。
如login。最終文件名為:UserLoginAction-login-validation.xml
23.處理重復提交
<s:token></s:token>
<result name="invalid.token">login.jsp</result>
<interceptor-ref name="token"><intercepto顯示r-ref>
24.Struts2圖片驗證碼使用
Action:生成圖片,並在session中保存圖片內容。生成的圖片,需要以流的方式傳出來:
private ByteArrayInputStream inputStream;
public ByteArrayInputStream getInputStream() {
return inputStream;
}
struts.xml:配置一個action用來獲取圖片流:
<action name="authImg" class="com.insigma.action.ValidateImageAction">
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action>
jsp:使用img控件,獲取圖片:
<s:form theme="simple” action=“register”>
驗證碼:<s:textfield name="validateImg"></s:textfield>
<img src="<%=basePath %>authImg.action"/>
</s:form>
public class UserRegisterAction extends ActionSupport{
private String validateImg;
public void setValidateImg(String validateImg) {
this.validateImg = validateImg;
}
public void validate(){
String valideStr = (String)ActionContext.getContext().getSession().get("session4ValidateImg");
if(valideStr == null || !valideStr.equals(validateImg)){
this.addFieldError("validateImg", "驗證碼錯誤");
}
}
public String execute(){
return "success";
}
}
public class ValidateImgAction extends ActionSupport{
private ByteArrayInputStream inputStream;
public ByteArrayInputStream getInputStream() {
return inputStream;
}
public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}
public String execute(){
//把inputStream賦值上去
// 在內存中創建圖象
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image.getGraphics();
// 生成隨機類
Random random = new Random();
// 設定背景色
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
// 設定字體
g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
g.setColor(getRandColor(160, 200));
for (int i = 0; i < 155; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 取隨機產生的認證碼(4位數字)
String sRand = "";
for (int i = 0; i < 4; i++) {
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
// 將認證碼顯示到圖象中
g.setColor(new Color(20 + random.nextInt(110),
20 + random.nextInt(110), 20 + random
.nextInt(110)));
// 調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
}
// 將認證碼存入SESSION
ActionContext.getContext().getSession().put("session4ValidateImg", sRand);
// 圖象生效
g.dispose();
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageOutputStream imageOut;
try {
imageOut = ImageIO.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageOut);
imageOut.close();
} catch (IOException e) {
e.printStackTrace();
}
ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
this.setInputStream(input);
return SUCCESS;
}
/*
* 給定范圍獲得隨機顏色
*/
private Color getRandColor(int fc, int bc) {
Random random = new Random();
if (fc > 255){
fc = 255;
}
if (bc > 255){
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
}
25.Struts2中使用JSON傳輸數據
引入struts2-json-plugin-2.3.14.jar包。
struts.xml中配置:
<package name="test" extends="json-default">
<action name="testJson" class="com.insigma.action.TestStruts2Json">
<result type="json" name="success"></result>
</action>
</package>
Action中:
private String userName;
private ArrayList<Account> accountList;
增加:[getter setter方法]
public String execute(){
userName = "用戶名";
accountList = new ArrayList<Account>();
for (int i = 0; i < 5; i++) {
Account account = new Account();
account.setId(i);
account.setName("名字" + i);
accountList.add(account);
}
return "success";
Account.java:
public class Account {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
通過訪問:/testJson.action,頁面上即顯示後台自動生成的JSON數據。