目录
🍌一.Cookie和Session
在Servlet中,对于Cookie和Session都有很好的支持,也就是有一些API可以完成会话管理的操作!
🍓 1.请求
在HTTPServletRequest里面就有相关的方法:
那么HttpSession是什么:
🍓 2.响应
响应(HTTPServletResponse)里面也有相关的方法:addCookie()(把指定的Cookie添加到响应中)
而通过这个方法,就可以添加Cookie信息到响应报文中了,这里添加进来的键值对,就会作为HTTP响应中的set-Cookie字段!!!
🍌 二.实现用户登录
Cookie和Session的这些方法都是非常关键的,下面就通过一个用户登录的案例来使用一下这些方法:
首先是主要的逻辑:在浏览器页面登录,点击登录按键之后就会给服务器发送一个请求,然后服务器就会处理这个登录请求,处理成功了就会给页面返回一个302响应,然后跳转到主页面上,主页面上就会显示一些用户信息(用户的用户名…)
🍓 1.约定前后端交互接口
这里有两组交互:
-
登录的交互:
-
获取主页的交互:
🍓 2.编写一个简单的登录页面
这里使用form表单来构造post请求(这里的样式就不设计了,简单的页面能实现想要的功能就可以了):
<form action="login" method="post">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit" value="登录">
</form>
🍓 3.编写Servlet代码来处理登录请求
登录页面:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, 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代码来处理返回到主页面的请求
跳转到主页面:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//这里的参数应该是false,因为前面登录的时候已经创建过了,而这里就不需要再创建了,直接获取就可以了
HttpSession httpSession = req.getSession(false);
//然后通过getAttribute这个方法就可以获取到信息了
String username = (String)httpSession.getAttribute("username");
//登录一次就让登录次数加1
Integer 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的格式构造到请求中 -->
<form action="upload" method="post" enctype="multipart/form-data">
<!-- 设置为file就会有个自带的选择文件的按钮 -->
<input type="file" name="MyImage">
<input type="submit" value="提交">
</form>
Servlet代码:
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, 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内容的补充了,通过这些就可以做一些简单的项目出来了!