- _nosay
网站的自动刷新及Servlet线程安全
2017-11-20 12:04:20
相关方法,response.setHeader("refresh",3);
建立RefreshServlet文件,相应代码为
package com.nosay.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "RefreshServlet",urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setHeader("refresh","3");
response.getWriter().print("3秒后自动刷新");
}
}打开浏览器访问,发现它在3秒后自动刷新,测试成功.
但是如果我们希望其在3秒后自动跳转到另外一个界面的时候,应该怎么处理呢?
我们只需要稍微改变一下代码,即可实现相应的功能了.
相关代码如下:
package com.nosay.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "RefreshServlet",urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.setHeader("refresh","3;url='https://www.baidu.com'");
response.getWriter().print("3秒后自动刷新");
}
}这样,三秒过后就自动跳转到百度去了.
在实际的开发中,三秒后自动刷新这样的功能是不会直接写到servlet中的,这些代码通常会写到jsp中.
在根目录下建立refresh.jsp文件,相关内容如下:
<%--
Created by IntelliJ IDEA.
User: nosay
Date: 17-11-20
Time: 上午11:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%=request.getAttribute("message")%>
</body>
</html>RefreshServlet相关内容如下
package com.nosay.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "RefreshServlet",urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String message = "<meta http-equiv=\"refresh\" content=\"3;url=/member.jsp\">3秒后会自动跳转到首页,如果没有跳转,请点击<a href='/member.jsp'>跳转链接 </a>";
request.setAttribute("message",message);
request.getRequestDispatcher("/refresh.jsp").forward(request,response);
RefreshDemo(response);
}
private void RefreshDemo(HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
response.setHeader("refresh","3;url='https://www.baidu.com'");
response.getWriter().print("3秒后自动刷新");
}
}打开相应的url地址,测试成功.
Servlet线程安全问题
什么是线程安全?
Servlet的线程安全相关
当多个客户端并发访问同一个Servlet的时候,web服务器会为每一个客户端的访问创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内部如果访问了同一个共享资源的话,就可能引发线程安全问题.
例子:
建立ThreadServlet文件,内容为
package com.nosay.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "ThreadServlet",urlPatterns = "/thread")
public class ThreadServlet extends HttpServlet {
int i = 0;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
i ++;
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(i+"");
}
}此时,分别打开两个浏览器访问,运行结果全部为2,并不像我们想像的那样,一个是1一个是2.
解决,可以使用同步代码块,如下所示
package com.nosay.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "ThreadServlet",urlPatterns = "/thread")
public class ThreadServlet extends HttpServlet {
int i = 0;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
synchronized (this)
{
i ++;
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(i+"");
}
}
}