জেএসপি ফাইলগুলিতে জাভা কোড এড়ানো যায় কীভাবে?


1673

আমি জাভা ইই তে নতুন এবং আমি জানি যে নিম্নলিখিত তিনটি লাইনের মতো কিছু

<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>

কোডিংয়ের একটি প্রাচীন স্কুল পদ্ধতি এবং জেএসপি সংস্করণ 2 এ জেএসপি ফাইলগুলিতে জাভা কোড এড়ানোর একটি পদ্ধতি রয়েছে। কেউ দয়া করে আমাকে বিকল্প জেএসপি 2 টি লাইন বলতে পারবেন এবং এই কৌশলটি কী বলা হয়?


22
@Koray Tugay, যতদিন কাউন্টার পরিবর্তনশীল হিসাবে কোথাও তার ব্যবহার করার পূর্বে ঘোষিত হয়, তাহলে এটি অবশ্যই বৈধ নয় ...
শেলডন আর

@SheldonR। এটি বৈধ: <% = কাউন্টার ++%> বা এটি: <%! int কাউন্টার = 0; int x = কাউন্টার ++; %> তবে নয়: <%! int কাউন্টার = 0; কাউন্টার ++,; %>
কোরাই টুগাই

@ কোরেটগুয়ে, আমার অর্থ হ'ল যদি ভেরিয়েবল কাউন্টারটি কোনও পূর্ববর্তী স্ক্রিপ্ট ব্লকে ঘোষণা করা হয় তবে এটি পরবর্তী ব্লকের মধ্যে বৈধ হওয়া উচিত। তবে শেষ পর্যন্ত, J2EE প্রোগ্রামারদের আজকাল স্ক্রিপ্টলেটগুলির পরিবর্তে ইএল ভেরিয়েবলগুলি ব্যবহার করা উচিত ...
শেল্ডন আর

উত্তর:


1971

ব্যবহারের scriptlets (যাদের <% %>কিছু) এ JSP প্রকৃতপক্ষে অত্যন্ত জন্ম যেহেতু নিরুৎসাহিত করা হয় taglibs (যেমন JSTL ) এবং এল ( এক্সপ্রেশন ভাষা , ঐ ${}জিনিষ) 2001 সালে পথ ফিরে।

লিপিগুলির প্রধান অসুবিধাগুলি হ'ল :

  1. পুনরায় ব্যবহারযোগ্যতা: আপনি স্ক্রিলেটগুলি পুনরায় ব্যবহার করতে পারবেন না।
  2. প্রতিস্থাপনযোগ্যতা: আপনি স্ক্রিপ্টলেট বিমূর্ত করতে পারবেন না।
  3. OO- ক্ষমতা: আপনি উত্তরাধিকার / রচনা ব্যবহার করতে পারবেন না।
  4. ডিবাজিবিলিটি: স্ক্রিলেটলে যদি একটি ব্যতিক্রম অর্ধেকটা ছুড়ে ফেলে তবে আপনি যা পান তা খালি পৃষ্ঠা।
  5. টেস্টিবিলিটি: স্ক্রিপ্টলেটগুলি ইউনিট- পরীক্ষামূলক নয়।
  6. Maintainability: মেশানো / বিশৃঙ্খলা / নকল কোড যুক্তি বজায় রাখতে সালডো প্রতি আরও সময় প্রয়োজন।

সান ওরাকল নিজেও জেএসপি কোডিং কনভেনশনগুলিতে সুপারিশ করেছেন যখনই (ট্যাগ) ক্লাস দ্বারা একই কার্যকারিতা সম্ভব হয় তখন স্ক্রিপ্টলেটগুলির ব্যবহার এড়ানোর জন্য । এখানে প্রাসঙ্গিকতার কয়েকটি উদ্ধৃতি দেওয়া হয়েছে:

জেএসপি ১.২ নির্দিষ্টকরণ থেকে, জেএসপি স্ক্রিপ্টলেটগুলির প্রয়োজনীয়তা হ্রাস করতে আপনার ওয়েব অ্যাপ্লিকেশনটিতে জেএসপি স্ট্যান্ডার্ড ট্যাগ লাইব্রেরি (জেএসটিএল) ব্যবহার করার পরামর্শ দেওয়া হচ্ছে আপনার পৃষ্ঠাগুলিতে । জেএসটিএল ব্যবহার করা পৃষ্ঠাগুলি, সাধারণভাবে পড়া এবং রক্ষণাবেক্ষণ করা সহজ।

...

যেখানে সম্ভব, জেএসপি স্ক্রিপ্টলেটগুলি এড়িয়ে চলুন যখনই ট্যাগ লাইব্রেরিগুলি সমতুল্য কার্যকারিতা সরবরাহ করে। এটি পৃষ্ঠাগুলি পড়তে ও বজায় রাখা সহজ করে তোলে, ব্যবসায়িক যুক্তিকে উপস্থাপনা যুক্তি থেকে পৃথক করতে সহায়তা করে এবং আপনার পৃষ্ঠাগুলিকে জেএসপি ২.০-শৈলীর পৃষ্ঠাগুলিতে বিভক্ত করা সহজতর করবে (জেএসপি ২.০ স্পেসিফিকেশন সমর্থন করে তবে স্ক্রিপ্টলেটগুলির ব্যবহারকে ডি-জোর দেয়)।

...

ব্যবসায়িক যুক্তি থেকে উপস্থাপনা স্তরগুলির মধ্যে সংযোগ কমাতে মডেল-ভিউ-কন্ট্রোলার (এমভিসি) ডিজাইন প্যাটার্ন গ্রহণের চেতনায়, জেএসপি স্ক্রিপ্টলেটগুলিকে ব্যবসায়িক যুক্তি লেখার জন্য ব্যবহার করা উচিত নয় । পরিবর্তে, জেএসপি স্ক্রিপ্টলেটগুলি প্রয়োজনীয় তথ্যের রূপান্তর করার জন্য ব্যবহৃত হয় ("মান অবজেক্টস" নামেও পরিচিত) ক্লায়েন্টের অনুরোধগুলি যথাযথ ক্লায়েন্ট-প্রস্তুত বিন্যাসে প্রক্রিয়াকরণ থেকে ফিরে আসে। তারপরেও, ফ্রন্ট কন্ট্রোলার সার্লেট বা একটি কাস্টম ট্যাগ দিয়ে এটি আরও ভাল করা হবে।


