ad轉換器的種類及特點,Struts2之類型轉換器

 2023-11-19 阅读 20 评论 0

摘要:一、類型轉換器的應用場景 類型轉換是OGNL的一部分,默認的八種基本類型、String、Date會使用類型轉換,但是更復雜的類型轉換就需要我們自定義了(雖然這個東西一般根本用不到),OGNL可以應用在很多領域,但是在web領域,因為在

一、類型轉換器的應用場景

類型轉換是OGNL的一部分,默認的八種基本類型、String、Date會使用類型轉換,但是更復雜的類型轉換就需要我們自定義了(雖然這個東西一般根本用不到),OGNL可以應用在很多領域,但是在web領域,因為在客戶端到服務器端傳輸的只是字符串,所以這里就有一個需求收縮,我們的需求就變為完成String和復雜對象之間的互相轉換
在Struts2中的類型轉換則是在客戶端的請求參數往Action的成員屬性中設置的時候會被調用。

ad轉換器的種類及特點,二、如何使用?

1.理論部分

所有的類型轉換器都要實現TypeConverter接口,Struts2有需求收縮,只滿足 String<-->復雜對象 就可以了,所以它提供了一個抽象類叫做StrutsTypeConverter,我們自定義的類型轉換器只要繼承這個類然后實現它的兩個抽象接口就可以了。
我們寫完了這個類型轉換器的代碼,但是怎么才能讓Struts2知道去使用它呢?這里分為了兩種情況:

DA轉換器有哪幾部分組成、Action級別
在Action的同級別目錄下放置“ActionName-conversion.properties”,在此文件使用“propertyName=typeConverterClassName”的格式為屬性指定類型轉換器。
比如:
文件名:PointAction-conversion.properties
內容:point=struts_practice_005.PointTypeConverter

全局級別
在類路徑下放置“xwork-conversion.properties”,在此文件中使用“ObjectName=typeConverterClassName”的格式為對象指定類型轉換器。
比如:
文件名:xwork-conversion.properties
內容:struts_practice_006.Circle=struts_practice_006.CircleTypeConverter

?

轉換器有哪幾種。總結一下:
定義一個類型轉換器分為兩步:
1.繼承StrutsTypeConverter,實現它的兩個抽象方法。
2.寫properties文件告訴Struts2應該如何使用。

2.實踐部分

兩個例子(Action級別類型轉換器 & 全局級別類型轉換器):

轉換器原理?2.1 一個字符串到Point對象的轉換。(使用Action級別)
結構如下:

image

Point:

/*** 表示一個點* @author CC11001100* */
public class Point {private double x;private double y;public Point() {}public Point(double x, double y) {super();this.x = x;this.y = y;}@Overridepublic String toString() {//toString--> (x,y)return "("+x+","+y+")";}public double getX() {return x;}public void setX(double x) {this.x = x;}public double getY() {return y;}public void setY(double y) {this.y = y;}}
 
import com.opensymphony.xwork2.ActionSupport;public class PointAction extends ActionSupport {private Point point;@Overridepublic String execute() throws Exception {System.out.println(point);return super.execute();}public Point getPoint() {return point;}public void setPoint(Point point) {this.point = point;}}
 
import java.util.Map;import org.apache.struts2.util.StrutsTypeConverter;/*** 完成 Point對象<-->String 的互相轉換* * @author CC11001100* */
public class PointTypeConverter extends StrutsTypeConverter {/*** 這個方法完成從String-->Point的類型轉換*/@Overridepublic Object convertFromString(Map context, String[] values, Class toClass) {if (values.length > 0) {String s = values[0];String ss[] = s.split(",");if (ss.length != 2)return null;double x = Double.parseDouble(ss[0].substring(1, ss[0].length()));double y = Double.parseDouble(ss[1].substring(0, ss[1].length() - 1));return new Point(x, y);} else {return null;}}/*** 這個方法完成從Point-->String的轉換*/@Overridepublic String convertToString(Map context, Object o) {// 偷個懶,直接調用toString()if (o != null)return o.toString();return null;}}

da轉換器的精度?配置PointAction-conversion.properties(Action級別):

point=struts_practice_005.PointTypeConverter

struts.xml:

<struts><package name="default" namespace="/" extends="struts-default"><action name="pointAction" class="struts_practice_005.PointAction"><result >/result.jsp</result></action></package>
</struts>

前端頁面:

<form action="pointAction" method="post"><input type="text" name="point" /><input type="submit" value="提交" /></form>

java struts?結果當然是轉換成功啦,可以看到控制臺的打印結果:
image
前端頁面的顯示結果:
image
當客戶端發來的請求參數point=(1,2)發送到服務器的時候,它設置之前會看一下是否給這個對象設置了類型轉換器,如果設置了就交給類型轉換器就可以了,所以這里是調用了PointTypeConverter的convertFromString()方法。

2.2 一個字符串到Circle對象的轉換。(使用全局級別)

概覽:

image

Circle:

/*** 表示一個圓* * @author CC11001100* */
public class Circle {// 圓的半徑private double r;public Circle() {}public Circle(double r) {super();this.r = r;}@Overridepublic String toString() {// toString() --> "C:rxx"return "C:r" + r;}public double getR() {return r;}public void setR(double r) {this.r = r;}}

CircleAction:

import com.opensymphony.xwork2.ActionSupport;public class CircleAction extends ActionSupport {private Circle circle;@Overridepublic String execute() throws Exception {return SUCCESS;}public Circle getCircle() {return circle;}public void setCircle(Circle circle) {this.circle = circle;}}

CircleTypeConverter:

/*** 完成從 String<-->Circle 的互相轉換.* @author CC11001100**/
public class CircleTypeConverter extends StrutsTypeConverter {@Overridepublic Object convertFromString(Map context, String[] values, Class toClass) {if (values.length > 0) {String s = values[0];if(s.indexOf("C:r")==-1) return null;s=s.substring(3,s.length());double r=Double.parseDouble(s);return new Circle(r);} else {return null;}}@Overridepublic String convertToString(Map context, Object o) {if(o!=null) return o.toString();return null;}}

struts.xml

<struts><package name="default" namespace="/" extends="struts-default"><action name="circleAction" class="struts_practice_006.CircleAction"><result >/result.jsp</result></action></package>
</struts>

xwork-conversion.properties:

struts_practice_006.Circle=struts_practice_006.CircleTypeConverter

前端:

<form action="circleAction" method="post"><input type="text" name="circle" /> <input type="submit" value="提交" />
</form>

result.jsp:

<s:property value="circle" /><s:debug />

輸入:

image

輸出:

image

<s:property value="circle" /> 得到的值使用了類型轉換器,<s:debug />顯示的ValueStack中的值沒有使用類型轉換器,證明:
給類型轉換器的convertToString加點料。如下:

public class CircleTypeConverter extends StrutsTypeConverter {...@Overridepublic String convertToString(Map context, Object o) {if(o!=null) return o.toString()+"類型轉換器";return null;}}

如圖:

image

三、工作原理?

?

待更、

轉載于:https://www.cnblogs.com/cc11001100/p/5937199.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/180327.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息