WEB项目总路径问题总结:
背景:项目中的资源文件我们如何访问:(路径怎么写)
例子:webRoot目录下有一个目标资源: target.html,如何访问
|
思考:
目标资源是给谁使用的。 * 给服务器使用的: / 表示在当前web应用的根目录(webRoot下) * 给浏览器使用的: / 表示在webapps的根目录下 |
代码测试:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //目标资源: target.html /** * 思考: 目标资源是给谁使用的。 * 给服务器使用的: / 表示在当前web应用的根目录(webRoot下) * 给浏览器使用的: / 表示在webapps的根目录下 */ /** * 1.转发:服务器内部使用,直接访问,不要项目名 */ // request.getRequestDispatcher("/target.html").forward(request, response); /** * 2.请求重定向 : 浏览器访问项目,需要项目名 */ // response.sendRedirect("/day11/target.html"); /** * 3.html页面的超连接href : 超链接,浏览器访问:需要项目名 */ // response.getWriter().write("<html><body><a href=‘/day11/target.html‘>超链接</a></body></html>"); /** * 4.html页面中的form提交地址 : 浏览器范文,需要项目名 */ response.getWriter().write("<html>" + "<body>" + "<form action=‘/day11/target.html‘>" + "<input type=‘submit‘/>" + "</form>" + "</body>" + "</html>"); } |
获取Tomcat服务器项目路径
API介绍:
request.getSession().getServletContext().getRealPath("/"); |
打印的结果是:
|
代码:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(request.getSession().getServletContext().getRealPath("/")); } |
读取Web应用路径下的配置文件:
代码一::
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 使用web应用下加载资源文件的方法 */ /** * 1. getRealPath读取,返回资源文件的绝对路径(物理路径):服务器内部调用,不用项目名 */ String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties"); System.out.println(path); File file = new File(path); FileInputStream in = new FileInputStream(file); Properties prop = new Properties(); // //读取资源文件 prop.load(in); String user = prop.getProperty("user"); String password = prop.getProperty("password"); System.out.println("user="+user); System.out.println("password="+password); } |
打印结果:
user=root password=root |
代码二,使用类加载器方式:
InputStream in=ResourceDemo.class.getClassLoader().getResourceAsStream("db.properties"); Properties prop = new Properties(); // //读取资源文件 prop.load(in); // String user = prop.getProperty("user"); String password = prop.getProperty("password"); System.out.println("user="+user); System.out.println("password="+password); |
打印结果一样
代码三:
/** * 2. getResourceAsStream() 得到资源文件,返回的是输入流 */ InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Properties prop = new Properties(); //读取资源文件 prop.load(in); String user = prop.getProperty("user"); String password = prop.getProperty("password"); System.out.println("user="+user); System.out.println("password="+password); |
注意一下,下面的代码效果是一样的:
request.getSession().getServletContext().getRealPath("/"); this.getServletContext().getRealPath("/"); ResourceDemo.class.getClassLoader().getResourceAsStream("db.properties") this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); |
会话管理
概念:
会话管理: 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据 |
会话技术:
Cookie技术:会话数据保存在浏览器客户端。 Session技术:会话数据保存在服务器端。 |
Cookie技术以及常用的API
特点:
Cookie技术:会话数据保存在浏览器客户端 |
Cookie类:用于存储会话数据 1)构造Cookie对象 Cookie(java.lang.String name, java.lang.String value) 2)设置cookie void setMaxAge(int expiry) : 设置cookie的有效时间 void setValue(java.lang.String newValue) :设置cookie的值 3)发送cookie到浏览器端保存 void response.addCookie(Cookie cookie) : 发送cookie 4)服务器接收cookie Cookie[] request.getCookies() : 接收cookie |
代码演示
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.创建Cookie对象 Cookie cookie1 = new Cookie("name","eric"); cookie1.setValue("jerry"); /** * 2)设置cookie的有效时间 * 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。 负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!! 零:表示删除同名的cookie数据 */ cookie1.setMaxAge(20); //20秒,从最后不调用cookie开始计算 数字表示时间 // cookie1.setMaxAge(-1); //cookie保存在浏览器内存(会话cookie) // cookie1.setMaxAge(0); //2.把cookie数据发送到浏览器(通过响应头发送: set-cookie名称) response.addCookie(cookie1); //3.接收浏览器发送的cookie信息 Cookie[] cookies = request.getCookies(); //注意:判断null,否则空指针 if(cookies!=null){ //遍历 for(Cookie c:cookies){ String name = c.getName(); String value = c.getValue(); System.out.println(name+"="+value); } }else{ System.out.println("没有接收cookie数据"); } } |
打印结果:
|
Cookie原理
1)服务器创建cookie对象,把会话数据存储到cookie对象中。 new Cookie("name","value"); 2) 服务器发送cookie信息到浏览器 response.addCookie(cookie); 3)浏览器得到服务器发送的cookie,然后保存在浏览器端。 4)浏览器在下次访问服务器时,会带着cookie信息 5)服务器接收到浏览器带来的cookie信息 request.getCookies(); |
删除Cookie
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 需求: 删除cookie */ Cookie cookie = new Cookie("name","xxxx"); cookie.setMaxAge(0);//删除同名的cookies 这个位置不要和下面那一行到代码换位置 // 把cookie数据发送到浏览器(通过响应头发送: set-cookie名称) response.addCookie(cookie); System.out.println("删除成功"); //3.接收浏览器发送的cookie信息 Cookie[] cookies = request.getCookies(); //注意:判断null,否则空指针 if(cookies!=null){ //遍历 for(Cookie c:cookies){ String name = c.getName(); String value = c.getValue(); System.out.println(name+"="+value); } }else{ System.out.println("没有接收cookie数据"); } } |
打印结果:
|
Cookie应用:用户上次访问的时间
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //获取当前时间 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String curTime = format.format(new Date()); //取得cookie Cookie[] cookies = request.getCookies(); String lastTime = null; if(cookies!=null){ for (Cookie cookie : cookies) { if(cookie.getName().equals("lastTime")){ //有lastTime的cookie,已经是第n次访问 lastTime = cookie.getValue();//上次访问的时间 //第n次访问 //1.把上次显示时间显示到浏览器 response.getWriter().write("欢迎回来,你上次访问的时间为:"+lastTime+",当前时间为:"+curTime); //2.更新cookie cookie.setValue(curTime); cookie.setMaxAge(1*30*24*60*60); //3.把更新后的cookie发送到浏览器 response.addCookie(cookie); break; } } } |
Session技术
引入 Cookie的局限: 1)Cookie只能存字符串类型。不能保存对象 2)只能存非中文。 3)1个Cookie的容量不超过4KB。 如果要保存非字符串,超过4kb内容,只能使用session技术!!! |
Session技术的特点:
Session特点: 会话数据保存在服务器端。(内存中) |
Session技术主要的类和API
HttpSession类:用于保存会话数据 1)创建或得到session对象 HttpSession getSession() HttpSession getSession(boolean create) 2)设置session对象 void setMaxInactiveInterval(int interval) : 设置session的有效时间 void invalidate() : 销毁session对象 java.lang.String getId() : 得到session编号 3)保存会话数据到session对象 void setAttribute(java.lang.String name, java.lang.Object value) : 保存数据 java.lang.Object getAttribute(java.lang.String name) : 获取数据 void removeAttribute(java.lang.String name) : 清除数据 |
代码测试:
SessionDemo1.java
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.创建session对象 HttpSession session = request.getSession(); /** * 得到session编号 */ System.out.println("id="+session.getId()); /** * 修改session的有效时间 单位 :秒 */ session.setMaxInactiveInterval(10); /** * 手动发送一个硬盘保存的cookie给浏览器 */ Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c); //2.保存会话数据 session.setAttribute("name", "rose"); } |
SessionDemo2.java
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到session对象 HttpSession session = request.getSession(false); if(session==null){ System.out.println("没有找到对应的sessino对象"); // return; } //3.接收浏览器发送的cookie信息 Cookie[] cookies = request.getCookies(); //注意:判断null,否则空指针 if(cookies!=null){ //遍历 for(Cookie c:cookies){ String name = c.getName(); String value = c.getValue(); System.out.println(name+"="+value); } }else{ System.out.println("没有接收cookie数据"); } /** * 得到session编号 */ if(session != null){ System.out.println("id="+session.getId()); //2.取出数据 String name = (String)session.getAttribute("name"); System.out.println("name="+name); } } |
Session的一些细节:
1)java.lang.String getId() : 得到session编号 2)两个getSession方法: getSession(true) / getSession() : 创建或得到session对象。没有匹配 的session编号,自动创建新的session对象。 getSession(false): 得到session对象。没有匹配的session编号,返回null 3)void setMaxInactiveInterval(int interval) : 设置session的有效时间 session对象销毁时间: 3.1 默认情况30分服务器自动回收 3.2 修改session回收时间 3.3 全局修改session有效时间 |
<!-- 修改session全局有效时间:分钟 --> <session-config> <session-timeout>1</session-timeout> </session-config> |
3.4.手动销毁session对象 void invalidate() : 销毁session对象 |
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); if(session!=null){ session.invalidate();//手动销毁 System.out.println("手动销毁"); } System.out.println("销毁成功"); } |
Session的原理
问题: 服务器能够识别不同的浏览者!!! 现象: 前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!! 浏览器1:(给s1分配一个唯一的标记:s001,把s001发送给浏览器) 1)创建session对象,保存会话数据 HttpSession session = request.getSession(); --保存会话数据 s1 浏览器1 的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1) 1)得到session对象的会话数据 HttpSession session = request.getSession(); --可以取出 s1 新的浏览器1:(没有带s001,不能返回s1) 1)得到session对象的会话数据 HttpSession session = request.getSession(); --不可以取出 s2 浏览器2:(没有带s001,不能返回s1) 1)得到session对象的会话数据 HttpSession session = request.getSession(); --不可以取出 s3 |