当前位置: 首页 > news >正文

Servlet笔记

JavaWeb

Servlet的工作流程

  1. 通过请求头获知浏览器访问的是哪个主机

  2. 通过请求行获取访问的是哪个一个web应用

  3. 通过请求行中的请求路径获知访问的是哪个资源

  4. 通过获取的资源路径在配置中匹配到真实的路径

  5. 服务器会创建servlet对象,(如果是第一次访问时,创建servlet实例,并调用init方法进行初始化操作)

  6. 调用service(request, response)方法来处理请求和响应的操作

  7. 调用service完毕后返回服务器,由服务器将response缓冲区的数据取出,以http响应的格式发送给浏览器

请求头

Referer:该请求头指明请求从哪里来

响应头

Location:Location响应报头域用于重定向接受者到一个新的位置

response.sendRedirect("http://www.baidu.com");

Refresh:自动跳转(单位是秒),可以在页面通过meta标签实现,也可在后台实现

<meta http-equiv="refresh" content="3;url=http://www.baidu.com">

字符流响应数据乱码

乱码原因:对于getWriter()获取到的字符流,服务器端在进行编码时默认会使用ISO-8859-1,该编码方式不支持中文。
乱码解决:1. 设置服务端的编码格式response.setCharacterEncoding("UTF-8");2. 设置客户端的编码格式response.setHeader("content-type","text/html;charset=UTF-8");
总结:设置客户端和服务端的编码都支持中文,且保持一致。同时设置客户端和服务端的编码格式3. response.setContentType("text/html;charset=UTF-8");

字节流响应数据乱码

乱码原因:对于getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示。当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。
乱码解决:1. 设置服务端的编码格式response.setCharacterEncoding("UTF-8");2. 设置客户端的编码格式response.setHeader("content-type","text/html;charset=UTF-8");
总结:设置客户端和服务端的编码都支持中文,且保持一致。同时设置客户端和服务端的编码格式3. response.setContentType("text/html;charset=UTF-8");

请求数据乱码

乱码原因:由于在解析过程中默认使用的编码方式为ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。*                  Tomcat8及以上版本                                Tomcat7及以下版本*  GET请求         不会乱码,不需要处理                              new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");**  POST请求     会乱码,通过设置服务器解析编码的格式            会乱码,通过设置服务器解析编码的格式*       request.setCharacterEncoding("UTF-8");    request.setCharacterEncoding("UTF-8");POST请求:无论什么版本的服务器,post请求中文都会乱码。request.setCharacterEncoding("UTF-8");注:
1. request.setCharacterEncoding("UTF-8") 只针对POST请求乱码有效
2. new String(request.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8") 针对任何请求方式。*        但是如果数据本身不乱吗,还依然使用new String()方法转换,则会乱码

HTTP协议的特点

  1. 支持客户/服务器模式。

  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的 有 GET、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

  3. 灵活:HTTP 允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。

  4. 无连接:无连接是表示每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP1.1 版本后支持可持续连接。通过这种连接,就有可能在建立一个 TCP 连接后,发送请求并得到回应,然后发送更多的请求并得到更多的回应.通过把建立和释放 TCP 连接的开销分摊到多个请求上,则对于每个请求而言,由于 TCP 而造成的相对开销被大大地降低了。而且, 还可以发送流水线请求,也就是说在发送请求 1 之后的回应到来之前就可以发送请求 2.也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。

  5. 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送 的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HttpServletRequest对象

​ 主要作用是接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息等,service()方法中形参接收的是HttpServletRequest接口的实例化对象,该对象主要应用在 HTTP 协议上,是由 Tomcat 封装好传递过来。

// 获取客户端请求的完整URL (从http开始,到?前面结束)
String url = request.getRequestURL().toString();
System.out.println("获取客户端请求的完整URL:" + url);
// 获取客户端请求的部分URL (从站点名开始,到?前面结束)
String uri = request.getRequestURI();
System.out.println("获取客户端请求的部分URL:" + uri);
// 获取请求行中的参数部分
String queryString = request.getQueryString();
System.out.println("获取请求行中的参数部分:" + queryString);
// 获取客户端的请求方式
String method = request.getMethod();
System.out.println("获取客户端的请求方式:" + method);
// 获取HTTP版本号
String protocol = request.getProtocol();
System.out.println("获取HTTP版本号:" + protocol);
// 获取webapp名字 (站点名)
String webapp = request.getContextPath();
System.out.println("获取webapp名字:" + webapp);// 获取指定名称的参数,返回字符串
String uname = request.getParameter("uname");
System.out.println("uname的参数值:" + uname);
// 获取指定名称参数的所有参数值,返回数组
String[] hobbys = request.getParameterValues("hobby");
System.out.println("获取指定名称参数的所有参数值:" + Arrays.toString(hobbys));

request作用域

作用范围:在一次请求中有效,即服务器跳转有效。可以通过 request 来传输/共享数据。

// 设置域对象内容
request.setAttribute(String name, String value);
// 获取域对象内容
request.getAttribute(String name); 
// 删除域对象内容
request.removeAttribute(String name);

HttpServletResponse对象

​ Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。获取客户端数据,需要通过 request 对象;向客户端输出数据,需要通过response对象。HttpServletResponse 的主要功能是服务器对客户端的请求进行响应,将 Web 服务器处理后的结果返回给客户端。service()方法中形参接收的是 HttpServletResponse 接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

响应时需要获取输出流,两者不能同时使用。

getWriter() 获取字符流(只能响应回字符)// 字符输出流PrintWriter writer = response.getWriter();writer.write("Hello");writer.write("<h2>Hello</h2>");
getOutputStream() 获取字节流(能响应一切数据)// 字节输出流ServletOutputStream out = response.getOutputStream();out.write("Hello".getBytes());out.write("<h2>Hello</h2>".getBytes());

请求转发

​ 请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。

request.getRequestDispatcher(url).forward(request,response);

重定向

​ 重定向是一种服务器指导,客户端的行为。客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,在响应的同时,服务器会给客户端一个新的地址,当客户端接收到响应后,会立刻、马上、自动根据服务器给的新地址发起第二个请求,服务器接收请求并作出响应,重定向完成。

// 重定向跳转到index.jsp
response.sendRedirect("index.jsp");

通过观察浏览器我们发现第一次请求获得的响应码为 302,并且含有一个 location 头信息。并且地址栏最终看到的地址是和第一次请求地址不同的,地址栏已经发生了变化。

请求转发-req.getRequestDispatcher().forward() 重定向-resp.sendRedirect()
一次请求,request域中数据共享 两次请求,request域中数据不共享
服务器端行为 客户端行为
地址栏不发生改变 地址栏发生改变
绝对地址定位到站点后 绝对地址可写到http://

Cookie对象

Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于Cookie 是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常见的记住密码则可以通过 Cookie来实现。有一个专门操作Cookie的类 javax.servlet.http.Cookie。随着服务器端的响应发送给客户端,保存在浏览器。当下次再访问服务器时把Cookie再带回服务器。

Cookie 的格式:键值对用“=”链接,多个键值对间通过“;”隔开。

Cookie的注意点

  1. Cookie保存在当前浏览器中。

  2. Cookie中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过URLDecoder.decode()来进行解码。

  3. 如果服务器端发送重复的Cookie那么会覆盖原有的Cookie。

  4. 不同的浏览器对Cookie也有限定,Cookie的存储是有上限的。

1、Cookie的创建和发送// 创建Cookie对象Cookie cookie = new Cookie("key","value");// 发送Cookie对象response.addCookie(cookie);
2、Cookie的获取// 获取Cookie数组Cookie[] cookies = request.getCookies();// 判断数组是否为空if (cookies != null && cookies.length > 0) {// 遍历Cookie数组for (Cookie cookie : cookies){System.out.println(cookie.getName());System.out.println(cookie.getValue());}}
3、Cookie设置到期时间cookie.setMaxAge(3 * 24 * 60 * 60);以秒为单位负整数:表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么cookie就会消失正整数:表示cookie对象可存活指定的秒数0:表示删除该cookie
4、中文乱码URLEncoder.encode()编码URLDecoder.decode()解码
5、路径问题当前项目为s01(1)当前服务器下任何项目的任何资源都可获取Cookie对象cookie.setPath("/");(2)当前项目下的资源可获取Cookie对象,默认不设置Cookie的pathcookie.setPath("/s01");(3)指定项目下的资源可获取Cookie对象cookie.setPath("/s02");(4)指定目录下的资源可获取Cookie对象cookie.setPath("/s01/cook");总结:只有访问的路径中包含cookie对象的path值,才可以获取到cookie对象

image-20250922223045227

session对象

		// 创建或获取HttpSession session = request.getSession();// 获取Session是否是新创建出来的状态  ,true表示新创建的,false表示前面创建好,获取的boolean isNew = session.isNew();// 获取会话的唯一标识String sessionId = session.getId();// 获取会话的创建时间和最后一次访问时间session.getCreationTime()session.getLastAccessedTime()setAttribute() 保存数据
getAttribute() 获取域数据protected void setAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.getSession().setAttribute("key","keyData");response.getWriter().write("已经往Session中保存了数据");
}
protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Object attribute = request.getSession().getAttribute("key");response.getWriter().write("从Session中获取前面保存的数据:" + attribute);
}Session的超时控制1.默认到期时间,tomcat中conf目录下web.xml配置文件默认设置的30分钟<session-config><session-timeout>30</session-timeout></session-config>2.手动设置到期时间获取Session会话的超时时长	getMaxInactiveInterval()     以秒为单位设置Session会话的超时时长    setMaxInactiveInterval(int)  以秒为单位3.立即销毁request.getSession().invalidate(); //让Session会话马上无效4.关闭浏览器失效session底层是依赖于cookie,cookie对象默认只存活于浏览器内存中,关闭浏览器则失效5.关闭服务器失效

