SORU
5 Temmuz 2010, PAZARTESİ


Nasıl JSP dosyaları Java kod önlemek için?

Java EE yeniyim ve aşağıdaki üç satır gibi bir şey olduğunu biliyorum

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

kodlama eski moda bir yoldur ve JSP sürümü 2 JSP dosyaları Java kod önlemek için bir yöntem var. Biri bana bu tekniği denilen alternatif JSP 2 satır, ve söyleyebilir?

CEVAP
5 Temmuz 2010, PAZARTESİ


Kullanımıkod parçacıkları(<% %> o şeyler) JSP gerçekten çok doğduğundan beri önerilmeztaglibs(JSTL gibi) ve EL (Expression Language, ${} o şeyler) on yıl kadar önce.

En önemli dezavantajlarıkod parçacıkları

  1. Tekrar kullanılabilirlik:kod parçacıkları yeniden kullanabilirsiniz.
  2. Replaceability:kod parçacıkları soyut yapamazsın.
  3. OO-yetenek:miras/kompozisyon yapabilirsiniz.
  4. Debuggability:eğer komut dosyası uygulamacığı istisna bir yarım atar, Ben olsun tüm boş bir sayfa.
  5. Test edilebilirlik:kod parçacıkları ünite-test edilebilir değildir.
  6. İdame:saldo başına daha fazla zaman karışmış/karışık/yinelenen kod mantığını korumak için gereklidir.

GüneşOracle kendisi de JSP coding conventions kullanılmasını önlemek için önerirkod parçacıklarıaynı işlevi (etiket) sınıflar tarafından mümkün. Burada ilgiye değinir birkaç:

JSP 1.2 Şartname, JSP Standard Tag Library (JSTL) web uygulamanızda kullanılması önerilirJSP kod parçacıkları için ihtiyaç azaltmaksayfalarınızda. JSTL kullanan sayfalar, genel olarak, daha kolay okumak ve korumak.

...

MümkünseJSP kod parçacıkları önlemekne zaman kütüphaneleri eşdeğer bir işlevsellik sağlayan etiket. Bu sayfaları daha kolay okumak ve korumak, yardım etmek ayrı iş mantığı, sunum mantığı, ve yapacak sayfalarınızı daha kolay bir evrim içine JSP 2.0-stil sayfaları (JSP 2.0 Belirtimi destekler ama deemphasizes kullanımı kod parçacıkları).

...

İş mantığı, sunum katmanı arasındaki bağlantı azaltmak-model görünüm-denetleyici (MVC) tasarım deseni benimseyen ruhu içindeJSP kod parçacıkları kullanılmamalıdıryazılı iş mantığı için. Daha doğrusu, JSP kod parçacıkları gerekirse verileri dönüştürmek için kullanılır (ayrıca denilen "değer nesnelerinin") istemci-hazır uygun bir biçime müşterinin istekleri işleme döndü. O zaman bile, bu daha iyi bir ön denetleyicisi bir sunucu uygulaması ya da özel bir etiket daha farklı olacağını düşünmüştüm.


