1. ความเป็นสากล
เตรียมไฟล์ทรัพยากร รูปแบบการตั้งชื่อไฟล์ทรัพยากรมีดังนี้:
baseName_ language_country.properties
baseName_ language.properties
baseName.properties
ในบรรดาชื่อเหล่านั้น baseName คือชื่อฐานของไฟล์ทรัพยากร เราสามารถปรับแต่งได้ แต่ภาษาและประเทศจะต้องเป็นภาษาและประเทศที่ Java รองรับ ชอบ:
จีนแผ่นดินใหญ่: baseName_zh_CN.properties
สหรัฐอเมริกา: baseName_en_US.properties
ตอนนี้เพิ่มไฟล์ทรัพยากรสองไฟล์ลงในแอปพลิเคชัน:
อันแรกเก็บภาษาจีน: csdn_zh_CN.properties
เนื้อหาคือ: ยินดีต้อนรับ=ยินดีต้อนรับสู่ Chuanzhi Podcast ศูนย์รับฝากแห่งที่สองคือภาษาอังกฤษ (สหรัฐอเมริกา): csdn_en_US.properties
เนื้อหาคือ: ยินดีต้อนรับ=ยินดีต้อนรับสู่ csdn
สำหรับไฟล์คุณสมบัติภาษาจีน หลังจากที่เราเขียนแล้ว เราควรใช้คำสั่ง Native2ascii ที่ได้รับจาก jdk เพื่อแปลงไฟล์เป็นไฟล์ที่เข้ารหัสแบบ Unicode คำสั่งถูกใช้ดังนี้:
file.properties แหล่งที่มาของ Native2ascii เป้าหมาย file.properties
2. กำหนดค่าทรัพยากรทั่วโลกและส่งออกข้อมูลระหว่างประเทศ
หลังจากเตรียมไฟล์รีซอร์ส เราสามารถกำหนดไฟล์รีซอร์สเป็นไฟล์รีซอร์สโกลบอลผ่านค่าคงที่ struts.custom.i18n.resources ใน struts.xml ดังต่อไปนี้:
<ชื่อคงที่="struts.custom.i18n.resources" value="csdn" />
csdn คือชื่อฐานของไฟล์ทรัพยากร
หลังจากนั้นเราสามารถเข้าถึงข้อมูลความเป็นสากลได้ที่หน้าหรือในการดำเนินการ:
ใช้แท็ก <s:text name=""/> ในหน้า JSP เพื่อส่งออกข้อมูลความเป็นสากล:
<s:text name="user"/> ชื่อคือคีย์ในไฟล์ทรัพยากร
ในคลาส Action คุณสามารถสืบทอด ActionSupport และใช้เมธอด getText() เพื่อรับข้อมูลความเป็นสากล พารามิเตอร์แรกของเมธอดนี้ใช้เพื่อระบุคีย์ในไฟล์ทรัพยากร
ในแท็กแบบฟอร์ม ให้ระบุคีย์ในไฟล์ทรัพยากรผ่านแอตทริบิวต์คีย์ เช่น:
<s:textfield name="realname" key="user"/>
3. การทำให้เป็นสากล - ส่งออกข้อมูลการทำให้เป็นสากลพร้อมตัวยึดตำแหน่ง
เนื้อหาของไฟล์ทรัพยากรมีดังนี้:
ยินดีต้อนรับ= {0} ยินดีต้อนรับสู่ Chuanzhi Podcast {1}
ส่งออกข้อมูลความเป็นสากลพร้อมตัวยึดตำแหน่งในหน้า jsp
<s:ชื่อข้อความ="ยินดีต้อนรับ">
<s:param><s:property value="realname"/></s:param>
<s:param>การเรียนรู้</s:param>
</s:ข้อความ>
หากต้องการรับข้อมูลความเป็นสากลด้วยตัวยึดตำแหน่งในคลาส Action คุณสามารถใช้เมธอด getText(String key, String[] args) หรือ getText(String aTextName, List args)
4. ความเป็นสากล - ขอบเขตไฟล์ทรัพยากร
ในแอปพลิเคชันขนาดใหญ่ แอปพลิเคชันทั้งหมดมีเนื้อหาจำนวนมากที่ต้องทำให้เป็นสากล หากเราวางเนื้อหาที่เป็นสากลทั้งหมดไว้ในไฟล์แอตทริบิวต์ทรัพยากรส่วนกลาง เห็นได้ชัดว่าจะทำให้ไฟล์ทรัพยากรมีขนาดใหญ่เกินไป ป่อง และไม่สะดวก เพื่อรักษาไว้ บางครั้งเราสามารถใช้ขอบเขตแพ็คเกจเพื่อจัดระเบียบไฟล์สากลสำหรับโมดูลต่างๆ
มีวิธีดังนี้:
วางไฟล์ทรัพยากร package_ language_country.properties ไว้ใต้แพ็คเกจ java แพ็คเกจเป็นวิธีการเขียนแบบตายตัว การดำเนินการภายใต้แพ็คเกจนี้และแพ็คเกจย่อยสามารถเข้าถึงทรัพยากรนี้ได้ เมื่อค้นหาข้อความด้วยคีย์ที่ระบุ ระบบจะค้นหาจากไฟล์ทรัพยากรแพ็กเกจก่อน เมื่อไม่พบคีย์ที่เกี่ยวข้อง ระบบจะค้นหาจากไฟล์ทรัพยากรที่ระบุโดยค่าคงที่ struts.custom.i18n.resources
5. ไฟล์ทรัพยากรขอบเขตสากล - การดำเนินการ
นอกจากนี้เรายังสามารถระบุไฟล์ทรัพยากรแยกต่างหากสำหรับการดำเนินการดังต่อไปนี้:
ในพาธซึ่งมีคลาส Action อยู่ ให้วางไฟล์รีซอร์ส ActionClassName_language_country.properties ActionClassName เป็นชื่อธรรมดาของคลาสแอ็คชัน
เมื่อค้นหาข้อความที่มีคีย์ที่ระบุ ขั้นแรกระบบจะค้นหาจากไฟล์รีซอร์ส ActionClassName_language_country.properties หากไม่พบคีย์ที่เกี่ยวข้อง ระบบจะค้นหาไฟล์รีซอร์สด้วยแพ็กเกจชื่อพื้นฐานตามแพ็กเกจปัจจุบันจนกว่าจะพบ แพ็คเกจระดับบนสุด หากไม่พบคีย์ที่เกี่ยวข้อง ในที่สุดคีย์จะถูกค้นหาจากไฟล์รีซอร์สที่ระบุโดยค่าคงที่ struts.custom.i18n.resources
6. ความเป็นสากล - การเข้าถึงไฟล์ทรัพยากรใน JSP โดยตรง
Struts2 ให้แท็ก <s:i18n> แก่เรา การใช้แท็ก <s:i18n> เราสามารถรับข้อมูลสากลได้โดยตรงจากไฟล์ทรัพยากรบน classpath โดยไม่ต้องกำหนดค่าใด ๆ :
<s:i18n name="csdn">
<s:ชื่อข้อความ="ยินดีต้อนรับ"/>
</s:i18n>
csdn เป็นชื่อฐานของไฟล์ทรัพยากรในคลาสพาธ
หากไฟล์ทรัพยากรที่คุณต้องการเข้าถึงอยู่ภายใต้แพ็คเกจที่กำหนดบน classpath คุณสามารถเข้าถึงได้ดังนี้:
<s:i18n name="cn/csdn/action/package">
<s:ชื่อข้อความ="ยินดีต้อนรับ">
<s:param>เสี่ยว จาง</s:param>
</s:ข้อความ>
</s:i18n>
ข้างต้นเข้าถึงไฟล์ทรัพยากรที่มีชื่อโดยทั่วไปว่าแพ็คเกจภายใต้แพ็คเกจ cn.csdn.action
7. ภาษานิพจน์ OGNL
OGNL เป็นตัวย่อของ Object Graphic Navigation Language ซึ่งเป็นโครงการโอเพ่นซอร์ส กรอบงาน Struts 2 ใช้ OGNL เป็นภาษานิพจน์เริ่มต้น
เมื่อเปรียบเทียบกับนิพจน์ EL จะมีฟังก์ชันบางอย่างที่เราต้องการตามปกติ เช่น:
รองรับการเรียกเมธอดอ็อบเจ็กต์ เช่น xxx.sayHello();
รองรับการเรียกเมธอดคลาสและการเข้าถึงค่า รูปแบบนิพจน์คือ @[ชื่อคลาสแบบเต็ม (รวมถึงเส้นทางแพ็คเกจ)]@[ชื่อเมธอด | ชื่อค่า] เช่น: @java.lang.String@format('foo %s' , 'บาร์') หรือ @cn.csdn.Constant@APP_NAME;
จัดการวัตถุคอลเลกชัน
Ognl มีแนวคิดเกี่ยวกับบริบท กล่าวอย่างตรงไปตรงมา บริบทคือโครงสร้าง MAP ซึ่งใช้อินเทอร์เฟซ java.utils.Map ใน Struts2 การใช้งานบริบทคือ ActionContext ต่อไปนี้เป็นแผนภาพโครงสร้างของบริบท
ในการเข้าถึงออบเจ็กต์ในบริบท คุณต้องใช้สัญลักษณ์ # เพื่อทำเครื่องหมายเนมสเปซ เช่น #application, #session
นอกจากนี้ OGNL จะตั้งค่าออบเจ็กต์รูท (ออบเจ็กต์รูท) ใน Struts2 ออบเจ็กต์รูทคือ ValueStack (สแต็กค่า) หากคุณต้องการเข้าถึงคุณสมบัติของออบเจ็กต์ในออบเจ็กต์รูท (เช่น ValueStack) คุณสามารถละเว้น # เนมสเปซและเข้าถึงคุณสมบัติของออบเจ็กต์ได้โดยตรง
ใน struts2 คลาสการใช้งานของอ็อบเจ็กต์รูท ValueStack คือ OgnlValueStack อ็อบเจ็กต์นี้ไม่เพียงแต่เก็บค่าเดียวตามที่เราจินตนาการ แต่ยังเก็บกลุ่มของอ็อบเจ็กต์อีกด้วย มีตัวแปรรูทประเภทรายการในคลาส OgnlValueStack ซึ่งใช้ในการจัดเก็บกลุ่มของวัตถุ
|--คำขอ
|--ใบสมัคร
บริบท -------|--ตัวแปรรูท OgnlValueStack [การกระทำ, OgnlUtil, ... ]
|--เซสชัน
|--แนบ
|--พารามิเตอร์
ออบเจ็กต์แรกในตัวแปรรูทเรียกว่าออบเจ็กต์บนสุดในสแต็ก โดยปกติเราสามารถเข้าถึงคุณสมบัติของวัตถุในตัวแปรรูทโดยการเขียนชื่อของคุณสมบัติโดยตรงในนิพจน์ OGNL เริ่มต้นจากวัตถุที่ด้านบนของสแต็ก หากไม่มีคุณสมบัติอยู่บนวัตถุ ที่ด้านบนของสแต็กจะถูกค้นหาจากวัตถุที่สอง หากไม่พบ ให้ค้นหาจากวัตถุที่สามและเข้าถึงตามลำดับจนกว่าจะพบ
ข้อควรสนใจ: ใน Struts2 จำเป็นต้องใช้นิพจน์ OGNL กับแท็ก Struts ตัวอย่างเช่น: <s:property value="name"/>
เนื่องจาก ValueStack เป็นอ็อบเจ็กต์รูทของ OGNL ใน Struts 2 หากผู้ใช้ต้องการเข้าถึงอ็อบเจ็กต์ในสแต็กค่า หน้า JSP จะสามารถเข้าถึงคุณสมบัติของอ็อบเจ็กต์ใน ValueStack ได้โดยตรงผ่านนิพจน์ EL ต่อไปนี้:
${foo} //รับแอตทริบิวต์ foo ของอ็อบเจ็กต์ใน value stack
หากคุณเข้าถึงออบเจ็กต์ในบริบทอื่น เนื่องจากไม่ใช่ออบเจ็กต์รูท คุณจะต้องเพิ่มคำนำหน้า # เมื่อเข้าถึง
application object: ใช้เพื่อเข้าถึง ServletContext เช่น #application.userName หรือ #application['userName'] ซึ่งเทียบเท่ากับการเรียก getAttribute("username") ของ ServletContext
session object: ใช้เพื่อเข้าถึง HttpSession เช่น #session.userName หรือ #session['userName'] ซึ่งเทียบเท่ากับการเรียก session.getAttribute("userName")
วัตถุคำขอ: แผนที่ที่ใช้ในการเข้าถึงแอตทริบิวต์ HttpServletRequest เช่น #request.userName หรือ #request['userName'] ซึ่งเทียบเท่ากับการเรียก request.getAttribute("userName")
วัตถุพารามิเตอร์: ใช้เพื่อเข้าถึงพารามิเตอร์คำขอ HTTP เช่น #parameters.userName หรือ #parameters['userName'] ซึ่งเทียบเท่ากับการเรียก request.getParameter("username")
วัตถุ attr: ใช้เพื่อเข้าถึงคุณลักษณะตามลำดับของหน้า -> คำขอ -> เซสชัน -> แอปพลิเคชัน
8. เหตุใดคุณจึงใช้นิพจน์ EL เพื่อเข้าถึงคุณสมบัติของวัตถุใน valueStack ได้
เหตุผลก็คือ Struts2 สรุป HttpServletRequest เพิ่มเติม รหัสที่เรียบง่ายมีดังนี้:
StrutsRequestWrapper คลาสสาธารณะขยาย HttpServletRequestWrapper {
StrutsRequestWrapper สาธารณะ (คำขอ HttpServletRequest) {
ซุปเปอร์(ต้องการ);
-
วัตถุสาธารณะ getAttribute (สตริง) {
-
ActionContext ctx = ActionContext.getContext();
คุณลักษณะของวัตถุ = super.getAttribute(s);//ขั้นแรกให้รับค่าแอตทริบิวต์จากขอบเขตคำขอ
ถ้า (ctx != null) {
ถ้า (แอตทริบิวต์ == null) {//หากไม่พบค่าแอตทริบิวต์จากช่วงคำขอ ให้ค้นหาค่าแอตทริบิวต์ของวัตถุจาก ValueStack
-
สแต็ก ValueStack = ctx.getValueStack();
คุณลักษณะ = stack.findValue (s);
-
-
-
แอตทริบิวต์การส่งคืน;
-
-
9. สร้างวัตถุคอลเลกชันรายการ/แผนที่โดยใช้นิพจน์ OGNL
หากคุณต้องการองค์ประกอบคอลเลกชัน (เช่นวัตถุรายการหรือวัตถุแผนที่) คุณสามารถใช้นิพจน์ที่เกี่ยวข้องกับคอลเลกชันใน OGNL
ใช้รหัสต่อไปนี้เพื่อสร้างวัตถุรายการโดยตรง:
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:iterator value="#list" id="n">
<s:ค่าคุณสมบัติ="n"/><br>
</s:ตัววนซ้ำ>
สร้างวัตถุแผนที่:
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar">
<s:property value="key"/>=<s:property value="value"/><br>
</s:ตัววนซ้ำ>
แท็ก Set ใช้เพื่อวางค่าลงในช่วงที่ระบุ
ขอบเขต: ระบุขอบเขตที่ตัวแปรถูกวาง คุณลักษณะนี้สามารถยอมรับแอปพลิเคชัน เซสชัน คำขอ เพจ หรือการดำเนินการ หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ คุณลักษณะดังกล่าวจะถูกวางไว้ในบริบท OGNL ตามค่าเริ่มต้น
ค่า: ค่าที่กำหนดให้กับตัวแปร หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ ค่าที่ด้านบนของสแต็ก ValueStack จะถูกกำหนดให้กับตัวแปร