Как преобразовать специальные символы в строку с помощью jstl [duplicate]

Сначала начнем с некоторых определений:

Интерфейс n. Набор всех сигнатур, определенных операциями объекта, называется интерфейсом к объекту

Тип n. Конкретный интерфейс

. Простым примером интерфейса, как определено выше, были бы все методы объекта PDO, такие как query(), commit(), close() и т. д., в целом, не отдельно. Эти методы, т. Е. Его интерфейс, определяют полный набор сообщений, запросы, которые могут быть отправлены объекту.

Тип, определенный выше, является конкретным интерфейсом. Я буду использовать созданный интерфейс формы, чтобы продемонстрировать: draw(), getArea(), getPerimeter() и т. Д.

Если объект относится к типу базы данных, мы подразумеваем, что он принимает сообщения / запросы интерфейс базы данных, query(), commit() и т. д. Объекты могут быть разных типов. У вас может быть объект базы данных типа формы, если он реализует свой интерфейс, и в этом случае это будет подтип.

Многие объекты могут иметь много разных интерфейсов / типов и реализовывать этот интерфейс иначе. Это позволяет нам заменять объекты, позволяя нам выбирать, какой из них использовать. Также известен как полиморфизм.

Клиент будет знать интерфейс, а не реализацию.

Таким образом, по сути программирование на интерфейс потребует создания некоторого типа абстрактного класса, такого как Shape, только с указанным интерфейсом, т.е. draw(), getCoordinates(), getArea() и т. д. И затем различные конкретные классы реализуют такие интерфейсы, как класс Circle, Square class, Triangle class. Следовательно, программа для интерфейса не является реализацией.

4
задан BalusC 11 August 2015 в 07:17
поделиться

1 ответ

Косая черта не является escape-символом. Это обратная косая черта.

${fn:replace(Desc, "'", "\\'")}

(да, это было представлено дважды, потому что это также escape-символ в Java!) [/ ​​g2]

Однако вам нужно не только для возврата ' на \', вам также нужно заменить \n (новые строки) на \\n. Строка печатается по нескольким строкам, что делает ее также недопустимой строковой переменной JS. Ваш конечный результат должен в основном выглядеть следующим образом:

var itemNameList = ''
    + '\nWeyland Estate Santa Barbara Pinot Noir'
    + '\nRaymond \'Prodigal\' North Coast Cabernet Sauvignon'
    + '\nChateau Haute Tuque'; 

(обратите внимание, что синтаксический ярлык согласен на меня здесь, но не на вашем)

Однако есть много более возможных специальных символов, которые должны быть экранированы. Все они покрыты Apache Commons Lang StringEscapeUtils#escapeEcmaScript() . Намного легче создать пользовательскую функцию EL, которая вызывает именно этот метод. Если это еще не сделано, загрузите и отпустите commons-lang.jar в /WEB-INF/lib. Затем создайте файл /WEB-INF/functions.tld следующим образом:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

    <display-name>Custom Functions</display-name>    
    <tlib-version>1.0</tlib-version>
    <uri>http://example.com/functions</uri>

    <function>
        <name>escapeJS</name>
        <function-class>org.apache.commons.lang3.StringEscapeUtils</function-class>
        <function-signature>java.lang.String escapeEcmaScript(java.lang.String)</function-signature>
    </function>
</taglib>

Чтобы вы могли использовать его следующим образом:

<%@taglib prefix="util" uri="http://example.com/functions" %>
...
${util:escapeJS(Desc)}
14
ответ дан BalusC 21 August 2018 в 11:13
поделиться
  • 1
    Спасибо, что прояснил это - это здорово! – jrutter 15 March 2012 в 15:14
  • 2
    Пожалуйста. – BalusC 15 March 2012 в 15:30
  • 3
    Spring имеет готовый тег для этого: s: escapeBody , поэтому, если вы используете Spring, вы можете использовать его без определения собственных собственных тегов. – David Balažic 29 January 2016 в 17:20
  • 4
    OmniFaces также имеет один: : escapeJS – BalusC 29 January 2016 в 17:21
  • 5
    s: escapeBody должен быть отдельным ответом @ DavidBalažic – Дмитрий Кулешов 18 July 2017 в 11:31
Другие вопросы по тегам:

Похожие вопросы: