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 目录下,如果没有,手动创建即可
选择工程 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的更多相关文章
- Servlet编程实例 续2
-----------------siwuxie095 Servlet 跳转之请求的重定向 继续完善登录实例,如下: login.jsp 不变,修改 LoginServlet,新建两个 JSP 文件 ...
- Servlet编程实例 续3
----------------siwuxie095 Servlet 跳转之请求的转发 修改 LoginServlet.java: package com.siwuxie095.servlet; im ...
- Servlet编程实例 续1
-----------------siwuxie095 在 LoginServlet 中,右键->Open Type Hierar ...
- Servlet编程实例1
编程目的:使用JSP+servlet,来实现一个登陆页面,登陆成功则提示成功,登陆失败则提示失败. 编程要求:登陆页面由login.jsp负责显示,登陆成功由success.jsp负责显示,登陆失败由 ...
- Servlet编程实例
---------------siwuxie095 登录实例: 从 login.jsp 提交登录信息到 LoginServlet,在 LoginServlet 中打印登录信息 工程结构目录如下: Lo ...
- Servlet编程实例2
上次实验中利用HttpServletRespon.sendRedict()方法来实现页面的转跳,而这种重定向请求的方法无法传递缓存的内容. 所以为了做出改进,这次使用RequestDispatcher ...
- Servlet编程实例-servlet学习之旅(三)
LoginServlet代码: public class LoginServlet extends HttpServlet{ @Override protected void service(Http ...
- Servlet编程
Servlet编程 1. servlet概念及相关接口简介 java Servlet是运行在web服务器或应用服务器上的程序,他是作为来自web浏览器或其他HTTP客户端的请求和HTTP服务器山的数据 ...
- Servlet编程-步步为营
[环境]eclipse j2ee;Tomcat 7.0; [模型1] package com.zhiqi; import ...; public class TestServlet extends H ...
随机推荐
- LeetCode:救生艇【881】
LeetCode:救生艇[881] 题目描述 第 i 个人的体重为 people[i],每艘船可以承载的最大重量为 limit. 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit. ...
- HDU - 1800 Flying to the Mars 【贪心】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1800 题意 给出N个人的 level 然后 高的level 的 人 是可以携带 比他低level 的人 ...
- python 3 递归调用与二分法
递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n): if n == 1: return 18 # 结束条件 return a ...
- Python核心编程 课后练习 第二章
2.4 使用raw_input()函数得到用户输入. (a) 创建一段脚本使用raw_input()函数从用户输入得到一个字符串, 然后显示这个用户杠杠输入的字符串. #coding = utf-8 ...
- POJ 2536 之 Gopher II(二分图最大匹配)
Gopher II Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6675 Accepted: 2732 Descrip ...
- 字节和unicode
一.字节和unicode Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的.因此Java要对这些字节流经行转化. char是unicode的, ...
- JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码
1. 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 pub ...
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
1. ServletConfig 有一些东西不合适在程序中写死,应该写在web.xml中,比如 文字怎么显示, 访问数据库名 和 密码, servlet要读取的配置文件 等等.. l在Servle ...
- python循环切片
x = [0,99, 'a', 1, 2, 'b',5, 3, 0,'a' ,1, 8, 5,'b',5,9,5] b=[] c=[] d=[] for i in range(len(x)): if ...
- JAVA发送手机短信
<p><span>JAVA发送手机短信,流传有几种方法:(1)使用webservice接口发送手机短信,这个可以使用sina提供的webservice进行发送,但是需要进行注册 ...