---------------siwuxie095

JSP+Servlet+JDBC

继续完善登录实例,将校验逻辑改为:从数据库中获取用户信息进行校验

数据库准备

在 Navicat for MySQL 中创建连接:user_conn,创建数据库:user_db,

创建表:user,并内置数据:

JDBC 驱动准备

下载 MySQL 的 JDBC 驱动,下载链接:

https://dev.mysql.com/downloads/connector/j/

mysql-connector-java-5.1.41.zip 解压后一览:

将 mysql-connector-java-5.1.41-bin.jar 放入 WEB-INF 的 lib 文件夹中,

选中该 jar 文件并执行操作:右键->Build Path->Add to Build Path

编写代码

点击选择 src,右键->New->File,创建文件:dbconfig.properties

此时,工程结构目录一览:

后端代码:

ConnectionFactory.java:

package com.siwuxie095.util;

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.util.Properties;

//数据库连接工厂类

public class ConnectionFactory {

//四个成员变量用于保存从属性文件中读取到的数据库配置信息

private static String driver;

private static String dburl;

private static String user;

private static String password;

//定义ConnectionFactory类型的成员变量

private static final ConnectionFactory factory=new ConnectionFactory();

//定义Connection类型的成员变量,用于保存数据库连接

private Connection conn;

/**

* 用 static 声明一个静态代码块

* 静态代码块用于初始化类,可以为类的属性赋值

*

* 当JVM加载类时,会执行其中的静态代码块

*

* 因为是在加载类的过程中执行的,所以静态代码块只会执行一次

*

* 这里是从属性文件中读取相关的配置信息

*/

static{

/**

* 创建一个 Properties 对象,Properties 在 java.util 包中,

* 继承自 Hashtable 类,可以用来保存属性文件中的键值对,

* Properties 的方法专门用于处理属性文件中的键值对

*/

Properties prop=new Properties();

try {

/**

* 获取属性文件中的内容:

* 首先获取当前类的类加载器,使用类加载器的getResourceAsStream()方法,

* 读取属性文件中内容,并读取到一个输入流中

*/

InputStream in=ConnectionFactory.class.getClassLoader()

.getResourceAsStream("dbconfig.properties");

//从输入流中读取属性列表,即键值对

prop.load(in);

} catch (Exception e) {

System.out.println("========配置文件读取错误========");

}

//将读取到的值赋值给成员变量

driver=prop.getProperty("driver");

dburl=prop.getProperty("dburl");

user=prop.getProperty("user");

password=prop.getProperty("password");

//属性文件的加载---编写完成

}

//定义一个默认构造方法(空的构造方法)

//构造方法私有化是单例化一个类的第一步

private ConnectionFactory(){

}

//定义getInstance()方法,用来获取一个ConnectionFactory的实例

//单例模式,保证在程序运行期间,只有一个ConnectionFactory实例存在

public static ConnectionFactory getInstance() {

return factory;

}

//创建一个获取数据库连接的方法 makeConnection()

public Connection makeConnection() {

try {

Class.forName(driver);

conn=DriverManager.getConnection(dburl,user,password);

} catch (Exception e) {

e.printStackTrace();

}

return conn;

}

}

UserEntity.java:

package com.siwuxie095.entity;

public abstract class UserEntity {

protected String userName;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

}

UserEntityExtd.java:

package com.siwuxie095.entity.extd;

import com.siwuxie095.entity.UserEntity;

public class UserEntityExtd extends UserEntity {

private String password;

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

@Override

public String toString() {

return "UserEntityExtd [password=" + password + ", userName=" + userName + "]";

}

}

UserDao.java:

package com.siwuxie095.dao;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.siwuxie095.entity.extd.UserEntityExtd;

public interface UserDao {

public void save(Connection conn,UserEntityExtd user) throws SQLException;

public void update(Connection conn,UserEntityExtd user) throws SQLException;

public void delete(Connection conn,UserEntityExtd user) throws SQLException;

public ResultSet get(Connection conn,UserEntityExtd user) throws SQLException;

}

UserDaoImpl.java:

package com.siwuxie095.dao.impl;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.siwuxie095.dao.UserDao;

import com.siwuxie095.entity.extd.UserEntityExtd;

public class UserDaoImpl implements UserDao {

@Override

public void save(Connection conn, UserEntityExtd user) throws SQLException {

PreparedStatement ps=conn

.prepareStatement("insert into user(uname,upwd) values(?,?)");

ps.setString(1, user.getUserName());

ps.setString(2, user.getPassword());

ps.execute();

}

@Override

public void update(Connection conn, UserEntityExtd user) throws SQLException {

String updateSql="update user set uname=?,upwd=? where uname=?";

PreparedStatement ps=conn.prepareStatement(updateSql);

ps.setString(1, user.getUserName());

ps.setString(2, user.getPassword());

ps.execute();

}

@Override

public void delete(Connection conn, UserEntityExtd user) throws SQLException {

PreparedStatement ps=conn.prepareStatement("delete from user where uname=?");

ps.setString(1, user.getUserName());

ps.execute();

}

@Override

public ResultSet get(Connection conn, UserEntityExtd user) throws SQLException {

PreparedStatement ps=conn

.prepareStatement("select * from user where uname=? and upwd=?");

ps.setString(1, user.getUserName());

ps.setString(2, user.getPassword());

return ps.executeQuery();

}

}

