servlet

您所在的位置:网站首页 怎么创建session对象 servlet

servlet

2024-07-10 18:26| 来源: 网络整理| 查看: 265

1.web项目中的路径 1.1 路径中最左边的/ /a/b/c/d 我们要讨论的是类似这样的路径中的最左边的/,除此之外其他/都是正常的路径分割符

客户端解析路径最左边的/ 代表的是端口号后面的/ http://ip:port/ 例如: 在页面中有一个超链接 测试 当我们点击这个超链接的时候,地址栏中的中会变成: http://ip:port/hello.html 例如: 在servlet完成一个客户端重定向操作 String url = "/hello.html"; response.sendRedirect(url); 由于客户端重定是把url地址返回给浏览器,浏览器解析之后,发出新的请求,这时候浏览器地址栏中的url地址变为: http://ip:port/hello.html 所以在这俩种情况下,url最左边加了/,那么运行之后出现404报错,查看浏览器地址栏后,发现请求的url地址中缺少了项目名 服务器端解析路径最左边的/ 代表的是项目名后面的/ http://ip:port/项目名/ 例如: 在web.xml文件中配置servlet的映射路径 /TestServlet 这个最左边的/是由服务器端进行解析的,所以它代表的是项目名后的/,浏览器进行访问的时候就要写这样的UR地址: http://ip:port/项目名/TestServlet 例如: 在servlet中进行服务器内部跳转操作 String url = "/TestServlet"; request.getRequestDispatcher(url).forward(request, response); 这个最左边的/是由服务器端进行解析的,所以它代表的是项目名后的/,最后内部跳转所访问的url地址就是: http://ip:port/项目名/TestServlet 1.2 HttpServletRequest中和路径相关的方法 // /web_servlet request.getContextPath(); // /PathServlet request.getServletPath(); // http://127.0.0.1:8989/web_servlet/PathServlet request.getRequestURL(); // /web_servlet/PathServlet request.getRequestURI(); 1.3 ServletContext中和路径相关的方法 ServletContext servletContext = getServletContext(); // /web_servlet servletContext.getContextPath(); //获得一个资源的绝对路径 // D:\jd2019\apache-tomcat-8.5.38\webapps\jd1911-servlet\ servletContext.getRealPath("/"); //获得一个指定路径下面所有的资源路径名 // 例如: /js/ /META-INF/ /a.html /param.html /login.html /WEB-INF/ /index.html /image/ /css/ /encoding.html servletContext.getResourcePaths("/"); 1.4 相对路径和绝对路径 绝对路径 使用servletContext.getRealPath("....")就可以获得一个资源的绝对路径 web形式的路径 例如: /hello.html 该路径会解析为: http://ip:port/hello.html 或者 http://ip:port/项目名/hello.html 具体是哪一种路径,要看解析这个/的是客户端还是服务器端 相对路径 例1: 假设path.html和hello.html在同一个目录下 path.html页面中有一个超链接 测试 超链接中的这个路径就是一个相对路径,相对于当前路径,当前路径指的是浏览器地址栏中这个时候的路径 所以当我们点击超链接的时候,就是在当前路径后面加上这个相对路径 访问path.html的url地址: http://127.0.0.1:8989/web_servlet/path.html 点击超链接之后,地址栏中的中变为: 当前路径+相对路径 http://127.0.0.1:8989/web_servlet/ + hello.html = http://127.0.0.1:8989/web_servlet/hello.html 例2: 假设path.html和hello.html不在同一个目录下,path.html在test目录下 path.html页面中有一个超链接 测试 超链接中的这个路径就是一个相对路径,相对于当前路径,当前路径指的是浏览器地址栏中这个时候的路径 所以当我们点击超链接的时候,就是在当前路径后面加上这个相对路径 访问path.html的url地址: http://127.0.0.1:8989/web_servlet/test/path.html 点击超链接之后,地址栏中的中变为: 当前路径+相对路径 http://127.0.0.1:8989/web_servlet/test + hello.html = http://127.0.0.1:8989/web_servlet/test/hello.html 这时候出现404错误,页面找不到 这个时候可以修改这个相对路径,使得点击超链接后可以正常访问 测试 例3: 假设path.html和hello.html在同一个目录下 path.html页面中有一个超链接 测试 web.xml中给PathServlet映射了一个路径 /servlet/PathServlet 访问这个servlet之后,会进行一个服务器内部跳转,跳转到path.html页面 浏览器显示path.html后,再点击页面中的超链接 先访问servlet http://127.0.0.1:8989/web_servlet/servlet/PathServlet 然后点击页面中的超链接 测试 超链接中的这个路径就是一个相对路径,相对于当前路径,当前路径指的是浏览器地址栏中这个时候的路径 所以当我们点击超链接的时候,就是在当前路径后面加上这个相对路径 点击超链接之后,地址栏中的中变为: 当前路径+相对路径 http://127.0.0.1:8989/web_servlet/servlet + hello.html = http://127.0.0.1:8989/web_servlet/servlet/hello.html 所以最后又出现了404报错信息 例4: 在html页面添加base标签之后,这个页面中的所有相对路径,就不再是相对于地址栏中的路径了,而是相对于base标签中设置的路径 path.html 测试

