我们使用JDeveloper 10.1.3.4来开发web应用程序。我们将应用程序部署在运行在linux上的OC4J上。我们将java代码直接放在jsp页面中。在jsp页面中,我们有通用的java代码,例如
<% String invoice_id = ""; %>
这里的变量invoice_id是jsp中的一个实例变量。我们还有诸如和之类的标记来处理数据库事务。我们有一个名为paymentApproved.jsp的jsp。这个jsp由第三方网关调用。换句话说,jsp是从应用程序外部调用的。我的问题是,在这种情况下,这个jsp paymentApproved.jsp线程安全吗?我检查了翻译后的jsp页面,该类扩展了com.orinserver.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: <%=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: <%=inv_id%></td></tr>
<tr><td> </td></tr>
<tr><td>Process time: <%=sec%> seconds</td></tr>
</table>
<hr>
<jbo:ReleasePageResources releasemode="Stateless"/>
</body>
</html>
叶
<% String invoice_id = ""; %>
这里的变量invoice_id是jsp中的一个实例变量。
不,不是。它是JSP服务方法的一个局部变量。
这个jsp paymentApproved.jsp线程安全吗?
我们怎么能在不看到这个JSP的一个字符的情况下判断呢?
将Java代码放在JSP中是一个非常糟糕的主意。多年来,不应该使用小册子。使用JSP作为纯视图组件,其唯一作用是通过用Java编写的控制器从存储在te请求中的bean生成HTML标记。