3、servlet-02

servlet-02

HttpResponse

服务器响应给浏览器的对象。

可以设置响应编码跟浏览器解析的编码一致的问题。

response.setContextType("text/html;charset=utf-8"); 只对post请求有效。

服务器常见的错误:

​ 404:原因一:

​ 客户端请求的地址跟我们web.xml映射的路径不一致。

​ 原因二:

​ 客户端请求的地址跟servlet的路径不一致。

​ 500:服务器内部错误。原因一:内部逻辑代码错误。

​ 原因二:配置web.xml的路径错误。

​ 403:请求的方式不匹配。

302:重定向。

200:成功。

解决乱码问题:

​ 请求乱码问题:客户端发数据给服务器的时候,客户端与服务器的编码格式不一致。

​ 解决:request.setCharacterEncoding("utf-8");

​ 响应乱码问题:服务器发数据给客户端时,服务器与客户端的编码不一致。

​ 解决:response.setContentType("text/html;charset=utf-8");

转发和重定向

请求转发:是一次请求,一次响应。请求的servletA无法解决当前问题,服务器内部就在寻找能解决这个问题的servletB,然后servletB返回数据给servletA,servletA再将数据返回给客户端。

  1. request.getRequestDispatcher(需求请求的servlet).forward(resquest,response);
  2. 根据servletContext对象也可以实现转发

重定向:两次请求两次响应。请求的servletA无法解决当前问题,就响应给客户端,告诉客户端让他去请求别的servletB,然后客户端去请求servletB后servletB能够解决问题,然后响应给客户端。

response.sendRedirect(要重定向的地址);

路径

分为客户端路径跟服务器端路径。

客户端路径分别有:表链接、表单、重定向。

  • 绝对路径(全路径)
  • 相对路径
    • 带 “/” : 以我们的主机作为开始,不带上项目名,路径为 主机+/后面的
    • 不带 “/” : 以我我们当前运行的程序为参考,也就是带上项目名,当前程序的虚拟路径,为
      • 主机+/项目名+/后面的

服务端的路径:比如web.xml的中的路径,注解的路径以及转发的路径

  • 绝对路径
  • 相对路径
    • 不带“/”为不加项目名,但是程序会帮我们加上当前程序的真实路径ServletContext对象中的getRealPath()
    • 带“/”就加上了当前项目的名称。

建议都加上 “/”:

原因是:当我们都很多个项目在同一服务器上运行的时候可以避免相同的servlet路径同名的问题。

ServletContext:

可以用来获取我们项目的虚拟路径,也就是发布在tomcat中的项目名。

String path = ServletContext.getRealPath();

获取servletContext的方式:

  1. 根据request对象。request.getServletContext();
  2. 直接调用getSetvletContext();

会话追踪技术

当我们的一次请求只能获取一次请求的数据,当我们需要从之前的请求获取我们想要的数据就满足不了我们了。所以就出现了cookie和session

保存在我们的客户端浏览器或者是客户的磁盘上的小文件。不得超过4k.

cookie是由服务器创建的,由客户端来保存。

创建:

Cookie cookie = new Cookie(String name,String value);
name为键,value为值,是以键值对的形式
response.addCookie(cookie);//响应给客户端保存

获取Cookie:(第二次请求的时候,请求中会携带cookie到服务器)

Cookie[] cookies = request.getCookies();//返回一个Cookie数组
//for-each循环来遍历获取我们想要的键和值
for(Cookie cookie : Cookies){
cookie.getName();//获取键的名称
cookie.getValue();//获取值
}

设置Cookie的存活时间:

cookie.setMaxAge(int);以秒为单位。大于0时为存活的时间,等于0时表示不保存cookie,-1时表示关闭浏览器cookie就不存活。

Cookie保存中文:

​ URL编码:URLEncoder.encoder(String name);保存时

​ URL解码:URLDecoder.decoder(String name);获取时

HttpSession:

在javax.servlet.HttpServlet中

生命周期:在一次会话中,当浏览器关闭是就会死亡,当浏览器还没有关闭的时候,我们所获取的session都是同一个。

session是四大域对象之一。

获取session的方式:

  • 通过HttpRequest对象来获取。
    • request.getSession(false); 此方式会判断session是否存在,如果不存在返回false,不会创建session
    • request.getSession();默认为true,此方式会判断session是否存在,如果不存在,就创建一个新的session

session中的方法:

  1. ​ setAttribute(String name ;Object obj);//值为Object类型

  2. ​ getAttribute(String name);//需要强制转换为String

  3. ​ removeAttribute(String name);//移除一个属性

  4. ​ setMaxInactiveInteravl(int);以秒为单位,来设置session的存活时间。

  5. ​ Invalidate();调用此方法使Session立即死亡。

  6. ​ boolean isNew();判断session是否为新。

  7. 此外还可以在web.xml中设置session的存活时间,以分为单位

    1. <session-config>
      <session-timeout>10</session-timeout>
      </session-config>

Session的原理:

session的底层依赖cookie,在第一次请求servlet的时候,服务器就会为客户端创建一个JSessionId的cookie然后响应给客户端,当客户端再次访问服务器的时候,就会请求携带过去,以方便服务器识别为同一浏览器发送的请求。

这样就达到了服务器能识别我们的客户端。

获取 jsessionId ,获取之前必须先创建session先,通过session对象的getId()的方法来获取。还可以通过遍历cookie数组来获取。

Cookie与Session的区别

  1. Session是保存在服务器的,cookie是保存在客户端浏览器获取磁盘上。
  2. Session保存的数据可以是任意的,cookie只能保存字符串。
  3. session会随会话的结束而死亡,cookie可以长期的存在客户端的磁盘上,也可以临时保存在浏览器中。
  4. Cookie常用来保存客户不重要的数据,Session可以用来保存客户重要的数据。

UUID:

可以用来获取一个不重复的随机数。在java.util包下,通过random()方法。

posted @   站着说话不腰疼  阅读(28)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示