Преобразование переменной скорости в java.lang.String

У меня есть переменная скорости "topic.url" внутри страницы jsp. Этот код был написан кем-то другим, поэтому я не очень уверен, откуда именно взялась эта переменная. В любом случае эта переменная дает мне конкретный URL-адрес, который я должен проанализировать и извлечь из определенного поля. Я планирую написать функцию Java для этого. Проблема в том, что когда я передаю эту переменную скорости функции, какой тип данных я должен использовать. Я попытался преобразовать его в строку, но это не работает. Вот фрагмент кода:

<html>
<head>
<%!

public String parse(String url)
{
    url="abc";  
    return(url);
}
%>

    <meta name="email.subject" content="Community name:{community.name},Topic Name:{topic.name},Topic URL:<%= parse({topic.url}) %>">
</head>

person Nisha    schedule 02.11.2010    source источник
comment
что значит не работает? ошибки? Ничего не произошло? расскажи нам свое наблюдение.   -  person Mihir Mathuria    schedule 02.11.2010
comment
Возможно, это не строка, например, URL-адрес. Измените параметр String на Object и посмотрите, что это такое.   -  person Thilo    schedule 02.11.2010
comment
Выдает ошибку, что аргумент не является строкой. Я попытался передать его как объект, но все равно та же ошибка, что аргумент не является объектом.   -  person Nisha    schedule 02.11.2010
comment
Может быть, добавить цитаты? ‹%= разбор({topic.url}) %›   -  person Mike Clark    schedule 02.11.2010
comment
Разве это не будет передано как обычная строка, если я добавлю кавычки. как бы я получил значение тогда?   -  person Nisha    schedule 02.11.2010


Ответы (5)


Переменная Velocity внутри jsp-страницы??? Тогда это не переменная скорости. Это JSP var. Вы либо пишете VTL, либо JSP. Вы можете встроить VTL в JSP с помощью VelocityViewTag, но это единственный способ иметь переменную Velocity внутри JSP. А это не похоже на то.

person Nathan Bubna    schedule 02.11.2010

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

person ch4nd4n    schedule 02.11.2010
comment
Я новичок в концепции скорости. Я просто знаю, что переменная, которую я использую, является переменной скорости, и она находится внутри страницы jsp. Он используется внутри метатега. Мне нужно передать его функции Java. - person Nisha; 02.11.2010
comment
Я бы посоветовал вам прочитать документацию velocity.apache.org/engine/devel/developer- руководство.html. Velocity принимает набор карт в контексте. Строка должна быть установлена ​​в контексте скорости. Вы можете вызывать методы для объектов, доступных в контексте. Это означает, что если объект String доступен, вы можете вызывать все связанные с ним методы. Если вы намереваетесь выполнить действие Regex, даже этот объект должен быть установлен в контексте. - person ch4nd4n; 02.11.2010

Я думаю, что вы не можете передать параметр шаблона скорости в функцию с таким синтаксисом:

<%= parse({topic.url}) %>

Вместо этого вы можете попробовать подход, описанный ниже. Обратите внимание, что почти наверняка есть гораздо лучший способ выполнить эту работу, используя инструменты, которые предоставляет Velocity. Ниже приведен довольно уродливый хак, который поможет вам начать работу. Я настоятельно рекомендую переработать этот подход, чтобы лучше использовать возможности Velocity:

public String parseTopicUrl(javax.servlet.http.HttpServletRequest request) throws Exception {
    Object topic = request.getAttribute("topic");
    if (topic == null) {
        System.out.println(">>>null topic");
        return null;
    }
    Class topicClass = topic.getClass();
    java.lang.reflect.Method method = topicClass.getMethod("getUrl", null);
    Object url = method.invoke(topic, null);
    if (url == null) {
        System.out.println(">>>'url' is null");
    } else {
        System.out.println(">>>'url' class is " + url.getClass());
        System.out.println(">>>'url' toString is " + url);
    }
    // TODO: cast 'url' to its real class and work with it
    return null;
}

Затем используйте:

<%= parseTopicUrl(request) %>
person Mike Clark    schedule 02.11.2010
comment
Я попытался передать его как объект функции, но он все равно выдает ошибку о том, что переменная не может быть преобразована в объект. - person Nisha; 02.11.2010
comment
Обновленный ответ в ответ на ваш комментарий. - person Mike Clark; 02.11.2010
comment
‹html› ‹head› ‹%! public String parseTopicUrl() выдает Exception { Тема объекта = request.getAttribute(topic); .......... } вернуть ноль; } %› ‹meta name=email.subject content=Название сообщества:{community.name},Название темы:{topic.name},URL темы:‹%= parseTopicURL() %›› ‹/head› - person Nisha; 02.11.2010
comment
Ниша, я почти уверен, что мой подход не лучший способ сделать это с помощью Velocity. Тем не менее, это может все еще работать. Я снова обновил свой ответ, чтобы попытаться исправить проблему «запрос не найден». Обратите внимание на изменения в методе и в файле <%= parseTopicUrl(request) %>. Обязательно внесите оба изменения. - person Mike Clark; 02.11.2010
comment
‹%= parseTopicUrl(request) %› Это невозможно сделать в Velocity. - person ch4nd4n; 02.11.2010
comment
@Mike.. Я попробовал новое решение. Его тема получения как нулевая... поскольку она входит в тему цикла if==null. Есть идеи, почему? - person Nisha; 02.11.2010

Ниша, что, если бы вы полностью удалили код d jsp и вместо этого выяснили, какой тип данных/объекта является top.url, и использовали бы его метод непосредственно внутри фигурных скобок d? давайте предположим, что это строка. что, если бы вы использовали sthg, например {topic.url.substring (индекс, где начинается идентификатор)}, чтобы извлечь идентификатор из URL-адреса d?

я имею в виду, например,
‹meta name="email.subject" content="Название сообщества: {community.name}, Название темы: {topic.name}, URL темы: {topic.url.substring(30)} "›

Суть в том, что я имею в виду просто использовать d соответствующих методов, специфичных для типа данных, в d фигурных скобках.

person Harikrishna Natrajan    schedule 02.11.2010
comment
Этот подход не работает... он отображает theme.url.substring(30) как есть. Я не думаю, что он понимает свою функцию Java - person Nisha; 03.11.2010

Я прихожу довольно поздно для ответа, но у меня была похожая проблема. В конце концов я понял, что скорость искала метод «getUrl» для моего «something.url», тогда как фактическое имя метода было «getURL» (заметьте, в верхнем регистре). В этом случае вам просто нужно явно написать «${something.getURL()}» вместо прежнего «${something.url}».

Это решило это для меня.

person DPM    schedule 06.07.2012