ServletContext

每一个web应用都有且只有一个ServletContext对象,又称Application对象

1.作为域对象用来共享数据,此时数据在整个应用程序中共享

2.该对象中保存了当前应用程序的相关信息

//获取ServletContext对象
req.getServletContext(); //通过request对象获取
req.getSession().getServletContext();//通过session对象获取
getServletConfig().getServletContext();//通过ServletConfig对象获取
getServletContext(); //直接获取,只能在servlet中用
//常用方法
getServerInfo(); //获取服务器的版本信息
getRealPath(); //获取项目真实路径

上传文件

必须是post请求,必须设置enctype为multipart/form-data
<form method="post" action="servlet03" enctype为="multipart/form-data">姓名:<input type="text" name="uname"/>文件:<input type="file" name="myfile"/><button>提交</button>
</form>
//上传的文件会被封装成part对象 
Part myfile = req.getPart("myfile");
//获取文件名
String submittedFileName = myfile.getSubmittedFileName();
//获取项目路径
String realPath = req.getServletContext().getRealPath("/");
//上传文件到路径下
myfile.write(realPath+'/'+submittedFileName);

下载文件

//1.通过超链接下载,当超链接遇到浏览器不能识别的资源时,就会自动下载
添加download属性可以规定浏览器进行下载
//2.后台实现下载

Servlet的三大域对象

1.request域对象

​ 在一次请求中有效。请求转发有效,重定向失效

2.session域对象

​ 在一次会话中有效。请求转发和重定向都有效,session销毁后失效

3.servletContext域对象

​ 在整个应用程序中有效。服务器关闭后失效

http://www.hskmm.com/?act=detail&tid=28230

相关文章:

  • 第一个博客
  • k8s 主节点重启后 从节点 get 异常 - 教程
  • 多维索引技术优化数据湖查询性能
  • Umi-OCR_文字识别工具 免安装使用教程(附下载安装包)!永久免费,开源离线OCR识别软件下载
  • 【汇总】OPPO r9m 分区名、分区功能
  • 04_线程池实现
  • #D251010D. 未命名 10 (unnamed)
  • 【JAVA】从入门到放弃-01-HelloWorld - 指南
  • 离线应用程序
  • 2025表面瑕疵检测厂家TOP5推荐:表面瑕疵检测,薄膜瑕疵检测,瑕疵检测设备,瑕疵在线检测,铝箔瑕疵在线检测,外观瑕疵检测机,薄膜瑕疵检测仪,陶瓷膜瑕疵检测各种类型检测,精准高效的质量守护
  • 表格识别:不仅能识别文字,更能理解表格的结构和逻辑关系,实现输出可编辑、可分析的结构化数据
  • 同步FIFO
  • P13274 [NOI2025] 三目运算符
  • Microsoft Office不小心卸载或重装系统后,如何重新安装 ... - sherlock
  • HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包) - 实践
  • 使用JaCoCo进行代码覆盖率分析
  • 计算机视觉专家入选德国国家科学院
  • 2025 年工程管理软件/软件系统/软件App/软件平台/工程管理软件和验房系统公司/企业推荐榜:数字化转型下的实用选型指南
  • 【Java学习】【Java基础】--第1篇:入门Java和对面向对象的理解
  • solutions
  • 技术面:Spring (事务传播机制、事务失效的原因、BeanFactory和FactoryBean的关系)
  • 安装与配置MySQL 8 on Ubuntu,包括权限授予、数据库备份及远程连接
  • 04-最简单的字符设备驱动
  • 完整教程:手机可视化方案(针对浓度识别)
  • AI元人文系列文章:决策范式与无为而治
  • SAP导入证书
  • Kubernetes存储卷:保障有状态应用的数据持久化
  • MySQL的查询操作语法要点
  • 华为链路聚合配置
  • 手机adb 调试自己