1.Struts 2提供了很是強大的類型轉換功能,提供了多種內置類型轉換器,也支持開發自定義類型轉換器
2.Struts 2框架使用OGNL做爲默認的表達式語言
==========================================OGNL=================================
OGNL:Object Graph Navigation Language
1.取代頁面中Java腳本,簡化數據訪問
2.和EL同樣是表達式語言,功能更強大
功能和特色:
1.能存取對象的屬性,也能調用對象的方法
2.能訪問靜態方法、靜態屬性
3.能訪問值棧及StackContext
4.能操做集合對象
5.支持賦值、運算操做、字段類型轉化
語法:
1.導入taglib指令:<%taglib uri="/struts-tags" prefix="s" %>
2.<s:property value="OGNL表達式"/> --> 在JSP中顯示OGNL表達式的值
做用:
1.表達式語言
將表單或者Struts2標籤與特定的Java數據庫綁定起來,用來將數據移入,移除框架
2.類型轉換
數據進入和流出框架,在頁面數據的字符串類型和Java數據類型之間進行轉換
值棧:ValueStack(可理解爲存儲數據的Map)
1.由Struts2框架建立的存儲區域,具備棧的特色
2.Action的實例會被存放到值棧中
【注意:值棧中內容能夠直接訪問,訪問非值棧對象須要添加#前綴】
OGNL訪問ValueStack
1.按照從上到下的順序
2.靠近棧頂的同名屬性會被讀取
訪問Bean的屬性
1.Bean的類型必須遵循JavaBean規範--必須具備無參構造
2.setter和getter方法符合JavaBean規範
訪問集合對象
1.能夠使用屬性名[index]的方式訪問 如:列表,數值
2.能夠使用屬性名[key]的方式訪問 如:Map對象
3.使用size或者length獲取集合長度
==========================================URL標籤=================================
使用Struts 2使用URL標籤能夠構建一個超連接
語法:
<s:url value="url" />
<s:param name="parname" value="parvalue" />
</s:url>
value屬性:表示指定生成URL的地址
<s:param />:表示須要傳遞的參數信息
name屬性:表示傳遞的參數名稱
value屬性:表示傳遞參數所具備的值
==========================================日期標籤=================================
使用Struts 2日期標籤能夠實現日期輸出的格式化顯示
<s:date format="format" nice="true|false" name="name" >
……
</s:date>
format:指定格式進行日期格式化
nice: 指定是否輸出指定日期和當前時間的時間差,默認false
name:當前須要格式化的日期
==========================================類型轉換=================================
基於HTTP協議的Web應用中:
1.客戶端請求的全部內容都以編碼方式傳輸到服務器端
2.服務器端的編程語言有豐富的數據類型
內置類型轉換器:自動對客戶端傳來的數據進行類型轉換(除Servlet手動轉換外)
內置類型轉換器 說 明
String 將int、long、double、boolean、String類型的數組或者java.util.Date類型轉換爲字符串
boolean/Boolean 在字符串和布爾值之間進行轉換
char/Character 在字符串和字符之間進行轉換
date 在字符串和日期類型之間進行轉換。具體輸入輸出格式與當前的Locale相關
數組和集合 在字符串數組和數組對象、集合對象間進行轉換
建立自定義類型轉換器
1.繼承StrutsTypeConverter抽象類(org.apache.struts2.util. StrutsTypeConverter)
2.應用於全局範圍的類型轉換器
在src目錄建立xwork-conversion.properties --> 轉換類全名=類型轉換器類全名
3.應用於特定類的類型轉換器
在特定類的相同目錄下建立一個名爲ClassName-conversion.properties的屬性文件 --> 特定類的屬性名=類型轉換器類全名
處理類型轉換錯誤
1)向用戶輸出類型轉換錯誤的前提條件
1.啓動StrutsConversionErrorInterceptor攔截器
攔截器已經包含在defaultStack攔截器棧中
2.Action要繼承ActionSupport類
實現ValidationAware接口
3.配置input結果映射
4.頁面使用Struts 2表單標籤或<s:fielderror>標籤
a.Struts 2表單標籤內嵌輸出錯誤信息功能
b.普通HTML標籤需使用<s:fielderror>標籤輸出轉換錯誤
2)修改全部類型的轉換錯誤信息
修改xwork.default.invalid.fieldvalue鍵的值
步驟:
1.在struts.xml中指定資源文件的基名 -- <constant name="struts.custom.i18n.resources" value="message"/>
2.在src目錄下建立資源文件並修改鍵值 -- xwork.default.invalid.fieldvalue=字段"{0}"的值無效
3)定製特定字段的類型轉換錯誤信息
在Action範圍的資源文件中添加I18N消息鍵invalid.fieldvalue.xxx
在Action包下建立RegisterAction.properties,指定鍵值 -- invalid.fieldvalue.birthday=生日轉換錯誤
範例:
1.實體類 -- Userjavascript
1 package com.Elastic.StrutsDemo4.ivy.entity; 2 public class User { 3 private String loginName; 4 private String loginPass; 5 6 public String getLoginName() { 7 return loginName; 8 } 9 public void setLoginName(String loginName) { 10 this.loginName = loginName; 11 } 12 public String getLoginPass() { 13 return loginPass; 14 } 15 public void setLoginPass(String loginPass) { 16 this.loginPass = loginPass; 17 } 18 }
2.test包 -- Testcss
1 package com.Elastic.StrutsDemo4.ivy.test; 2 3 import com.Elastic.StrutsDemo4.ivy.entity.User; 4 5 import ognl.Ognl; 6 import ognl.OgnlContext; 7 import ognl.OgnlException; 8 9 public class Test { 10 11 public static void main(String[] args) throws OgnlException { 12 User user = new User(); 13 //使用OGNL表達式賦值 14 Ognl.setValue("loginName", user, "張三"); 15 System.out.println(user.getLoginName()); 16 17 User user2 = new User(); 18 //建立上下文環境 19 OgnlContext ognlContext = new OgnlContext(); 20 ognlContext.put("user", user); 21 ognlContext.put("msg", user2); 22 //設置根對象 -- user 23 ognlContext.setRoot(user); 24 25 /*Ognl.setValue("user.loginPass", ognlContext, "abc123"); 26 System.out.println(user.getLoginPass()); 27 System.out.println(user2.getLoginName()); 28 Ognl.setValue("msg.loginName", ognlContext, "admin123"); 29 System.out.println(user2.getLoginName());*/ 30 31 //ActionContext中包含多個對象。若是使用OGNL訪問根對象,可直接書寫對象的屬性,而要使用其餘對象必須使用"#key"前綴來訪問 32 Ognl.setValue("loginName", ognlContext, ognlContext.getRoot(), "李四"); 33 System.out.println(user.getLoginName()); 34 35 Ognl.setValue("#msg.loginName", ognlContext, ognlContext.getRoot(), "王五"); 36 System.out.println(user2.getLoginName()); 37 } 38 }
3.action包
a.UserActionhtml
1 package com.Elastic.StrutsDemo4.ivy.action; 2 3 import java.util.Date; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 import com.Elastic.StrutsDemo4.ivy.entity.User; 8 import com.opensymphony.xwork2.ActionSupport; 9 public class UserAction extends ActionSupport { 10 11 private User user; 12 private String[] strs; 13 private Map<String, Object> map; 14 private Date regDate; 15 private Integer age; 16 17 public Map<String, Object> getMap() { 18 return map; 19 } 20 21 public void setMap(Map<String, Object> map) { 22 this.map = map; 23 } 24 25 public Date getRegDate() { 26 return regDate; 27 } 28 29 public void setRegDate(Date regDate) { 30 this.regDate = regDate; 31 } 32 33 public Integer getAge() { 34 return age; 35 } 36 37 public void setAge(Integer age) { 38 this.age = age; 39 } 40 41 public String[] getStrs() { 42 return strs; 43 } 44 45 public void setStrs(String[] strs) { 46 this.strs = strs; 47 } 48 49 public User getUser() { 50 return user; 51 } 52 53 public void setUser(User user) { 54 this.user = user; 55 } 56 57 public String regPage() { 58 user = new User(); 59 user.setLoginName("admin"); 60 strs = new String[3]; 61 strs[0] = "test"; 62 strs[1] = "abc"; 63 64 map = new HashMap<String, Object>(); 65 map.put("admin", "123456"); 66 67 return SUCCESS; 68 } 69 70 public String index(){ 71 return SUCCESS; 72 } 73 }
b.UserAction-conversion.propertiesjava
1 regDate=com.Elastic.StrutsDemo4.ivy.util.DateConvert
c.UserAction.propertiesjquery
1 invalid.fieldvalue.regDate=\u65E5\u671F\u683C\u5F0F\u65E0\u6548
4.util包
a.DateConvertweb
1 package com.Elastic.StrutsDemo4.ivy.util; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.Map; 6 7 import javax.management.RuntimeErrorException; 8 9 import org.apache.struts2.util.StrutsTypeConverter; 10 11 public class DateConvert extends StrutsTypeConverter{ 12 SimpleDateFormat[] formats = new SimpleDateFormat[]{ 13 new SimpleDateFormat("yyyy-MM-dd"), 14 new SimpleDateFormat("yyyy/MM/dd"), 15 new SimpleDateFormat("yyyy年MM月dd日"), 16 new SimpleDateFormat("yyyy.MM.dd") 17 }; 18 19 /** 20 * 將一個或多個字符串值轉換爲指定的類型 21 */ 22 @Override 23 public Object convertFromString(Map arg0, String[] values, Class arg2) { 24 Object value = null; 25 for (SimpleDateFormat format : formats) { 26 try { 27 value = format.parse(values[0]); 28 } catch (ParseException e) { 29 e.printStackTrace(); 30 } 31 } 32 if (values[0].length() != 0 && value == null) { 33 throw new RuntimeException(""); 34 } 35 return value; 36 } 37 38 /** 39 * 將指定對象轉化爲字符串 40 */ 41 @Override 42 public String convertToString(Map arg0, Object arg1) { 43 return null; 44 } 45 }
5.Struts配置文件 -- struts.xmlchrome
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd" > 3 <struts> 4 <constant name="struts.custom.i18n.resources" value="message"></constant> 5 <package name="default" namespace="/" extends="struts-default"> 6 7 <action name="regPage" class="com.Elastic.StrutsDemo4.ivy.action.UserAction" method="regPage"> 8 <result name="success">/reg.jsp</result> 9 <result name="input">/index.jsp</result> 10 </action> 11 12 <action name="index" class="com.Elastic.StrutsDemo4.ivy.action.UserAction" method="index"> 13 <result name="success">/reg.jsp</result> 14 <result name="input">/index.jsp</result> 15 </action> 16 </package> 17 </struts>
6.xwork-conversion.properties數據庫
1 java.util.Date=com.Elastic.StrutsDemo4.ivy.util.DateConvert
7.errormsg.propertiesapache
1 xwork.default.invalid.fieldvalue=\u5B57\u6BB5{0}\u683C\u5F0F\u65E0\u6548
8.web.xml編程
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>StrutsDemo4_ivy</display-name> 4 <welcome-file-list> 5 <welcome-file>regPage</welcome-file> 6 </welcome-file-list> 7 8 <filter> 9 <filter-name>Struts2</filter-name> 10 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 11 </filter> 12 <filter-mapping> 13 <filter-name>Struts2</filter-name> 14 <url-pattern>/*</url-pattern> 15 </filter-mapping> 16 </web-app>
9.jsp
a.reg.jsp
1 <%-- 引入JSP頁面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3 <%-- 引入JSTL標籤指令 --%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 6 7 <%-- 引入Struts標籤指令 --%> 8 <%@ taglib uri="/struts-tags" prefix="s" %> 9 10 <!DOCTYPE html> 11 <html language="zh-CN"> 12 <head> 13 <meta charset="utf-8"> 14 <!-- 設置瀏覽器渲染的引擎 --> 15 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 16 <!-- 設置支持移動設備 --> 17 <meta name="viewport" content="width=device-width, initial-scale=1"> 18 <title>網頁標題</title> 19 <!-- 引用bootstrap樣式 --> 20 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 21 </head> 22 <body> 23 <div class="container-fluid"> 24 <s:debug></s:debug> 25 <s:property value="user.loginName" /> 26 <s:property value="strs[1]" /> 27 <s:property value="map['admin']" /> 28 29 <s:property value="{123,44,56,78}[1]"/> 30 <s:property value="#{'name':'admin','pass':'123456' }['pass']"/> 31 32 <s:iterator value="strs" var="s"> 33 <h1><s:property value="s"/></h1> 34 </s:iterator> 35 36 <s:property value="#parameters['test']"/> 37 38 <!-- struts標籤顯示url地址 --> 39 <a href="<s:url action="regPage"> 40 <s:param name="name" value="admin"></s:param> 41 </s:url>">連接</a> 42 43 <!-- includeParams 包含前一次請求的參數 --> 44 <s:url value="reg.jsp" includeParams="all"> 45 <s:param name="admin">test</s:param> 46 </s:url> 47 <s:url value="login.jsp"> 48 <s:param name="loginName" value="ognl表達式">直接書寫值</s:param> 49 <s:param name="loginPass" value="ognl表達式">直接書寫值</s:param> 50 </s:url> 51 52 <!-- 顯示日期 --> 53 <s:property value="regDate"/> 54 <s:date name="regDate" format="yyyy-MM-dd hh:mm:ss"/> 55 <h1><s:date name="regDate" nice="true"/></h1> 56 <s:fielderror name="regDate"></s:fielderror> 57 58 <fmt:formatDate value="${regDate }" pattern="yyyy年MM月rr日hh時mm分ss秒"/> 59 60 <br><s:property value="age"/> 61 62 63 </div> 64 65 <!-- 引用外部JS文件 --> 66 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 67 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 68 69 </body> 70 </html>
b.index.jsp
1 <%--引入JSP頁面PAGE指令 --%> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 3 <%-- 引入JSTL標籤指令 --%> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5 <%@ taglib uri="/struts-tags" prefix="s" %> 6 <!DOCTYPE html> 7 <html language="zh-CN"> 8 <head> 9 <meta charset="utf-8"> 10 <!-- 設置瀏覽器渲染的引擎 --> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 <!-- 設置支持移動設備 --> 13 <meta name="viewport" content="width=device-width, initial-scale=1"> 14 <title>首頁</title> 15 <!-- 引入bootstrap的樣式 --> 16 <link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/bootstrap.min.css"> 17 </head> 18 <body> 19 <s:debug></s:debug> 20 <div class="container"> 21 <form action="index"> 22 <input name="regDate" type="text"> 23 <s:fielderror name="regDate"></s:fielderror> 24 <input type="submit" value="提交"> 25 </form> 26 </div> 27 28 <!-- 引入JS的樣式 --> 29 <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-2.2.4.js"></script> 30 <script type="text/javascript" src="<%=request.getContextPath() %>/js/bootstrap.min.js"></script> 31 32 </body> 33 </html>
服務器報錯:1.框架中若是沒用用Spring框架,那麼必定不要添加Spring的jar包。由於Spring是自動加載,若是沒有用Spring,它也會加載Spring的jar包。此時,若沒用Spring,那麼服務器會報錯2.當服務器報多個cause by 時,從最後一條cause by 開始找緣由