2016-03-17 2 views
0

Я работал над проектом с использованием MVC, создающего JSP в качестве уровня представления. Я тестировал результат сеанса, аппликации и объекта запроса, доступного JSP. Я написал следующий код:JSP Проверка объекта по умолчанию

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<!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>Calculator</title> 
</head> 
<body> 
    <%! int result = 0; 
     int add_request(String num1, String num2){ 
      if((num1 != null && num2 !=null) && (!num1.isEmpty() && !num2.isEmpty())) 
       result = Integer.parseInt(num1)+Integer.parseInt(num2); 
     return result; 
    } 

    int div_session(String number, String number1){ 
     if((number != null && number1 != null) && (!number.isEmpty() && !number1.isEmpty())) 
       return (Integer.parseInt(number)/Integer.parseInt(number1)); 
     return 0; 
    } 

    int mult_context(String number, String number1){ 
     if((number != null && number1 != null) && (!number.isEmpty() && !number1.isEmpty())) 
       return (Integer.parseInt(number)*Integer.parseInt(number1)); 
     return 0; 
    } 

    %> 

    <div align="center"> 
     <form> 
      Number: <input type="text" name="num1" /> <br> 
      Number: <input type="text" name="num2" /> 
      <div align="center"> 
      <input type="submit" > 
      </div> 
     </form> 
    </div> 

    <% 
     ServletContext context = request.getServletContext(); 
     String firstnum = request.getParameter("num1"); 
     String secondnum = request.getParameter("num2"); 
     if((firstnum != null && secondnum != null) && (!firstnum.isEmpty() && !secondnum.isEmpty())) 
     { 
      session.setAttribute("test1", firstnum); 
      session.setAttribute("test2", secondnum); 
      context.setAttribute("test1", firstnum); 
      context.setAttribute("test2", secondnum); 
      application.setAttribute("test1", firstnum); 
      application.setAttribute("test2", secondnum); 
     } 
    %> 
    Result:<br> 

    <br>Add request: <%= add_request(request.getParameter("num1"), request.getParameter("num2")) %> 
    <br>Division session: <%= div_session((String)session.getAttribute("test1"), (String)session.getAttribute("test2")) %> 
    <br>Multiplication context: <%= mult_context((String)context.getAttribute("test1"), (String)context.getAttribute("test2")) %> 
    <br>Application Result: <%= mult_context((String)application.getAttribute("test1"), (String)application.getAttribute("test2")) %> 

</body> 
</html> 

Нужный выход был:
Номер: 120
Количество: 20


Добавить результат: 140
Отдел Сессия: 6
Контракт умножения: 2400
Умножение аппликата ion: 2400

И когда я повторно отправлю, тогда параметр, переданный объекту запроса, равен нулю, поэтому добавление результата должно быть нулевым. если я открываю новую вкладку, то присоединяет url без параметра, а затем добавляет результат, равный нулю. Когда я открываю другой браузер, то сеанс отдела должен быть равен нулю. но все идет так же.


Поскольку согласно теории только сеанс и объект приложения/контекста постоянны между несколькими запросами, и только контекст является постоянным через несколько сеансов.


Ребята, где я неправильно. Спасибо.

+0

все выглядит нормально. –

+0

Если я обновляю, тогда параметры num1 и num2 будут равны нулю, поэтому метод add покажет 0, но покажет последний результат, не обновляя результат в следующем запросе. так и сеанс и приложение. –

ответ

1

Вы создали переменную экземпляра экземпляра Servlet, созданного из вашего переведенного JSP.

<%! int result = 0 

Чтобы вернуть нуль, вам необходимо перезагрузить JSP или ваше веб-приложение. В Tomcat (см рабочую папку), которая выглядит следующим образом

public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase 
    implements org.apache.jasper.runtime.JspSourceDependent, 
      org.apache.jasper.runtime.JspSourceImports { 

    int result = 0; 
    ... 
} 

Поэтому в вашем методе add_request, когда параметры являются пустыми, сохраненное значение результата возвращается.

1

См., Это происходит из-за концепции Scope.

JSP имеет есть осциллографы более Ликей говорят тогда от узкого до широкого пути:

1. request 
2. page 
3. session 
4. application 

Теперь, как я знал тогда,

Когда некоторые parameter собирается принести, скажем,

от запроса собирается «num1» & «num2» (которые уже установлены в сеанс + область применения при запросе первого запроса), тогда

если он не найден (на самом деле не найден при обновлении страницы), тогда он попытается найти , если он там есть.

Итак, наконец-то здесь, в вашем случае,

если num1 или num2 не найден из запроса (когда обновления страницы) это начало искать со следующего уровня более широкого охвата, если он присутствует, то или нет (шире пробега запроса).Направление

Престола, то поиск должен следующего следующий широкий охват до тех пор пока не найти, наконец, не найти где-то возвращает нуль,

поэтому он получает от сессии, то это не будет идти искать в сферу применения.

Спасибо.

ОБНОВЛЕНО

пожалуйста следующие изменения в код ...

int add_request(String num1, String num2){ 

      if((num1 != null && num2 !=null) && (!num1.isEmpty() && !num2.isEmpty())) 
       result = Integer.parseInt(num1)+Integer.parseInt(num2); 
      else 
       result = 0; 

     return result; 

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

+0

Хорошо, что request.getParameter («num1») ищет расширенные области параметров, но я сохранил объект с другим именем, т. Е. Имя параметра формы - num1, num2, но в сеансе и приложении имя параметра test1, test2, то как это сделать отображение происходит. –

+0

@AbhijatyaSingh см. Мой раздел UPDATED ... вы правы, что для разных областей нет одинакового имени. простите..!! Спасибо :-) –

+0

спасибо, это !!!!!!!! –

1

Воспользуйтесь приведенным ниже кодом для add_request. Меня устраивает!

int add_request(String num1, String num2) { 
     if ((num1 != null && num2 != null) 
       && (!num1.isEmpty() && !num2.isEmpty())) 
      return (Integer.parseInt(num1) + Integer.parseInt(num2)); 
     return 0; 
    } 

В вашем коде только что добавленная опция работает некорректно. Фактически опция разделения работает нормально, как ожидалось (в разных браузерах сеанс не переносится). Если вы сделаете вышеуказанное изменение в своем коде, вся область действия будет работать должным образом.

+0

Точно. Члену экземпляра «результат» даже не требуется. – rickz

+0

Спасибо, это !!!!!! –