JSP 1.2 පිරිවිතරයෙන්, ඔබේ වෙබ් යෙදුමේ JSP සම්මත ටැග් පුස්තකාලය (JSTL) භාවිතා කිරීම රෙකමදාරු කරනු ලැබේ. ඔබේ පිටු වල ජේඑස්පී ස්ක්රිප්ට්ලෙට් වල අවශ්යතාවය අඩු . JSTL භාවිතා කරන පිටු සාමාන්යයෙන් කියවීමට හා නඩත්තු කිරීමට පහසුය.
...
හැකි නම්, JSP scriptlets වළක්වා ටැගය පුස්තකාල සමාන පහසුකම් ලබා විට. මෙය පිටු කියවීමට හා නඩත්තු කිරීමට පහසු කරයි, ඉදිරිපත් කිරීමේ තර්කනයෙන් ව්යාපාර තර්කනය වෙන් කිරීමට උපකාරී වන අතර ඔබේ පිටු ජේඑස්පී 2.0 විලාසිතාවේ පිටු බවට පරිණාමය වීමට පහසු කරයි (ජේඑස්පී 2.0 පිරිවිතරයන් සහාය දක්වයි, නමුත් ස්ක්රිප්ට්ලෙට් භාවිතය අවධාරණය කරයි).
...
ව්යාපාර තර්කනයෙන් ඉදිරිපත් කිරීමේ ස්ථරය අතර සම්බන්ධතාවය අඩු කිරීම සඳහා ආදර්ශ-දර්ශන-පාලක (එම්වීසී) සැලසුම් රටාව අනුගමනය කිරීමේ අරමුණින්, ව්යාපාර තර්කනය ලිවීම සඳහා ජේඑස්පී පිටපත් භාවිතා නොකළ යුතුය . ඒ වෙනුවට, සේවාදායකයාගේ ඉල්ලීම් නිසි ග්රාහක-සූදානම් ආකෘතියකට සැකසීමෙන් ආපසු ලබා දෙන දත්ත ("වටිනා වස්තු" ලෙසද හැඳින්වේ) පරිවර්තනය කිරීමට අවශ්ය නම් ජේඑස්පී ස්ක්රිප්ට්ලට් භාවිතා කරයි. එසේ වුවද, ඉදිරිපස පාලක සේවාදායකයක් හෝ අභිරුචි ටැගයක් සමඟ මෙය වඩා හොඳ වනු ඇත.
සෑම ඉල්ලීමකදීම එකම ජාවා කේතය ඉල්ලීමට ඔබට අවශ්ය නම් , ඉල්ලූ පිටුව නොසලකා අඩු හෝ වැඩි ගණනක්, උදා: පරිශීලකයෙකු ලොග් වී ඇත්දැයි පරීක්ෂා කිරීම, ඉන්පසු පෙරනයක් ක්රියාත්මක කර ඒ අනුව කේතයක් ලිවීම . උදා:doFilter()
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
} else {
chain.doFilter(request, response); // Logged in, just continue request.
}
}
<url-pattern>
ජේඑස්පී රුචිකත්වයන් ආවරණය වන පරිදි සුදුසු පරිදි සිතියම් ගත කළ විට , ඔබට එකම කේත කැබැල්ලක් සමස්ත ජේඑස්පී පිටු පිටපත් කිරීමට අවශ්ය නොවේ.
ඉල්ලීමක් පෙර සැකසීම සඳහා ඔබට යම් ජාවා කේතයක් කැඳවීමට අවශ්ය නම් , උදා: දත්ත සමුදායකින් යම් ලැයිස්තුවක් යම් වගුවක ප්රදර්ශනය කිරීම සඳහා පූර්ව පැටවීම, අවශ්ය නම් සමහර විමසුම් පරාමිතීන් මත පදනම්ව, පසුව සේවාදායකයක් ක්රියාත්මක කර ඒ අනුව කේතයක් ලිවීම doGet()
. උදා:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<Product> products = productService.list(); // Obtain all products.
request.setAttribute("products", products); // Store products in request scope.
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
} catch (SQLException e) {
throw new ServletException("Retrieving products failed!", e);
}
}
ව්යතිරේකයන් සමඟ කටයුතු කිරීම මේ ආකාරයෙන් පහසුය. ජේඑස්පී විදැහුම්කරණය මධ්යයේ ඩීබී වෙත පිවිසෙන්නේ නැත, නමුත් ජේඑස්පී දර්ශනය වීමට බොහෝ කලකට පෙරය. ඩීබී ප්රවේශය ව්යතිරේකයක් විසි කරන සෑම විටම ප්රතිචාරය වෙනස් කිරීමට ඔබට තවමත් හැකියාවක් ඇත. ඉහත නිදසුනේ, පෙරනිමි දෝෂයක් 500 පිටුව මගින් කෙසේ හෝ සකසුරුවම් කරන ඔබට හැකි ප්රදර්ශනය වනු ඇත <error-page>
තුල web.xml
.
ඉල්ලීමක් කල්තබා ගැනීම සඳහා ඔබට යම් ජාවා කේතයක් කැඳවීමට අවශ්ය නම් , උදා: පෝරමයක් ඉදිරිපත් කිරීම සැකසීම, ඉන්පසු සේවාදායකයක් ක්රියාත්මක කර ඒ අනුව කේතයක් ලිවීම doPost()
. උදා:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirect to home page.
} else {
request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error.
}
}
විවිධ ප්රති result ල පිටු ගමනාන්ත සමඟ කටයුතු කිරීම පහසුය: දෝෂයක් ඇති වූ විට වලංගු කිරීමේ දෝෂ සහිතව පෝරමය නැවත ප්රදර්ශනය කිරීම (මෙම විශේෂිත උදාහරණයේ දී ඔබට එය EL${message}
හි නැවත ප්රදර්ශනය කළ හැකිය ), හෝ සාර්ථක වූ විට අපේක්ෂිත ඉලක්ක පිටුවට රැගෙන යාම.
ක්රියාත්මක කිරීමේ සැලැස්ම සහ / හෝ ඉල්ලීමේ ගමනාන්තය සහ ප්රතිචාරය පාලනය කිරීම සඳහා ඔබට යම් ජාවා කේතයක් යෙදවීමට අවශ්ය නම් , එම්වීසී හි ඉදිරිපස පාලක රටාවට අනුව සේවාදායකයක් ක්රියාත්මක කරන්න . උදා:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Action action = ActionFactory.getAction(request);
String view = action.execute(request, response);
if (view.equals(request.getPathInfo().substring(1)) {
request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
} else {
response.sendRedirect(view);
}
} catch (Exception e) {
throw new ServletException("Executing action failed.", e);
}
}
නැතහොත් JSF , Spring MVC , Wicket වැනි MVC රාමුවක් අනුගමනය කරන්න , එවිට ඔබට අභිරුචි සේවාදායකයක් නොමැතිව JSP / Facelets පිටුවක් සහ ජාවාබීන් පන්තියක් සමඟ අවසන් වේ.
ජේඑස්පී පිටුවක් තුළ ඇති ප්රවාහය පාලනය කිරීම සඳහා ඔබට යම් ජාවා කේතයක් යෙදීමට අවශ්ය නම්, ඔබට ජේඑස්ටීඑල් හරය වැනි (පවතින) ප්රවාහ පාලන ටැග්ලිබ් එකක් අල්ලා ගත යුතුය . උදා List<Product>
: වගුවක පෙන්වීම :
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
<c:forEach items="${products}" var="product">
<tr>
<td>${product.name}</td>
<td>${product.description}</td>
<td>${product.price}</td>
</tr>
</c:forEach>
</table>
විවිධ HTML හා ගැලපෙන XML ශෛලීය ටැග් සමඟ, කේතය විවිධ විවෘත හා සංවෘත වරහන් සහිත ස්ක්රිප්ට්ලට් පොකුරකට වඩා කියවිය හැකි (සහ වඩා හොඳින් නඩත්තු කළ හැකි) වේ ( "මෙම වසා දැමීමේ වරහන අයත් වන්නේ කොහේද?" ). පහත දැක්වෙන කොටස එකතු කිරීමෙන් ස්ක්රිප්ට්ලට් තවමත් භාවිතා කරන සෑම අවස්ථාවකම ව්යතිරේකයක් විසි කිරීම සඳහා ඔබේ වෙබ් යෙදුම වින්යාස කිරීම පහසු ආධාරයකිweb.xml
:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
දී Facelets , ජාවා EE කොටසක් වන JSP වන අනුප්රාප්තිකයා MVC රාමුව ලබා JSF , එය දැනටමත් නොවේ භාවිතා කිරීමට හැකි scriptlets . මේ ආකාරයෙන් ඔබට "නිවැරදි මාර්ගය" කිරීමට ස්වයංක්රීයව බල කෙරෙයි.
ජේඑස්පී පිටුවක් තුළ "බැකෙන්ඩ්" දත්ත වෙත ප්රවේශ වීමට සහ ප්රදර්ශනය කිරීමට ඔබට යම් ජාවා කේතයක් කැඳවීමට අවශ්ය නම්, ඔබ ඒ ${}
දේවල් EL (ප්රකාශන භාෂාව) භාවිතා කළ යුතුය . උදා: ඉදිරිපත් කළ ආදාන අගයන් නැවත ප්රදර්ශනය කිරීම:
<input type="text" name="foo" value="${param.foo}" />
හි ${param.foo}
ප්රති come ල පෙන්වයි request.getParameter("foo")
.
ඔබට සමහර උපයෝගීතා ජාවා කේත සෘජුවම ජේඑස්පී පිටුවට කැඳවීමට අවශ්ය නම් (සාමාන්යයෙන් public static
ක්රම), එවිට ඔබ ඒවා EL ශ්රිත ලෙස අර්ථ දැක්විය යුතුය. ජේඑස්ටීඑල් හි සම්මත කාර්යයන් ටැග්ලිබ් ඇත, නමුත් ඔබට පහසුවෙන්ම කාර්යයන් නිර්මාණය කළ හැකිය . XSS ප්රහාරfn:escapeXml
වැළැක්වීම සඳහා JSTL ප්රයෝජනවත් වන ආකාරය මෙන්න .
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
XSS සංවේදීතාව කිසිදු ආකාරයකින් ජාවා / ජේඑස්පී / ජේඑස්ටීඑල් / ඊඑල් / කුමක් හෝ සම්බන්ධ නොවන බව සලකන්න, ඔබ සංවර්ධනය කරන සෑම වෙබ් යෙදුමකදීම මෙම ගැටළුව සැලකිල්ලට ගත යුතුය . ස්ක්රිප්ට්ලෙට් වල ගැටළුව නම්, එය අවම වශයෙන් සම්මත ජාවා ඒපීඅයි භාවිතා නොකිරීම, බිල්ඩින් වැළැක්වීමේ ක්රමයක් ලබා නොදීමයි. ජේඑස්පී හි අනුප්රාප්තික ෆේස්ලෙට්ස් දැනටමත් ව්යාජ HTML ගැලවී යාමක් ඇති බැවින් ෆේස්ලට් වල එක්ස්එස්එස් සිදුරු ගැන කරදර විය යුතු නැත.