কীভাবে স্ক্রিপ্টলেটগুলি পুরোপুরি প্রতিস্থাপন করা যায় তা কোড / যুক্তির একমাত্র উদ্দেশ্যে নির্ভর করে। প্রায়শই বেশি এই কোডটি একটি পূর্ণ যোগ্য জাভা শ্রেণিতে স্থাপন করা উচিত:

  • আপনি যদি প্রতিটি অনুরোধে একই জাভা কোডটি চান , অনুরোধকৃত পৃষ্ঠাটি কম বা বেশি নির্বিশেষে, যেমন কোনও ব্যবহারকারী লগ ইন করেছেন কিনা তা পরীক্ষা করে দেখতে চান, তবে একটি ফিল্টার প্রয়োগ করুন এবং সেই অনুযায়ী পদ্ধতিতে কোড লিখুন । উদাহরণ: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)}" />

    নোট করুন যে এক্সএসএস সংবেদনশীলতা কোনওভাবেই জাভা / জেএসপি / জেএসটিএল / ইএল / যাই হোক না কেন সম্পর্কিত, আপনার বিকাশের প্রতিটি ওয়েব অ্যাপ্লিকেশনটিতে এই সমস্যাটি বিবেচনায় নেওয়া দরকার। স্ক্রিপ্টলেটগুলির সমস্যাটি হ'ল এটি বিল্টিন প্রতিরোধের কোনও উপায় সরবরাহ করে না, কমপক্ষে মানক জাভা এপিআই ব্যবহার না করে। জেএসপির উত্তরসূরি ফেসলেটস ইতিমধ্যে এইচটিএমএল এস্কেপিংয়ে অন্তর্ভুক্ত রয়েছে, তাই আপনাকে ফেসলেটগুলিতে এক্সএসএস গর্ত সম্পর্কে চিন্তা করার দরকার নেই।

আরো দেখুন:


117
+1 দুর্দান্ত উত্তর। তবে কৌতূহলবিহীন হবেন না, স্ক্রিলেটলেটগুলি ব্যবহার করে কিছু সময় ঠিক আছে, তবে এটি নিয়মের প্রমাণিত ব্যতিক্রম হওয়া উচিত।
সোয়াচন

26
@ সোয়াচন: স্ক্রিপ্টলেটগুলি দ্রুত প্রোটোটাইপিং / পরীক্ষার জন্য দরকারী। যতদূর আমি জানি, ওয়েব ব্রাউজারে ওয়েবপৃষ্ঠা পার্সিংয়ের কর্মক্ষমতা উন্নত করার জন্য এবং এর <% response.getWriter().flush(); %>মধ্যে একটিই একটি "স্ক্রিপ্টলেট" উত্পাদন ব্যবহার রয়েছে । সার্ভারের পাশের আউটপুট বাফার আকারটি (1 ~ 2KB) কম হলে এই ব্যবহারটি সম্পূর্ণ নগণ্য। এই নিবন্ধটি দেখুন</head><body>
বালাসসি

5
@ বালুসসি কয়েকবার আমি জাভা ক্লাসগুলির সাথে আটকে গিয়েছি যা গেটর / সেটার প্যাটার্নটি অনুসরণ করে না। আইএমএইচও এটি এমন একটি মামলা যেখানে একটি স্ক্রিপ্টলেট কাজ করে।
সোয়াচন

41
@ সোয়াচন: আমি এই ক্লাসগুলিকে নিজের জাবাবেইন ক্লাস দিয়ে জড়িয়ে রাখতাম এবং তার পরিবর্তে সেগুলি ব্যবহার করতাম।
বালাসসি

31
এটি একটি দুর্দান্ত উত্তর ছিল, তবে doGet এবং doPost অংশগুলি বিভ্রান্তিকর। এই পদ্ধতিগুলি নির্দিষ্ট অনুরোধ (হেড, জিইটি এবং পোষ্ট) পদ্ধতিগুলি পরিচালনা করার জন্য এবং "প্রিপ্রসেসিং" বা "পোস্টপ্রসেসিং" অনুরোধের জন্য নয়!
MetroidFan2002

225

সেফগার্ড হিসাবে: ভাল জন্য স্ক্রিপ্টলেট অক্ষম করুন

হিসাবে আরেকটি প্রশ্ন নিয়ে আলোচনা করছে, আপনি সবসময় scriptlets আপনার অক্ষম করা উচিত পারবেন web.xmlওয়েব অ্যাপ্লিকেশন বর্ননাকারী।

কোনও বিকাশকারীকে স্ক্রিলেটলেট যুক্ত করা রোধ করার জন্য আমি সর্বদা এটি করব, বিশেষত বড় বড় সংস্থাগুলিতে যেখানে আপনি খুব শীঘ্রই বা ওভারভিউ হারাবেন। web.xmlসেটিংস এই মত চেহারা:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>

4
এটি কি স্ক্রিপ্টলেট মন্তব্যগুলিও অক্ষম করে ?: <%-- comment that i don't want in the final HTML --%>। আমি এইচটিএমএল মন্তব্যের চেয়ে এগুলি ব্যবহার করা দরকারী বলে মনে করি।
ডেভিড ল্যাভেন্ডার

16
@ মিস্টারস্পুন আপনার জন্য একটি উত্তর সন্ধান করেছে। অনুযায়ী এই উত্তর + + মন্তব্য , scriptlets বন্ধ এই পালাক্রমে <% %>, scriptlet এক্সপ্রেশন <%! %>, এবং scriptlet ঘোষণা <%= %>। এর অর্থ নির্দেশনা <%@ %>এবং মন্তব্যগুলি <%-- --%>সক্ষম এবং ব্যবহারযোগ্য হয়ে থাকে, সুতরাং আপনি এখনও মন্তব্য করতে পারেন এবং এতে অন্তর্ভুক্ত থাকতে পারেন।
মার্টিন কার্নি

3
লিপি নির্দেশিকা নিষ্ক্রিয় করা ভয়ানক হবে - অতিরিক্ত শ্বেত স্পেস দিয়ে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে leg
কর্সিকা

108

জেএসটিএল শর্তসাপেক্ষ, লুপস, সেট, গেস ইত্যাদির জন্য ট্যাগ সরবরাহ করে example উদাহরণস্বরূপ:

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

জেএসটিএল অনুরোধের বৈশিষ্ট্যগুলির সাথে কাজ করে - এগুলি প্রায়শই কোনও সার্লেট দ্বারা অনুরোধে সেট করা থাকে, যা জেএসপিতে ফরোয়ার্ড করে।


2
আপনি কেন বলেন যে জেএসটিএল অনুরোধের গুণাবলী নিয়ে কাজ করে? তারা যে কোনও সুযোগে গুণাবলী নিয়ে কাজ করতে পারে, তাই না?
Koray Tugay

60

আমি সঠিক না আমি নিশ্চিত না।

আপনার এমভিসি সম্পর্কে কিছু পড়া উচিত। স্প্রিং এমভিসি এবং স্ট্রুটস 2 হল দুটি সাধারণ সমাধান।


29
এমভিসি সার্ভলেট / জেএসপি দিয়ে স্প্রিং বা স্ট্রুট ছাড়াই উপরের অনেকগুলি কৌশল ব্যবহার করে প্রয়োগ করা যেতে পারে।
স্টেপানিয়ান

18
কিভাবে এটি প্রশ্নের উত্তর?
xyz

54

জাভা এবং এইচটিএমএল কোডকে আন্তঃব্যক্ত করা এড়াতে আপনি EL এক্সপ্রেশনগুলির সাথে জেএসটিএল ট্যাগগুলি ব্যবহার করতে পারেন:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
    <head>
    </head>
    <body>

        <c:out value="${x + 1}" />
        <c:out value="${param.name}" />
        // and so on

    </body>
</html>

34

উইকেটের মতো উপাদান-ভিত্তিক ফ্রেমওয়ার্কগুলিও রয়েছে যা আপনার জন্য অনেকগুলি HTML তৈরি করে gene এইচটিএমএল-এ শেষ হওয়া ট্যাগগুলি অত্যন্ত মৌলিক এবং কার্যত এমন কোনও যুক্তি নেই যা মিশে যায় The ফলাফলটি প্রায় খালি জাতীয় HTML পৃষ্ঠাগুলির মতো HTML পৃষ্ঠাগুলি। নেতিবাচক দিকটি হ'ল উইকেট এপিআইতে প্রচুর উপাদান শিখতে হয় এবং কিছু সীমাবদ্ধতার অধীনে অর্জন করা কঠিন হতে পারে।


33

এমভিসি আর্কিটেকচারাল প্যাটার্নে, জেএসপিগুলি ভিউ স্তরটিকে উপস্থাপন করে। জেএসপিগুলিতে জাভা কোড এম্বেড করা একটি খারাপ অভ্যাস হিসাবে বিবেচিত হয়। আপনি ব্যবহার করতে পারেন JSTL , freeMarker , বেগ "টেমপ্লেট ইঞ্জিন" হিসাবে JSP সঙ্গে। এই ট্যাগগুলিতে ডেটা সরবরাহকারী আপনার সাথে কাজ করা ফ্রেমওয়ার্কের উপর নির্ভর করেStruts 2এবং webworkএমভিসি প্যাটার্নের বাস্তবায়ন হিসাবে ওজিএনএল " জেএসপিতে শিমের বৈশিষ্ট্য প্রকাশ করার জন্য খুব আকর্ষণীয় কৌশল" ব্যবহার করে।


27

অভিজ্ঞতা দেখিয়েছে যে জেএসপির কিছু ত্রুটি রয়েছে, তাদের মধ্যে একটি সত্যিকারের কোডের সাথে মার্কআপ মিশ্রণ এড়াতে কঠিন।

যদি আপনি পারেন তবে আপনার যা করা দরকার তার জন্য একটি বিশেষ প্রযুক্তি ব্যবহার করার বিষয়টি বিবেচনা করুন। জাভা ইই 6 এ জেএসএফ 2.0 রয়েছে, যা জেএসএফ পৃষ্ঠাগুলির সাথে #{bean.method(argument)}পদ্ধতির মাধ্যমে একসাথে জাভা বিনগুলি গ্লুয়িং সহ অনেকগুলি দুর্দান্ত বৈশিষ্ট্য সরবরাহ করে।


3
পুরানো উত্তর কিন্তু আমি জেএসএফ জাভা স্পেসের মধ্যে অন্যতম ভয়াবহ উদ্ভাবন তা বলতে প্রতিহত করতে পারি না। একটি সিঙ্গল (এইচটিটিপি পেতে পছন্দ করুন) লিঙ্ক তৈরি করার চেষ্টা করুন এবং আপনি বুঝতে পারবেন কেন।
অ্যালেক্স

@ অ্যালেক্স তবে এখনও আরও ভাল। আরও ভাল কিছু সুপারিশ করতে নির্দ্বিধায়।
থোরবজর্ন রাভন অ্যান্ডারসন

26

আপনি যদি জেএসপিতে জাভা কোডিংয়ের অসুবিধাগুলি এড়াতে চান তবে আপনি স্ক্রিপলেট দিয়েও এটি করতে পারেন। জেএসপিতে ন্যূনতম জাভা থাকার জন্য কিছু শৃঙ্খলা অনুসরণ করুন এবং জেএসপি পৃষ্ঠায় প্রায় কোনও গণনা এবং যুক্তি নেই।

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%//instantiate a JSP controller
MyController clr = new MyController(request, response);

//process action if any
clr.process(request);

//process page forwaring if necessary

//do all variable assignment here
String showMe = clr.getShowMe();%>

<html>
    <head>
    </head>
    <body>
        <form name="frm1">
            <p><%= showMe %>
            <p><% for(String str : clr.listOfStrings()) { %>
            <p><%= str %><% } %>

            // and so on   
        </form>
    </body>
</html>

26

জেএসটিএল ব্যবহার করে নিজস্ব ট্যাগগুলি কাস্টমাইজ করতে এবং লিখতে শিখুন

নোট করুন যে EL EviL (রানটাইম ব্যতিক্রম, রিফ্যাক্টরিং) উইকেটটি
খুব খারাপ হতে পারে (পারফরম্যান্স, ছোট অ্যাপ্লিকেশনগুলির জন্য পরিশ্রমী বা সাধারণ দর্শনের স্তর) জাভা 2 এর

