пример Как избежать Java-кода в JSP-файлах?




jsp пример (20)

Wicket также является альтернативой, которая полностью отделяет java от html, поэтому разработчик и программист могут работать вместе и на разных наборах кода, не понимая друг друга.

Посмотри на Калитку.

https://code.i-harness.com

Я новичок в Java EE, и я знаю, что что-то вроде следующих трех строк

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

является старым школьным способом кодирования, а в JSP версии 2 существует способ избежать Java-кода в JSP-файлах. Может кто-нибудь, пожалуйста, скажите мне альтернативные линии JSP 2 и что называется этой техникой?


В архитектурном шаблоне MVC JSP представляют собой слой «Вид». Встраивание java-кода в JSP считается плохой практикой. Вы можете использовать JSTL , freeMarker , velocity с JSP как «шаблонный движок». Поставщик данных для этих тегов зависит от структуры, с которой вы имеете дело. Struts 2 и webwork как реализация для MVC Pattern использует OGNL «очень интересную технику для выставления Beans Properties для JSP».


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

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


Если мы используем в Java-приложении следующие вещи, java-код можно исключить из переднего плана JSP.

  1. Использовать архитектуру MVC для веб-приложения

  2. Использовать теги JSP

    а. Стандартные теги

    б. Пользовательские теги

  3. Язык выражений


Использование скриптов очень старый и не рекомендуется. Если вы хотите напрямую вывести что-то на своих страницах JSP, используйте язык выражений (EL) и JSTL .

Существуют и другие варианты, такие как использование шаблонов, таких как Velocity, Freemarker, Thymeleaf и т. Д. Но использование простого JSP с EL и JSTL служит моей цели большую часть времени, и это также кажется самым простым для новичка.

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


Использование сценариев в JSP не является хорошей практикой.

Вместо этого вы можете использовать:

  1. Теги JSTL
  2. Выражения EL
  3. Пользовательские теги - вы можете определить свои собственные теги для использования.

Пожалуйста, обратитесь к:

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

Конечно, замените <%! counter++; %> <%! counter++; %> <%! counter++; %> по архитектуре производителя-потребителя событий, где бизнес-уровень уведомляется о необходимости увеличения счетчика, он реагирует соответствующим образом и уведомляет докладчиков, чтобы они обновляли представления. Применяется ряд транзакций базы данных, поскольку в будущем нам нужно будет узнать новое и старое значение счетчика, который увеличил его и с какой целью. Очевидно, что сериализация задействована, поскольку слои полностью развязаны. Вы сможете увеличить ваш счетчик на RMI, IIOP, SOAP. Но требуется только HTML, который вы не реализуете, поскольку это такой мирский случай. Ваша новая цель - достичь 250 шагов в секунду на вашем новом блестящем сервере E7, 64 ГБ оперативной памяти.

У меня есть более 20 лет в программировании, большинство проектов проваливаются перед секстэтом: Возможность повторного использования Возможность OO-способности Отладочная проверка Возможность проверки работоспособности даже необходима. Другие проекты, управляемые людьми, которые заботились только о функциональности, были чрезвычайно успешными. Кроме того, жесткая структура объекта, внедренная слишком рано в проекте, делает код неспособным адаптироваться к резким изменениям в спецификациях (ака agile).

Поэтому я рассматриваю в качестве промедления активность определения «слоев» или избыточных структур данных либо в начале проекта, либо когда это не требуется.


Независимо от того, насколько вы пытаетесь избежать, когда вы работаете с другими разработчиками, некоторые из них по-прежнему предпочитают скриптлет, а затем вставляют злой код в проект. Поэтому настройка проекта при первом знаке очень важна, если вы действительно хотите уменьшить код сценария. Существует несколько способов преодолеть это (в том числе несколько фреймворков, о которых упоминалось выше). Однако, если вы предпочитаете чистый JSP-путь, используйте файл тегов JSTL. Самое приятное в этом - вы также можете настроить мастер-страницы для своего проекта, чтобы другие страницы могли наследовать мастер-страницы

Создайте главную страницу под названием base.tag под вашими WEB-INF / тегами со следующим содержимым

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

На этой странице mater я создал фрагмент под названием «title», так что на дочерней странице я мог вставить больше кодов в это место главной страницы. Кроме того, тег <jsp:doBody/> будет заменен содержимым дочерней страницы

