在js函数里嵌套的java代码即使不被调用也会执行
JS代码是本地的静态的,JAVA代码是服务器的动态的。
实例一、Cookie的增删
这样写是无法达到在点击时触发删除的效果的,因为嵌套的java代码一定会被执行:
<script type="text/javascript">
function del() {
<%
Cookie[] cookies = request.getCookies(); //在js函数里嵌套的java代码即使不被调用也会执行
if(cookies!=null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("autologin")){
cookie.setMaxAge(0); //函数即使没被调用cookie也会被设为0
response.addCookie(cookie);
}
}
}
%>
}
</script>
<a href="#" onclick=del()> </a>
实例二、Session的增删 (同上会自动执行)
function exitSystem()
{
var ok = confirm("您确定要退出该系统吗?");
if(ok){
<%session.removeAttribute("user");%>
}
window.close();
}
<a href="#" onclick=exitSystem()> </a>
问题:包含这个js的页面,函数没运行,但是session中的user被清除了。
分析: <%session.removeAttribute(“user”);%> 是在服务端执行的,而js是在浏览器端执行的。流程:访问服务器-》服务端运行Java代码,生成静态内容-》返回给客户端浏览器-》浏览器展示并运行js代码,也就是session清除user属性的操作在服务端已经执行了,这才会导致明明登录了,session中却没有user的问题。
解决方法:用location.href或者window.location跳转到另一个处理页面
在没有掌握其他技术的情况下,最好的方法便是jsp页面和js页面分开写,通过跳转来实现。分开写
function exitSystem()
{
var ok = confirm("您确定要退出该系统吗?");
if(ok){
location.href="${pageContext.request.contextPath}/removeUser"; //通过跳转到后台的代码里来删除数据
}
window.close();
}
jsp
exitRegister.jsp
在welcome.jsp的js函数中直接跳转到exitRegister.jsp。由exitRegister.jsp来实现session的删除和跳转回登录首页。(cookie同理)
jsp页面:
<script type="text/javascript">
function del() {
location.href="${pageContext.request.contextPath}/FormServlet";
window.close();
}
</script>
<p>欢迎您!您已登录 <a href="#" onclick=del()>点击退出</a></p>
FormServlet页面:
Cookie[] cookies = request.getCookies(); //Cookie在这是可以正常删除的,但是Session对象可能不行
if(cookies!=null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("autologin")){
out.println((String) cookie.getValue());
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
}
response.sendRedirect("/login.jsp");
分页面处理就可以在想用的时候用