Nasıl değiştirmek içinkod parçacıklarıkod tek amacı bağlıdır/mantık tamamen. Genellikle daha fazla bu kod fullworthy bir Java sınıf yerleştirilecek

  • Çağırmak istiyorsanızaynıJava kodheristek, talep edilen sayfa ne olursa olsun, daha az ya da daha fazla, örneğin, eğer bir kullanıcı açtıysa kontrol, filter uygulamak ve buna göre doFilter() yöntem kod yazma o zaman. E. g.:

    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> uygun bir ilgi JSP sayfaları kapsayan eşleştirilmiş zaman, tüm JSP sayfaları üzerinde aynı kod parçası copypaste gerek yok.


  • Eğer çağırmak istiyorsanız bazı kod Javasüreç öncesiörneğin gerekirse bazı tablo görüntülemek için bir veritabanı, bazı liste önyükleme isteği bazı sorgu parametreleri dayalı, servlet uygulamak ve buna göre doGet() yöntem kod yazma o zaman. E. g.:

    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);
        }
    }
    

    Bu şekilde özel durumları ile ilgili daha kolaydır. DB JSP render ortasında erişilebilir değil, ama çok JSP önce gösterilmiştir. Hala DB erişim bir istisna atar her yanıtı değiştirmek için imkanı var. Yukarıdaki örnekte, varsayılan hata 500 sayfa zaten web.xml 15 *ile özelleştirebilirsiniz hangi görüntülenir.


  • Eğer çağırmak istiyorsanız bazı kod Javayeniden işle yenidenbir istek, örneğin bir form işleme göndermek, servlet ve yazmak bir kod buna göre doPost() yöntemi uygulayın. E. g.:

    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.
        }
    }
    

    Bu şekilde muamele ile farklı sonuç sayfası hedeflere daha kolay: yeniden görüntüleme form ile doğrulama hatası diye bir hata (bu belirli bir örnek olabilir yeniden kullanmadan ${message} 43*), ya da sadece almak istediğiniz hedef sayfa halinde başarı.


  • Eğer çağırmak istiyorsanız bazı kod Javakontrolyürütme planı ve/veya istek hedef ve yanıt öyleyse servlet MVC's Front Controller Pattern göre bir uygulama. E. g.:

    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);
        }
    }
    

    Ya da sadece kabul bir MVC çerçeve gibi JSF, Spring MVC, Wicket, vb böylece, sonunda, sadece bir JSP/Facelets sayfa ve bir Javabean class ihtiyaç duymadan özel bir sunucu uygulaması.


  • Eğer çağırmak istiyorsanız bazı kod Javaakışını kontrolJSP sayfası içinde, JSTL core gibi (mevcut) akışını kontrol taglib yakalaman lazım. E. g. bir tablo List<Product> görüntüleme:

    <%@ 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>
    

    Tarzı XML güzel tüm bu HTML kodu arasında uygun etiketleri daha okunabilir (ve böylece daha iyi) sürdürülebilir açılış ve kapanış parantez ile çeşitli kod parçacıkları bir demet daha ("Nerede bu kapanış ait brace mu?"). Kolay bir yardım, her bir özel durum için web uygulama yapılandırmak içinkod parçacıklarıhala web.xml aşağıdaki parça ekleyerek kullanılmış

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

    Facelets, Java EE MVC çerçevesinde sağlanan bir parçası olan JSP, halefi JSF zatendeğilmümkün kullanmak içinkod parçacıkları. Otomatik olarak bir şeyler yapmak zorunda olduğunuzu bu şekilde "doğru yol".


  • Eğer çağırmak istiyorsanız bazı kod Javaerişim ve görüntüleme"arka uç" veri JSP sayfası içinde, sonra EL (Expression Language) kullanmak gerekir, ${} o şeyler. E. g. giriş değerleri sunulmuştur yeniden görüntüleme:

    <input type="text" name="foo" value="${param.foo}" />
    

    ${param.foo} request.getParameter("foo") sonucunu görüntüler.


  • Bazı çağırmak istiyorsanızyararKodu doğrudan JSP sayfasının Java (genellikle public static yöntemleri), sonra da EL fonksiyonları olarak tanımlamak gerekir. functions taglib JSTL bir standart var, ama you can also easily create functions yourself. İşte fn:escapeXml XSS attacksönlemek için yararlıdır nasıl bir örnek.

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    ...
    <input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
    

    XSS hassasiyetini hiçbir şekilde spesifik olarak, bu sorunu dikkate alınması gereken ne varsa/JSP/JSTL/EL/Java ile ilgili olduğunu unutmayınhergeliştirmek webapplication. Sorunukod parçacıklarıyerleşik önlemler imkan sağladığını, en azından standart Java API kullanarak değil. JSP halefi Facelets zaten örtülü HTML kaçan, Facelets içinde XSS delik hakkında endişelenmenize gerek yok yani.

Ayrıca Bkz:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • After Effects Tutorials w/ Mikey

    After Effect

    24 HAZİRAN 2009
  • How It Should Have Ended

    How It Shoul

    5 Mart 2007
  • InfoPuppet

    InfoPuppet

    15 Kasım 2011