登录案例

登录:

  步骤分析:

    1.创建数据库和表

    2.创建项目

      目录结构:

 

 

 

    3.导入jar包

      驱动 dbutils  c3p0

    4.导入工具类和配置文件

      dataSourceUtils  

package com.yisen.utils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

public class DataSourceUtils {
    private static ComboPooledDataSource ds=new ComboPooledDataSource();
    
    /**
     * 获取数据源
     * @return 连接池
     */
    public static DataSource getDataSource(){
        return ds;
    }
    
    /**
     * 获取连接
     * @return 连接
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException{
        return ds.getConnection();
    }
    
    
    
    /**
     * 释放资源
     * 
     * @param conn
     *            连接
     * @param st
     *            语句执行者
     * @param rs
     *            结果集
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        closeResultSet(rs);
        closeStatement(st);
        closeConn(conn);
    }

    /**
     * 释放连接
     * 
     * @param conn
     *            连接
     */
    public static void closeConn(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }

    }

    /**
     * 释放语句执行者
     * 
     * @param st
     *            语句执行者
     */
    public static void closeStatement(Statement st) {
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            st = null;
        }

    }

    /**
     * 释放结果集
     * 
     * @param rs
     *            结果集
     */
    public static void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }

    }
}
dataSourceUtils.java

      c3p0-config.xml

<c3p0-config>
    <!-- 默认配置,如果没有指定则使用这个配置 -->
    <default-config>
        <!-- 基本配置 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day09</property>
        <property name="user">root</property>
        <property name="password">123456</property>
    
        <!--扩展配置-->
        <property name="checkoutTimeout">30000</property>
        <property name="idleConnectionTestPeriod">30</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </default-config> 
    
    
    <!-- 命名的配置 -->
    <named-config name="yisen">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/day09</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        
        
        <!-- 如果池中数据连接不够时一次增长多少个 -->
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">20</property>
        <property name="minPoolSize">10</property>
        <property name="maxPoolSize">40</property>
        <property name="maxStatements">20</property>
        <property name="maxStatementsPerConnection">5</property>
    </named-config>
</c3p0-config> 
c3p0-config.xml

    5.创建servlet(LoginServlet:路径   /login)

import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.yisen.domain.User;
import com.yisen.service.UserService;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0.设置编码
        response.setContentType("text/html;charset=utf-8");

        //1.接受用户名和密码
        String username=request.getParameter("username");
        String password=request.getParameter("password");

        //2.调用userservice 里的login(username,password) 返回值:User user
        User user = null;
        try {
            user = new UserService().login(username,password);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("网络异常,请稍后再试!");
        }

        //3.判断user是否为空
        if(user==null){
            //3.1若为空 写"用户名和密码不匹配"
            response.getWriter().print("用户名和密码不匹配,3s后跳转");

        }else{
            //3.2若不为空 写"xxx:欢迎回来"
            response.getWriter().print(user.getUsername()+":欢迎回来");
        }
    }
}
LoginServlet

      接收用户名和密码

package com.yisen.domain;

public class User {
    private int id;
    private String username;
    private String password;

    public void setId(int id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }
}
User

      调用service层(UserService)完成登陆操作

      提示信息

    6.UserService

      login(username,password)

      调用dao

package com.yisen.service;

import com.yisen.dao.UserDao;
import com.yisen.domain.User;

import java.sql.SQLException;

public class UserService {
    /**
     *  用户登陆方法
     * @param username 用户名
     * @param password 密码
     * @return User 用户
     */
    public User login(String username, String password) throws SQLException {
        //调用dao
        UserDao dao=new UserDao();

        return dao.getUserByUsernameAndPwd(username,password);
    }

}
UserService

    7.dao

      通过用户名和密码查询数据库 (UserDao)

package com.yisen.dao;

import com.yisen.domain.User;
import com.yisen.utils.DataSourceUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import java.sql.SQLException;

public class UserDao {
    /**
     *  登录
     * @param username 用户名
     * @param password 密码
     * @return
     */
    public User getUserByUsernameAndPwd(String username, String password) throws SQLException {
        //创建queryrunner
        QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());

        //编写sql
        String sql="select * from user where username = ? and password = ?";

