Arhn - архитектура программирования

Почему функция EL не работает в этом случае?

Я работаю с Java 1.7, Eclipse Luna и JBoss 4.2.3.

Я создал простой динамический веб-проект с именем Test001_WAR. В этом:

Я создал класс StringUtil, в котором определяю общедоступный статический метод:

package com.srh.base.util;

public final class StringUtil {
    
    public static String notNullTrim(String string) {
        System.out.println("StringUtil.java: notNullTrim(String): string=" + string);
        if (string == null) {
            return "";
        } else {
            return string.trim();
        }
    }

}

Я создал файл myfunction.tld, в котором я сопоставил вышеуказанный метод Java с функцией EL:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xml="http://www.w3.org/XML/1998/namespace" 
        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 ">
    <display-name>Custom Functions</display-name>
    <tlib-version>1.0</tlib-version>
    <short-name>NMTOKEN</short-name>
    <uri>http://test001.srh.com/functions</uri>
    
    <function>
        <name>notNullTrim</name>
        <function-class>com.srh.base.util.StringUtil</function-class>
        <function-signature>java.lang.String notNullTrim(java.lang.String)</function-signature>
    </function>
</taglib>

Я создал index.jsp, где я использую вышеуказанную функцию EL для тестирования. В нем я определяю строку с пробелами abc , сохраняю ее в скрытой переменной, вызываю для нее функцию EL и сохраняю возвращаемое значение в другой скрытой переменной, а затем после загрузки значений предупреждений обеих скрытых переменных:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://test001.srh.com/functions" prefix="fr" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function afterLoad() {
    alert("h_mystring_org=" + document.getElementById("h_mystring_org").value); 
    alert("h_mystring_new=" + document.getElementById("h_mystring_new").value); 
}
</script>

</head>

<body onload="afterLoad();">

<%
String mystring = " abd ";
System.out.println("index.jsp: mystring=" + mystring);
%>

<form action="">
    <input type="hidden" id="h_mystring_org" name="h_mystring_org" value="<%=mystring%>">
    <input type="hidden" id="h_mystring_new" name="h_mystring_new" value="${fr:notNullTrim(mystring)}">
</form>

</body>

</html>

Я развертываю WAR на JBoss. Затем перейдите по URL-адресу

http://localhost:8080/Test001_WAR/index.jsp

Это не работает. Функция в классе StringUtil была вызвана, но полученное значение параметра не совпадало с переданным из JSP.

В файле server.log вижу:

2016-01-10 10:58:37,295 ИНФОРМАЦИЯ [STDOUT] index.jsp: mystring= abd

2016-01-10 10:58:37,298 ИНФОРМАЦИЯ [STDOUT] StringUtil.java: notNullTrim(String): string=

Предупреждающие значения были

h_mystring_org=абд

h_mystring_new=

Что я здесь делаю неправильно?

10.01.2016

Ответы:


1

Почему бы вам не использовать стандартный JSTL fn:trim() функция, которая делает именно это?

В любом случае JSP EL использует атрибуты page/request/session/application. Не локальные переменные скриптлета.

Ваш код (вероятно) работал бы, если бы скриптлет

page.setAttribute("mystring", " abd ");    

или, если вы правильно сделали и совсем забыли про скриптлет:

<c:set var="mystring" value=" abd "/>
10.01.2016
  • Спасибо, что напомнили, что EL использует атрибуты. Когда я добавляю pageContext.setAttribute("mystring", " abd ");, это работает. 10.01.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..