Создайте дочернюю страницу (child.jsp) в папке WebContent:

<%@ 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> используется для указания основной страницы, которую вы хотите использовать (в данный момент это base.tag). Все содержимое внутри тега <jsp:body> здесь заменит <jsp:doBody/> на главной странице. Ваша дочерняя страница также может содержать любые теги lib, и вы можете использовать ее, как и другие. Однако, если вы используете любой скриптлетный код здесь ( <%= request.getParameter("name") %> ...) и попробуйте запустить эту страницу, вы получите JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here . Таким образом, другие люди не могут включить злой код в файл jsp

Вызов этой страницы с вашего контроллера:

Вы можете легко вызвать файл child.jsp с вашего контроллера. Это также хорошо работает с ракурсами struts


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

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


Просто используйте тег JSTL и выражение EL.


Я не уверен, правильно ли я это понял.

Вы должны прочитать что-то о MVC. Spring MVC & Struts 2 - два наиболее распространенных решения.


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

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

JSTL предлагает теги для условных выражений, циклов, наборов, наборов и т. Д. Например:

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

JSTL работает с атрибутами запроса - они чаще всего задаются в запросе сервлетом, который пересылается в JSP.


Как избежать Java-кода в JSP-файлах?

Вы можете использовать теги библиотеки табуляции, такие как JSTL, в дополнение к языку выражений ( EL ). Но EL не работает с JSP. Поэтому, вероятно, лучше полностью отказаться от JSP и использовать Facelets .

Facelets - это первый язык декларации страницы, не предназначенный для JSP, разработанный для JSF (Java Server Faces), который предоставил разработчикам JSF более простую и более мощную модель программирования по сравнению с JSP. Он решает различные проблемы, возникающие в JSP для разработки веб-приложений.


Как защитник: отключить скрипты для хорошего

Как еще один вопрос обсуждает, вы можете и всегда должны отключать скрипты в вашем web.xml веб-приложения web.xml .

Я всегда делал это, чтобы любой разработчик не добавлял сценарии, особенно в крупных компаниях, где рано или поздно вы потеряете обзор. Настройки web.xml выглядят следующим образом:

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

Научитесь настраивать и писать свои собственные теги с помощью JSTL

Обратите внимание, что EL является EviL (исключения времени выполнения, рефакторинг)
Калитка может быть и злой (производительность, трудная для небольших приложений или простой уровень обзора)

Пример из 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">

<!-- 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>

скомпилируйте следующий код в 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(); // 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>

Ничто из этого больше не используется моим другом, мой совет - отделить представление (css, html, javascript и т. Д.) От сервера.

В моем случае я использую свои системы, обрабатывающие представление с помощью Angular, и любые необходимые данные приводятся с сервера с использованием служб отдыха.

Поверьте мне, это изменит ваш дизайн


JSP 2.0 имеет функцию «Файлы тегов» , вы можете писать теги без внешнего javaкода и tld. Вам нужно создать .tagфайл и поместить его, WEB-INF\tagsвы даже можете создать структуру каталогов для упаковки ваших тегов.

Например:

/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или даже SQL тегов select/update), передавать все параметры типа, например Hashmap, доступ session, request... в файле теги тоже.

Файл тега настолько прост, что вам не нужно перезапускать сервер при их изменении, например, файлы jsp. Это облегчает их разработку.

Даже если вы используете фреймворк, такой как struts 2, в котором есть много хороших тегов, вы можете обнаружить, что наличие ваших собственных тегов может значительно сократить ваш код. Вы можете передать свои параметры тега в struts и таким образом настроить свой тег framework.

Вы можете использовать тег не только для того, чтобы избежать java, но и свести к минимуму ваши HTML-коды. Я сам пытаюсь просмотреть HTML-коды и быстро создавать теги, как только на моих страницах начнется просмотр дубликатов кода.

(Даже если вы в конечном итоге используете java в jsp-коде, который, надеюсь, нет, вы можете инкапсулировать этот код в тег)


Используя теги JSTL вместе с выражением EL, вы можете избежать этого. На странице 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" %>

Как и многие ответы, используйте JSTL или создайте свои собственные теги. Here хорошее объяснение создания пользовательских тегов







scriptlet