        //执行sql
        User user = qr.query(sql, new BeanHandler<>(User.class), username,password);
        return user;
    }

}
UserDao

 登录失败跳转:

  技术分析:

    定时刷新

  常见响应头 -refresh

    响应头格式:

      refresh:秒数;url=跳转的路径

    设置响应头:

      response.setHeader(String key,String value):设置字符串形式的响应头

      response.addHeader(String key,String value):追加响应头,若之前设置过这个头则追加,若没有设置过,则设置

    设置定时刷新:

      response.setHeader("refresh","3;url=/xxx/login.html")

  步骤分析:

    登录失败后,修改业务逻辑

      打印之后添加一个头信息

package com.yisen.web.Servlet;

import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.yisen.domain.User;
import com.yisen.service.UserService;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0.设置编码
        response.setContentType("text/html;charset=utf-8");

        //1.接受用户名和密码
        String username=request.getParameter("username");
        String password=request.getParameter("password");

        //2.调用userservice 里的login(username,password) 返回值:User user
        User user = null;
        try {
            user = new UserService().login(username,password);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("网络异常,请稍后再试!");
        }

        //3.判断user是否为空
        if(user==null){
            //3.1若为空 写"用户名和密码不匹配"
            response.getWriter().print("用户名和密码不匹配,3s后跳转");
            //案例2:定时跳转z
            response.setHeader("refresh","3;url=ServletProjects_war_exploded/login.htm");

        }else{
            //3.2若不为空 写"xxx:欢迎回来"
            response.getWriter().print(user.getUsername()+":欢迎回来");
        }
    }
}
LoginServlet(refresh)

 

 

 统计登录成功总人次:

  技术分析:

    ServletContext

  ServletContext:

      上下文(全局管理者)

      常用方法:

        setAttribute(String key,Object value);  //设置值

        Object getAttribute(String key);  //获取值

        removeAttribute(String key); //移除值

      获取全局管理者:

        getServletContext()

  步骤分析:

    1.在项目启动时,初始化登录次数

      在loginservlet的init()方法中获取全局管理者ServletContext,将值初始化为0

    登录成功后,在loginservlet中获取ServletContext,获取登录成功的总次数

    然后次数+1,然后将值设置回去

package com.yisen.web.Servlet;

import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.yisen.domain.User;
import com.yisen.service.UserService;

public class LoginServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        //获取全局管理者
        ServletContext servletContext = getServletContext();

        //初始化次数
        servletContext.setAttribute("count","0");
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0.设置编码
        response.setContentType("text/html;charset=utf-8");

        //1.接受用户名和密码
        String username=request.getParameter("username");
        String password=request.getParameter("password");

        //2.调用userservice 里的login(username,password) 返回值:User user
        User user = null;
        try {
            user = new UserService().login(username,password);
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("网络异常,请稍后再试!");
        }

        //3.判断user是否为空
        if(user==null){
            //3.1若为空 写"用户名和密码不匹配"
            response.getWriter().print("用户名和密码不匹配,3s后跳转");
            //案例2:定时跳转z
            response.setHeader("refresh","3;url=/ServletProjects_war_exploded/login.htm");

        }else{
            //3.2若不为空 写"xxx:欢迎回来"
            response.getWriter().print(user.getUsername()+":欢迎回来");

            //获取全局管理者
            ServletContext context = getServletContext();
            //获取总次数
            Integer count = (Integer) context.getAttribute("count");
            //将次数+1
            count++;
            //将次数再次放入域对象中
            context.setAttribute("count",count);
        }
    }
}
LoginServlet(count)

    当访问showServlet时,获取全局管理者,获取登录成功的总次数,然后打印

package com.yisen.web.Servlet;

import javax.servlet.ServletContext;
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 java.io.IOException;

@WebServlet(name = "showServlet")
public class showServlet extends HttpServlet {


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0.设置编码
        response.setContentType("text/html;charset=utf-8");
        //1.获取全局管理者
        ServletContext context = getServletContext();
        //2.获取登陆次数
        Integer count = (Integer) context.getAttribute("count");
        //3.在页面打印总次数
        System.out.println("登录成功总次数"+count);
        response.getWriter().println("登录成功总次数"+count);
    }
}
showServlet

 

posted @ 2020-08-02 21:48  Yisennnn丶  阅读(169)  评论(0编辑  收藏  举报