Является ли этот класс потокобезопасным: com.orionserver.http.OrionHttpJspPage

Мы используем JDeveloper 10.1.3.4 для разработки веб-приложений. Развертываем приложение на OC4J под управлением linux. Мы помещаем java-код прямо на jsp-страницу. На странице jsp у нас есть общий java-код, например,

<% String invoice_id = ""; %> 

Здесь переменная invoice_id - это переменная экземпляра в jsp. У нас также есть теги, такие как и, для обработки транзакций с базой данных. У нас есть такой jsp, который называется paymentApproved.jsp. Этот jsp вызывается сторонним шлюзом. Другими словами, jsp вызывается извне нашего приложения. Мой вопрос: является ли этот jsp paymentApproved.jsp потокобезопасным в таком сценарии? Я проверил переведенную страницу jsp, класс расширяет com.orionserver.http.OrionHttpJspPage, и логика заключается в этом методе:

public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException

В частности, я не уверен, является ли переменная экземпляра, определенная в таком jsp, потокобезопасной, когда для вызова страницы поступает несколько запросов? Или все-таки есть возможность протестировать? (Я знаю, что вставлять java-код в jsp - плохая идея. Но это проект моего босса, а не мой.) Спасибо

Код JSP:

<%@ include file="mainHeader.jsp"%>
<%
  String inv_id = "";
%>

<jbo:ApplicationModule id="AM_Payment" definition="test.AM_Payment" releasemode="Stateless" />
<jbo:DataSource id="dsinv" appid="AM_Payment" viewobject="InvoiceView1"/>

<%

  SimpleDateFormat dtformat = new SimpleDateFormat("yyyy-MM-dd");
  SimpleDateFormat tmformat = new SimpleDateFormat("HH:mm:ss");
  String invoicedateStr = dtformat.format(new java.util.Date());
  oracle.jbo.domain.Date invoicedate = new oracle.jbo.domain.Date(invoicedateStr);
  String invoicetime = tmformat.format(new java.util.Date());

  inv_id = invoicedateStr+invoicetime;

%>

<BR><BR>
<table>
  <tr><td>Invoice id:&nbsp;&nbsp; <%=inv_id%></td></tr>
</table>
<hr>
<% 

    long startTime = System.nanoTime();
    int[] dummy = new int[10];
      for (int i=0; i<999999999; i++) {
        for (int j=0; j<10; j++) {
          dummy[j] = i;
        }
      } 
    long endTime = System.nanoTime();
    long duration = endTime - startTime;
    double seconds = (double)Math.round( (duration/1000000000.0d) *100.0d)/100.0d;    
    String sec = Double.toString(seconds);    
%>
<table>
<tr><td>Invoice id:&nbsp;&nbsp; <%=inv_id%></td></tr>
<tr><td>&nbsp;&nbsp;</td></tr>

<tr><td>Process time:&nbsp;&nbsp; <%=sec%>&nbsp;&nbsp;seconds</td></tr>

</table>
<hr>

<jbo:ReleasePageResources releasemode="Stateless"/>
</body>
</html> 

Лист


person Raistlin    schedule 18.11.2013    source источник


Ответы (1)


<% String invoice_id = ""; %>

Здесь переменная invoice_id - это переменная экземпляра в jsp.

Нет, это не так. Это локальная переменная служебного метода JSP.

является ли этот jsp paymentApproved.jsp потокобезопасным?

Как мы можем сказать, не увидев ни одного символа этого JSP?

Помещать Java-код в JSP - крайне плохая идея. Скриплеты нельзя использовать годами. Используйте JSP как компоненты чистого представления, единственная роль которых - генерировать разметку HTML из bean-компонентов, хранящихся в запросе te, контроллером, написанным на Java.

person JB Nizet    schedule 18.11.2013