CheckLoginService.java:

package com.siwuxie095.service;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.siwuxie095.dao.UserDao;

import com.siwuxie095.dao.impl.UserDaoImpl;

import com.siwuxie095.entity.extd.UserEntityExtd;

import com.siwuxie095.util.ConnectionFactory;

public class CheckLoginService {

private UserDao userDao=new UserDaoImpl();

public boolean check(UserEntityExtd user){

Connection conn=null;

try {

conn=ConnectionFactory.getInstance().makeConnection();

conn.setAutoCommit(false);

ResultSet rs=userDao.get(conn, user);

while (rs.next()) {

return true;

}

} catch (SQLException e) {

e.printStackTrace();

try {

conn.rollback();

} catch (SQLException e1) {

e1.printStackTrace();

}

}finally {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

return false;

}

}

CheckLoginServlet.java:

package com.siwuxie095.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.siwuxie095.entity.extd.UserEntityExtd;

import com.siwuxie095.service.CheckLoginService;

public class CheckLoginServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

private CheckLoginService cls=new CheckLoginService();

public CheckLoginServlet() {

super();

}

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

doPost(request, response);

}

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

String userName=request.getParameter("uname");

String password=request.getParameter("upwd");

RequestDispatcher rd=null;

String forward=null;

if (userName==null && password==null) {

request.setAttribute("msg", "用户名或密码为空!");

forward="/error.jsp";

}else {

UserEntityExtd user=new UserEntityExtd();

user.setUserName(userName);

user.setPassword(password);

boolean bool=cls.check(user);

if (bool) {

forward="/success.jsp";

}else {

request.setAttribute("msg", "用户名或密码错误,请重新输入!");

forward="/error.jsp";

}

}

rd=request.getRequestDispatcher(forward);

rd.forward(request, response);

}

}

前端代码:

login.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>登录页面</title>

<script type="text/javascript">

function check(form){

if(document.forms.loginForm.uname.value==""){

alert("请输入用户名!");

document.forms.loginForm.uname.focus();

return false;

}

if(document.forms.loginForm.upwd.value==""){

alert("请输入密码!");

document.forms.loginForm.upwd.focus();

return false;

}

}

</script>

<style type="text/css">

body {

color: #000; font-size =14px;

margin: 20px, auto;

}

</style>

</head>

<body>

<!-- 添加表单,url在部署描述符中进行配置,使用post方式来提交 -->

<form action="<%= request.getContextPath() %>/checkLoginServlet" method="post" name="loginForm">

<table border="1" cellspacing="0" cellpadding="5" bordercolor="silver" align="center">

<tr>

<td colspan="2" align="center" bgcolor="#E8E8E8">用户登录</td>

</tr>

<tr>

<td>用户名:</td>

<td><input type="text" name="uname" /></td>

</tr>

<tr>

<td>密码:</td>

<td><input type="password" name="upwd" /></td>

</tr>

<tr>

<td colspan="2" align="center">

<input type="submit" name="submit" onclick="return check(this);" />

<input type="reset" name="reset" />

</td>

</tr>

</table>

</form>

</body>

</html>

success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>登录成功提示页面</title>

<style type="text/css">

body {

color: #000; font-size =14px;

margin: 20px, auto;

}

#message {

text-align: center;

}

</style>

</head>

<body>

<div id="message">

登录成功!<br/>

您提交的信息为:<br/>

用户名:<%= request.getParameter("uname") %><br/>

密码:<%= request.getParameter("upwd") %><br/>

<a href="<%= request.getContextPath() %>/login.jsp">返回登录页面</a>

</div>

</body>

</html>

error.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>登录失败提示页面</title>

<style type="text/css">

body {

color: #000; font-size =14px;

margin: 20px, auto;

}

#message {

text-align: center;

}

</style>

</head>

<body>

<div id="message">

登录失败!<br/>

错误提示:

<%

Object obj=request.getAttribute("msg");

if(obj!=null){

out.print(obj.toString());

}else{

out.print("无");

}

%><br/>

您提交的信息为:<br/>

用户名:<%= request.getParameter("uname") %><br/>

密码:<%= request.getParameter("upwd") %><br/>

<a href="<%= request.getContextPath() %>/login.jsp">返回登录页面</a>

</div>

</body>

</html>

在部署描述符 web.xml 中注册 servlet:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

<display-name>MyServlet</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>

<servlet-name>CheckLoginServlet</servlet-name>

<servlet-class>com.siwuxie095.servlet.CheckLoginServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>CheckLoginServlet</servlet-name>

<url-pattern>/checkLoginServlet</url-pattern>

