ServletContext
1、ServletContext
web容器启动时,为每一web程序创建一个对应的ServletContext对象。作用:共享数据,可以在一个Servlet中拿到另外一个Servlet中的内容。
测试:
public class SetServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username="姜楠";
context.setAttribute("username",username);
}
}
public class GetServletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String)context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().write("名字:"+username);
}
}
分别在web.xml中配置后,先打开SetServletContext,后打开GetServletContext才能拿到内容。
2、ServletContext应用
1)获取初始化参数
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/maven</param-value>
</context-param>
获取url:
String url = context.getInitParameter("url");
resp.getWriter().write(url);
2)请求转发
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/get");//转发的url
requestDispatcher.forward(req,resp);//实现请求转发
输入此Servlet的url会获取到/get路径下的数据。
3)获取资源文件
在resources下新建properties文件
注意文件的路径
InputStream is = context.getResourceAsStream("/WEB-INF/classes/db.properties");
Properties properties=new Properties();
properties.load(is);
resp.getWriter().write(properties.getProperty("username")+properties.getProperty("password"));
Response
重定向
使用sendRedirect()
HttpServletRequest
request代表客户端的请求,用户通过http协议访问服务器,HTTP请求中的所有信息会被封装到request中,通过request的方法,获取客户端的所有信息
保存会话的两种方式
Cookie:
1、从请求中拿到cookie
2、服务器端响应给客户端cookie
//解决乱码问题
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
req.setCharacterEncoding("UTF-8");
//服务器从客户端获取Cookie
Cookie[] cookie=req.getCookies();//这里返回数组,不止有一个cookie
PrintWriter printWriter= resp.getWriter();
//判断cookie是否为空
if(cookie!=null)
{
printWriter.write("上一次访问时间:");
for(int i=0;i<cookie.length;i++)
{
if(cookie[i].getName().equals("LastLoginTime"))
{
long lastLoginTime=Long.parseLong(cookie[i].getValue());
Date date=new Date(lastLoginTime);
printWriter.write(date.toLocaleString());
}
}
}
else {
printWriter.write("这是第一次访问本网站");
}
Cookie cookie1=new Cookie("LastLoginTime",System.currentTimeMillis()+"");
resp.addCookie(cookie1);
}
在浏览器中查看结果
服务器设置新的cookie!
请求获取cookie,此cookie是上一次访问该网站cookie。
可以给cookie设置最大存活时间cookie.setMaxAge(),例如10秒钟,此时响应头中会添加新的信息
10秒内刷新浏览器会获取到该cookie,10秒后刷新该cookie会消失,请求中不包含cookie。
Session
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("UTF-8");
//获取session
HttpSession session= req.getSession();
//向session中添加
session.setAttribute("name","姜楠");
String id = session.getId();
if(session.isNew())
{
resp.getWriter().write("session是新创建的,id:"+id);
}
else
{
resp.getWriter().write("session已在服务器中创建,id"+id);
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
HttpSession session=req.getSession();
System.out.println(session.getAttribute("name"));
}
Session与cookie的区别:
cookie是将用户数据存储在用户浏览器,服务器通过请求可以获取cookie,session是将用户数据存储在服务器中,分发给用户一个sessionid,服务通过识别sessionid从而获取到用户数据