登录案例
登录:
步骤分析:
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; } } }
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>
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()+":欢迎回来"); } } }
接收用户名和密码
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; } }
调用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); } }
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; } }
登录失败跳转:
技术分析:
定时刷新
常见响应头 -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()+":欢迎回来"); } } }
统计登录成功总人次:
技术分析:
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); } } }
当访问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); } }