</servlet-mapping>

</web-app>

部署描述符 web.xml 在 WEB-INF 目录下,如果没有,手动创建即可

选择工程 MyServlet,右键->Java EE Tools->Generate Deployment Descriptor Stub

访问:localhost:8080/MyServlet/login.jsp,分别输入 siwuxie095 和 8888

跳转到:localhost:8080/MyServlet/checkLoginServlet

注意:高版本的 JDBC 驱动需要指明是否进行 SSL 连接

即 加上:?characterEncoding=utf8&useSSL=false

或:

即 加上:?useUnicode=true&characterEncoding=utf-8&useSSL=false

【made by siwuxie095】

Servlet编程实例 续4的更多相关文章

  1. Servlet编程实例 续2

    -----------------siwuxie095 Servlet 跳转之请求的重定向 继续完善登录实例,如下: login.jsp 不变,修改 LoginServlet,新建两个 JSP 文件 ...

  2. Servlet编程实例 续3

    ----------------siwuxie095 Servlet 跳转之请求的转发 修改 LoginServlet.java: package com.siwuxie095.servlet; im ...

  3. Servlet编程实例 续1

    -----------------siwuxie095                                 在 LoginServlet 中,右键->Open Type Hierar ...

  4. Servlet编程实例1

    编程目的:使用JSP+servlet,来实现一个登陆页面,登陆成功则提示成功,登陆失败则提示失败. 编程要求:登陆页面由login.jsp负责显示,登陆成功由success.jsp负责显示,登陆失败由 ...

  5. Servlet编程实例

    ---------------siwuxie095 登录实例: 从 login.jsp 提交登录信息到 LoginServlet,在 LoginServlet 中打印登录信息 工程结构目录如下: Lo ...

  6. Servlet编程实例2

    上次实验中利用HttpServletRespon.sendRedict()方法来实现页面的转跳,而这种重定向请求的方法无法传递缓存的内容. 所以为了做出改进,这次使用RequestDispatcher ...

  7. Servlet编程实例-servlet学习之旅(三)

    LoginServlet代码: public class LoginServlet extends HttpServlet{ @Override protected void service(Http ...

  8. Servlet编程

    Servlet编程 1. servlet概念及相关接口简介 java Servlet是运行在web服务器或应用服务器上的程序,他是作为来自web浏览器或其他HTTP客户端的请求和HTTP服务器山的数据 ...

  9. Servlet编程-步步为营

    [环境]eclipse j2ee;Tomcat 7.0; [模型1] package com.zhiqi; import ...; public class TestServlet extends H ...

随机推荐

  1. LeetCode:救生艇【881】

    LeetCode:救生艇[881] 题目描述 第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit. 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit. ...

  2. gulp 打包报错:ReferenceError: internalBinding is not defined

    > gulp build internal/util/inspect.js:31 const types = internalBinding('types'); ^ ReferenceError ...

  3. iOS 动态修改导航栏颜色 UINavigationBar

    示例 所谓动态修改  意思是 在当前页面滚动的过程中 亦或 是在 触发返回事件\进入一个新的页面  导航栏的动态变化 由于系统级别的navBar 高度集成  很多自己想实现的功能 很不好弄 如果是通过 ...

  4. Spring的使用

    Spring的组成 1. Core模块 该模块是Spring的核心容器,它实现了Ioc模式和Spring框架的基础功能. 2. Context模块 该模块继承BeanFactory类,并添加了事件处理 ...

  5. Linux- AWS之EC2大数据集群定时开关机

    众所周知,云计算就是在计算你的钱,每当ec2开起来就要开始计费.当用户购买了一个庞大的与服务器做一个集群,尤其是用来做大数据集群,这些服务器的配置相当高,每台服务器所需要的费用不菲.其实在很多时候没能 ...

  6. Vue2.0项目

    什么是 Vue Vue 是一个前端框架,特点是 数据绑定 比如你改变一个输入框 Input 标签的值,会 自动同步 更新到页面上其他绑定该输入框的组件的值  组件化 页面上小到一个按钮都可以是一个单 ...

  7. php 设置页面导航动态active类样式的添加

    在用php制作项目中,一般都是把页头和页脚分离出来.页头导航在选中状态时会有一些样式,例如active等,当页面在首页时候,导航的首页也应该是active的样式,那么,怎么用php控制这些样式的添加和 ...

  8. Building Performant Expand & Collapse Animations

    t's starting to be pretty common knowledge that there are only 2 things you can animate cheaply in C ...

  9. Jmete基础使用

    1,jmeter下载与安装 Jmeter的运行需要JDK支持,所以需要先安装好jdk,并配置好环境变量: 下载地址:http://jmeter.apache.org/download_jmeter.c ...

  10. Java自定义分页标签的实现

    主要字段含义: 页号 pagaNo页面大小 pageSize总记录条数 recordCount计算本次一共分多少页 myPageSize页号显示开始 start 页号显示结束 end PageTag需 ...