0


关于Servlet的补充知识

🔥🔥🔥🔥Hello,我是栋zzzz,先祝各位端午节快乐!!那么接下来就继续来学习Servlet吧😂 ,还是整理了一些前置知识,方便更好的理解Servlet:

  • HTTP协议(上)😀
  • HTTP协议(下)😀
  • Tomcat😀
  • Servlet😀
  • Servlet的相关API😀

在这里插入图片描述

目录


🍌一.Cookie和Session

在Servlet中,对于Cookie和Session都有很好的支持,也就是有一些API可以完成会话管理的操作!

🍓 1.请求

在HTTPServletRequest里面就有相关的方法:

  • getSession():在服务器中获得会话具体行为取决于参数,如果参数为true,存在会话就直接获取,不存在就会创建一个会话;如果参数为false,存在会话就直接获取,不存在就返回null,不会创建; 简单介绍一下调用getSession所做的事情: ①创建会话:首先会获取请求中Cookie里面的sessionId字段(会话的身份标识),判定这个sessionId是否在当前服务器上存在,如果不存在,就会进入创建会话逻辑,创建会话,就会创建一个HttpSession对象,并生成一个SessionId(一段很长的数字,会保证唯一性),然后会把这个sessionId作为key值,其value值就是这个HttpSession对象,然后把这样的键值对存储在服务器内存的一个"哈希表"(不一定是哈希表,但一定是类似于哈希表的结构,并且这个数据是在内存中的)的结构中去,最后服务器就会返回一个HTTP响应,把这个sessionId通过set-Cookie字段返回给浏览器,然后浏览器就会保存这个sessionId到Cookie中了 ②获取会话:首先会获取请求中Cookie里面的sessionId字段,判定这个sessionId字段是否在服务器中存在,如果存在(在哈希表中存在),就会把查询出的HttpSession对象,通过返回值返回回去

那么HttpSession是什么:

在这里插入图片描述

  • getCookies():获取请求中的Cookie数据,其返回值就是Cookie类型的数组,每个元素就是一个Cookie对象,每个Cookie对象又包含了两个属性name和value(也是键值对); 和HTTP请求中的cookie字段就是通过键值对的方式来组织的,通过;来分割多个键值对,使用=来分割键和值,这些键值对都会在请求中通过cookie字段传给服务器,服务器收到请求之后,就会进行解析,然后就会解析成Cookie数组的形式,而Cookie中也有一些方法getName()(返回Cookie名称),getValue()(获得Cookie对应的value值),setValue()(设置Cookie对应的value值),有了这些方法,Cookie就可以保存自定义的键值对了,如果是一般的键值对,直接通过getCookies就可以获取,如果是特殊的键值对(表示sessionId的键值对),就可以直接用getSession就可以自动从Cookie中获取sessionId了

🍓 2.响应

响应(HTTPServletResponse)里面也有相关的方法:addCookie()(把指定的Cookie添加到响应中)
而通过这个方法,就可以添加Cookie信息到响应报文中了,这里添加进来的键值对,就会作为HTTP响应中的set-Cookie字段!!!
在这里插入图片描述


🍌 二.实现用户登录

在这里插入图片描述
Cookie和Session的这些方法都是非常关键的,下面就通过一个用户登录的案例来使用一下这些方法:
首先是主要的逻辑:在浏览器页面登录,点击登录按键之后就会给服务器发送一个请求,然后服务器就会处理这个登录请求,处理成功了就会给页面返回一个302响应,然后跳转到主页面上,主页面上就会显示一些用户信息(用户的用户名…)

🍓 1.约定前后端交互接口

这里有两组交互:

  • 登录的交互: 在这里插入图片描述
  • 获取主页的交互:在这里插入图片描述

🍓 2.编写一个简单的登录页面

这里使用form表单来构造post请求(这里的样式就不设计了,简单的页面能实现想要的功能就可以了):

<formaction="login"method="post"><inputtype="text"name="username"><inputtype="text"name="password"><inputtype="submit"value="登录"></form>

🍓 3.编写Servlet代码来处理登录请求

登录页面:

importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importjava.io.IOException;@WebServlet("/login")publicclassLoginServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{//获取到请求中的信息String username = req.getParameter("username");String password = req.getParameter("password");//然后判断这个信息是否正确,如果正确就可以跳转到一个新的页面,如果错误就直接返回登录失败的信息//这里的验证本来是要根据数据库中的信息来进行判断的,但是这里就不使用了,直接使用唯一的用户名这密码来进行判断了if("zhangsan".equals(username)&&"123".equals(password)){//登录成功//如果登录成功就看有使用一个HttpSession对象来保存需要的用户信息,然后在后续的页面中显示,这里的参数设置为true,如果没有这个会话没救主动创建一个会话HttpSession httpSession = req.getSession(true);//这里的键值对就是必要的用户信息
            httpSession.setAttribute("username",username);//这里还可以实现一个登录次数的信息
            httpSession.setAttribute("count",0);//然后重定向到一个新的页面
            resp.sendRedirect("index");}else{//登录失败//返回一个登录失败的响应
            resp.getWriter().write("login failed!!!");}}}

这里就可以使用HttpSession对象来保存一些必要的信息,而且这里的信息是可以自定义的,想保存什么信息就保存什么信息,这里存好了就方便后面获取!

🍓 4.编写Servlet代码来处理返回到主页面的请求

跳转到主页面:

importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importjava.io.IOException;@WebServlet("/index")publicclassIndexServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{//这里的参数应该是false,因为前面登录的时候已经创建过了,而这里就不需要再创建了,直接获取就可以了HttpSession httpSession = req.getSession(false);//然后通过getAttribute这个方法就可以获取到信息了String username =(String)httpSession.getAttribute("username");//登录一次就让登录次数加1Integer count =(Integer) httpSession.getAttribute("count");
        count +=1;//需要把次数更新写回
        httpSession.setAttribute("count",count);//防止乱码
        resp.setContentType("text/html;charset=utf8");//这里就直接返回一个简单的页面就可以了
        resp.getWriter().write("<h3> 欢迎你!"+ username +" 这是第"+ count +"次访问页面 </h3>");}}

在这里所获得的对象就和登陆成功所创建的对象是同一个对象,然后通过这个对象,就可以获取到前面保存好的信息了!!

🍓 5.验证

第一次交互:登录页面
在这里插入图片描述
第二次交互:跳转到主页面
在这里插入图片描述
然后多刷新几次就可以这个次数也就会不断叠加
在这里插入图片描述
这样一个简单的用户登录的页面也就创建成功了,这也就使用到了HttpSession对象及其方法!!
在这里插入图片描述


🍌 三.上传文件

上传文件在实际的开发中也是一个典型的需求,而在Servlet中也对上传文件进行了支持,主要就是使用getPart(),通过给定的name就可以获得到对应的文件!而上传文件的时候,前端就需要用到form表单,而此时form表单就需要使用到特殊的类型form-data,然后提交文件的时候,浏览器就会把文件内容以form-data的格式构造到HTTP请求中去了,然后服务器通过这个getPart方法就可以获得到这个文件内容了!
另外Part类也有一些方法可以获得一些文件对应的属性:
getSubmittedFileName()(可以获得文件名),getContentType()(获得文件类型),getSize()(获得文件大小),write()(可以将提交的文件写入到磁盘文件中去)
下面就具体实现一下:

<!-- 这里enctype="multipart/form-data"就是使用form-data的格式构造到请求中 --><formaction="upload"method="post"enctype="multipart/form-data"><!-- 设置为file就会有个自带的选择文件的按钮 --><inputtype="file"name="MyImage"><inputtype="submit"value="提交"></form>

Servlet代码:

importjavax.servlet.ServletException;importjavax.servlet.annotation.MultipartConfig;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.Part;importjava.io.IOException;@MultipartConfig@WebServlet("/upload")publicclassUploadServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequest req,HttpServletResponse resp)throwsServletException,IOException{//要上传文件就需要获取这个文件,而通过getPart方法就可以获取到//而这里的参数就是html里面的那么内容Part part = req.getPart("MyImage");//然后这里可以打印出这个文件的一系列信息System.out.println(part.getSubmittedFileName());//获取文件名字System.out.println(part.getContentType());//获取文件类型System.out.println(part.getSize());//获取文件大小//将这个文件写入到哪里去
        part.write("E:/picture/test/b.jpg");
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("上传成功!");}}

这里一定要写@MultipartConfig,给这个类加上这个注解,才能开启对于上传文件的支持,否则getPart调用的时候就会抛出异常!!
接下来验证一下:
上传文件页面:
在这里插入图片描述
选择一个粽子图片:
在这里插入图片描述
写入到刚才所指定好的路径去(提交之前):
在这里插入图片描述

点击提交:
在这里插入图片描述
就会发现图片已经上传成功了:
在这里插入图片描述
这样上传文件的功能也就实现成功了!!!
在这里插入图片描述
以上内容就是对Servlet内容的补充了,通过这些就可以做一些简单的项目出来了!
在这里插入图片描述

标签: http tomcat 网络

本文转载自: https://blog.csdn.net/qq_58266033/article/details/125117857
版权归原作者 栋zzzz 所有, 如有侵权,请联系我们删除。

“关于Servlet的补充知识”的评论:

还没有评论