জেএসপি ১.২ নির্দিষ্টকরণ থেকে, জেএসপি স্ক্রিপ্টলেটগুলির প্রয়োজনীয়তা হ্রাস করতে আপনার ওয়েব অ্যাপ্লিকেশনটিতে জেএসপি স্ট্যান্ডার্ড ট্যাগ লাইব্রেরি (জেএসটিএল) ব্যবহার করার পরামর্শ দেওয়া হচ্ছে আপনার পৃষ্ঠাগুলিতে । জেএসটিএল ব্যবহার করা পৃষ্ঠাগুলি, সাধারণভাবে পড়া এবং রক্ষণাবেক্ষণ করা সহজ।
...
যেখানে সম্ভব, জেএসপি স্ক্রিপ্টলেটগুলি এড়িয়ে চলুন যখনই ট্যাগ লাইব্রেরিগুলি সমতুল্য কার্যকারিতা সরবরাহ করে। এটি পৃষ্ঠাগুলি পড়তে ও বজায় রাখা সহজ করে তোলে, ব্যবসায়িক যুক্তিকে উপস্থাপনা যুক্তি থেকে পৃথক করতে সহায়তা করে এবং আপনার পৃষ্ঠাগুলিকে জেএসপি ২.০-শৈলীর পৃষ্ঠাগুলিতে বিভক্ত করা সহজতর করবে (জেএসপি ২.০ স্পেসিফিকেশন সমর্থন করে তবে স্ক্রিপ্টলেটগুলির ব্যবহারকে ডি-জোর দেয়)।
...
ব্যবসায়িক যুক্তি থেকে উপস্থাপনা স্তরগুলির মধ্যে সংযোগ কমাতে মডেল-ভিউ-কন্ট্রোলার (এমভিসি) ডিজাইন প্যাটার্ন গ্রহণের চেতনায়, জেএসপি স্ক্রিপ্টলেটগুলিকে ব্যবসায়িক যুক্তি লেখার জন্য ব্যবহার করা উচিত নয় । পরিবর্তে, জেএসপি স্ক্রিপ্টলেটগুলি প্রয়োজনীয় তথ্যের রূপান্তর করার জন্য ব্যবহৃত হয় ("মান অবজেক্টস" নামেও পরিচিত) ক্লায়েন্টের অনুরোধগুলি যথাযথ ক্লায়েন্ট-প্রস্তুত বিন্যাসে প্রক্রিয়াকরণ থেকে ফিরে আসে। তারপরেও, ফ্রন্ট কন্ট্রোলার সার্লেট বা একটি কাস্টম ট্যাগ দিয়ে এটি আরও ভাল করা হবে।
আপনি যদি প্রতিটি অনুরোধে একই জাভা কোডটি চান , অনুরোধকৃত পৃষ্ঠাটি কম বা বেশি নির্বিশেষে, যেমন কোনও ব্যবহারকারী লগ ইন করেছেন কিনা তা পরীক্ষা করে দেখতে চান, তবে একটি ফিল্টার প্রয়োগ করুন এবং সেই অনুযায়ী পদ্ধতিতে কোড লিখুন । উদাহরণ: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.
}
}
বিভিন্ন ফলাফলের পৃষ্ঠা গন্তব্যস্থল সঙ্গে তার আচরণ এই পদ্ধতি সহজ: একটি ত্রুটি ক্ষেত্রে বৈধতা ত্রুটিযুক্ত ফর্ম redisplaying (এই বিশেষ উদাহরণ আপনি ব্যবহার করে এটি আবার দেখাও করতে ${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);
}
}
অথবা কেবল জেএসএফ , স্প্রিং এমভিসি , উইকেট ইত্যাদির মতো একটি এমভিসি কাঠামো গ্রহণ করুন যাতে আপনি কাস্টম সার্লেটের প্রয়োজন ছাড়াই কেবল একটি জেএসপি / ফেসলেট পৃষ্ঠা এবং জাভাবিয়ান শ্রেণিতে সমাপ্ত হন।
আপনি যদি কোনও জেএসপি পৃষ্ঠার অভ্যন্তরে প্রবাহ নিয়ন্ত্রণ করতে কিছু জাভা কোড শুরু করতে চান তবে আপনাকে জেএসটিএল কোরের মতো একটি (বিদ্যমান) ফ্লো কন্ট্রোল ট্যাগলিব গ্রহন করতে হবে । যেমন 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>
এক্সএমএল-স্টাইলের ট্যাগগুলির সাথে যা সমস্ত এইচটিএমএল-এর মধ্যে দুর্দান্তভাবে মাপসই হয়, কোডটি বিভিন্ন খোলার এবং বন্ধ হওয়ার ধনুর্বন্ধনী ( "হেক এই ক্লোজিং বন্ধনীটি কোথায়?" ) এর সাথে একগুচ্ছ স্ক্রিপ্টলেটগুলির চেয়ে আরও ভাল পঠনযোগ্য (এবং এইভাবে আরও ভাল বজায় রাখা যায় )। একটি সহজ সহায়তা হ'ল যখনই স্ক্রিপ্টলেট নিম্নলিখিত টুকরোটিতে যোগ করে ততক্ষণ স্ক্রিলেটলেটগুলি ব্যবহার করা হয় তখন একটি ব্যতিক্রম ছুঁড়ে ফেলার জন্য আপনার ওয়েব অ্যাপ্লিকেশনটিকে কনফিগার করা হয় web.xml
:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
ইন Facelets , JSP এর উত্তরাধিকারী, যা জাভা EE অংশ MVC ফ্রেমওয়ার্ক প্রদান JSF , এটা আগে থেকেই না সম্ভব ব্যবহারের scriptlets । এইভাবে আপনি স্বয়ংক্রিয়ভাবে জিনিসগুলি "সঠিক পথে" করতে বাধ্য হন।
আপনি যদি কোনও জেএসপি পৃষ্ঠার অভ্যন্তরে "ব্যাকএন্ড" ডেটা অ্যাক্সেস করতে এবং প্রদর্শন করতে কিছু জাভা কোডের আবেদন করতে চান , তবে আপনাকে সেই ${}
জিনিসগুলি EL (এক্সপ্রেশন ভাষা) ব্যবহার করতে হবে । যেমন জমা দেওয়া ইনপুট মানগুলি পুনঃনির্দেশকরণ:
<input type="text" name="foo" value="${param.foo}" />
${param.foo}
প্রদর্শন ফলাফল request.getParameter("foo")
।
আপনি যদি কিছুটা ইউটিলিটি জাভা কোড সরাসরি জেএসপি পৃষ্ঠায় (সাধারণত public static
পদ্ধতিগুলি) চালু করতে চান তবে আপনাকে সেগুলি EL ফাংশন হিসাবে সংজ্ঞায়িত করতে হবে। জেএসটিএলে একটি স্ট্যান্ডার্ড ফাংশন ট্যাগলিব রয়েছে তবে আপনি নিজেরাই সহজেই ফাংশন তৈরি করতে পারবেন । এক্সএসএস আক্রমণfn:escapeXml
প্রতিরোধে জেএসটিএল কীভাবে কার্যকর তা এখানে একটি উদাহরণ ।
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
নোট করুন যে এক্সএসএস সংবেদনশীলতা কোনওভাবেই জাভা / জেএসপি / জেএসটিএল / ইএল / যাই হোক না কেন সম্পর্কিত, আপনার বিকাশের প্রতিটি ওয়েব অ্যাপ্লিকেশনটিতে এই সমস্যাটি বিবেচনায় নেওয়া দরকার। স্ক্রিপ্টলেটগুলির সমস্যাটি হ'ল এটি বিল্টিন প্রতিরোধের কোনও উপায় সরবরাহ করে না, কমপক্ষে মানক জাভা এপিআই ব্যবহার না করে। জেএসপির উত্তরসূরি ফেসলেটস ইতিমধ্যে এইচটিএমএল এস্কেপিংয়ে অন্তর্ভুক্ত রয়েছে, তাই আপনাকে ফেসলেটগুলিতে এক্সএসএস গর্ত সম্পর্কে চিন্তা করার দরকার নেই।