2.request session application 2.1 这三种对象可以在服务器内部帮我们保存数据以及传递数据. 类型(接口) 对象名 HttpServletRequest request HttpSession session ServletContext application

2.2 doGet或者doPost中怎么拿到这三种对象 request对象 在doGet或者doPost方法的参数中 session对象 HttpSession session = request.getSession(); application对象 request.getServletContext(); 或者 this.getServletContext(); 或者 request.getSession().getServletContext(); 或者 this.getServletConfig().getServletContext(); 注意:无论哪一种方式,拿到的都是同一个application对象 2.3 这三种对象的生命周期及作用范围 request对象 生命周期: 客户端每次发请求,服务器就会创建一个新的request对象,本次访问结束后,该request对象就会被销毁 作用范围: 使用request存/取数据只能在一次请求之内起作用.比如服务器内部跳转的时候(因为内部跳转客户端只发一次请求). 注意:客户端重定向是不行的,因为客户端重定向会发出多个请求(多个新的request对象). session对象 (会话) 获得session对象的三种方式: //如果request有对应的session,则返回这个session,如果request没有对应的session,则创建一个新的session并返回 HttpSession session = request.getSession(true); //如果request有对应的session,则返回这个session,如果request没有对应的session,则返回null HttpSession session = request.getSession(false); //等同于request.getSession(true); HttpSession session = request.getSession(); 生命周期: getSession()方法第一次被调用时创建session对象。 session.invalidate()调用的时候会销毁session session如果自动超时的话,也会被销毁 session默认超时时间为30分钟 session的超时时间可以在代码中设置或者在web.xml中设置 代码中设置:session.setMaxInactiveInterval(5); 5秒 web.xml中设置: 1分钟超时,负数或者0为不限制时间 1 session超时时间是指:客户端不与服务器进行交互的时间 作用范围: 在一个会话之中起作用.一个会话中可以有多个request请求,所以放在session中的数据,可以被多个请求所共享. 思考:每次request对象创建之后,服务器怎么知道这个request和哪个session对象相对应? 注意:注意服务器正常关闭和非正常关闭对session对象的影响(session被序列化的问题) application对象 ServletContext被称为应用上下文/servlet上下文 生命周期: 启动tomcat服务器的时候,就会被创建 关闭tomcat服务器的时候,就会被销毁 而且每个项目在运行期间,都会有且只有一个application对象 作用范围:整个项目在运行期间,只有一个application对象,所以这个对象是所有用户共享的,大家都可以向这个对象里面存值,也可以再拿出来.因为这个对象一个项目中只有一个. 2.3 使用这三种对象存/取数据 存值: request.setAttribute("key", value); session.setAttribute("key", value); application.setAttribute("key", value); 取值: request.getAttribute("key"); session.getAttribute("key"); application.getAttribute("key");

