วิธีที่ 1: ใช้ servletContext เพื่ออ่าน
รับ realpath ของไฟล์การกำหนดค่าจากนั้นอ่านผ่านสตรีมไฟล์หรือใช้วิธีการ getReaasurceasstream ()
เนื่องจากเส้นทางไฟล์ถูกอ่านโดยใช้ ServletContext ไฟล์การกำหนดค่าสามารถวางไว้ในไดเรกทอรีคลาสของ Web-Inf หรือในระดับแอปพลิเคชันและไดเรกทอรี Web-Inf ประสิทธิภาพเฉพาะของตำแหน่งที่เก็บไฟล์ในโครงการ Eclipse คือ: สามารถวางไว้ใต้ SRC หรือภายใต้ Web-Inf และ Web-Root ฯลฯ เนื่องจากเส้นทางนั้นถูกอ่านออกและใช้สตรีมไฟล์สำหรับการอ่านไฟล์การกำหนดค่าใด ๆ สามารถอ่านได้รวมถึง XML และคุณสมบัติ ข้อเสีย: ไม่สามารถอ่านข้อมูลการกำหนดค่านอก Servlet ได้
1. ก่อนสร้างโครงการ Javaweb แบบไดนามิกไดเรกทอรีโครงการมีดังนี้:
2. สร้าง servlet (filereader.java)
แพ็คเกจ com.xia.filereader; นำเข้า Java.io.FileInputStream; นำเข้า java.io.ioException; นำเข้า Java.io.InputStream; นำเข้า Java.io.InputStreamReader; นำเข้า java.text.messageFormat; นำเข้า java.util.properties; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; Filereader ระดับสาธารณะขยาย httpservlet {ส่วนตัวคงที่สุดท้าย long serialversionuid = 1l; Void Doget ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception { /*** response.setContentType ("ข้อความ /html; charset = utf-8"); วัตถุประสงค์คือเพื่อควบคุมเบราว์เซอร์เพื่อถอดรหัส UTF-8; * ด้วยวิธีนี้จะไม่มีภาษาจีนที่อ่านไม่ออก*/ response.Setheader ("เนื้อหาประเภท", "ข้อความ/ html; charset = utf-8"); readsrcdirpropcfgfile (การตอบสนอง); // อ่าน db1.properties การกำหนดค่าไฟล์ตอบสนอง getWriter (). println ("<hr/>"); ReadWebRootDirPropCFGFILE (การตอบสนอง); // อ่าน db2.properties การกำหนดค่าไฟล์ตอบสนอง getWriter (). println ("<hr/>"); ReadWebRootDirPropCFGFILE (การตอบสนอง); // อ่าน db2.properties การกำหนดค่าไฟล์ตอบสนอง getWriter (). println ("<hr/>"); ReadSrcSourcePackPropCFGFILE (การตอบสนอง); // อ่านไฟล์กำหนดค่า db3.properties ในไดเรกทอรี config ภายใต้ไดเรกทอรี src response.getWriter () println ("<hr/>"); ReadWebinfPropcfgFile (การตอบสนอง); // อ่านไฟล์กำหนดค่า DB4.Properties ในไดเรกทอรี JDBC ภายใต้ไดเรกทอรี Web-Inf} โมฆะสาธารณะ readsrcdirpropcfgfile (httpservletResponse) inputStream ใน = this.getServletContext (). getResourceasstream (พา ธ ); คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); props.load (in); String driver = props.getProperty ("jdbc.driver"); string url = props.getProperty ("jdbc.url"); String username = props.getProperty ("jdbc.username"); สตริงรหัสผ่าน = props.getProperty ("jdbc.password"); Response.getWriter (). println ("อ่านไฟล์กำหนดค่า db1.properties ในไดเรกทอรี SRC"); Response.getWriter (). println (messageFormat.format ("ไดรเวอร์ = {0}, url = {1}, ชื่อผู้ใช้ = {2}, รหัสผ่าน = {3}", ไดรเวอร์, url, ชื่อผู้ใช้, รหัสผ่าน)); } โมฆะสาธารณะ readWebRootDirPropcfgFile (การตอบสนอง httpservletResponse) พ่น IOException {String path = "/db2.properties"; inputStream ใน = this.getServletContext (). getResourceasstream (พา ธ ); คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); props.load (in); String driver = props.getProperty ("jdbc.driver"); string url = props.getProperty ("jdbc.url"); String username = props.getProperty ("jdbc.username"); สตริงรหัสผ่าน = props.getProperty ("jdbc.password"); Response.getWriter (). println ("อ่านไฟล์กำหนดค่า db2.properties ในไดเรกทอรี webroot"); Response.getWriter (). println (messageFormat.format ("ไดรเวอร์ = {0}, url = {1}, ชื่อผู้ใช้ = {2}, รหัสผ่าน = {3}", ไดรเวอร์, url, ชื่อผู้ใช้, รหัสผ่าน)); } โมฆะสาธารณะ readsrcsourcepackpropcfgfile (การตอบสนอง httpservletResponse) พ่น IOException {String path = "/web-inf/classes/config/db3.properties"; String realPath = this.getServletContext (). getRealPath (พา ธ ); inputStreamReader reader = new InputStreamReader (ใหม่ FileInputStream (RealPath), "UTF-8"); คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); props.load (reader); String driver = props.getProperty ("jdbc.driver"); string url = props.getProperty ("jdbc.url"); String username = props.getProperty ("jdbc.username"); สตริงรหัสผ่าน = props.getProperty ("jdbc.password"); Response.getWriter (). println ("อ่านไฟล์กำหนดค่า db3.properties ในไดเรกทอรี config ภายใต้ไดเรกทอรี SRC"); Response.getWriter (). println (messageFormat.format ("ไดรเวอร์ = {0}, url = {1}, ชื่อผู้ใช้ = {2}, รหัสผ่าน = {3}", ไดรเวอร์, url, ชื่อผู้ใช้, รหัสผ่าน)); } โมฆะสาธารณะ readWebInFPROPCFGFILE (การตอบสนอง httpservletResponse) พ่น IOException {String Path = "/web-inf/jdbc/db4.properties"; String realPath = this.getServletContext (). getRealPath (พา ธ ); System.out.println ("RealPath:"+RealPath); System.out.println ("บริบท:"+this.getServletContext (). getContextPath ()); inputStreamReader reader = new InputStreamReader (ใหม่ FileInputStream (RealPath), "UTF-8"); คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); props.load (reader); String driver = props.getProperty ("jdbc.driver"); string url = props.getProperty ("jdbc.url"); String username = props.getProperty ("jdbc.username"); สตริงรหัสผ่าน = props.getProperty ("jdbc.password"); Response.getWriter (). println ("อ่านไฟล์กำหนดค่า DB4.Properties ในไดเรกทอรี JDBC ภายใต้ไดเรกทอรี Web-Inf"); Response.getWriter (). println (messageFormat.format ("ไดรเวอร์ = {0}, url = {1}, ชื่อผู้ใช้ = {2}, รหัสผ่าน = {3}", ไดรเวอร์, url, ชื่อผู้ใช้, รหัสผ่าน)); } void dopost ที่ได้รับการป้องกัน (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {}}3. กำหนดค่า servlet (web.xml)
<? xml version = "1.0" การเข้ารหัส = "utf-8"?> <web-app xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://java.sun.com/xml XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3 <plะแสดง-ชื่อ> JavaReaderFile </display-name> <welcome-file-list> <welcome-file> index.html </welcome-file> <welcome-file> index.htm </welcome-file> <welcome-file> index.jsp </welcome-file> <welcome-file> default.jsp </welcome-file> </welcome-file-list> <servlet> <servlet-name> filereader </servlet-name> <servlet-class> com.xia.filereader.filereader </servlet-class> </servlet> <url-pattern>/filereader </url-pattern> </servlet-mapping> </eb-app>
4. ทดสอบ
วิธีที่ 2: ใช้คลาส ResourceBundle เพื่ออ่านข้อมูลการกำหนดค่า
ข้อดีคือ: ทรัพยากรสามารถโหลดได้ในชื่อคลาสที่ผ่านการรับรองและอ่านโดยตรงและไฟล์ทรัพยากรสามารถอ่านได้ในแอปพลิเคชันที่ไม่ใช่เว็บ
ข้อเสีย: เฉพาะไฟล์ทรัพยากรภายใต้คลาส SRC เท่านั้นที่สามารถโหลดได้และสามารถอ่านไฟล์ได้เท่านั้น
/** * รับข้อมูลทั้งหมดในไฟล์กำหนดค่าที่ระบุ * @param propertyName * วิธีการโทร: * 1 วางไฟล์การกำหนดค่าภายใต้แพ็คเกจแหล่งข้อมูลโดยไม่ต้องเพิ่มคำต่อท้าย * PropertiesUtil.getAllMessage ("ข้อความ"); * 2. วางในแพ็คเกจ * PropertiesUtil.getAllMessage ("com.test.message"); * @return */ รายการคงที่สาธารณะ <String> getAllMessage (สตริงคุณสมบัติ Name) {// รับทรัพยากรแพ็คเกจทรัพยากร Bundle RB = ResourceBundle.getBundle (PropertyName.Trim ()); // รับการแจงนับคีย์ทั้งหมด <String> allkey = rb.getKeys (); // Traverse คีย์และรับรายการค่า <string> vallist = new ArrayList <String> (); ในขณะที่ (allkey.hasmoreElements ()) {string key = allkey.nextElement (); ค่าสตริง = (สตริง) rb.getString (คีย์); vallist.add (ค่า); } return vallist; -วิธีที่ 3: ใช้ classloader เพื่ออ่านข้อมูลการกำหนดค่า
ข้อดีคือ: ข้อมูลทรัพยากรการกำหนดค่าสามารถอ่านได้ในแอปพลิเคชันที่ไม่ใช่เว็บและข้อมูลไฟล์ทรัพยากรใด ๆ สามารถอ่านได้
ข้อเสีย: เฉพาะไฟล์ทรัพยากรภายใต้คลาส SRC เท่านั้นและไม่เหมาะสำหรับการโหลดไฟล์ขนาดใหญ่มิฉะนั้นจะทำให้หน่วยความจำ JVM ล้น
แพ็คเกจ com.xia.filereader; นำเข้า java.io.bufferedreader; นำเข้า java.io.ioException; นำเข้า Java.io.InputStream; นำเข้า Java.io.InputStreamReader; นำเข้า java.util.properties; คลาสสาธารณะ readbyclassloader {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น ioexception {readPropFileByClasslassLoad (); } โมฆะคงที่สาธารณะ readPropFileByClassLoad () พ่น IOException {// อ่านไฟล์กำหนดค่า db3.properties inputStream ใน = readbyclassloader.class.getClassLoader (). getResourceasstream ("config/db3.properties"); bufferedReader br = bufferedReader ใหม่ (ใหม่ inputStreamReader (ใน)); คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); props.load (br); สำหรับ (วัตถุ S: props.keyset ()) {system.out.println (s+":"+props.getProperty (s.toString ())); -วิธีที่ 4: PropertiesLoadeRutils คลาสเครื่องมือ
/ *** PropertiesLoadeRutils ที่จัดทำโดย Spring ช่วยให้คุณสามารถโหลดทรัพยากรคุณสมบัติโดยตรงผ่านที่อยู่ไฟล์ตาม classPath* ข้อได้เปรียบที่ใหญ่ที่สุดคือ: โหลดไฟล์การกำหนดค่าแบบเรียลไทม์และจะมีผลทันทีหลังจากการดัดแปลงโดยไม่ต้องรีสตาร์ท ในขณะที่ (จริง) {ลอง {props = propertiesloaderutils.loadallproperties ("message.properties"); สำหรับ (คีย์วัตถุ: props.keyset ()) {system.out.print (คีย์+":"); System.out.println (props.get (key)); }} catch (ioexception e) {system.out.println (e.getMessage ()); } ลอง {thread.sleep (5000);} catch (interruptedException e) {E.printStackTrace ();}}}แก้ไขคุณสมบัติ
/** * ผ่านแผนที่ของคู่คีย์-ค่าอัปเดตไฟล์คุณสมบัติ * * @param ชื่อไฟล์ * ชื่อไฟล์ (วางไว้ในไดเรกทอรีแพ็คเกจแหล่งข้อมูลทรัพยากร) และต้องใช้คำต่อท้าย * @param keyvaluemap * คีย์-ค่าพัควัท เข้ารหัสข้อมูลเส้นทาง เมื่อมีภาษาจีนและช่องว่างในเส้นทางมันจะแปลงอักขระเหล่านี้ ด้วยวิธีนี้ผลลัพธ์มักจะไม่ใช่เส้นทางที่แท้จริงที่เราต้องการ ที่นี่วิธีการถอดรหัส urldeCoder ถูกเรียกให้ถอดรหัสเพื่อให้ได้เส้นทางจีนดั้งเดิมและเส้นทางอวกาศ String filePath = ProperTiesUtil.class.getClassLoader (). getResource (ชื่อไฟล์) .getFile (); คุณสมบัติอุปกรณ์ประกอบฉาก = null; bufferedWriter bw = null; ลอง {filepath = urldecoder.decode (FilePath, "UTF-8"); log.debug ("UpdateProperties PropertiesPath:" + FilePath); อุปกรณ์ประกอบฉาก = PropertiesLoadEutils.loadProperties (ใหม่ classPathResource (ชื่อไฟล์)); log.debug ("UpdateProperties PropertiesPath:" + FilePath); อุปกรณ์ประกอบฉาก = PropertiesLoadEutils.loadProperties (ใหม่ classPathResource (ชื่อไฟล์)); log.debug ("UpdateProperties เก่า:"+อุปกรณ์ประกอบฉาก); // เขียนไฟล์คุณสมบัติ bw = bufferedWriter ใหม่ (ใหม่ OutputStreamWriter (ใหม่ FileOutputStream (FilePath))); props.clear (); // ล้างไฟล์เก่าสำหรับ (คีย์สตริง: keyvaluemap.keyset ()) props.setProperty (key, keyvaluemap.get (key)); log.debug ("UpdateProperties ใหม่:"+อุปกรณ์ประกอบฉาก); props.store (bw, ""); } catch (ioexception e) {log.error (e.getMessage ()); } ในที่สุด {ลอง {bw.close (); } catch (ioexception e) {e.printstacktrace (); -สรุป
ข้างต้นเป็นสี่วิธีในการอ่านไฟล์การกำหนดค่าโดย Javaweb ที่ตัวแก้ไขแนะนำให้คุณ ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!