17

Как избежать использования Java-кода в JSP-файлах, используя JSP 2?

12

Заголовок: Как заменить встроенный Java код в JSP на альтернативные конструкции в JSP 2?

Я понимаю, что использование встроенного Java кода в JSP выглядит устаревшим, например, такие строки как:

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

С выходом JSP версии 2 появились методы, которые позволяют избежать написания Java кода непосредственно в JSP файлах. Какие альтернативные конструкции в JSP 2 можно использовать вместо этих строк, и как называется эта техника?

5 ответ(ов)

0

Вы можете использовать теги JSTL вместе с выражениями EL, чтобы избежать смешивания кода Java и HTML:

<%@ 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}" />
        // и так далее

    </body>
</html>

В этом примере мы используем тег <c:out>, чтобы вывести результат выражений EL, таких как арифметические операции и параметры запроса, что позволяет нам сохранять чистоту кода и улучшает читабельность.

0

Опыт показывает, что JSP имеют некоторые недостатки, одним из которых является сложность в избегании смешивания разметки с реальным кодом.

Если это возможно, рассмотрите использование специализированной технологии для выполнения вашей задачи. В Java EE 6 присутствует JSF 2.0, который предлагает множество удобных функций, включая возможность связывания Java-бинов с JSF-страницами через подход #{bean.method(argument)}.

0

Если вы просто хотите избежать недостатков кодирования на Java в JSP, вы можете сделать это даже с помощью скриплетов. Просто следуйте некоторым принципам, чтобы минимизировать количество Java-кода в JSP и избегать каких-либо вычислений и логики на странице JSP.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% // Создание контроллера JSP
MyController clr = new MyController(request, response);

// Обработка действия, если таковое имеется
clr.process(request);

// Обработка перенаправления страницы, если необходимо

// Выполнение всех присваиваний переменных здесь
String showMe = clr.getShowMe(); %>

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

            // И так далее   
        </form>
    </body>
</html>

Этот подход позволяет сосредоточиться на представлении, избегая смешивания бизнес-логики с отображением.

0

Чтобы научиться настраивать и создавать собственные теги с использованием JSTL, необходимо учитывать, что EL может вести себя непредсказуемо (ошибки времени выполнения и рефакторинг). Также стоит отметить, что Wicket может быть не самым подходящим выбором для небольших приложений или простых представлений из-за проблем с производительностью и трудоемкости.

Пример из java2s

Прежде всего, вам нужно добавить следующую конфигурацию в файл web.xml вашего веб-приложения:

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

После этого создайте файл java2s.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">

<!-- Дескриптор библиотеки тегов -->
<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>

    <!-- Этот тег манипулирует содержимым своего тела, преобразуя его в верхний регистр -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

Далее, скомпилируйте следующий код в директории WEB-INF\classes\com\java2s:

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(); // очищаем буфер для следующей оценки
        } catch (IOException e) {
            System.out.println("Ошибка в BodyContentTag.doAfterBody(): " + e.getMessage());
            e.printStackTrace();
        }

        int retValue = SKIP_BODY;

        if (iterations < howMany)
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

Теперь запустите сервер и откройте файл bodyContent.jsp в браузере:

<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
    <head>
        <title>Пользовательский тег: содержимое тела</title>
    </head>
    <body>
        Эта страница использует пользовательский тег, который манипулирует своим содержимым. Вот его вывод:
        <ol>
            <java2s:bodyContentTag howMany="3">
            <li>java2s.com</li>
            </java2s:bodyContentTag>
        </ol>
    </body>
</html>

Убедитесь, что все работает правильно, и вы сможете настраивать свои собственные теги, используя JSTL! Если у вас возникнут вопросы, не стесняйтесь спрашивать!

0

Вы подняли хороший вопрос, и хотя вы получили несколько дельных ответов, я бы посоветовал отказаться от JSP. Это устаревшая технология, которая со временем уйдет в прошлое. Используйте более современные подходы, например, движки шаблонов. Это обеспечит четкое разделение бизнес-логики и представления, а также избавит от необходимости использовать Java- код в шаблонах, что позволит вам генерировать шаблоны напрямую из программ для редактирования веб-презентаций, часто с использованием WYSIWYG.

И, конечно, старайтесь избегать фильтров и предобработки или постобработки, иначе вы можете столкнуться с трудностями поддержки и отладки, поскольку всегда есть неопределенность в том, откуда берётся значение переменной.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь