หากเป็นโครงการอินเทอร์เฟซ HTTP+JSON ในฐานะไคลเอนต์และไม่มี JSP และมุมมองมุมมองอื่น ๆ การใช้เฟรมเวิร์ก Jersery เป็นตัวเลือกแรกอย่างแน่นอน ภายใต้สถาปัตยกรรมที่ใช้ Spring3 MVC ประเภทผลตอบแทนของ HTTP+JSON ก็ให้การสนับสนุนเช่นกัน อย่างไรก็ตามในงานพัฒนามันเป็นเรื่องธรรมดามากสำหรับการอัพเกรดฟังก์ชั่นที่จะขึ้นอยู่กับสถาปัตยกรรมที่จัดตั้งขึ้น ฉันพบความจำเป็นในการใช้อินเตอร์เฟสประเภท HTTP+JSON Return ตาม Struts2 ซึ่งขึ้นอยู่กับโครงสร้างเฟรมเวิร์กที่กำหนดไว้
มีสองวิธีในการส่งคืน JSON ใน struts2: 1 ใช้กระแสเอาต์พุตของ servlet เพื่อเขียนสตริง JSON; 2. ใช้ struts2 เพื่อขยาย JSON
1. ใช้สตรีมเอาต์พุต servlet
สาระสำคัญของอินเทอร์เฟซ JSON คือ: ในระหว่างกระบวนการส่งผ่านข้อมูล JSON มันเป็นเพียงแค่ผ่านสตริงธรรมดาที่สอดคล้องกับรูปแบบไวยากรณ์ JSON สิ่งที่เรียกว่า "วัตถุ JSON" หมายถึงผลลัพธ์ของการแยกวิเคราะห์และห่อสตริง JSON นี้
ดังนั้นที่นี่คุณจะต้องเขียนสตริงในรูปแบบไวยากรณ์ JSON ไปยัง httpsertResponse ของ servlet ที่นี่คุณใช้วิธี PrintWriter และแน่นอนว่าคุณสามารถใช้วิธีสตรีมสตรีมได้ ควรสังเกตว่าการเข้ารหัสไม่ได้ตั้งไว้ก่อนที่จะเรียก getWriter (เรียกว่า setContentType หรือวิธีการตั้งค่าการเข้ารหัสเพื่อตั้งค่าการเข้ารหัส), httpservletResponse จะส่งคืนอินสแตนซ์ของ Printwriter ที่เข้ารหัสด้วยการเข้ารหัสเริ่มต้น (ทั้ง ISO-8859-1) สิ่งนี้จะทำให้จีนอ่านไม่ออก ยิ่งกว่านั้นเมื่อตั้งค่าการเข้ารหัสจะต้องตั้งค่าก่อนที่จะเรียก GetWriter มิฉะนั้นจะไม่ถูกต้อง
เขียนรหัสอินเตอร์เฟส:
ความแตกต่างระหว่างวิธีการที่นี่และวิธีการทั่วไป struts2 คือนี่คือประเภทการส่งคืนโมฆะ
โมฆะสาธารณะเขียน () พ่น IOException {httpservletResponse response = servletactionContext.getResponse (); / * * การเข้ารหัสไม่ได้ถูกตั้งค่าก่อนการเรียก getWriter (เรียกว่า setContentType หรือวิธีการตั้งค่าการเข้ารหัสที่จะตั้งค่า) * httpservletResponse จะส่งคืนอินสแตนซ์ของ Witchwriter ที่เข้ารหัสด้วยการเข้ารหัสเริ่มต้น (ISO-8859-1) สิ่งนี้จะทำให้จีนอ่านไม่ออก ยิ่งกว่านั้นเมื่อตั้งค่าการเข้ารหัสจะต้องตั้งค่าก่อนที่จะเรียก GetWriter มิฉะนั้นจะไม่ถูกต้อง * */ response.setContentType ("text/ html; charset = utf-8"); //response.setcharacterencoding("utf-8 "); PrintWriter out = response.getWriter (); // JSON ถูกส่งผ่านในรูปแบบของสตริงปกติในระหว่างกระบวนการจัดส่ง นี่คือการประกบอย่างง่ายของหนึ่งสำหรับการทดสอบสตริง jsonstring = "{/" ผู้ใช้/": {/" id/":/" 123/",/" ชื่อ/":/" จางซาน/",/" พูด/":/" สวัสดีฉันเป็นแอ็คชั่น out.println (jsonstring); out.flush (); out.close (); -การดำเนินการกำหนดค่า
จากการกำหนดค่าต่อไปนี้จะเห็นได้อย่างชัดเจนว่าการกำหนดค่าไม่แตกต่างจากการกำหนดค่าการกระทำปกติ แต่ไม่มีมุมมองคืน
<action name = "write" method = "write" />
ค่าส่งคืน
{"ผู้ใช้": {"id": "123", "ชื่อ": "จางซาน", "พูด": "สวัสดีฉันเป็นแอ็คชั่นที่จะพิมพ์ JSON!", "รหัสผ่าน": "JSON"}, "ความสำเร็จ": จริง}}2. ส่วนขยายของ JSON โดยใช้ struts2
ในการใช้ส่วนขยายนี้คุณจะต้องเพิ่มแพ็คเกจสนับสนุนอย่างแน่นอน หลังจากการดีบักของฉันนี่คือสองตัวเลือก:
1.xwork-core-2.1.6.jar และ struts2-json-plugin-2.1.8.jar หากคุณต้องการใช้ struts2-json-plugin-2.1.8.jar, xwork-core ของคุณ-*. jar ไม่สามารถเลือก 2.2.1 ขึ้นไปได้เนื่องจาก 2.2.1 และสูงกว่ารุ่น Xwork-core-*. jar ไม่มีแพ็คเกจเช่น org.apache.commons.lang เมื่อเริ่มต้น Tomcat มันจะปรากฏขึ้น: java.lang.noclassdeffounderror: org.apache.commons.lang.xwork.stringutils
2.xwork-2.1.2.jar และ jsonplugin-0.34.jar หากคุณต้องการใช้ JSONPLUGIN-0.34.JAR เพื่อรองรับคุณต้องเปลี่ยน Xwork-Core-*. jar เป็น xwork-2.1.2.jar เนื่องจาก jsonplugin-0.34.jar ต้องมีการสนับสนุน com.opensymphony.xwork2.util.textutils พบ Xwork-Core 2.2.1 ขึ้นไป-*. jar และไม่มีคลาสดังกล่าวใน Xwork-Core-2.1.6.jar
ในที่สุดฉันอยากจะบอกว่ามันไม่คุ้มค่าเพราะวิธีการก่อสร้างดั้งเดิม ฉันเหนื่อยมาก การใช้ส่วนประกอบอัตโนมัติเช่น Maven ส่วนใหญ่จะหลีกเลี่ยงข้อบกพร่องที่ขึ้นอยู่กับความแตกต่างของรุ่นระหว่างชิ้นส่วนส่วนตัว วิธีการส่วนประกอบของ Maven จะถูกใช้ใน "การกำหนดค่าศูนย์ struts2 zero" ในส่วนที่สาม
การเขียนรหัสอินเตอร์เฟส
ในคลาสนี้วิธี JSON () เป็นวิธี struts2 ธรรมดา ฉันไม่เห็นสตริงใด ๆ ในรูปแบบ JSON ที่นี่เพราะเรากำลังจะออกจากงานนี้ไปยังส่วนขยายเพื่อทำ หากไม่มีการตั้งค่าใด ๆ ค่าส่งคืนของวิธี getter ทั้งหมดภายใต้คลาสจะรวมอยู่ในสตริง JSON ที่ส่งคืนไปยังไคลเอนต์ ในการกำจัดแอตทริบิวต์ที่ไม่จำเป็นต้องรวมอยู่คุณต้องใช้ @JSON (serialize = false) บนวิธี getter สำหรับคำอธิบายประกอบในโครงสร้างคลาส แน่นอนคุณสามารถลบวิธีการ getter นี้โดยตรงเมื่อมันไม่ส่งผลกระทบต่อธุรกิจอื่น ๆ ดังนั้นผลลัพธ์การส่งคืนในตัวอย่างนี้คือสตริง JSON-Format ที่แปลงวัตถุ Datamap เป็น
แพ็คเกจ JSON; นำเข้า java.util.hashmap; นำเข้า java.util.map; นำเข้า org.apache.struts2.json.annotations.json; นำเข้า com.opensymphony.xwork2.actionsupport; / ** * การทดสอบ JSON * * @author Watson Xu * @date 2012-8-4 06:21:01 PM */ คลาสสาธารณะ JSONAction ขยายการกระทำ {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L; แผนที่ส่วนตัว <String, Object> Datamap; คีย์สตริงส่วนตัว = "แค่ดูดู"; สตริงสาธารณะ json () {// ข้อมูลใน dataMap จะถูกแปลงเป็นสตริง JSON โดย struts2 ดังนั้นคุณต้องล้างข้อมูลในนั้นก่อน datamap = ใหม่ hashmap <string, object> (); ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setName ("Zhang San"); user.setPassword ("123"); datamap.put ("ผู้ใช้" ผู้ใช้); // ใส่ในแท็กว่าการดำเนินการนั้นประสบความสำเร็จ datamap.put ("ความสำเร็จ", จริง); // ส่งคืนผลตอบแทนผลลัพธ์ที่ประสบความสำเร็จ; } แผนที่สาธารณะ <String, Object> getDatamap () {return datamap; } // ตั้งค่าแอตทริบิวต์คีย์ที่จะไม่กลับเป็นเนื้อหาของ JSON @JSON (serialize = false) สตริงสาธารณะ getKey () {คีย์ return; -กำหนดค่า aciton
ในการกำหนดค่าอันดับแรกแพ็คเกจที่การกระทำนั้นจำเป็นต้องได้รับการสืบทอด JSON-Default หรือแพคเกจหลักที่สืบทอดมานั้นสืบทอด JSON-DEFAULT สิ่งนี้กำหนดค่าประเภทการกระทำที่ส่งคืนไปยัง JSON และสามารถกำหนดค่าคุณสมบัติที่เป็นอนุกรมและพารามิเตอร์คลาสอื่น ๆ
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype struts สาธารณะ "-// Apache Software Foundation // dtd struts การกำหนดค่า 2.0 // en" "http://struts.apache.org/dtds/struts-2.0.dtd" Extends = "struts-default, json-default"> <action name = "json" method = "json"> <result type = "JSON"> <!-ที่นี่เราระบุแอตทริบิวต์ที่จะทำให้เป็นอนุกรมโดย struts2 แอตทริบิวต์นี้จะต้องมีเมธอด getter ที่สอดคล้องกันในการกระทำ -> <param name = "root"> dataMap </param> </result> </action> </package> </struts>
ค่าส่งคืน
{"ความสำเร็จ": จริง, "ผู้ใช้": {"ชื่อ": "จางซาน", "รหัสผ่าน": "123"}}3. วิธีใช้การกำหนดค่า struts2 Zero โดยใช้ส่วนประกอบ Maven:
3.1) ในการสร้าง WebApp เรายังคงใช้ Maven เพื่อสร้างมัน กระบวนการก่อสร้างหมายถึงบล็อกของ Limingnihao: ใช้ Eclipse เพื่อสร้างโครงการ SpringMVC ของ Maven
3.2) เพิ่มการพึ่งพา struts2, struts2 zero การพึ่งพาการกำหนดค่าและการพึ่งพา struts2 JSON:
<การพึ่งพา> <!-struts2 core dependency-> <การพึ่งพา> <roupId> org.apache.structs </groupId> <ratifactid> structs2-core </artifactid> <cersion> 2.3.4 </เวอร์ชัน> <RoupID> org.apache.structs </groupId> <ratifactId> structs2-convention-plugin </artifactid> <sersion> 2.3.4 </sersion> <pey> jar </type> <pope> Compile </cope> </การพึ่งพา <ArtIfactId> struts2-json-plugin </artifactid> <version> 2.3.4 </version> <ply> jar </ply> <pope> คอมไพล์ </cope>
หลังจากการทดสอบไม่มีข้อผิดพลาดที่เข้ากันได้กับเวอร์ชันในห้องพึ่งพาข้างต้นไม่เพียงเพราะเป็นรุ่นเดียวกัน แต่ยังเป็นเพราะวิธีการก่อสร้างอัตโนมัติของ Maven
3.3) กำหนดค่า web.xml และเปิดใช้งาน struts2:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <web-app version = "2.5" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://ww.w3.org/200 XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" <Tilter-class> org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter </filter-class> <init-param> <param-name> config </param-name> <param-value> struts-default.xml </filter> <filter-mapping> <silter-name> strutsprepareandexecuteFilter </filter-name> <url-pattern>/*</url-pattern>
3.4) กำหนดค่า struts.xml และตั้งค่าคงที่และแอปพลิเคชันพื้นฐานบางอย่าง:
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <! doctype struts สาธารณะ "-// Apache ซอฟต์แวร์ Foundation // dtd struts การกำหนดค่า 2.0 // en" "http://struts.apache.org/dtds/struts-2.0.dtd" Extends = "JSON-DEFAULT, struts-default"> <!-ที่นี่คุณสามารถตั้งค่าความสัมพันธ์การแมปค่าคืนกลับทั่วโลก ฯลฯ-> < /package> <constant name = "struts.action.extension" value = " /> <constant name =" struts.ui.theme "value =" Simple " /> < name = "struts.multipart.maxsize" value = "1073741824"/> <constant name = "struts.devmode" value = "false"/> </struts>
3.5) เขียนและกำหนดค่าการกระทำ ตั้งค่าโดยการประชุมที่ไม่ได้ระบุไว้ดังนั้นสำหรับปลั๊กอินการประชุมมันจะปฏิบัติต่อคลาส Java ทั้งหมดด้วยชื่อคลาสที่ลงท้ายด้วยการกระทำเป็นการกระทำ:
แพ็คเกจ Watson.action; นำเข้า java.util.hashmap; นำเข้า java.util.map; นำเข้า org.apache.struts2.convention.annotation.action; นำเข้า org.apache.struts2.convention.annotation.namespace; นำเข้า org.apache.struts2.convention.annotation.namespace; นำเข้า org.apache.struts2.convention.annotation.parentpackage; นำเข้า org.apache.struts2.convention.annotation.result; นำเข้า org.apache.struts2.convention.annotation.results; @ParentPackage ("base") @namespace ("/watson") @Results ({@Result (name = "JSON", type = "JSON", params = {"root", "msg"}}) คลาสสาธารณะ JSONAction msg.put ("Flag", "Success"); แผนที่ <สตริง, สตริง> user = new hashmap <string, string> (); user.put ("ชื่อ", "Zhang San"); user.put ("อายุ", "34"); msg.put ("ผู้ใช้" ผู้ใช้); กลับ "JSON"; } // ========================================== แผนที่ส่วนตัว <String, Object> MSG; แผนที่สาธารณะ <สตริงวัตถุ> getMSG () {return msg; - 3.6) ปรับใช้โครงการเริ่มคอนเทนเนอร์และป้อน: http: // localhost: 7070/struts2foo/Watson/JSON ในแถบที่อยู่เบราว์เซอร์ รอจนกว่าผลลัพธ์จะมีดังนี้:
{"Flag": "Success", "User": {"Age": "34", "Name": "Zhang San"}}}จากผลลัพธ์ข้างต้นเราจะเห็นว่าหลังจากเปิดใช้งานการกำหนดค่าเป็นศูนย์การกำหนดค่าใน XML จะหายไปและแทนที่ด้วยคำอธิบายประกอบในแต่ละการกระทำ ที่นี่เราลบการกำหนดค่าข้างต้นใน XML และเขียนรหัสต่อไปนี้ไปยังส่วนบนของ JSONAction ด้านบน:
@ParentPackage ("base") @namespace ("/watson") @Results ({@Result (name = "JSON", type = "JSON", params = {"root", "msg"})})รูทเทียบเท่ากับการกำหนดค่าพารามิเตอร์ในการกำหนดค่า XML
4. เอกสารแนบ:
คำอธิบายโดยละเอียดของพารามิเตอร์ที่กำหนดค่าได้เมื่อประเภทการกระทำที่ส่งคืนคือ JSON:
<result type = "JSON"> <!- ที่นี่ระบุคุณสมบัติที่จะถูกทำให้เป็นอนุกรมโดย struts2 คุณสมบัตินี้จะต้องมีวิธีการ getter ที่สอดคล้องกันในการกระทำ-> <!-โดยค่าเริ่มต้นค่าของวิธีการ getter ทั้งหมดที่มีค่าส่งคืนจะถูกจัดลำดับโดยไม่คำนึงว่าวิธีการมีคุณสมบัติที่สอดคล้องกัน-> <param name = "root"> dataMap </param> <! DataMap-> <param name = "includeproperties"> userlist.*</param> <!-ที่นี่ระบุคุณสมบัติใดที่จะถูกแยกออกจาก datamap คุณสมบัติที่ไม่รวมเหล่านี้จะไม่ถูกทำให้เป็นอนุกรมและโดยทั่วไปจะไม่ปรากฏในเวลาเดียวกันกับการกำหนดค่าพารามิเตอร์ข้างต้น -> <param name = "excludeproperties"> ความสำเร็จ </param>
ดาวน์โหลดไฟล์แนบ
strutsjson.rar
struts2foo.rar
ข้างต้นเป็นเนื้อหาทั้งหมดของ struts2 ที่ส่งคืนวัตถุ JSON ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น