项目结构图
用户登录页面login.jsp代码
< % @ page language= "java" contentType= "text/html; UTF-8"
pageEncoding= "UTF-8" % >
< ! DOCTYPE html>
< html>
< head>
< meta charset= "UTF-8" >
< title> Insert title here< / title>
< script type= "text/javascript" >
function changeimg ( ) {
document. getElementById ( "img1" ) . src= "/web05/verifycodeservlet?time=" + new Date ( ) . getTime ( ) ;
}
< / script>
< / head>
< body>
< %
String msg= "" ;
if ( request. getAttribute ( "msg" ) != null) {
msg= ( String) request. getAttribute ( "msg" ) ;
}
% >
< h1> 登录页面< / h1>
< h3> < font color= "red" > < %= msg % > < / font> < / h3>
< form action= "/web05/loginservle" method= "post" >
< table border= "1" width= "500" >
< tr>
< td> 用户名< / td>
< td> < input type= "text" name= "username" valuse= "${cookie.remember.value}" } / > < / td>
< / tr>
< tr>
< td> 密码< / td>
< td> < input type= "password" name= "password" valuse= "${cookie1.password.value}" } / > < / td>
< / tr>
< tr>
< td> 验证码< / td>
< td> < input type= "text" name= "checkcode" size= "6" / >
< img id= "img1" src= "/web05/verifycodeservlet" >
< a href= "#" onclick= "changeimg()" > 看不清,换一张< / a>
< ! -- 通过事件绑定,来改变验证码 -- >
< / td>
< / tr>
< tr>
< td> < input type= "checkbox" name= "remember" / > < / td>
< td> 记住用户名< / td>
< / tr>
< tr>
< td colspan= "2" > < input type= "submit" value= "登录" / > < / td>
< / tr>
< / table>
< / form>
< / body>
< / html>
登录成功页面代码success.jsp
< % @ page import = "com.itheima.Useritl.user" % >
< % @ page language= "java" contentType= "text/html; charset=UTF-8"
pageEncoding= "UTF-8" % >
< ! DOCTYPE html>
< html>
< head>
< meta charset= "UTF-8" >
< title> Insert title here< / title>
< / head>
< body>
< %
if ( request. getSession ( ) . getAttribute ( "existuser" ) == null) {
% >
< h1> 您还没有登录!请先去< a href= "/web05/login.jsp" > 登录< / a> ! < / h1>
< %
}
else {
% >
< h1> 用户登录成功!< / h1>
< % user existuser = ( user) request. getSession ( ) . getAttribute ( "existuser" ) ; % >
< h3> 您好< %= existuser. getUsername ( ) % > < / h3>
< a href= "/web05/logoutservlet" > 退出登录< / a>
< %
}
% >
< / body>
< / html>
用户工具类user.java
package com. itheima. Useritl;
public class user {
private Integer id;
private String username;
private String password;
private String nickname;
private int age;
public Integer getId ( ) {
return id;
}
public void setId ( Integer id) {
this . id = id;
}
public String getUsername ( ) {
return username;
}
public void setUsername ( String username) {
this . username = username;
}
public String getPassword ( ) {
return password;
}
public void setPassword ( String password) {
this . password = password;
}
public String getNickname ( ) {
return nickname;
}
public void setNickname ( String nickname) {
this . nickname = nickname;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
@Override
public String toString ( ) {
return "user [id=" + id + ", username=" + username + ", password=" + password + ", nickname=" + nickname
+ ", age=" + age + "]" ;
}
}
用户登录工具类UserModel.java
package com. itheima. Useritl;
import java. sql. Connection;
import java. sql. PreparedStatement;
import java. sql. ResultSet;
import java. sql. SQLException;
import org. apache. commons. dbutils. QueryRunner;
import org. apache. commons. dbutils. handlers. BeanHandler;
import com. itheima. DBuitle. JDBCUitel1;
public class UserModel {
public user login ( user use) throws SQLException{
if ( use!= null) {
QueryRunner queryrunner = new QueryRunner ( JDBCUitel1. getdatasource ( ) ) ;
user existuser = queryrunner. query ( "select * from user where username=? and password=?" , new BeanHandler < user> ( user. class ) , use. getUsername ( ) , use. getPassword ( ) ) ;
return existuser;
} else {
return null;
}
}
}
用户登录servlet代码loginservle.java
package com. itheima. domain;
import java. io. IOException;
import javax. servlet. ServletException;
import javax. servlet. http. Cookie;
import javax. servlet. http. HttpServlet;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
import javax. servlet. http. HttpSession;
import org. apache. commons. dbutils. QueryRunner;
import org. apache. commons. dbutils. handlers. BeanHandler;
import com. itheima. DBuitle. JDBCUitel1;
import com. itheima. Useritl. UserModel;
import com. itheima. Useritl. user;
public class loginservle extends HttpServlet {
protected void doGet ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
request. setCharacterEncoding ( "UTF-8" ) ;
String username = request. getParameter ( "username" ) ;
String password = request. getParameter ( "password" ) ;
String checkcode1 = request. getParameter ( "checkcode" ) ;
String checkcode2 = ( String) request. getSession ( ) . getAttribute ( "checkcode" ) ;
request. getSession ( ) . removeAttribute ( "checkcode" ) ;
if ( ! checkcode1. equalsIgnoreCase ( checkcode2) ) {
request. setAttribute ( "msg" , "验证码输入错误!" ) ;
request. getRequestDispatcher ( "./login.jsp" ) . forward ( request, response) ;
return ;
}
user use = new user ( ) ;
use. setUsername ( username) ;
use. setPassword ( password) ;
UserModel usermo = new UserModel ( ) ;
user existuser = usermo. login ( use) ;
if ( existuser == null) {
request. setAttribute ( "msg" , "用户名或密码错误" ) ;
request. getRequestDispatcher ( "./login.jsp" ) . forward ( request, response) ;
} else {
String remember = request. getParameter ( "remember" ) ;
if ( "on" . equals ( remember) ) {
Cookie cookie= new Cookie ( "remember" , existuser. getUsername ( ) ) ;
Cookie cookie1= new Cookie ( "password" , existuser. getPassword ( ) ) ;
cookie. setPath ( "/web05" ) ;
cookie. setMaxAge ( 60 * 60 ) ;
response. addCookie ( cookie) ;
response. addCookie ( cookie1) ;
}
HttpSession session = request. getSession ( ) ;
session. setAttribute ( "existuser" , existuser) ;
response. sendRedirect ( "./success.jsp" ) ;
}
} catch ( Exception e) {
e. printStackTrace ( ) ;
throw new RuntimeException ( ) ;
}
}
protected void doPost ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet ( request, response) ;
}
}
生成验证码的servlet代码verifycodeservlet.java
package com. itheima. domain;
import java. awt. Color;
import java. awt. Font;
import java. awt. Graphics;
import java. awt. image. BufferedImage;
import java. io. IOException;
import java. util. Random;
import javax. imageio. ImageIO;
import javax. servlet. ServletException;
import javax. servlet. http. HttpServlet;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
public class verifycodeservlet extends HttpServlet {
protected void doGet ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response. setDateHeader ( "Expires" , - 1 ) ;
response. setHeader ( "Cache-Control" , "no-cache" ) ;
response. setHeader ( "Pragma" , "no-cache" ) ;
response. setHeader ( "Content-Type" , "image/jpeg" ) ;
int width = 60 ;
int height = 30 ;
String data = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghijklmnpqrstuvwxyz" ;
Random random = new Random ( ) ;
BufferedImage image = new BufferedImage ( width, height, BufferedImage. TYPE_INT_RGB) ;
Graphics g = image. getGraphics ( ) ;
g. setColor ( Color. BLACK) ;
g. fillRect ( 0 , 0 , width, height) ;
g. setColor ( Color. WHITE) ;
g. fillRect ( 1 , 1 , width- 2 , height- 2 ) ;
StringBuilder builder = new StringBuilder ( ) ;
g. setFont ( new Font ( "宋体" , Font. BOLD& Font. ITALIC, 20 ) ) ;
for ( int i = 0 ; i < 4 ; i ++ ) {
g. setColor ( new Color ( random. nextInt ( 255 ) , random. nextInt ( 255 ) , random. nextInt ( 255 ) ) ) ;
int index = random. nextInt ( data. length ( ) ) ;
String str = data. substring ( index, index + 1 ) ;
builder. append ( str) ;
g. drawString ( str, ( width / 6 ) * ( i + 1 ) , 20 ) ;
}
for ( int j= 0 , n= random. nextInt ( 100 ) ; j< n; j++ ) {
g. setColor ( Color. RED) ;
g. fillRect ( random. nextInt ( width) , random. nextInt ( height) , 1 , 1 ) ;
}
String checkcode = builder. toString ( ) ;
request. getSession ( ) . setAttribute ( "checkcode" , checkcode) ;
ImageIO. write ( image, "jpg" , response. getOutputStream ( ) ) ;
}
protected void doPost ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet ( request, response) ;
}
}
用户退出登录的servlet代码logoutservlet.java
package com. itheima. domain;
import java. io. IOException;
import javax. servlet. ServletException;
import javax. servlet. http. HttpServlet;
import javax. servlet. http. HttpServletRequest;
import javax. servlet. http. HttpServletResponse;
public class logoutservlet extends HttpServlet {
private static final long serialVersionUID = 1 L;
public logoutservlet ( ) {
super ( ) ;
}
protected void doGet ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request. getSession ( ) . invalidate ( ) ;
response. sendRedirect ( "./login.jsp" ) ;
}
protected void doPost ( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet ( request, response) ;
}
}
数据库连接池代码JDBCUitel1.java
package com. itheima. DBuitle;
import java. io. FileInputStream;
import java. io. FileNotFoundException;
import java. io. IOException;
import java. sql. Connection;
import java. sql. DriverManager;
import java. sql. ResultSet;
import java. sql. SQLException;
import java. sql. Statement;
import java. util. Properties;
import javax. sql. DataSource;
import org. omg. CORBA. portable. InputStream;
import com. alibaba. druid. pool. DruidDataSourceFactory;
public class JDBCUitel1 {
private static DataSource dataSource= null;
static {
Properties properties = new Properties ( ) ;
try {
properties. load ( new FileInputStream ( "D:/apache-tomcat-8.5.39/webapps/web05/WEB-INF/classes/druid.properties" ) ) ;
dataSource = DruidDataSourceFactory. createDataSource ( properties) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
public static Connection getconnection ( ) {
Connection conn = null;
try {
conn = dataSource. getConnection ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
return conn;
}
public static DataSource getdatasource ( ) {
return dataSource;
}
public static void release ( Statement stmt, Connection conn) {
if ( stmt!= null) {
try {
stmt. close ( ) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
stmt= null;
}
if ( conn!= null) {
try {
conn. close ( ) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
conn= null;
}
}
public static void release ( ResultSet rs, Statement stmt, Connection conn) {
if ( stmt!= null) {
try {
stmt. close ( ) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
stmt= null;
}
if ( conn!= null) {
try {
conn. close ( ) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
conn= null;
}
if ( rs!= null) {
try {
rs. close ( ) ;
} catch ( SQLException e) {
e. printStackTrace ( ) ;
}
rs= null;
}
}
}
配置文件web.xml
< ? xml version= "1.0" encoding= "UTF-8" ? >
< web- app xmlns: xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns= "http://java.sun.com/xml/ns/javaee" xsi: schemaLocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id= "WebApp_ID" version= "2.5" >
< display- name> web05< / display- name>
< welcome- file- list>
< welcome- file> index. html< / welcome- file>
< welcome- file> index. htm< / welcome- file>
< welcome- file> index. jsp< / welcome- file>
< welcome- file> default . html< / welcome- file>
< welcome- file> default . htm< / welcome- file>
< welcome- file> default . jsp< / welcome- file>
< / welcome- file- list>
< servlet>
< description> < / description>
< display- name> loginservle< / display- name>
< servlet- name> loginservle< / servlet- name>
< servlet- class > com. itheima. domain. loginservle< / servlet- class >
< / servlet>
< servlet- mapping>
< servlet- name> loginservle< / servlet- name>
< url- pattern> / loginservle< / url- pattern>
< / servlet- mapping>
< servlet>
< description> < / description>
< display- name> verifycodeservlet< / display- name>
< servlet- name> verifycodeservlet< / servlet- name>
< servlet- class > com. itheima. domain. verifycodeservlet< / servlet- class >
< / servlet>
< servlet- mapping>
< servlet- name> verifycodeservlet< / servlet- name>
< url- pattern> / verifycodeservlet< / url- pattern>
< / servlet- mapping>
< servlet>
< description> < / description>
< display- name> logoutservlet< / display- name>
< servlet- name> logoutservlet< / servlet- name>
< servlet- class > com. itheima. domain. logoutservlet< / servlet- class >
< / servlet>
< servlet- mapping>
< servlet- name> logoutservlet< / servlet- name>
< url- pattern> / logoutservlet< / url- pattern>
< / servlet- mapping>
< / web- app>
配置文件druid.properties
url= jdbc: mysql: / / localhost/ web_test3? serverTimezone= UTC
driverClassName= com. mysql. cj. jdbc. Driver
username= root
password= 123456
filters= stat
initialSize= 2
maxActive= 300
maxWait= 60000
timeBetweenEvictionRunsMillis= 60000
minEvictableIdleTimeMillis= 300000
validationQuery= SELECT 1
testWhileIdle= true
testOnBorrow= false
testOnReturn= false
poolPreparedStatements= false
maxPoolPreparedStatementPerConnectionSize= 200