文件上传,下载,登录
大纲
文件上传简单处理
头像上传,身份证上传,商品图片等等
获取文件(记得在对应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>