ฉันได้รับการติดต่อกับการพัฒนาเว็บที่เกี่ยวข้องกับ. NET มาก่อน แต่ตอนนี้ฉันยังคงรู้สึกอึดอัดในการใช้ Javaweb
1. พูดคุยเกี่ยวกับสถาปัตยกรรมโครงการ <br /> ฉันได้ติดต่อกับการพัฒนาที่เกี่ยวข้องกับ. NET เป็นครั้งแรกดังนั้นฉันจึงคุ้นเคยกับการพัฒนาที่เกี่ยวข้องกับ. NET แต่ฉันได้เรียนรู้ Java ในโรงเรียนและฉันวางแผนที่จะรวมแพลตฟอร์มทั้งสองนี้เข้าด้วยกัน ลุกขึ้นใช้ Java เป็นแบ็กเอนด์นั่นคือผู้ให้บริการเติมเต็มตรรกะทางธุรกิจทั้งหมดบนแพลตฟอร์ม Java และใช้. NET ที่ฉันคุ้นเคยกับการพัฒนาเว็บมากขึ้น ด้วยวิธีนี้จะมีแอพ Android และฝั่งเว็บ ลูกค้าเรียกบริการอย่างสม่ำเสมอผ่านกรอบการกระจาย หลังจากค้นหาเป็นเวลานานในที่สุดฉันก็เลือก HPROSE ซึ่งมีน้ำหนักเบาข้ามภาษาข้ามแพลตฟอร์มไม่รุกรานและมีประสิทธิภาพสูงไดนามิกไลบรารีเครื่องยนต์โทรระยะไกล เหตุผลที่ฉันเลือกเป็นเพราะค่าใช้จ่ายในการเรียนรู้ต่ำและในทางกลับกันการโทรข้ามแพลตฟอร์มนั้นง่ายมากและมีประสิทธิภาพเพราะเราต้องใช้. NET เพื่อทำเว็บเพื่อเรียกบริการที่เผยแพร่โดย Java! หลังจากดูเอกสาร HPROSE ประมาณฉันพบว่าการใช้บริการปล่อย HPRoseservlet ในตัวนั้นเร็วขึ้นและพัฒนาได้ง่ายขึ้นดังนั้นฉันจึงวางแผนที่จะใช้วิธีนี้เพื่อเผยแพร่บริการ แต่ปัญหาคือสถาปัตยกรรม SSH แบบดั้งเดิมรู้สึกหนักเล็กน้อยและฉันจะใช้. NET เพื่อพัฒนาด้านเว็บดังนั้นฉันจึงรู้สึกว่าไม่จำเป็นต้องรวม struts ดังนั้นมันจึงเป็นสถาปัตยกรรม Hibernate+Spring+Hprose .
2. การออกแบบฐานข้อมูล
มันเป็นร้านหนังสือออนไลน์ขนาดเล็กดังนั้นการออกแบบจึงยังขาดอยู่และส่วนใหญ่เป็นประโยชน์ส่วนใหญ่คือการพัฒนา Java การพัฒนา ~~ ดังนั้นฉันใช้ Navicat เพื่อออกแบบในเวลาสั้น ๆ แต่ไม่มีความสัมพันธ์ของตารางการออกแบบ
ในความเป็นจริงคุณสามารถเห็นความสัมพันธ์ของตารางได้อย่างรวดเร็ว ~~, ถัดไปคือ hibernate การแมปบางอย่างและใช้ปลั๊กอินเพื่อสร้างโมเดลและไฟล์การแมป
มันเป็นแบบนี้ด้วยการดัดแปลงเล็กน้อย-
3. การกำหนดค่า Spring3+Hibernate4 <br /> เนื่องจากไฟล์และการแมปถูกสร้างขึ้นโดยอัตโนมัติมันจะดีกว่าที่จะกำหนดค่าไว้เล็กน้อย โมเดลคอมโพสิต ตัวอย่างเช่น คีย์หลักประเภทหลักของตารางตรวจสอบผลิตภัณฑ์ :
แพ็คเกจ com.book.model; // สร้าง 2015-11-2 9:07:06 โดยเครื่องมือไฮเบอร์เนต 4.0.0.finalimport java.util.date;/** * ความคิดเห็นที่สร้างโดย hbm2java */publi . .CommentsDate = commentsDate; ผู้ใช้) {this.user = ผู้ใช้; == อื่น ๆ ) กลับมาจริง; Castother.getBook ()) || (this.getBook ()! = null && castother.getBook ()! ) == Castother.getUser ()) || (this.getUser ()! = null && castother.getUser ()! .getCom mentsdate () == castother.getcommentsdate ()) || (this.getcommentsdate ()! = null && castother.getcommentsdate ()! = null && this.getcommentsdate () ; == null? รูปแบบตารางตรวจสอบผลิตภัณฑ์ :
แพ็คเกจ com.book.model; // สร้าง 2015-10-30 14:56:21 โดยเครื่องมือไฮเบอร์เนต 4.0.0.finalimport java.sql.date;/** * ความคิดเห็นที่สร้างโดย hbm2java */คลาสสาธารณะ io.serializable {เนื้อหาสตริงส่วนตัว; } Public String getPic () {return pic;} public void setpic (String pic) {this.pic = pic; ; content = content; ไฟล์การแมปไฮเบอร์เนตที่เกี่ยวข้อง:
<? xml version = "1.0"?> <! doctype hibernate-mapping สาธารณะ "-// hibernate/hibernate mapping dtd 3.0 // en" "http://www.hibernate.org/dtd/hibernate-mapp ing-3.0 . "ความคิดเห็น" catalog = "bookstore"> <composite-id name = "id"> <key-many-many-to-one name = "Book"> <column name = "bookid" /> < /key-many-to- หนึ่ง> <key-many-to-one name = "user"> <column name = "userId" /> < /key-many-to-one> <key-property name = "commentsdate" type = "timestamp"> <column name = "commentsdate" length = "19"/> </key-property> </composite-id> <property name = "content" type = "String"> <column name = "content" length = "65535 " /> < /คุณสมบัติ> <property name =" pic "type =" string "> <column name =" pic "length =" 65535 " /> < /property> <property name =" client "type =" java lan g .integer "> <column name =" client "/> </property> </class> </hibernate-mapping>
เนื่องจากมีสองปุ่มต่างประเทศในตารางการตรวจสอบผลิตภัณฑ์จึงใช้แท็กคีย์แบบหลายต่อหนึ่ง
เนื่องจากใช้ Spring3.2+Hibernate4.1 วิธีการรับ SessionFactory นั้น จำกัด อยู่ที่ SessionFactory.getCurrentsession ()
<bean id = "transactionManager"> <property name = "SessionFactory" ref = "SessionFactory" /> </epean> <!-ลักษณะการแพร่กระจายของธุรกรรม-> <tx: คำแนะนำ ID = "txadvice" transac tion-manager = "TransactionManager"> <tx: แอตทริบิวต์> <tx: method name = "เพิ่ม*" การแพร่กระจาย = "จำเป็น" /> <tx: method name = "ลบ*" การแพร่กระจาย = "จำเป็น" /> <tx: method name = " แก้ไข*"การแพร่กระจาย =" จำเป็น " /> <!-ไฮเบอร์เนต 4 จะต้องกำหนดค่าเพื่อเปิดใช้งานการทำธุรกรรมมิฉะนั้น getCurrentSession () ไม่สามารถรับได้-> <tx: method name ="*"การแพร่กระจาย =" จำเป็น " = "true"/> </tx: แอตทริบิวต์> </tx: คำแนะนำ>
ข้างต้นเป็นปัญหาที่เกิดขึ้นเมื่อฉันกำหนดค่า นี่คือไฟล์การกำหนดค่าสปริง:
<? xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://ww.w3.org" /2001/xmlschema-instance "xmlns: aop =" http://www.springframework.org/schema/aop "xmlns: context =" http://www.springframework http://www.springframework.org/schema/tx "xsi: schemalocation =" http://www.springframework.org/schema/beans 3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3 บริบท http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http: //www.springframework -tx-3.2.xsd "> <!-เปิดใช้งานการสนับสนุนคำอธิบายประกอบฤดูใบไม้ผลิ-> <บริบท: คำอธิบายประกอบ-config /> <bean id =" dataSource "destroy-method =" close "> <property name =" driverclassnam e " value = "com.mysql.jdbc.driver"/> <property name = "url" value = "jdbc: mysql: //127.0.0.1/bookstore? useunicode = true & catreatencoding = utf-8"/> <property name = " ชื่อผู้ใช้ "value =" root " /> <property name =" รหัสผ่าน "value =" Yangyang " /> </ebean> <!-คุณสามารถเพิ่มการกำหนดค่าของแคชรอง-> <bean id =" SessionFactory " > <property name = "dataSource" ref = "dataSource"/> <property name = "MappingDirectoryLocations"> <list> <dalue> classPath: config </value> "> <props> <prop key =" hibernate.dialect "> org.hibernate.dialect.mysqldialect </prop> <prop key =" hibernate.show_sql "> true </prop> <prop key =" hibernate.show_sql " > true </prop> <prop key = "hibernat e.hbm2ddl.auto"> อัปเดต </prop> <prop key = "hibernate.temp.use_jdbc_metadata_defaults"> false </prop> <prop key = "current_session_context_class" </prop> </props> </property> </ebean> <!-ตัวจัดการธุรกรรมการกำหนดค่า-> <bean id = "transactionManager"> <property name = "SessionFactory" ref = "SessionFactory" Bean> <!-ลักษณะการแพร่กระจายของธุรกรรม-> <tx: คำแนะนำ id = "txadvice" ธุรกรรม-ผู้จัดการ = "transactionManager"> <tx: แอตทริบิวต์> <tx: method name = "เพิ่ม*" การเผยแพร่ = "จำเป็น" /> <tx: method name = "delet e*" การแพร่กระจาย = "ต้องการ" /> <tx: method name = "Modify*" การแพร่กระจาย = "ต้องการ" /> <!-Hibernate4 ต้องกำหนดค่าเพื่อเปิดใช้งานธุรกรรมมิฉะนั้น ไม่สามารถรับ getCurrentSession ()-> <tx: method name = "*" การแพร่กระจาย = "ต้องการ" read-only = "true"/>> </tx: attributes> </tx: คำแนะนำ> <!-คลาสเหล่านั้น และวิธีการใช้ธุรกรรม-> <aop: config> <!-มีการใช้ธุรกรรมเฉพาะสำหรับเลเยอร์ตรรกะทางธุรกิจ-> <aop: pointcut id = "allmanagermethod" expression = "การดำเนินการ (* com.book.test.* .*(.. )) " /> <aop: ที่ปรึกษา pointcut-ref =" allmanagermethod "adv ice-ref =" txadvice " /> < /aop: config> <bean name =" baseddao " /> <bean name = "orderdao" /> </epeans>
หลังจากทุกอย่างพร้อมแล้วเราใช้การทดสอบ Servlet:
<servlet> <servlet-name> ทดสอบ </servlet-name> <servlet-lass> com.book.test.test </servlet-lass> </servlet> <servlet-mapping> <servlet-name> ทดสอบ <// servlet-name> <url-pattern>/index </url-pattern> </servlet-mapping>
Void DoGet ที่ได้รับการป้องกัน (HttpservletRequest Requess, HttpservletResponse Response) พ่น ServleTexception, iOexception {// toDo วิธีการที่สร้างขึ้นอัตโนมัติ stub เป็นปัจจัย anfactory = webapplicationContextils.getRequiredWebapplicationContext orderdaoเนื่องจากเราไม่ได้ใช้ structs เราจำเป็นต้องค้นหา beanfactory ของฤดูใบไม้ผลิเพื่อให้ได้ถั่ว Dao
ผลการทำงาน:
โหลดตารางคำสั่งซื้อสำเร็จคำสั่งซื้อ 1 ปริมาณการสั่งซื้อรายการ
ท้ายที่สุดมันเป็นครั้งแรกที่ฉันใช้ Java เพื่อพัฒนาโครงการดังกล่าว