@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是会话保持技术之一,是一种小型文本文件。