Перехват или переопределение тегов JSTL [дубликат]

Я отвечаю на вопрос: Как получить значение переменной, учитывая ее имя в строке? , которая закрыта как дубликат со ссылкой на этот вопрос.

Если рассматриваемые переменные являются частью объекта (например, части класса), то некоторые полезные функции для достижения именно этого: hasattr, getattr и setattr.

Так, например, вы можете иметь:

class Variables(object):
    def __init__(self):
        self.foo = "initial_variable"
    def create_new_var(self,name,value):
        setattr(self,name,value)
    def get_var(self,name):
        if hasattr(self,name):
            return getattr(self,name)
        else:
            raise("Class does not have a variable named: "+name)

Тогда вы можете сделать:

v = Variables()
v.get_var("foo")

"initial_variable"

v.create_new_var(v.foo,"is actually not initial")
v.initial_variable

"на самом деле не является начальным"

blockquote>

42
задан parkerfath 12 September 2008 в 01:57
поделиться

13 ответов

Вот решение, которое я нашел. Это выглядит не очень элегантно:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newLineChar", "\n"); %>

${fn:replace(item.comments, newLineChar, "; ")}
53
ответ дан parkerfath 22 August 2018 в 17:53
поделиться
  • 1
    Я принимаю это, хотя это мой собственный ответ, потому что он прост, и я нашел, что он действительно работает. – parkerfath 12 February 2009 в 01:06
  • 2
  • 3
    Я попытался просто избежать обратной косой черты, и это тоже не сработало. Мой вышеописанный метод установки атрибута pageContext по-прежнему остается единственным способом заставить его работать. Хотя, как говорит BalusC, вам может быть повезло с некоторыми из более простых методов. Наверное, хорошо иметь все варианты здесь. – parkerfath 19 February 2010 в 20:44
  • 4
    Как всегда, будьте осторожны с разными версиями Windows и Unix (используйте «\r\n» для первого). – pimlottc 12 July 2010 в 18:01
  • 5
    Ничего не работало для меня, кроме этого. Не избегать обратной косой черты и не использовать c: set. – Amir M 7 November 2016 в 08:45
13
ответ дан andy 22 August 2018 в 17:53
поделиться
19
ответ дан BalusC 22 August 2018 в 17:53
поделиться

Вы должны иметь возможность сделать это с помощью fn: replace.

Вам нужно будет импортировать библиотеку тегов в ваш JSP со следующим объявлением:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

Затем вы может использовать следующее выражение для замены вхождения строки new в $ {data} точкой с запятой:

${fn:replace(data, "\n", ";")}

Документация не очень хороша в этом материале, и у меня не было возможности проверить ее.

