🔥🔥🔥🔥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内容的补充了,通过这些就可以做一些简单的项目出来了!
版权归原作者 栋zzzz 所有, 如有侵权,请联系我们删除。