Servlet编程实例 续4

---------------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 目录下,如果没有,手动创建即可

选择工程 HelloServlet,右键->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】

时间: 2024-10-13 20:00:09

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

Servlet编程实例 续2

-----------------siwuxie095 Servlet 跳转之请求的重定向 继续完善登录实例,如下: login.jsp 不变,修改 LoginServlet,新建两个 JSP 文件 此时工程结构目录一览: login.jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCT

Servlet编程实例 续3

----------------siwuxie095 Servlet 跳转之请求的转发 修改 LoginServlet.java: package com.siwuxie095.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import

Servlet学习(三)Servlet编程实例-网站登录(修改版-增加数据库-附源码)

我们为刚才的那个示例Servlet学习(二)Servlet编程实例-网站登录添加上数据库,组成一个较为完整的登录功能. 在开始之前我们得首先了解下一些常用的java术语: PO(persistant object) 持久对象 在o/r 映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了. 通常对应数据模型(数据库),本身还有部分业务逻辑的处理. 可以看成是与数据库中的表相映射的java对象. 最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合. PO中应该不包含

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

LoginServlet代码: public class LoginServlet extends HttpServlet{ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("uName"); String pswd = req.g

JSP(4) ----servlet 编程1

Servlet Servlet是很多框架的技术基础 Servlet是特殊的java类,没有main方法,运行于服务端,创建和销毁都由Servlet容器管理 Servlet容器值tomcat. Servlet与http紧密联系,Servlet可以处理几乎所有http相关的内容 简单的Servlet程序,输出hello 添加Servlet类: package com.jike.servlet; import java.io.IOException; import java.io.PrintWrite

请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层).View(视图层).Controller(控制层). Model是可作为JavaBean使用的业务对象:View是负责创建显示界面的JSP页面:Controller通常是一个接收用户请求的Servlet程序,它根据请求创建相应的model对象和调用model对象的业务方法,最后再选择一个View去创建网页文档内容并回送给客户端. Controller调用RequestDispatc

计算机科学箴言集 -- &lt;编程珠玑续&gt;

6 计算机科学箴言集 程序员常常要转换时间单位; e.g. 一个程序每秒能处理100条记录, 那处理100w条需要多久? 用除法算, 就知道要花100000秒, 按每小时3600秒算, 差不多3小时; 而一年有多少秒? 如果我直接告诉你 3.155x10^7秒, 你可能很快就忘了; 事实上, 要记住这个很简单, 在误差不超过0.5%的约束下: π秒就是一个纳世纪    --Tom Duff 贝尔实验室    [nano 1×10?9 ] 所以, 如果程序要运行10^7秒, 就要准备等上4个月;

HBase编程实例

摘要:在前文中安装了Hbase,通过Hbase shell可以进行一些操作,但是和实际的编程实例联系起来不方便,因此本文介绍有关Hbase编程的实例. 一.使用Eclipse开发HBase应用程序 1,在Eclipse中新建一个Java Project,命名为HBaseTest,然后右键Properties中选择Java Build Path,选择Add External Jars,将HBase/lib目录下的jar包导入进来. 2,在工程根目录下创建Conf文件夹,将HBase/Conf下的h

c编程实例:809*??=800*??+9*???+1

程序代码: #include<stdio.h>#include<stdio.h>void main(){ int c; int i,j,k; printf("start computing!!!"); for(i=10;i<100;i++){ for(j=100;j<1000;j++){ c=i*809-1-9*j; k=c%800; if(k==0){ k=c/800; if(k>10&&k<100) printf(&q