@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取表单里name数据到request
String username = req.getParameter("username");
String password = req.getParameter("password");
String check = req.getParameter("check");
//创建公共全局域
ServletContext servletContext = req.getServletContext();
Object o= servletContext.getAttribute("users");
//如果全局域里没有user对象,则返回登录
if (o==null){
resp.sendRedirect("login.jsp");
return;
}
// 父 转 子
ArrayList<User> list =(ArrayList<User>) o;
//
String pwd=""; //账号密码
/**
* 遍历公共集合,如果公共集合有该用户名
* 就将该密码保存
*/
for (int i = 0; i <list.size() ; i++) {
User user = list.get(i);
// 如果存在该用户,将真实密码给pwd;
// 如果不存在用户 pwd为空;
if (user.getUsername().equals(username)) {
pwd = user.getPassword();
break;
}
}
// 与空
if ("".equals(pwd)){
req.setAttribute("msg", "用户不存在");
req.getRequestDispatcher("login.jsp").forward(req,resp);
return;
}
// 与前台密码比较
if (!pwd.equals(password)){
req.setAttribute("msg", "密码错误");
req.getRequestDispatcher("login.jsp").forward(req,resp);
return;
}
//获取会话域
//将登录成功的用户名放到session作用域中
HttpSession session = req.getSession();
//与login.jsp里<h2>
session.setAttribute("name", username);
//如果勾选了复选框
if ("on".equals(check)) {
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60 * 24 * 7);//7天
resp.addCookie(cookie);
} else {
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(-1);//
resp.addCookie(cookie);
}
//设置会话T出功能
Object o1 = req.getServletContext().getAttribute(username);
//如果这个账号登录过,就让原账号失效
if (o1!=null) {
HttpSession session1 = (HttpSession) o1;
session1.setMaxInactiveInterval(1); //存活0秒
}
req.getServletContext().setAttribute(username, session);
//登录成功,跳首页
resp.sendRedirect("/index.jsp");
}
}
登录
先注册再登陆
先获取前台的请求name,
再获取公共域users,此时是o类型
再判断公共域是否有users对象,
第一次,则创建一个新的集合,将数据放入集合中,再将集合放到application作用域中。
如果有,则将o类型对象转为集合类型
然后遍历该集合
// 判断用户名是否相同
该集合getname里是否和请求name相同,
相同则提示重复,转发到注册界面。
不相同则创建一个user对象,赋值之后将该对象添加到集合,再将该集合放到application作用域。
最后
重定向到登陆界面。
登陆
获取请求参数name等。
再获取公共域users,此时是o类型
判断公共域是否有对象,如果全局域里没有user对象,则重定向到登录界面。
将o类型转集合类型
定义一个 String pwd=""中间变量
遍历集合
// 如果存在该用户,将真实密码给pwd;
// 如果不存在用户 pwd为空;
与“”比,用户不存在,转发到登陆
与请求到密码比不相同,密码错误,转发到登陆。
显示当前登陆对象功能(原理把当前对象以key,value形式存到会话。用EL表达式获取值)
获取session对象
将登陆成功的用户名存到session域
session.setAttribute("name", username);
????将session对象存到公共域???
req.getServletContext().setAttribute(username, session);
重定向主页???
七天免登陆功能(原理 给cookie 设置过期时间)
会话T出功能(原理 设置会话失效时间)
获取当前请求用户名,放到公共域,o类型
判断o 是否为空
将o转session类型
设置失效时间
上传功能
输入框类型 file,servlet上加@MultipartConfig
获取请求上传的文件,和文件名
io流
下载
获取请求参数name
设置下载地址
四大域都是在服务器内部
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
//1.拿到servlet上下文对象,
ServletContext servletContext = req.getServletContext();
// 2.从servletContext中获取users的数据
Object o = servletContext.getAttribute("users");
// 判断公共域里是否有user对象
if (o==null){
//第一次,则创建一个新的集合,将数据放入集合中,再将集合放到application作用域中
ArrayList<User> list = new ArrayList<User>();
// 创建user对象
User user = new User();
user.setUsername(username);
user.setPassword(password);
list.add(user);
//添加到公共域
servletContext.setAttribute("users", list);
}else {
//如果是有对象的 ?
ArrayList<User> list = (ArrayList<User>) o;
//判断用户名是否重复
for (User user : list) {
if (user.getUsername().equals(username)) {
req.setAttribute("msg", "用户名已存在,不能重复注册");
req.getRequestDispatcher("register.jsp").forward(req, resp);
return;
}
}
//用户名不存在,可以注册
User user = new User();
user.setUsername(username);
user.setPassword(password);
list.add(user);
servletContext.setAttribute("users", list);
}
// 注册成功
resp.sendRedirect("login.jsp");
}
}
注册
<body>
欢迎${user}使用本系统
<table border="1">
<tr>
<th>用户名</th>
<th>密码</th>
<th>操作</th>
</tr>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.username}</td>
<td>${user.password}</td>
<td><a href="/deleteServlet">删除</a></td>
</tr>
</c:forEach>
</table>
</body>
index.jsp
<body>
<h1>登录</h1>
<form action="/login" method="post">
用户名:<input name="username"><br>
密码:<input type="password" name="password"><br>
<input type="checkbox" name="check">七天免登录<br>
${msg}<br>
<input type="submit" value="登录">
</form>
<a href="register.jsp">注册账号</a>
</body>
login.jsp
<body>
<h1>注册账号</h1>
<form action="/register" method="post">
用户名:<input name="username">
密码:<input type="password" name="password">${msg}
<input type="submit" value="注册">
</form>
<a href="login.jsp">去登录</a>
</body>
register.jsp
Servlet使用
HttpServletRequest请求
HttpServletRequest代表请求,凡是请求中的数据都可以从这个对象获取
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#aa5500">//获取前台表单传过来的数据,后面username对应form表单中的标签的name值</span>
<span style="color:#000000">req</span>.<span style="color:#000000">getParameter</span>(<span style="color:#aa1111">"username"</span>);</span></span>
HttpServletResponse响应
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#aa5500">//向前台响应内容</span>
<span style="color:#000000">resp</span>.<span style="color:#000000">getWriter</span>().<span style="color:#000000">write</span>(<span style="color:#aa1111">"register success"</span>);</span></span>
转发
将请求转发给其它资源来处理,这个过程就叫转发
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#000000">req</span>.<span style="color:#000000">getRequestDispatcher</span>(<span style="color:#aa1111">"success.html"</span>).<span style="color:#000000">forward</span>(<span style="color:#000000">req</span>, <span style="color:#000000">resp</span>);</span></span>
重定向
将请求重新定位到其它地址中去
<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#000000">resp</span>.<span style="color:#000000">sendRedirect</span>(<span style="color:#aa1111">"success.html"</span>);</span></span>
转发与重定向的区别
- 转发只发起1次请求,而重定向2次请求
- 转发不会改变地址栏,而重定向会改变地址栏
- 转发可以获取request作用域中的数据,而重定向不行
如果跳转时要携带数据,用转发,如果不携带数据用重定向
Jsp
JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准
jsp的使用
JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
jstl是对el表达式(${msg})的增强。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
JSTL的使用
- 导入依赖包
- 导入对应的标签的命名空间
<c:forEach items="${users}" var="user">
<tr>
<td>${user.username}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
会话管理
session
session是会话保持技术之一,通过为每个连接分配sessionid的方式,为区分和识别每个连接。
在JavaWeb中,就有一个HttpSession对象,它就是用来存储和管理session的。通过session对象,我们可以向session作用域存放数据,也可以从session作用域取数据。具体代码如下
//放数据
session.setAttribute("name", "value");
//取数据
session.getAttribute("name"); //返回value
cookie
cookie是会话保持技术之一,是一种小型文本文件。