Как получить доступ к переменной c: set из jsp в javascript не работает [дубликат]

Просто для удовольствия я играл с представлением поплавков, следуя определениям из стандарта C99, и я написал код ниже.

Код печатает двоичное представление поплавков в 3 отдельных группах

SIGN EXPONENT FRACTION

, и после этого он печатает сумму, которая при суммировании с достаточной точностью покажет значение, которое действительно существует в аппаратном обеспечении.

Поэтому, когда вы пишете float x = 999... компилятор преобразует это число в битовое представление, напечатанное функцией xx, так что сумма, напечатанная функцией yy, будет равна заданному числу.

В действительности эта сумма является только приближение. Для числа 999,999,999 компилятор будет вставлять в бит представление float число 1,000,000,000

После кода я присоединяю консольный сеанс, в котором я вычисляю сумму терминов для обеих констант (минус PI и 999999999) который действительно существует в аппаратном обеспечении, вставленном там компилятором.

#include <stdio.h>
#include <limits.h>

void
xx(float *x)
{
    unsigned char i = sizeof(*x)*CHAR_BIT-1;
    do {
        switch (i) {
        case 31:
             printf("sign:");
             break;
        case 30:
             printf("exponent:");
             break;
        case 23:
             printf("fraction:");
             break;

        }
        char b=(*(unsigned long long*)x&((unsigned long long)1<<i))!=0;
        printf("%d ", b);
    } while (i--);
    printf("\n");
}

void
yy(float a)
{
    int sign=!(*(unsigned long long*)&a&((unsigned long long)1<<31));
    int fraction = ((1<<23)-1)&(*(int*)&a);
    int exponent = (255&((*(int*)&a)>>23))-127;

    printf(sign?"positive" " ( 1+":"negative" " ( 1+");
    unsigned int i = 1<<22;
    unsigned int j = 1;
    do {
        char b=(fraction&i)!=0;
        b&&(printf("1/(%d) %c", 1<<j, (fraction&(i-1))?'+':')' ), 0);
    } while (j++, i>>=1);

    printf("*2^%d", exponent);
    printf("\n");
}

void
main()
{
    float x=-3.14;
    float y=999999999;
    printf("%lu\n", sizeof(x));
    xx(&x);
    xx(&y);
    yy(x);
    yy(y);
}

Вот сеанс консоли, в котором я вычисляю реальное значение float, которое существует в аппаратном обеспечении. Я использовал bc для печати суммы терминов, выводимых основной программой. Можно вставить эту сумму в python repl или что-то подобное.

-- .../terra1/stub
@ qemacs f.c
-- .../terra1/stub
@ gcc f.c
-- .../terra1/stub
@ ./a.out
sign:1 exponent:1 0 0 0 0 0 0 fraction:0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 0 0 0 0 1 1
sign:0 exponent:1 0 0 1 1 1 0 fraction:0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 0
negative ( 1+1/(2) +1/(16) +1/(256) +1/(512) +1/(1024) +1/(2048) +1/(8192) +1/(32768) +1/(65536) +1/(131072) +1/(4194304) +1/(8388608) )*2^1
positive ( 1+1/(2) +1/(4) +1/(16) +1/(32) +1/(64) +1/(512) +1/(1024) +1/(4096) +1/(16384) +1/(32768) +1/(262144) +1/(1048576) )*2^29
-- .../terra1/stub
@ bc
scale=15
( 1+1/(2) +1/(4) +1/(16) +1/(32) +1/(64) +1/(512) +1/(1024) +1/(4096) +1/(16384) +1/(32768) +1/(262144) +1/(1048576) )*2^29
999999999.999999446351872

Вот и все. Фактически значение 999999999

999999999.999999446351872

Вы также можете проверить с помощью bc, что -3.14 также возмущено. Не забудьте установить коэффициент scale в bc.

Отображаемая сумма - это то, что внутри аппаратного обеспечения. Значение, которое вы получаете, вычисляя его, зависит от установленного вами масштаба. Я установил коэффициент scale равным 15. Математически, с бесконечной точностью, кажется, что это 1 000 000 000.

12
задан BalusC 20 February 2016 в 08:58
поделиться

3 ответа

Вам нужно понять, что Java / JSP - это просто производитель кода HTML / CSS / JS. Итак, все, что вам нужно сделать, это просто позволить JSP распечатать переменную Java, как если бы она была переменной JavaScript, и что сгенерированный вывод кода HTML / JS синтаксически корректен.

При условии, что переменная Java доступна в область EL с помощью ${foo}, вот несколько примеров, как ее напечатать:

<script>var foo = '${foo}';</script>
<script>someFunction('${foo}');</script>
<div onclick="someFunction('${foo}')">...</div>

Представьте, что переменная Java имеет значение "bar", тогда JSP в конечном итоге сгенерирует этот HTML-код, который вы можете проверить с помощью rightclick, Просмотреть источник в веб-браузере:

<script>var foo = 'bar';</script>
<script>someFunction('bar');</script>
<div onclick="someFunction('bar')">...</div>

Обратите внимание, что эти одиночные кавычки, таким образом, являются обязательными для представления переменная с строкой в ​​JS. Если вы использовали var foo = ${foo}; вместо этого, тогда он будет печатать var foo = bar;, который может закончиться ошибками «bar undefined», когда вы пытаетесь получить доступ к нему дальше в JS-коде (вы можете увидеть ошибки JS в консоли JS веб-разработчик браузера, который вы можете открыть, нажав F12 в Chrome / FireFox23 + / IE9 +). Также обратите внимание, что если переменная представляет собой число или логическое значение, которое не нужно указывать, то оно будет работать нормально.

Если переменная возникает из пользовательского ввода, чтобы учесть дыры XSS-атаки и JS, ускоряя . В нижней части нашей страницы wiki вы можете найти пример, как создать пользовательскую функцию EL, которая ускользает от переменной Java для безопасного использования в JS.

Если переменная является бит более сложный, например Java-компонент или его список или карту, то вы можете использовать одну из многих доступных JSON-библиотек для преобразования объекта Java в строку JSON. Вот пример, предполагающий Gson.

String someObjectAsJson = new Gson().toJson(someObject);

Обратите внимание, что таким образом вам больше не нужно печатать его в качестве цитируемой строки.

<script>var foo = ${someObjectAsJson};</script>

См. Также:

17
ответ дан Community 28 August 2018 в 17:02
поделиться

На странице JSP:

<c:set var="list_size" value="${list1.size() }"></c:set>

Получите доступ к этому значению на странице Javascript, используя:

var list_size = parseInt($('#list_size').val());

Я добавил страницу javascript в свой проект извне.

-1
ответ дан Parth Patel 28 August 2018 в 17:02
поделиться

Если вы предварительно заполняете поля формы на основе параметров в HTTP-запросе, то почему бы просто не сделать это на стороне сервера в JSP ... а не на стороне клиента с JavaScript? В JSP это выглядело бы смутно:

<input type="text" name="myFormField1" value="<%= request.getParameter("value1"); %>"/>

На стороне клиента JavaScript действительно не имеет понятия «объекта запроса». Вам очень нужно самостоятельно разобрать строку запроса, чтобы получить параметры CGI. Я подозреваю, что это не то, что вы на самом деле хотите сделать.

6
ответ дан Steve Perkins 28 August 2018 в 17:02
поделиться
Другие вопросы по тегам:

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