(三十)文件上传、下载,登录实现

文件上传,下载,登录


大纲

文件上传简单处理

头像上传,身份证上传,商品图片等等

获取文件(记得在对应Servlet头上贴上注解) @MultipartConfig,保存到磁盘中

获取文件()

文件下载简单处理

下载各种协议,下载各种资源
找到对应用户下载文件,使用响应对象的输出流把文件内容响应回浏览器
//避免写死路径,这样项目可以随意迁移部署
ServletContext对象.getRealPath("Web目录文件路径") //根据项目所在路径返回这个路径的绝对路径

为什么要有三层架构的思想

做到项目高内聚,低耦合

为什么要有登录功能,怎么实现登录

有需求需要知道请求用户是谁,有些资源不是所有人都允许访问,需要保护


Servlet3.0文件上传

Servlet3通过注解**@MultipartConfig**上传,拿到通过getpart(String name) :拿指定的对象. getPart() :拿全部 拿到part对象 ,调用part.write(“存放路径”)


@WebServlet("/avatar")
@MultipartConfig
public class AvatarServlet extends HttpServlet {
    private IUserService userService =new UserServiceImpl();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //判断是否有登录
        User user = (User) req.getSession().getAttribute("USER_IN_SESSION");
        if (user==null){
            resp.sendRedirect("/login.jsp");
            return;
        }

       //获取新上传的头像图片
        Part part = req.getPart("avatar");

    //获取上传文件,存到对应img文件夹中
        String path = this.getServletContext().getRealPath("/img");
        //获取上传文件名
        String fileName = part.getSubmittedFileName();
        //获取上传文件扩展名
        String ext = fileName.substring(fileName.lastIndexOf("."));
        //随机生成文件名
        fileName= UUID.randomUUID().toString()+ext;
        
        //存到磁盘中
        part.write(path+"/"+fileName);
        //修改数据库中对应用户头像字段的值,为新上传头像的路径
        user.setAvatar("/img/"+fileName);
        userService.updateAvatar(user);
     
        //跳转
        resp.sendRedirect("/list");

    }
}

文件上传 ,文件名一样,依然存在覆盖问题,使用uuid随机文件名


文件下载

JSP :

<a href="/download?fileName=AA.rar">下载资源</a>

DownloadServlet

@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //找到用户要下载的资源,响应回去
        String fileName = req.getParameter("fileName");

        //设置下载文件名称
        resp.addHeader("Content-Disposition", "attachment;filename="+fileName);

        //源目标
        Path src = Paths.get(this.getServletContext().getRealPath("WEB-INF/download/"), fileName);
        //借助响应对象的输出流把找的文件内容响应回浏览器
        Files.copy(src,resp.getOutputStream()); 
    }
}


登录实现

1.注册:本质底层往数据库用户表中插入一条用户数据

2.登录:本质就是根据用户名和密码去表中查询数据,有的话,把用户信息存到session中,跳转没有的话,提示错误信息给用户

3.登录限制,资源保护:给项目需要保护资源,访问之间加入判断,判断当前访问用户是否登录过,让其正常访问,没登录过,跳转到登录页面

业务方法返回什么类型?方法调用不仅可以通过返回值返回结果,还可以通过异常结果

登录:记得登录成功往session存入查询出来的数据
访问限制:在需要被限制的地方,加入判断,判断session中有无参访登录时存入数据


三层架构

  • 表现层:MVC,负责处理与界面交互的相关操作
  • 业务层:Service:负责业务逻辑计算
  • 持久层:DAO:负责将业务逻辑数据进行持久化存储

表现层调业务层,业务层调持久层

表现层
  • login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
${errorMsg}
<form action="/login" method="post">
    账号:<input type="text" name="username" placeholder="请输入用户名"/><br/>
    密码:<input type="text" name="password" placeholder="请输入密码"/><br/>
    <input type="submit" value="登录">
</form>

</body>
</html>
  • LoginServlet
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private IUserService userService =new UserServiceImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        User user = new User();
        //获取请求参数
        String password = req.getParameter("password");
        String username = req.getParameter("username");
        user.setUsername(username);
        user.setPassword(password);

        try {
            //调用业务层处理登录请求
            User login = userService.login(username, password);
            //登录成功,加入session
            req.getSession().setAttribute("USER_IN_SESSION",login);

            //跳转主页面
            resp.sendRedirect("/list");
        }catch (Exception e){
            e.printStackTrace();
            req.setAttribute("errorMsg",e.getMessage());
            //
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }
}
业务层
  • IUserService
public interface IUserService {
    User login(String username ,String password);
}
  • UserServiceImpl
public class UserServiceImpl implements IUserService {
    private IUserDAO userDAO =new UserDAOImpl();
    @Override
    public User login(String username, String password) {
        User user = userDAO.checkUserName(username);
        //用户名错误
        if ( user==null){
            throw new RuntimeException("账号不存在");
        }
        //密码错误
        if (!user.getPassword().equals(password)){
            throw new RuntimeException("密码错误");
        }
        return user;
    }
}
DAO层
  • IUserDAO
public interface IUserDAO {
   User checkUserName(String username);
}
  • UserDAOImpl
@Override
    public User checkUserName(String username) {
        SqlSession sqlSession = MybatisUtil.openSession();
        User u = sqlSession.selectOne("cn.wolfcode.dao.IUserDAO.checkUserName", username);
        sqlSession.commit();
        sqlSession.close();
        return u;
    }
Mapper
  • UserMapper
<select id="checkUserName" resultType="User">
select*from userlogin where username=#{username}
</select>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值