3.会话追踪技术:cookie 3.1 http协议的访问是无状态的访问 当前访问是不会知道之前访问的状态的.(http协议的访问是不会帮我们保存访问的记录/痕迹的)。

3.2 有些时候需要记录之前的访问状态 比如在购物网站的时候,第一次访问点击购买了一个手机,第二次访问点击购买了一个电脑,第三次访问点击购物车结算,这个时候我们就必须知道前俩次访问的时候购买了什么,要不然就没有方法去结算。 所以我们就有了会话追踪技术来解决这个访问无状态的问题 3.3 session和cookie的位置 session是保存在服务器端的一个对象.客户端是没有session的. cookie在客户端和服务器端都会有。但是存在的形式不一样.在客户端cookie是以本地文件(浏览器管理的文件)的形式存在的,在服务器端是以java对象的形式存在.我们平时说说的cookie都是指的客户端文件形式存在的cookie 3.4 session和cookie的作用 session是在服务器端保存用户的相关信息,cookie是在客户端保存用户的相关信息。同时cookie还可以在客户端保存session的信息,例如session的id值 3.5 session和cookie之间的关系 1.客户端访问服务器的时候,假设服务器创建了一个session对象,服务器端的内存里面同时可能有好多个session对象,分别对应着不同客户端的访问,每一个session对象都有一个唯一的id值,叫做JSESSIONID。 2.服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个session的JSESSIONID的值返回给浏览器,浏览器接收到后会把这个值以一个cookie文件的形式保存起来. 3.在此之后,这个浏览器再发请求到服务器的时候,就会把之前保存在cookie文件中的JSESSIONID的值传给服务器,服务器通过这个JESSIONID的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应. 4.这样以来,就能到达一个效果,客户端的每一次访问,在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享. 3.6 服务器端向浏览器写回cookie response对象会把cookie带回到浏览器,然后浏览器把cookie对象中的内容保存到对应的一个cookie的文件中。 //创建cookie对象 Cookie c1 = new Cookie("name","tom"); Cookie c2 = new Cookie("msg","hello"); //设置cookie的有效时间 c1.setMaxAge(60*60*24*365); c2.setMaxAge(60*60*24*365*10); //把cookie放到response里面 response.addCookie(c1); response.addCookie(c2); 注意:如果没有设置cookie生效的时间,那么这个cookie就是会话cookie,当关闭浏览器的时候cookie就是失效了。 3.7 servlet中拿到从浏览器发送过来的cookie文件中的数据 //从request中拿到一个cookie数组 //如果没任何cookie数据则返回null Cookie[] cookies = request.getCookies(); //遍历数组 拿出key和value for(Cookie c:cookies){ String key = c.getName(); String value = c.getValue(); System.out.println(key+" : "+value); }

4.URL重写 (也属于会话追踪技术的一种) 4.1 URL重写的作用 当前浏览器把cookie禁用之后,浏览器在发请求的时候,就不会把cookie带到服务器端了(其中最重要的也包括JSESSIONID),因为禁用cookie之后浏览器拒绝一切站点向浏览器写入cookie的(注意在禁用之前是否已经有一些已经存在的cookie了),这样的话,浏览器发送请求的时候就不能在服务器端根据JSESSIONID来拿到之前创建的session对象了(因为发送请求的时候没有把JSESSIONID的值传给服务器)。URL重写就是解决这个问题的

4.2 JSESSIONID从客户端传给服务器的方式 第一种方式: JSESSIONID保存在cookie文件中,浏览器发送请求的时候把这个cookie文件中的数据带给服务器. 第二种方式: 通过传参的方式,把JSESSIONID的值通过要访问的URL传给服务器.(URL重写) 4.3 URL重写的实现 String url = response.encodeURL("url"); 这个方法参数就是我们要访问的URL,这个方法会把重写后的URL以字符串的形式返回. 例如:在一个超链接中,本来要访问的URL是: 重写后: 注意:response.encodeURL("url")方法 如果当前没有使用到session,则直接返回参数url。 同时还要注意禁用cookie后是不是已经把之前的cookie给删除了


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3