வடிகட்டிகள் அறிமுகம்
ஆனால் அதெல்லாம் இல்லை. சர்வ்லெட்டுகள் அவ்வளவு எளிமையானவை என்று நீங்கள் உண்மையில் நினைக்கவில்லை, இல்லையா?
நாங்கள் ஏற்கனவே பகுப்பாய்வு செய்த சர்வ்லெட்டுகளுக்கு கூடுதலாக, "பயன்பாட்டு சேவையகங்கள்" என்று அழைக்கப்படுபவை உள்ளன - வடிகட்டிகள் . அவை சர்வ்லெட்டுகளைப் போலவே இருக்கின்றன, ஆனால் அவற்றின் முக்கிய வேலை, கோரிக்கைகளைச் செயல்படுத்த சர்வ்லெட்டுகளுக்கு உதவுவதாகும்.
ஒரு வடிகட்டி ஒரு செயலாளர் போன்றது, மற்றும் ஒரு சர்வ்லெட் ஒரு இயக்குனர் போன்றது. ஆவணம் இயக்குனரின் மேசையை அடையும் முன், அது செயலாளரின் கைகளுக்குச் செல்லும். இயக்குனர் கையொப்பமிட்ட பிறகு, அது மீண்டும் செயலாளரிடம் செல்லும், ஏற்கனவே வெளிச்செல்லும் கடிதமாக, எடுத்துக்காட்டாக.
அத்தகைய செயலாளர் இயக்குனரிடம் சில கோரிக்கைகளை நிராகரிக்கலாம் (உதாரணமாக, ஸ்பேம்). அல்லது அவருக்குத் தெரிந்த கேள்விகளுக்கு நிலையான பதில்களைக் கொடுங்கள் ("இயக்குனர் இடத்தில் இல்லை"). மற்றும் பல. மேலும், இதுபோன்ற பல செயலாளர்கள் இருக்கலாம்: ஒருவர் அனைத்து இயக்குநர்களுக்கும் ஒரே நேரத்தில் ஸ்பேமை வடிகட்டலாம், மற்றொன்று வெவ்வேறு இயக்குநர்களுக்கு இடையே கோரிக்கைகளை மாற்றலாம்.
வடிப்பான்கள் அதே வழியில் செயல்படுகின்றன.
வகுப்புகள் வடிகட்டி, வடிகட்டி, வடிகட்டி அமைப்பு
வடிப்பான்கள் சர்வ்லெட்டுகளுக்கு மிகவும் ஒத்தவை, ஆனால் சில சிறிய வேறுபாடுகளுடன். உங்கள் சொந்த வடிப்பானை எழுத, நீங்கள் இலிருந்து பெற வேண்டும் javax.servlet.Filter
.
வடிப்பான் முறைகளையும் கொண்டுள்ளது init()
மற்றும் destroy()
. ஒரு முறைக்கு பதிலாக, service()
ஒரு வடிகட்டி உள்ளது doFilter()
. மற்றும் அதன் சொந்த வகுப்பு FilterConfig உள்ளது. web.xml கோப்பில் அல்லது @WebFilter சிறுகுறிப்பு வழியாகவும் இந்த வடிகட்டி சர்வ்லெட்டில் சேர்க்கப்படும்.
முறைகளின் பட்டியல்:
முறைகள் | விளக்கம் | |
---|---|---|
1 | init(FilterConfig config) |
வடிகட்டி துவக்கம் |
2 | destroy() |
வடிகட்டி இறக்குதல் |
3 | doFilter(ServletRequest , ServletResponse, FilterChain) |
கோரிக்கை செயலாக்கம் (வடிகட்டுதல்) |
சர்வ்லெட்டுக்கும் வடிகட்டிக்கும் என்ன வித்தியாசம்?
பல வடிப்பான்கள் இருக்கலாம், மேலும் அவை கோரிக்கையை (மற்றும் பதில்) தொடர்ச்சியாக செயல்படுத்துகின்றன. அவை சங்கிலி என்று அழைக்கப்படும் ஒன்றாக இணைக்கப்பட்டுள்ளன - மேலும் அவர்களுக்காக ஒரு சிறப்பு வகுப்பு கூட உள்ளது FilterChain
.
முறையில் கோரிக்கையைச் செயலாக்கிய பிறகு, சங்கிலியில் அடுத்த வடிகட்டியின் doFilter()
முறையை நீங்கள் அழைக்க வேண்டும் . doFilter()
உதாரணமாக:
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
PrintWriter out = resp.getWriter();
out.print("Adding something before the body of the response");
chain.doFilter(req, resp); // call the next filter in the chain
out.print("Adding something after the body of the response");
}
public void destroy() {
}
}
உண்மையில், நீங்கள் மறுமொழி அமைப்பை அப்படிச் சேர்க்க முடியாது . முறையாக, வடிப்பான்கள் மற்றும் சேவையகங்கள் ஒன்றுக்கொன்று சார்பற்றவை மற்றும் சுயாதீனமாக மாற்றப்படலாம். வெவ்வேறு நேரங்களில் வெவ்வேறு டெவலப்பர்களால் அவற்றை எழுதலாம். வடிகட்டி செயல்பாடு ஒரு சேவை செயல்பாடு மட்டுமே, எடுத்துக்காட்டாக:
- உள்வரும் அனைத்து கோரிக்கைகளையும் (மற்றும் பதில்கள்) பதிவு செய்தல்
- தரவு சுருக்கம்
- தரவின் குறியாக்கம் (மற்றும் மறைகுறியாக்கம்).
- தரவு சரிபார்ப்பு கோரிக்கை
- விரும்பிய தலைப்புகளைச் சேர்க்கவும்/அகற்றவும்
- கோரிக்கைகளை திருப்பிவிடவும்
- அணுகல் கட்டுப்பாடு (பயனர் உள்நுழைந்துள்ளாரா என்பதைச் சரிபார்த்தல்)
RequestDispatcher வகுப்பு
ஒரு முறைக்குள் வடிகட்டி இயங்கும் போது சில சமயங்களில் doFilter()
மற்றொரு சர்வ்லெட்டை அழைக்க வேண்டியிருக்கலாம் . இதைச் செய்ய, கொள்கலனில் ஒரு சிறப்பு பொருள் உள்ளது RequestDispatcher
.
நீங்கள் அதை இரண்டு வழிகளில் பெறலாம்:
- பொருளில்
HttpServletRequest
- பொருளில்
ServletContext
ஏற்கனவே உள்ள கோரிக்கையை வேறொரு சர்வ்லெட்டுக்கு திருப்பிவிட இந்த ஆப்ஜெக்ட்டைப் பயன்படுத்தலாம் . எடுத்துக்காட்டாக, பயனருக்கு அங்கீகாரம் இல்லை மற்றும் அங்கீகாரத்துடன் கூடிய பக்கத்தை அவருக்குக் காட்ட விரும்புகிறோம். சரி, அல்லது சர்வரில் பிழை ஏற்பட்டது மற்றும் பயனருக்கு ஒரு பிழைப் பக்கத்தைக் காட்ட விரும்புகிறோம் :)
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
String path = "/error.html";
ServletContext servletContext = this.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
requestDispatcher.forward(request, response);
}
}
RequestDispatcher
வடிப்பானிலிருந்தும் அழைக்கலாம் .
public class MyFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
String path = "/error.html";
ServletContext servletContext = req.getServletContext();
RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
requestDispatcher.forward(req, resp);
}
public void destroy() {
}
}
கோரிக்கை முறையிலேயே கையாளப்படும் என்பதையும் பயன்பாட்டிற்குப் பிறகு forward()
அழைக்க வேண்டிய அவசியமில்லை என்பதையும் நினைவில் கொள்ளவும் .doFilter()
RequestDispatcher
வழிமாற்று மற்றும் முன்னோக்கி ஒப்பீடு
மேலும் ஒரு முக்கியமான புள்ளி. உங்கள் சர்வ்லெட்டில் உள்ள மற்றொரு URI க்கு பயனரை திருப்பிவிட விரும்பினால், நீங்கள் இதை இரண்டு வழிகளில் செய்யலாம்:
redirect
forward
நாங்கள் ஏற்கனவே அவற்றை பகுப்பாய்வு செய்துள்ளோம், ஆனால் வசதிக்காக நான் மீண்டும் சொல்கிறேன்.
நீங்கள் அழைப்பின் மூலம் திசைதிருப்பும்போதுresponse.sendRedirect("link")
, சேவையகம் உலாவிக்கு (கிளையண்ட்) பதிலையும் 302
நீங்கள் குறிப்பிட்ட இணைப்பையும் திருப்பி அனுப்புகிறது. உலாவி, சேவையக பதிலைப் பகுப்பாய்வு செய்த பிறகு, நீங்கள் அனுப்பிய இணைப்பைப் பதிவிறக்குகிறது. அதாவது, உலாவியில் உள்ள இணைப்பு புதியதாக மாறுகிறது.
நீங்கள் அழைப்பு மூலம் முன்னனுப்பினால்requestDispatcher.forward()
, கொள்கலனுக்குள் ஒரு புதிய கோரிக்கை வைக்கப்படும், மேலும் உங்கள் சர்வ்லெட் அதன் பதிலை உலாவிக்கு (கிளையன்ட்) உங்கள் சர்வ்லெட்டின் பதிலாக அனுப்பும். இந்த வழக்கில், உலாவி புதிய சர்வ்லெட்டிலிருந்து பதிலைப் பெறுகிறது, ஆனால் உலாவியில் உள்ள இணைப்பு மாறாது.
GO TO FULL VERSION