อัปเดต
เช่นเดียวกับการอัปเดตและเพื่อให้ชัดเจนยิ่งขึ้นสิ่งเหล่านี้คือความแตกต่างที่สำคัญระหว่าง servlets 2.5 และ 3 (ฉันไม่ได้พยายามที่จะละเอียดถี่ถ้วนฉันแค่พูดถึงส่วนที่น่าสนใจที่สุด):
คำอธิบายประกอบเพื่อประกาศ servlets ตัวกรองและตัวฟัง (ความง่ายในการพัฒนา)
ใน servlets 2.5 หากต้องการประกาศ servlet ด้วยพารามิเตอร์ init หนึ่งตัวคุณต้องเพิ่มสิ่งนี้ในweb.xml :
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
<init-param>
<param-name>configFile</param-name>
<param-value>config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>
ใน servlets 3 web.xmlเป็นทางเลือกและคุณสามารถใช้คำอธิบายประกอบแทน XML ได้ ตัวอย่างเดียวกัน:
@WebServlet(name="myServlet",
urlPatterns={"/path/to/my/servlet"},
initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }
สำหรับตัวกรองคุณต้องเพิ่มสิ่งนี้ในweb.xmlใน servlets 2.5:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>
เทียบเท่าโดยใช้คำอธิบายประกอบใน servlets 3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
สำหรับผู้ฟัง (ในกรณีนี้คือ ServletContextListener) ใน servlets 2.5:
<listener>
<listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
การใช้คำอธิบายประกอบเช่นเดียวกัน:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
Modularization ของ web.xml (Pluggability)
- ใน servlets 2.5 มีไฟล์web.xmlเสาหินเพียงไฟล์เดียว
- ใน servlets 3 แต่ละ jar "loadable" สามารถมีweb-fragment.xmlในไดเร็กทอรี META-INF ที่ระบุ servlets ตัวกรองและอื่น ๆ เพื่อให้ไลบรารีและเฟรมเวิร์กสามารถระบุ servlets ของตนเองหรืออ็อบเจ็กต์อื่น ๆ
การลงทะเบียนแบบไดนามิกของ servlets ตัวกรองและตัวฟังในเวลาเริ่มต้นบริบท (ความสามารถในการเสียบ)
ใน servlets 3 a ServletContextListener
สามารถเพิ่ม servlets ตัวกรองและตัวฟังแบบไดนามิกโดยใช้วิธีการต่อไปนี้ที่เพิ่มในSevletContext
: addServlet()
, addFilter()
และaddListener()
การสนับสนุนแบบอะซิงโครนัส
ตัวอย่าง: สมมติว่าคอนเทนเนอร์ servlet บางตัวมีเธรด 5 เธรดในเธรดพูลและมีกระบวนการที่ใช้เวลานานในการดำเนินการต่อคำขอ (เช่นเคียวรี SQL ที่ซับซ้อน)
ด้วย Servlets 2.5 ภาชนะ servlet นี้จะวิ่งออกจากหัวข้อที่มีอยู่หากได้รับการร้องขอห้าในเวลาเดียวกันและหัวข้อที่มีอยู่ห้าเริ่มต้นทำกระบวนการเพราะกระทู้จะไม่กลับมาจนกว่าservice()
(หรือdoGet()
, doPost()
ฯลฯ ) จะถูกดำเนินการตั้งแต่เริ่มต้น เพื่อสิ้นสุดและส่งคืนการตอบกลับ
ด้วย servlets 3.0 กระบวนการที่ใช้เวลานานนี้สามารถมอบหมายให้กับเธรดอื่นและทำให้เสร็จสิ้นservice()
ก่อนที่จะส่งการตอบกลับ (การตอบกลับจะถูกส่งโดยเธรดล่าสุด) วิธีนี้ทำให้เธรดมีอิสระในการรับการตอบกลับใหม่
ตัวอย่างของการสนับสนุนแบบอะซิงโครนัส:
เซอร์เวท 2.5:
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
runSlowProcess();
}
}
Servlets 3:
@WebServlet(name="myServlet",
urlPatterns={"/mySlowProcess"},
asyncSupported=true)
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
AsyncContext myAsyncContext = request.startAsync(request, response);
delegateExecutionToProcessingThread(myAsyncContext);
}
}
public class MyProcessingObject {
public void doSlowProcess() {
runSlowProcess();
myAsyncContext.complete();
}
}
อินเทอร์เฟซAsyncContext
ยังมีเมธอดในการรับอ็อบเจ็กต์คำขออ็อบเจ็กต์การตอบสนองและเพิ่ม Listeners เพื่อแจ้งเตือนเมื่อกระบวนการเสร็จสิ้น
การเข้าสู่ระบบและออกจากระบบแบบเป็นโปรแกรม (การปรับปรุงความปลอดภัย)
ใน servlets 3 อินเทอร์เฟซHttpServletRequest
ได้ถูกเพิ่มสองวิธีการใหม่: login(username, password)
และlogout()
.
สำหรับรายละเอียดเพิ่มเติมดูได้ที่เป็นJava EE 6 API