Я отвечаю на вопрос: Как получить значение переменной, учитывая ее имя в строке? , которая закрыта как дубликат со ссылкой на этот вопрос.
Если рассматриваемые переменные являются частью объекта (например, части класса), то некоторые полезные функции для достижения именно этого: 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>
Вот решение, которое я нашел. Это выглядит не очень элегантно:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newLineChar", "\n"); %>
${fn:replace(item.comments, newLineChar, "; ")}
Вы должны иметь возможность сделать это с помощью fn: replace.
Вам нужно будет импортировать библиотеку тегов в ваш JSP со следующим объявлением:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
Затем вы может использовать следующее выражение для замены вхождения строки new в $ {data} точкой с запятой:
${fn:replace(data, "\n", ";")}
Документация не очень хороша в этом материале, и у меня не было возможности проверить ее.
Легче:
<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>
Вы можете создать свою собственную функцию 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)}
Это правильное решение для JSP EL:
"${fn:split(string1, Character.valueOf(10))}"
Если вам действительно нужен символ\n, вы можете использовать совет здесь :
${fn:replace(text, "
", "<br/>")}
или
<c:set var="nl" value="
" /><%-- this is a new line --%>
Это включает новую строку в строковый литерал.
\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» вряд ли появится в тексте, в котором я делаю замену, поэтому для меня это был разумный выбор.
Это решение более элегантно, чем ваше собственное решение, которое напрямую устанавливает атрибут 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", ";")}
НЕ работает.
"
на '
в ${fn:replace(data, "\n", ";")}
, и он должен работать: ${fn:replace(data, '\n', ';')}
. В противном случае это, например, не будет работать: <option value="${fn:replace(data, '\n', ';')}">someOption</option>
из-за двойных кавычек после значения.
– mvdb
28 December 2011 в 15:50
В значении при настройке var нажмите клавишу ВВОД между двойными кавычками.
$ {fn: replace (data, newLineChar, ";")}
Вы можете написать свою собственную функцию JSP для замены.
Это означает, что вы получите что-то вроде:
<%@ taglib prefix="ns" uri="..." %>
...
${ns:replace(data)}
Где ns
- пространство имен префикс, который вы определяете, и replace
- ваша функция JSP.
Эти функции довольно просты в реализации (они всего лишь статический метод), хотя я не могу найти хорошую ссылку для написания момент.
Для записи я столкнулся с этим сообщением при решении этой проблемы:
Многострочная строка в JSTL добавляется в качестве атрибута title текстового поля. Затем Javascript добавляет это как текст по умолчанию в текстовое поле. Чтобы очистить этот текст от фокуса, значение должно совпадать с заголовком ... но сбой, так как много текстовых редакторов помещают\r\n вместо\n. Поэтому follownig избавится от нежелательных\r:
<% pageContext.setAttribute("newLineChar", "\r"); %>
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />