众所周知,JSP页面中是可以直接写原生Java代码的,只是需要把Java代码放到<%%>中。当JSP页面加载的时候,<%%>中的代码就会初始化,而不会等你调用的时候执行。
这样就有一个问题,比如我想实现一个功能:
当用户点击页面上某个按钮的时候,记录用户的操作日志到数据库中。
代码:
<input name="showRealPasswd" type="button" value="查看" class="btn_g" onclick="showRealPasswd()">
function showRealPasswd() {
var value = document.getElementById("compw_span").innerHTML;
if ("******" == value) {
document.getElementById("compw_span").innerHTML = "<%=x_com_passwd%>"
// 调用LogItemHBLT.java类中的writeItemLogHBLT()方法
<%=LogItemHBLT.getInstance().writeItemLogHBLT(request, 1, "WEB", content, "成功") %>
}
}
public int writeItemLogHBLT(HttpServletRequest request, int type, String device, String content, String result) {
HttpSession session = request.getSession();
UserRes curUser = (UserRes) session.getAttribute("curUser");
User user = curUser.getUser();
// do something
……
}
这样写大家能看出来有啥问题嘛?我们打开页面按F12看下这个JSP的源代码:发现了吗?源代码中并没有这一行代码:<%=LogItemHBLT.getInstance().writeItemLogHBLT(request, 1, "WEB", content, "成功") %>
而是直接初始化成了writeItemLogHBLT()方法的返回值:1,
所以当你点击“查看”按钮的时候,JS代码中的showRealPasswd()方法并不会去调Java类中的writeItemLogHBLT()方法,因为这个方法变成了常量1。
怎么解决这个问题呢?
可以新建一个JSP页面,Java代码的调用写在这个JSP中,然后在原来的JSP页面中调用这个页面。这样就将Java代码的执行“延迟”到子JSP页面了。
具体操作:
第一步:
新建一个JSP页面
<%@ page contentType="text/html;charset=GBK"%>
<%@page import="com.linkage.litms.system.dbimpl.LogItemHBLT"%>
<%@ page import="cn.hutool.json.JSONObject" %>
<%
request.setCharacterEncoding("GBK");
String device_serialnumber = request.getParameter("device_serialnumber");
String city_id = request.getParameter("city_id");
JSONObject operationContent = new JSONObject();
operationContent.set("device_serialnumber", device_serialnumber);
operationContent.set("city_id", city_id);
String content = operationContent.toString();
LogItemHBLT.getInstance().writeItemLogHBLT(request, 1, "WEB", content, "success");
%>
第二步:在原页面中调用新建的JSP
此时再来看下F12中的源代码:
此时再点击查看按钮就会去加载DeviceShowLogHBLT.jsp
另外注意一个问题:
如果Java类中的方法没有返回值,要使用<%><%>,而不是<%=><%>