Struts(四)

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 開始找緣由                                                           

相關文章
相關標籤/搜索