উদাহরণ ,

এটি অবশ্যই ওয়েব অ্যাপ্লিকেশনের ওয়েব.এক্সএমএলে যুক্ত করা উচিত

<taglib>
    <taglib-uri>/java2s</taglib-uri>
    <taglib-location>/WEB-INF/java2s.tld</taglib-location>
</taglib>

ফাইল তৈরি করুন: / ja2s.tld / WEB-INF / এ

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- a tab library descriptor -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Java2s Simple Tags</short-name>

    <!-- this tag manipulates its body content by converting it to upper case
    -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

নিম্নলিখিত কোডটি ওয়েব-আইএনএফ \ ক্লাস \ কম \ জাভা 2 তে সংকলন করুন

package com.java2s;

import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyContentTag extends BodyTagSupport{
    private int iterations, howMany;

    public void setHowMany(int i){
        this.howMany = i;
    }

    public void setBodyContent(BodyContent bc){
        super.setBodyContent(bc);
        System.out.println("BodyContent = '" + bc.getString() + "'");
    }

    public int doAfterBody(){
        try{    
            BodyContent bodyContent = super.getBodyContent();
            String bodyString  = bodyContent.getString();
            JspWriter out = bodyContent.getEnclosingWriter();

            if ( iterations % 2 == 0 ) 
                out.print(bodyString.toLowerCase());
            else
                out.print(bodyString.toUpperCase());

            iterations++;
            bodyContent.clear(); // empty buffer for next evaluation
        }
        catch (IOException e) {
            System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
            e.printStackTrace();
        } // end of catch

        int retValue = SKIP_BODY;

        if ( iterations < howMany ) 
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

সার্ভার আরম্ভ করুন এবং ব্রাউজারে bodyContent.jsp লোড করুন

<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
    <head>
        <title>A custom tag: body content</title>
    </head>
    <body>
        This page uses a custom tag manipulates its body content.Here is its output:
        <ol>
            <java2s:bodyContentTag howMany="3">
            <li>java2s.com</li>
            </java2s:bodyContentTag>
        </ol>
    </body>
</html>

যদিও উপাদানগুলির
পুনঃব্যবহারযোগ্যতা

25

উইকেট হ'ল একটি বিকল্প যা জাভাটিকে এইচটিএমএল থেকে সম্পূর্ণ পৃথক করে, তাই ডিজাইনার এবং প্রোগ্রামার একে অপরের সামান্য বোঝার সাথে একত্রে এবং কোডের বিভিন্ন সেটগুলিতে কাজ করতে পারেন।

উইকেট তাকান।


23

আপনি একটি ভাল প্রশ্ন উত্থাপন করেছিলেন এবং যদিও আপনার ভাল উত্তর পেয়েছে তবে আমি আপনাকে জেএসপি থেকে মুক্তি দেওয়ার পরামর্শ দেব। এটি পুরানো প্রযুক্তি যা শেষ পর্যন্ত মারা যাবে। টেম্পলেট ইঞ্জিনগুলির মতো একটি আধুনিক পদ্ধতির ব্যবহার করুন। আপনার ব্যবসা এবং উপস্থাপনা স্তরগুলির খুব স্পষ্ট বিভাজন থাকবে এবং টেমপ্লেটগুলিতে অবশ্যই জাভা কোড নেই, তাই আপনি ডাব্লুওয়াইএসআইডাব্লুওয়াইজি ব্যবহারের বেশিরভাগ ক্ষেত্রে সরাসরি ওয়েব উপস্থাপনা সম্পাদনা সফ্টওয়্যার থেকে টেমপ্লেট তৈরি করতে পারেন।

এবং অবশ্যই ফিল্টার এবং প্রাক এবং পোস্ট প্রসেসিং থেকে দূরে থাকুন, অন্যথায় আপনি সমর্থন / ডিবাগিং অসুবিধাগুলি মোকাবেলা করতে পারেন যেহেতু আপনি সবসময় জানেন না যে ভেরিয়েবলটির মান কোথায় পাওয়া যায়।


9
জেএসপি নিজেই একটি টেম্পলেট ইঞ্জিন
ওয়ারফক্স

1
-1 - ফিল্টার, প্রাক প্রসেসর এবং পোস্ট প্রসেসর ব্যবহার করার জন্য অনেকগুলি সম্পূর্ণ বৈধ কারণ রয়েছে। হ্যাঁ, আপনি রহস্যজনক বলে মনে হচ্ছে এমন মানগুলি শেষ করতে পারেন, তবে আপনি যদি আপনার স্থাপত্যটি বোঝেন তবে তা নয়।
রাস্টি দ্য বয়রবোট

21

জেএসপি ফাইলগুলিতে জাভা কোড এড়ানোর জন্য জাভা এখন জেএসটিএলের মতো ট্যাগ লাইব্রেরিও সরবরাহ করে জাভা জেএসএফ নিয়ে এসেছে যা আপনি ট্যাগ আকারে সমস্ত প্রোগ্রামিং কাঠামো লিখতে পারেন


21

আপনি অন্যান্য বিকাশকারীদের সাথে কাজ করার সময় আপনি যতটা এড়ানোর চেষ্টা করবেন না কেন, তাদের মধ্যে কিছু এখনও স্ক্রিপ্টলেটটিকে পছন্দ করবে এবং তারপরে প্রকল্পে দুষ্ট কোডটি সন্নিবেশ করবে। সুতরাং, আপনি যদি সত্যিই স্ক্রিপ্টলেট কোডটি হ্রাস করতে চান তবে প্রথম সাইনটিতে প্রকল্পটি স্থাপন করা খুব গুরুত্বপূর্ণ। এটিকে কাটিয়ে উঠতে বেশ কয়েকটি কৌশল রয়েছে (অন্যান্য ফ্রেমওয়ার্কগুলিও উল্লেখ করা আছে যা সহ) তবে, আপনি যদি খাঁটি জেএসপি উপায় পছন্দ করেন তবে জেএসটিএল ট্যাগ ফাইলটি ব্যবহার করুন। এটি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনিও আপনার প্রকল্পের জন্য মাস্টার পৃষ্ঠাগুলি সেট আপ করতে পারেন, যাতে অন্য পৃষ্ঠাগুলি মাস্টার পৃষ্ঠাগুলি উত্তরাধিকার সূত্রে নিতে পারে

আপনার ওয়েব-আইএনএফ / ট্যাগগুলির নীচে নিম্নলিখিত বিষয়বস্তুতে বেস.টাগ নামে একটি মাস্টার পৃষ্ঠা তৈরি করুন

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>

<%@attribute name="title" fragment="true" %>

<html>
  <head>
    <title>  
       <jsp:invoke fragment="title"></jsp:invoke>
    </title>

  </head>
  <body>
    <div id="page-header">
       ....
    </div>
    <div id="page-body">
      <jsp:doBody/>
    </div>
    <div id="page-footer">
      .....
    </div>
  </body>
</html>

এই ম্যাটার পৃষ্ঠায়, আমি "শিরোনাম" নামে একটি খণ্ড তৈরি করেছি, যাতে শিশু পৃষ্ঠায়, আমি মাস্টার পৃষ্ঠার এই জায়গাতে আরও কোড সন্নিবেশ করতে পারি। এছাড়াও, ট্যাগ<jsp:doBody/> শিশু পৃষ্ঠার সামগ্রী দ্বারা প্রতিস্থাপন করা হবে

আপনার ওয়েবসন্টেন্ট ফোল্ডারে চাইল্ড পৃষ্ঠা (চাইল্ড.জেপি) তৈরি করুন:

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:base>
    <jsp:attribute name="title"> 
        <bean:message key="hello.world" />
    </jsp:attribute>

    <jsp:body>
    [Put your content of the child here]
    </jsp:body>   
</t:base>

<t:base>আপনি যে মাস্টার পৃষ্ঠাটি ব্যবহার করতে চান তা নির্দিষ্ট করতে ব্যবহার করা হয় (যা এই মুহুর্তে বেস.ট্যাগ)। <jsp:body>এখানে ট্যাগের সমস্ত সামগ্রী <jsp:doBody/>আপনার মাস্টার পৃষ্ঠায় প্রতিস্থাপন করবে । আপনার সন্তানের পৃষ্ঠায় কোনও ট্যাগ লিবিও অন্তর্ভুক্ত থাকতে পারে এবং আপনি অন্যান্য উল্লিখিত মত এটি সাধারণত ব্যবহার করতে পারেন। তবে, আপনি যদি এখানে কোনও স্ক্রিলেটলেট কোড ব্যবহার করেন ( <%= request.getParameter("name") %>...) এবং এই পৃষ্ঠাটি চালানোর চেষ্টা করেন, আপনি একটি পাবেনJasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here । অতএব, অন্য লোকেরা দুষ্ট কোডটি jsp ফাইলে অন্তর্ভুক্ত করতে পারে এমন কোনও উপায় নেই

আপনার নিয়ামক থেকে এই পৃষ্ঠাটি কল করা:

আপনি সহজেই আপনার কন্ট্রোলার থেকে চাইল্ড.জেপ ফাইলটি কল করতে পারেন। এটি স্ট্রट्स ফ্রেমওয়ার্কের সাথেও দুর্দান্ত কাজ করে


"আপনি অন্যান্য বিকাশকারীদের সাথে কাজ করার পরে আপনি যতটা এড়াতে চেষ্টা করুন না কেন, তাদের মধ্যে কিছু এখনও স্ক্রিপ্টলেট পছন্দ করবে এবং তারপরে প্রকল্পে দুষ্ট কোডটি সন্নিবেশ করবে।" "একটি সুরক্ষার হিসাবে: উত্তমর জন্য স্ক্রিপ্টলেটগুলি অক্ষম করুন" দেখুন।
Lluis মার্টিনেজ


18

কেবল জেএসটিএল ট্যাগ এবং ইএল এক্সপ্রেশন ব্যবহার করুন।


17

যদি কেউ সত্যিই একের অধিক ভাষায় প্রোগ্রামিংয়ের বিপক্ষে থাকে তবে আমি জিডাব্লুটিটির পরামর্শ দিচ্ছি, তাত্ত্বিকভাবে আপনি সমস্ত জেএস এবং এইচটিএমএল উপাদানগুলি এড়াতে পারবেন, কারণ গুগল টুলকিট সমস্ত ক্লায়েন্ট এবং শেয়ার্ড কোডকে জেএসে রূপান্তর করে, আপনার তাদের সাথে সমস্যা হবে না, তাই অন্য কোনও ভাষায় কোড না করেই আপনার একটি ওয়েবসার্ভিস রয়েছে। এমনকি আপনি কোথাও থেকে কিছু ডিফল্ট সিএসএস ব্যবহার করতে পারেন যেমন এটি এক্সটেনশনগুলি (স্মার্টজিডব্লিউটি বা ভাদিন) দিয়ে থাকে। আপনার কয়েক ডজন টিকা শেখার দরকার নেই।

অবশ্যই যদি আপনি চান, আপনি কোডের গভীরতায় নিজেকে হ্যাক করতে পারেন এবং জেএস ইনজেক্ট করতে পারেন এবং আপনার এইচটিএমএল পৃষ্ঠা সমৃদ্ধ করতে পারেন, তবে আপনি যদি চান তবে এটি এড়াতে পারবেন, এবং ফলাফলটি অন্য কোনও ফ্রেমওয়ার্কে যেমন লেখা হয়েছিল তেমন ভাল হবে। আমি বলি একটি চেষ্টা মূল্য, এবং বেসিক GWT ভাল নথিভুক্ত।

এবং অবশ্যই অনেক সহকর্মী প্রোগ্রামারগণ আরও কয়েকটি সমাধানের বর্ণনা বা সুপারিশ করেছেন। জিডব্লিউটি হ'ল এমন লোকদের জন্য যারা ওয়েব অংশটি সত্যিকার অর্থে ডিল করতে বা এটি হ্রাস করতে চান না।


1
আসলেই ওপি-র প্রশ্নের উত্তর দেয় না।
ইভান ডোনভান

1
@ ইভডোনভান ভাল, কার্যত এটি একটি উত্তর দেয়। জাভা কোডগুলি অন্যান্য ভাষার সাথে মিশ্রিত করতে আপনাকে গণ্ডগোলের দরকার নেই। আমি স্বীকার করি এটি কোডিংয়ের জন্য জাভা ব্যবহার করে তবে জাভা কল ছাড়াই এটি জেএসে অনুবাদ করা হবে। তবে কীভাবে ক্লাসিক জেএসপির বিশৃঙ্খলা এড়ানো যায় সে প্রশ্নের প্রশ্নের অবকাশ। এবং জিডব্লিউটি প্রযুক্তি এটি সমাধান করে। আমি এই উত্তরটি যুক্ত করেছি যেহেতু কেউ এটির উল্লেখ করেনি, তবে এটি প্রাসঙ্গিক যেহেতু এটি জেএসপির বিকল্প। আমি প্রশ্নের পুরো ক্ষেত্রের উত্তর দিতে চাইনি, তবে বিকল্পের দিকে ঝুঁকছেন এমন লোকদের জন্য একটি মূল্যবান তথ্য যুক্ত করতে।
সিএস বালাজস হুঙ্গারি

16

পাইথন জগতের একটি ঝরঝরে ধারণা হ'ল টেমপ্লেট অ্যাট্রিবিউট ভাষা ; টিএলটি জোপ (অতএব ওরফে "জোপ পৃষ্ঠা টেম্পলেটগুলি", জেডপিটি) দ্বারা প্রবর্তিত হয়েছিল এবং এটি একটি মান, এটি পিএইচপি, এক্সএসএলটি এবং জাভাতেও বাস্তবায়িত হয়েছে (আমি পাইথন / জোপ এবং পিএইচপি অবতার ব্যবহার করেছি)। টেম্প্লেটিং ভাষাগুলির এই শ্রেণিতে, উপরের উদাহরণটি দেখতে এরকম হতে পারে:

<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name">Example product</td>
        <td tal:content="product/description">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

কোডটি সাধারণ এইচটিএমএল (বা এক্সএইচটিএমএল) প্লাস কোনও এক্সএমএল নেমস্পেসে কিছু বিশেষ বৈশিষ্ট্যগুলির মতো দেখায়; এটি একটি ব্রাউজারের সাথে দেখা যায় এবং কোনও ডিজাইনার নিরাপদে টুইট করতে পারেন। ম্যাক্রো এবং আই 18 এন এর জন্যও সমর্থন রয়েছে:

<h1 i18n:translate="">Our special offers</h1>
<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name"
            i18n:translate="">Example product</td>
        <td tal:content="product/description"
            i18n:translate="">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

যদি সামগ্রীর অনুবাদ উপলব্ধ থাকে তবে সেগুলি ব্যবহৃত হয়।

যদিও জাভা বাস্তবায়ন সম্পর্কে আমি খুব বেশি জানি না ।


1
জেএসপি ২০০৯ সালের ডিসেম্বরের পরে ফেসলেটস দ্বারা সফল হয়েছিল যা এই স্টাফগুলিকে সমর্থন করে। ফেসলেটগুলিও এক্সএমএল ভিত্তিক। অন্যান্যের মধ্যে আরও দেখুন মধ্যে জাভা EE 6 টিউটোরিয়াল Facelets অধ্যায় এবং ui:xxxFacelts VDL আপনাকে ট্যাগ করলে
বালাসসি

আমি ফেসলেটগুলি খুব ভাল জানি না, তবে আইআইআরসি এটি সমস্তই ক্লাস লেখার বিষয়ে যা কাস্টম এক্সএমএল উপাদানগুলি প্রয়োগ করে। টাল / জেডপিটি উপায়টি হ'ল টেমপ্লেটগুলি থাকতে পারে যাতে সত্য (এক্স) এইচটিএমএল থাকে বিশেষ বৈশিষ্ট্যযুক্ত যা মূল উপাদানগুলি পূরণ করে বা প্রতিস্থাপন করে; সুতরাং, আপনি কার্যকরী টেম্পলেট দেখতে এবং সুন্দর ডামি সামগ্রী সহ একটি প্রোটোটাইপ দেখতে পারেন। আমি নিশ্চিত নই যে ফেসলেটগুলি কাস্টম বৈশিষ্ট্যগুলি ব্যবহার করে মূল এইচটিএমএল এলিমেন্টগুলি (w / o একটি অতিরিক্ত নেমস্পেস) টুইঙ্ক করতে দেয়।
টোবিয়াস

এই ফেসলেটস স্টাফটিতে আমার কেবল অন্য চেহারা ছিল। এটিতে বৈধতা সংক্রান্ত সমস্ত ধরণের সুবিধা ইত্যাদি রয়েছে এবং এটি টালের চেয়ে সম্পূর্ণ আলাদা দর্শন অনুসরণ করে। টাল উপায়টি হ'ল, "লজিকটিকে যতটা সম্ভব পরিষ্কারভাবে টেমপ্লেট থেকে দূরে সরিয়ে রাখুন; নিয়ন্ত্রক যে সমস্ত জটিল জিনিস এটি খাওয়ান তা সম্পন্ন করুন" " আপনি কোনও ডিজাইনার এটির জন্য এটি কোনও ফেসলেটস টেমপ্লেট দিতে পারবেন না; এটা ঠিক সম্ভব নয়। উত্পন্ন সামগ্রী সম্পর্কে - এটি tal:replace="structure (expression)"সর্বদা অ্যাট্রিবিউট ব্যবহার করার মতো।
টোবিয়াস

15

জেএসপিতে স্ক্রিপ্টলেট ব্যবহার করা ভাল অভ্যাস নয়।

পরিবর্তে, আপনি ব্যবহার করতে পারেন:

  1. জেএসটিএল ট্যাগগুলি
  2. EL এক্সপ্রেশন
  3. কাস্টম ট্যাগ্স - আপনি নিজের নিজস্ব ট্যাগ ব্যবহার করতে পারেন।

দয়া করে দেখুন:

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. এল

14

অবশ্যই, প্রতিস্থাপন <%! counter++; %> কোনও ইভেন্টের উত্পাদক-ভোক্তা আর্কিটেকচার দ্বারা যেখানে ব্যবসায়ের স্তরকে কাউন্টার বাড়ানোর প্রয়োজনীয়তা সম্পর্কে অবহিত করা হয়েছে, এটি সেই অনুযায়ী প্রতিক্রিয়া দেখায় এবং উপস্থাপকদের অবহিত করে যাতে তারা মতামত আপডেট করে। অনেকগুলি ডাটাবেস লেনদেন জড়িত, যেহেতু ভবিষ্যতে আমাদের কাউন্টারটির নতুন এবং পুরাতন মান জানতে হবে, কে এটি বাড়িয়েছে এবং কী উদ্দেশ্য বিবেচনা করে। স্পষ্টতই সিরিয়ালাইজেশন জড়িত, যেহেতু স্তরগুলি পুরোপুরি ডিকপলড। আপনি আরএমআই, আইওওপি, এসওএপি-র মাধ্যমে আপনার কাউন্টারকে বাড়িয়ে তুলতে সক্ষম হবেন। তবে কেবল এইচটিএমএল প্রয়োজন, যা আপনি বাস্তবায়ন করেন না, কারণ এটি এমন জাগতিক মামলা। আপনার নতুন লক্ষ্যটি হল আপনার নতুন চকচকে ই 7, 64 জিবি র‌্যাম সার্ভারে 250 সেকেন্ডে সেকেন্ডে পৌঁছানো।

প্রোগ্রামিংয়ে আমার 20 বছরেরও বেশি সময় রয়েছে, বেশিরভাগ প্রকল্পগুলি সেক্সটেটের আগে ব্যর্থ হয়: পুনরায় ব্যবহারযোগ্যতা প্রতিস্থাপনের ওও-ক্ষমতা ডিবাগিবিলিটি টেস্টিবিলিটি মেইনটেইনটেবলি এমনকি প্রয়োজন। কেবলমাত্র কার্যকারিতা দেখাশোনা করে এমন লোকেদের দ্বারা পরিচালিত অন্যান্য প্রকল্পগুলি অত্যন্ত সফল হয়েছিল। এছাড়াও, প্রকল্পের খুব তাড়াতাড়ি বাস্তবায়িত কঠোর অবজেক্ট স্ট্রাকচারটি কোডটিকে স্পেসিফিকেশনের (ওরফে চটপটে) কঠোর পরিবর্তনের সাথে মানিয়ে নিতে অক্ষম করে তোলে।

সুতরাং আমি "লেয়ার" বা অপ্রয়োজনীয় ডেটা স্ট্রাকচার সংজ্ঞায়নের কার্যক্রমটি প্রজেক্টের প্রথম দিকে বা বিশেষভাবে প্রয়োজন না হলে বিবেচনা করি।  


11

প্রযুক্তিগতভাবে, জেএসপি সমস্ত রানটাইমের সময় সার্ভলেটে রূপান্তরিত হয় । জেএসপি প্রথমে এমভিসি প্যাটার্ন অনুসরণ করে ব্যবসায়ের যুক্তি এবং নকশার যুক্তি ডিক্লুপ করার উদ্দেশ্যে তৈরি করা হয়েছিল। সুতরাং জেএসপি রানটাইমের সময় প্রযুক্তিগতভাবে সমস্ত জাভা কোড। তবে প্রশ্নের উত্তর দেওয়ার জন্য, ট্যাগ লাইব্রেরিগুলি সাধারণত জেএসপি পৃষ্ঠাগুলিতে যুক্তি প্রয়োগ করার (জাভা কোডগুলি অপসারণ) করতে ব্যবহৃত হয়।


8

আমরা যদি জাভা ওয়েব অ্যাপ্লিকেশনটিতে নিম্নোক্ত জিনিসগুলি ব্যবহার করি, জাভা কোডটি জেএসপির অগ্রভাগ থেকে মুছে ফেলা যায়।

  1. ওয়েব অ্যাপ্লিকেশনের জন্য এমভিসি আর্কিটেকচার ব্যবহার করুন

  2. জেএসপি ট্যাগ ব্যবহার করুন

    ক। স্ট্যান্ডার্ড ট্যাগ

    খ। কাস্টম ট্যাগস

  3. এক্সপ্রেশন ভাষা


8

জেএসপি ফাইলগুলিতে জাভা কোড এড়ানো যায় কীভাবে?

আপনি এক্সপ্রেশন ল্যাঙ্গুয়েজ ( EL ) এর পাশাপাশি জেএসটিএলের মতো ট্যাব লাইব্রেরি ট্যাগ ব্যবহার করতে পারেন । তবে ইএস জেএসপি নিয়ে ভাল কাজ করে না। সুতরাং সম্ভবত জেএসপি পুরোপুরি ফেলে ফেইসলেট ব্যবহার করা ভাল

ফেসলেটস হ'ল জেএসএফ (জাভা সার্ভার ফেসস) এর জন্য ডিজাইন করা প্রথম নন জেএসপি পৃষ্ঠা ঘোষণার ভাষা যা জেএসপির তুলনায় জেএসএফ বিকাশকারীদের একটি সহজ এবং আরও শক্তিশালী প্রোগ্রামিং মডেল সরবরাহ করেছে। এটি ওয়েব অ্যাপ্লিকেশন বিকাশের জন্য জেএসপিতে ঘটে যাওয়া বিভিন্ন সমস্যার সমাধান করে।

এখানে চিত্র বর্ণনা লিখুন

সূত্র


আমি অবশ্যই এই প্রতিক্রিয়া দ্বিতীয়। জেএসএফ ফেসলেটস সহ বা ছাড়াই। আমি ভেবেছিলাম 10 বছরেরও বেশি আগে জেএসপিতে বিকাশ বেশিরভাগভাবে বন্ধ হয়ে গেছে। আমি সর্বশেষ 2000 সালে জেএসপি লিখেছি!
ক্যাগেজ করুন

4

স্ক্রিপ্টলেটগুলি ব্যবহার করা খুব পুরানো উপায় এবং প্রস্তাবিত নয়। আপনি যদি আপনার জেএসপি পৃষ্ঠাগুলিতে সরাসরি কিছু আউটপুট করতে চান তবে জেএসটিএল সহ এক্সপ্রেশন ল্যাঙ্গুয়েজ (ইএল) ব্যবহার করুন

অন্যান্য বিকল্প রয়েছে যেমন একটি টেম্পলেটিং ইঞ্জিন যেমন ভেলোসিটি, ফ্রিমার্কার, থাইমালিফ ইত্যাদি ব্যবহার করা তবে EL এবং জেএসটিএল এর সাথে সরল জেএসপি ব্যবহার করা আমার উদ্দেশ্যটির বেশিরভাগ সময় পরিবেশন করে এবং এটি কোনও নবজাতকের পক্ষে সহজতম বলে মনে হয়।

এছাড়াও, নোট করুন যে ভিউ লেয়ারে ব্যবসায়িক যুক্তি করা সর্বোত্তম অনুশীলন নয়, আপনার পরিষেবা স্তরটিতে আপনার ব্যবসায়িক লজিকগুলি সম্পাদন করা উচিত এবং একটি নিয়ামকের মাধ্যমে আউটপুট ফলাফলটি আপনার দর্শনে দেওয়া উচিত।


3

এর আর কিছুই আমার বন্ধু ব্যবহৃত হয় না, আমার পরামর্শটি সার্ভার থেকে ভিউ (সিএসএস, এইচটিএমএল, জাভাস্ক্রিপ্ট, ইত্যাদি) ডিকুয়াল করার জন্য।

আমার ক্ষেত্রে আমি আমার সিস্টেমগুলি কৌনিকের সাথে ভিউ পরিচালনা করে এবং প্রয়োজনীয় কোনও ডেটা সার্ভার থেকে বিশ্রাম পরিষেবাগুলি ব্যবহার করে আনা হয়।

বিশ্বাস করুন, এটি আপনার নকশার পদ্ধতি পরিবর্তন করবে


3

ইউআই ডিজাইনের জন্য জাভাস্ক্রিপ্ট কাঠামোর মতো ব্যাকবোন, কৌণিক ব্যবহার করুন এবং বাকী এপিআই ব্যবহার করে ডেটা আনুন। এটি পুরোপুরি ইউআই থেকে জাভা নির্ভরতা অপসারণ করবে।


3

জেএসপি ২.০ এর "ট্যাগ ফাইল" নামে একটি বৈশিষ্ট্য রয়েছে , আপনি বহিরাগত javaকোড ছাড়াই ট্যাগ লিখতে পারেন এবং tld। আপনার ট্যাগগুলি প্যাকেজ করার জন্য আপনাকে একটি .tagফাইল তৈরি করতে হবে এবং এটি লাগাতে হবে WEB-INF\tagseven

উদাহরণ স্বরূপ:

/WEB-INF/tags/html/label.tag

<%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%>
<%@attribute name="name" required="true" description="The label"%>

<label class="control-label control-default"  id="${name}Label">${name}</label>

এটি ব্যবহার করুন

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%>
<h:label  name="customer name" />

এছাড়াও আপনি ট্যাগ বডি সহজেই পড়তে পারেন

/WEB-INF/tags/html/bold.tag
<%@tag description="Bold tag" pageEncoding="UTF-8"%>
<b>
  <jsp:doBody/>
</b>

এটা ব্যবহার করো

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%>
<h:bold>Make me bold</h:bold>

নমুনাগুলি খুব সহজ তবে আপনি এখানে অনেক জটিল কাজ করতে পারেন। বিবেচনা করুন আপনি অন্য ট্যাগগুলি ব্যবহার করতে পারেন (যেমন: JSTLযা মত ট্যাগ নিয়ন্ত্রণ করেছে if/forEcah/chosenমত টেক্সট ম্যানিপুলেশন format/contains/uppercaseবা এমনকি এসকিউএল ট্যাগ select/update), উদাহরণস্বরূপ, সব ধরনের পরামিতি পাস Hashmap, অ্যাক্সেস session, request... আপনার ট্যাগ ফাইলে খুব।

ট্যাগ ফাইলটি এত সহজে বিকাশযুক্ত যেহেতু জেএসপি ফাইলগুলির মতো সার্ভারগুলি পরিবর্তন করার সময় আপনার পুনরায় আরম্ভ করার দরকার ছিল না। এটি তাদের উন্নয়নের পক্ষে সহজ করে তোলে।

এমনকি যদি আপনি স্ট্রুটস 2 এর মতো একটি কাঠামো ব্যবহার করেন, যার প্রচুর ভাল ট্যাগ রয়েছে, তবে আপনি দেখতে পাবেন যে আপনার নিজের ট্যাগ থাকার ফলে আপনার কোডটি অনেক হ্রাস করতে পারে। আপনি আপনার ট্যাগ প্যারামিটারগুলি স্ট্রুতে পাস করতে পারেন এবং এইভাবে আপনার ফ্রেমওয়ার্ক ট্যাগটি কাস্টমাইজ করতে পারেন।

আপনি কেবল জাভা এড়ানোর জন্যই ট্যাগ ব্যবহার করতে পারবেন না তবে আপনার এইচটিএমএল কোডগুলিও ছোট করতে পারেন। আমি নিজেই HTML কোডগুলি পর্যালোচনা করার চেষ্টা করি এবং আমার পৃষ্ঠাগুলিতে কোড ডুপ্লিকেটগুলি শুরু হওয়ার সাথে সাথেই ট্যাগগুলি অনেকগুলি তৈরি করার চেষ্টা করি।

(এমনকি যদি আপনি নিজের জেএসপি কোডে জাভা ব্যবহার না করেন, যা আমি আশা করি না তবে আপনি কোডটি একটি ট্যাগে আবদ্ধ করতে পারেন)


1

যেমন অনেক উত্তর বলেছে, জেএসটিএল ব্যবহার করুন বা আপনার নিজস্ব কাস্টম ট্যাগ তৈরি করুন। কাস্টম ট্যাগ তৈরি সম্পর্কে এখানে ভাল ব্যাখ্যা is


1
  1. আপনার সার্লেট ক্লাসের মধ্যে আপনার মান এবং পরামিতিগুলি তৈরি করুন
  2. আপনার জেএসপিএল / জেএসটিএল / ট্যাগলিব ব্যবহার করে সেই মানগুলি এবং পরামিতিগুলি আনুন

এই পদ্ধতির সম্পর্কে ভাল বিষয়টি হ'ল আপনার কোডটিও কোডের মতো এইচটিএমএল!


0

ইএস এক্সপ্রেশনের সাথে জেএসটিএল ট্যাগগুলি ব্যবহার করে আপনি এড়াতে পারবেন। নিম্নলিখিত বিষয়গুলি আপনার jsp পৃষ্ঠায় রাখুন:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.