සර්වට්කොන්ටෙක්ස්ට්
සර්වට් බහාලුම ( අපාචේ ටොම්කාට් වැනි ) ආරම්භ වූ විට, එය එහි සියලුම වෙබ් යෙදුම් යෙදවීම සහ පැටවීම සිදු කරයි. වෙබ් යෙදුමක් පටවන විට, සර්වට් බහාලුම ServletContext
එක් වරක් නිර්මාණය කර එය සේවාදායකයේ මතකයේ තබා ගනී. වෙබ් යෙදුම ගේ web.xml
හා ඇතුළත් සියලු web-fragment.xml
ගොනු කියවූ අතර, එක් එක් <servlet>
, <filter>
හා <listener>
සොයා (හෝ ග්රන්ථ එක් එක් පන්තියට @WebServlet
, @WebFilter
හා @WebListener
පිළිවෙළින්) වරක් instantiated මෙන්ම සේවාදායකය මතකයේ තබා ඇත. සෑම ක්ෂණික පෙරණයක් සඳහාම, එහි init()
ක්රමය නව එකක් සමඟ ක්රියාත්මක වේFilterConfig
.
කරන විට Servlet
සතුව <servlet><load-on-startup>
හෝ @WebServlet(loadOnStartup)
වැඩි වටිනාකමක් වඩා 0
, එසේ නම් එහි init()
ක්රමය ද සමග නව ආරම්භක කාලය තුළ පළ කළහ ඇත ServletConfig
. එම සේවාදායකයන් ආරම්භ කරනු ලබන්නේ එම අගය අනුව නියම කර ඇති අනුපිළිවෙලෙනි ( 1
1 වන, 2
2 වන, ආදිය). එම අගය එකකට වඩා වැඩි servlet සඳහා නිශ්චිත නම්, එසේ නම් එම servlets එක් එක් ඔවුන් පෙනී සමාන පිණිස රුවා ඇත web.xml
, web-fragment.xml
හෝ @WebServlet
classloading. "ආරම්භක-පැටවීමේ ආරම්භක අගය" නොමැති init()
විට, HTTP ඉල්ලීම පළමු වරට එම සේවාදායකයට පහර දෙන සෑම විටම ක්රමය ක්රියාත්මක වේ.
ඉහත විස්තර කර ඇති ආරම්භක පියවරයන් සියල්ලම සමඟ සර්වට් බහාලුම අවසන් වූ විට, ඉන්වොයිස් ServletContextListener#contextInitialized()
කරනු ලැබේ.
පහළ වූ විට servlet රුවනයකි වෑල්ව වැසී, එය, සියලු වෙබ් යෙදුම් වඩසටහනක් වන අල්ලාහ් destroy()
එහි සියලු ආරම්භනය servlets සහ පෙරහන් ක්රමය, සහ සියලු ServletContext
, Servlet
, Filter
හා Listener
අවස්ථා දවසක් ලස්සන කලා වේ. අවසාන වශයෙන් ServletContextListener#contextDestroyed()
කැමැත්ත ඉල්ලා සිටිනු ඇත.
HttpServletRequest සහ HttpServletResponse
සර්වට් බහාලුම කිසියම් වරාය අංකයකින් HTTP ඉල්ලීම්වලට සවන් දෙන වෙබ් සේවාදායකයකට අමුණා ඇත (වරාය 8080 සාමාන්යයෙන් සංවර්ධනයේදී භාවිතා වන අතර නිෂ්පාදනයේ 80 වරාය වේ). සේවාදායකයෙක් (උදා: වෙබ් බ්රව්සරයක් ඇති පරිශීලකයෙකු හෝ ක්රමලේඛිකව භාවිතා කරනURLConnection
) HTTP ඉල්ලීමක් යවන විට, සර්වට් බහාලුම නව HttpServletRequest
සහ HttpServletResponse
වස්තූන් නිර්මාණය Filter
කර ඒවා දාමයේ අර්ථ දක්වා ඇති ඕනෑම දෙයක් හරහා යවයි Servlet
.
මෙම නඩුවේ පෙරහන් මෙම doFilter()
ක්රමය උපයෝගී කර ඇත. සර්වට් බහාලුම් කේතය ඇමතූ විට chain.doFilter(request, response)
, ඉල්ලීම සහ ප්රතිචාරය ඊළඟ පෙරණය වෙත ඉදිරියට යයි, නැතහොත් ඉතිරි පෙරහන් නොමැති නම් සේවාදායකයට පහර දෙන්න.
මෙම නඩුවේ servlets මෙම service()
ක්රමය උපයෝගී කර ඇත. පෙර සැකසුමක් ලෙස, එක් වන මෙම ක්රමය මගින් තීරණය doXxx()
ක්රම මත පදනම් පතා request.getMethod()
. තීරණය කරන ලද ක්රමය සේවාදායකයෙන් නොමැති නම්, ප්රතිචාරයේ දී HTTP 405 දෝෂයක් නැවත ලබා දෙනු ලැබේ.
ඉල්ලීම් වස්තුව HTTP ඉල්ලීම පිළිබඳ එහි URL, ශීර්ෂයන්, විමසුම් නූල් සහ ශරීරය වැනි සියලු තොරතුරු සඳහා ප්රවේශය සපයයි. ප්රතිචාර වස්තුව මඟින් ඔබට අවශ්ය ආකාරයට HTTP ප්රතිචාරය පාලනය කිරීමට සහ යැවීමට හැකියාව ලබා දෙයි, නිදසුනක් ලෙස, ශීර්ෂයන් සහ ශරීරය සැකසීමට ඔබට ඉඩ සලසයි (සාමාන්යයෙන් JSP ගොනුවකින් ජනනය කරන ලද HTML අන්තර්ගතය සමඟ). HTTP ප්රතිචාරය කැපවී අවසන් වූ විට, ඉල්ලීම සහ ප්රතිචාර වස්තු ප්රතිචක්රීකරණය කර නැවත භාවිතා කිරීම සඳහා ලබා දේ.
HttpSession
සේවාදායකයෙක් පළමු වරට වෙබ් ඇප් වෙත පිවිසෙන විට සහ / හෝ HttpSession
ලබා ගත් විට request.getSession()
, සර්වට් බහාලුම නව HttpSession
වස්තුවක් නිර්මාණය කරයි , දිගු හා අද්විතීය හැඳුනුම්පතක් ජනනය කරයි (ඔබට එය ලබා ගත හැකිය session.getId()
), සහ එය සේවාදායකයේ ගබඩා කරයි මතකය. මෙම servlet රුවනයකි ද සකසයි Cookie
තුළ Set-Cookie
සමග HTTP ප්රතිචාරයක් ශීර්ෂ JSESSIONID
එහි නම හා අද්විතීය සැසිය හැඳුනුම්පත එහි අගය ලෙස.
දක්වා ඇති පරිදි HTTP කුකී පිරිවිතර (කොන්ත්රාත්තුවක් ඕනෑම යහපත් වෙබ් බ්රවුසරයක් සහ වෙබ් සේවාදායකය පිළිපැදිය යුතුය), සේවාලාභියා (වෙබ් බ්රවුසරය) තුළ පසු ඉල්ලීම් මෙම කුකිය ආපසු යැවීමට අවශ්ය වේ Cookie
කල් කුකී වලංගු ලෙස සඳහා ශීර්ෂ ( එනම් අද්විතීය හැඳුනුම්පත අඩු නොකළ සැසියකට යොමු විය යුතු අතර වසම සහ මාර්ගය නිවැරදි වේ). ඔබගේ බ්රව්සරයේ සාදන ලද HTTP ගමනාගමන මොනිටරය භාවිතා කරමින්, ඔබට කුකිය වලංගු දැයි තහවුරු කර ගත හැකිය (Chrome / Firefox 23+ / IE9 + හි F12 ඔබන්න, සහ Net / Network පටිත්ත පරීක්ෂා කරන්න). සර්වට් බහාලුම Cookie
කුකියේ නම සහිතව සිටීම සඳහා පැමිණෙන සෑම HTTP ඉල්ලීමකම ශීර්ෂකය පරීක්ෂා කර සේවාදායකයේ මතකයෙන් JSESSIONID
සම්බන්ධය ලබා ගැනීමට එහි අගය (සැසි හැඳුනුම්පත) භාවිතා කරයි HttpSession
.
මෙම HttpSession
එය සඳහන් වඩා ඉකුත් අගය අකර්මන්යව (එනම්, ඉල්ලීම භාවිතා නොවේ) වී ඇති තෙක් ජීවත් නවාතැන් පහසුකම් <session-timeout>
දී සැකසුම, web.xml
. කල් ඉකුත් වීමේ අගය පෙරනිමිය විනාඩි 30 කි. එබැවින්, සේවාදායකයා නියමිත වේලාවට වඩා වැඩි කාලයක් වෙබ් යෙදුමට නොපැමිණෙන විට, සේවාදායක බහාලුම සැසිය ඉවත දමයි. සෑම පසුකාලීන ඉල්ලීමකටම, කුකිය නියම කර තිබුණද, එකම සැසිවාරයට තවදුරටත් ප්රවේශ නොවනු ඇත; සේවාදායක බහාලුම නව සැසියක් නිර්මාණය කරයි.
සේවාදායකයාගේ පැත්තෙන්, බ්රවුසර උදාහරණය ක්රියාත්මක වන තාක් සැසි කුකිය සජීවීව පවතී. එබැවින්, සේවාදායකයා බ්රව්සරය (සියලු ටැබ් / කවුළු) වසා දැමුවහොත්, සැසිය සේවාදායකයාගේ පැත්තෙන් ඉවත දමනු ලැබේ. නව බ්රව්සර අවස්ථාවක, සැසිය හා සම්බන්ධ කුකිය නොපවතින බැවින් එය තවදුරටත් යවනු නොලැබේ. මෙය HttpSession
සම්පූර්ණයෙන්ම නව සැසි කුකියක් භාවිතා කරමින් සම්පූර්ණයෙන්ම නව නිර්මාණය වීමට හේතු වේ .
කෙටියෙන් කිවහොත්
- මෙම
ServletContext
වෙබ් යෙදුම ජීවිත තාක් කාලයක් සඳහා ජීවිත. හි ඇති සියලුම ඉල්ලීම් අතර එය බෙදා ගැනේ සියලු සැසිවල .
- මෙම
HttpSession
තාක් කල් සේවාලාභියා එම බ්රවුසරය උදාහරණයක් සමග වෙබ් යෙදුම සමඟ අනොන්ය කර තිබේ නම්, එම සැසිය සේවාදායකය පැත්තේ කල් ඉකුත් නැති ලෙස සඳහා ජීවිත. හි ඇති සියලුම ඉල්ලීම් අතර එය බෙදා ගැනේඑකම සැසියේ ගැනේ.
- මෙම
HttpServletRequest
සහ HttpServletResponse
සම්පූර්ණ ප්රතිචාර (වෙබ් පිටුව) පැමිණ තිබේ තෙක් servlet, ග්රාහක සිට විසින් HTTP ඉල්ලීමක් ලැබෙන කාලයේ සිට සජීවී. එය එසේ නොවේ වෙනත් තැන්වල ගත්හ.
- සියල්ල
Servlet
, Filter
සහ Listener
සිද්ධීන් වෙබ් යෙදුම ජීවත්වන තාක් කල් ජීවත් වේ. සියලුම සැසිවල සියලුම ඉල්ලීම් අතර ඒවා බෙදා ගැනේ.
attribute
අර්ථ දක්වා ඇති ඕනෑම දෙයක් ServletContext
, HttpServletRequest
සහ HttpSession
ප්රශ්නයේ ඇති වස්තුව ජීවත්වන තාක් කල් ජීවත් වේ. ජේඑස්එෆ්, සීඩීඅයි, ස්ප්රිං වැනි බෝංචි කළමනාකරණ රාමුවල ඇති “විෂය පථය” මෙම වස්තුවෙන් නිරූපණය වේ. එම රාමු ඒවායේ විෂය පථය බෝංචි ලෙස ගබඩා කරයිattribute
වේ.
නූල් ආරක්ෂාව
එයින් කියැවෙන්නේ, ඔබේ ප්රධාන අවධානය යොමු විය හැක්කේ නූල් ආරක්ෂාවයි . සියලුම ඉල්ලීම් අතර සේවාදායක සහ පෙරහන් බෙදාගෙන ඇති බව ඔබ දැන් දැන සිටිය යුතුය. ජාවා පිළිබඳ හොඳ දෙය එයයි, එය බහු-නූල් සහ විවිධ නූල් (කියවන්න: HTTP ඉල්ලීම්) එකම අවස්ථාව භාවිතා කළ හැකිය. එය ප්රතිනිර්මාණය කිරීමට තරම් මිල අධික වනු ඇත, init()
සහdestroy()
ඒවා සෑම ඉල්ලීමක් සඳහාම වේ.
සර්වට්ලට් හෝ ෆිල්ටරයේ නිදර්ශන විචල්යයක් ලෙස ඔබ කිසි විටෙකත් කිසිදු ඉල්ලීමක් හෝ සැසියක් පරික්ෂා කළ දත්ත ලබා නොදිය යුතු බව ඔබ වටහා ගත යුතුය . එය අනෙකුත් සැසිවල අනෙකුත් සියලුම ඉල්ලීම් අතර බෙදා ගනු ඇත. බව ය නොවන නූල්-ආරක්ෂිත! පහත උදාහරණයෙන් මෙය පැහැදිලි වේ:
public class ExampleServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
මෙයද බලන්න: