关于Servlet的补充知识

关于Servlet的补充知识,第1张

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

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

目录 🍌一.Cookie和Session🍓 1.请求🍓 2.响应 🍌 二.实现用户登录🍓 1.约定前后端交互接口🍓 2.编写一个简单的登录页面🍓 3.编写Servlet代码来处理登录请求🍓 4.编写Servlet代码来处理返回到主页面的请求🍓 5.验证 🍌 三.上传文件


🍌一.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请求(这里的样式就不设计了,简单的页面能实现想要的功能就可以了):

    <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(" 欢迎你!" + username +" 这是第" + count + "次访问页面 ");
    }
}

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

🍓 5.验证

第一次交互:登录页面

第二次交互:跳转到主页面

然后多刷新几次就可以这个次数也就会不断叠加

这样一个简单的用户登录的页面也就创建成功了,这也就使用到了HttpSession对象及其方法!!


🍌 三.上传文件

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

    
    <form action="upload" method="post" enctype="multipart/form-data">
        
        <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内容的补充了,通过这些就可以做一些简单的项目出来了!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1323291.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存