2
ответ дан Brian Matthews 22 August 2018 в 17:53
поделиться
  • 1
    Я почти уверен, что это то, что я пробовал первым, и это не сработало. На самом деле у меня нет времени перепроверить его, поэтому я могу ошибаться. – parkerfath 12 September 2008 в 23:52
  • 2
    Я думаю, что этот ответ почти такой же, как у меня (см. Ниже), но без дополнительной pageContext.setAttribute (). Знаете ли вы, может быть, некоторые настройки, которые я не установил, заставляют меня вызвать этот дополнительный метод? – parkerfath 30 September 2008 в 23:16
  • 3
    Я получаю эту ошибку: org.apache.jasper.JasperException: /WEB-INF/jsp/team/alarms.jsp(11,2) & quot; $ {fn: replace (blob, & quot;\n & quot ;, & quot ;; & quot; ;)} & Quot; содержит недопустимые выражения: javax.servlet.jsp.el.ELException: Encountered & quot;\n & quot ;, ожидаемый один из [& lt; INTEGER_LITERAL & gt ;, & lt; FLOATING_POINT_LITERAL & gt ;, и т. д. – parkerfath 12 February 2009 в 01:06

Легче:

<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>  
1
ответ дан brunohop 22 August 2018 в 17:53
поделиться

Вы можете создать свою собственную функцию JSP. http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

Это примерно то, что вам нужно сделать.

Создать файл дескриптора библиотеки тегов /src/META-INF/sf.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>sf</short-name>
  <uri>http://www.stackoverflow.com</uri>
  <function>
    <name>clean</name>
    <function-class>com.stackoverflow.web.tag.function.TagUtils</function-class>
    <function-signature>
      java.lang.String clean(java.lang.String)
    </function-signature>
  </function>
</taglib>

Создать класс Java для логики функций. com.stackoverflow.web.tag.function.TagUtils

package com.stackoverflow.web.tag.function;

import javax.servlet.jsp.tagext.TagSupport;

public class TagUtils extends TagSupport {
  public static String clean(String comment) {
    return comment.replaceAll("\n", "; ");
  }
}

В вашем JSP вы можете получить доступ к своей функции следующим образом.

<%@ taglib prefix="sf" uri="http://www.stackoverflow.com"%>
${sf:clean(item.comments)}
4
ответ дан Geekygecko 22 August 2018 в 17:53
поделиться
  • 1
    должен быть $ {sf: clean (item.comments)} ... Я использовал это решение .. кажется чище, чем скриптлет – danb 9 February 2010 в 19:35
  • 2
    спасибо danb, я обновил свой пост – Geekygecko 11 February 2010 в 04:34
  • 3
    @danb: вы пропустили мой ответ? [Д0] stackoverflow.com/questions/58054/… – BalusC 11 February 2010 в 12:36

Это правильное решение для JSP EL:

"${fn:split(string1, Character.valueOf(10))}"
1
ответ дан josliber 22 August 2018 в 17:53
поделиться

Если вам действительно нужен символ\n, вы можете использовать совет здесь :

${fn:replace(text, "
", "<br/>")}

или

<c:set var="nl" value="
" /><%-- this is a new line --%>

Это включает новую строку в строковый литерал.

4
ответ дан Leonid 22 August 2018 в 17:53
поделиться

\n не представляет символ новой строки в выражении EL.

Решение, которое устанавливает атрибут pageContext для символа новой строки, а затем использует его с функцией fn:replace JSTL, работает

Тем не менее, я предпочитаю использовать библиотеку вкладок Jakarta String для решения этой проблемы:

<%@ taglib prefix="str" uri="http://jakarta.apache.org/taglibs/string-1.1" %>
...
<str:replace var="result" replace="~n" with=";" newlineToken="~n">
Text containing newlines
</str:replace>
...

Вы можете использовать все, что хотите для newlineToken; «~ n» вряд ли появится в тексте, в котором я делаю замену, поэтому для меня это был разумный выбор.

1
ответ дан Matt Hurne 22 August 2018 в 17:53
поделиться

Это решение более элегантно, чем ваше собственное решение, которое напрямую устанавливает атрибут pagecontext. Вы должны использовать тег <c:set> для этого:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<c:set var="newLine" value="\n"/>
${fn:replace(data, newLine, "; ")}

BTW: ${fn:replace(data, "\n", ";")} НЕ работает.

8
ответ дан simon 22 August 2018 в 17:53
поделиться
  • 1
    Это не работает для меня в Resin 3, тогда как верхний ответ с использованием скрипта pageContext. – pimlottc 12 July 2010 в 17:45
  • 2
    Я думаю, это будет ошибкой, потому что в соответствии со стандартами она должна работать. – bousch 14 July 2010 в 14:01
  • 3
    @pimlottc Замените " на ' в ${fn:replace(data, "\n", ";")}, и он должен работать: ${fn:replace(data, '\n', ';')}. В противном случае это, например, не будет работать: <option value="${fn:replace(data, '\n', ';')}">someOption</option> из-за двойных кавычек после значения. – mvdb 28 December 2011 в 15:50
  • 4
    @HeadFirst - его решение предназначено для использования на HTML-странице; ваша модификация позволяет решению работать в XHTML – Daniel F. Thornton 15 December 2012 в 21:04

В значении при настройке var нажмите клавишу ВВОД между двойными кавычками.

$ {fn: replace (data, newLineChar, ";")}

0
ответ дан user 22 August 2018 в 17:53
поделиться
  • 1
    Это ответы выше, не так ли? Возможно, было бы лучше прокомментировать или укрепить ответы, уже приведенные, а не повторять их. – parkerfath 1 April 2010 в 01:41
  • 2
    – Günay Gültekin 17 July 2013 в 13:55
  • 3
    @parkerfath Более высокая ранжированная версия этого ответа не предупреждает, что версии c: set или inline будут часто терпеть неудачу. – LateralFractal 11 December 2015 в 07:01

Вы можете написать свою собственную функцию JSP для замены.

Это означает, что вы получите что-то вроде:

<%@ taglib prefix="ns" uri="..." %>
...
${ns:replace(data)}

Где ns - пространство имен префикс, который вы определяете, и replace - ваша функция JSP.

Эти функции довольно просты в реализации (они всего лишь статический метод), хотя я не могу найти хорошую ссылку для написания момент.

0
ответ дан Walter Rumsby 22 August 2018 в 17:53
поделиться

Для записи я столкнулся с этим сообщением при решении этой проблемы:

Многострочная строка в JSTL добавляется в качестве атрибута title текстового поля. Затем Javascript добавляет это как текст по умолчанию в текстовое поле. Чтобы очистить этот текст от фокуса, значение должно совпадать с заголовком ... но сбой, так как много текстовых редакторов помещают\r\n вместо\n. Поэтому follownig избавится от нежелательных\r:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
0
ответ дан wheresrhys 22 August 2018 в 17:53
поделиться
Другие вопросы по тегам:

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