程序源代码及数据库文件:http://download.csdn.net/detail/hyz301/8887175
首先,创建数据库logindemo,创建用户表:userinfo.(数据库文件见附件)如图所示:
开发工具为myeclipse8.6,数据为mySQL5.0.代码结构如下图所示:
详细代码如下:
login.jsp登录界面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>登录</title> </head> <body> <form method="post" name="frmLogin" action="LoginServlet"> <h1 align="center"> 用户登录 </h1> <br> ${error} <div align="center"> 用户名: <input type="text" name="txtUserName" value="Your name" size="20" maxlength="20" onfocus="if(this.value=='Your name')this.value='';"> <br> 密码: <input type="password" name="txtPassword" value="Your password" size="20" maxlength="20" onfocus="if(this.value=='Your password')this.value='';"> <br> <input type="submit" name="Submit" value="登录" onClick="validateLogin();"> <input type="reset" name="Reset" value="取消"> <br> </div> </form> <script language="javaScript"> function validateLogin() { var sUserName = document.frmLogin.txtUserName.value; var sPassword = document.frmLogin.txtPassword.value; if (sUserName == "") { alert("请输入用户名!"); return false; } if (sPassword == "") { alert("请输入密码!"); return false; } } </script> </body> </html>
login_success.jsp登录成功后显示
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>login_success</title> </head> <body> <div align=center> ${UserName } 欢迎您,登录成功! </div> </body> </html>
login_failure.jsp 登录失败界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>login_failure</title> </head> <body> <div align=center> ${error } 登录失败! </div> </body> </html>
LoginServlet.java 处理登录Servlet
/** * 需要一个数据库:logindemo,和其中一个表:userinfo * 表中有两个字段分别为:username varchar (20) not null,password varchar (20) not null */ package demo.servlet; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.Servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import demo.conn.DBConn; public class LoginServlet extends HttpServlet implements Servlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String result = ""; // 获取用户名 String sUserName = request.getParameter("txtUserName"); if (sUserName == "" || sUserName == null || sUserName.length() > 20) { result = "请输入用户名(不超过20字符)!"; request.getSession().setAttribute("error", result); response.sendRedirect("login.jsp"); } // 获取密码 String sPasswd = request.getParameter("txtPassword"); if (sPasswd == "" || sPasswd == null || sPasswd.length() > 20) { result = "请输入密码(不超过20字符)!"; request.getSession().setAttribute("error", result); response.sendRedirect("login.jsp"); } Statement st = null; ResultSet rs = null; Connection conn = null; try { conn = DBConn.getConn(); st = conn.createStatement(); // SQL语句 String sql = "select * from userinfo where username='" + sUserName + "' and password = '" + sPasswd + "'"; rs = st.executeQuery(sql);// 返回查询结果 if (rs.next())// 如果记录集非空,表明有匹配的用户名和密码,登陆成功 { // 登录成功后将sUserName设置为session变量的UserName // 这样在后面就可以通过 session.getAttribute("UserName") 来获取用户名, // 同时这样还可以作为用户登录与否的判断依据 request.getSession().setAttribute("UserName", sUserName); response.sendRedirect("login_success.jsp"); } else { // 否则登录失败 request.getSession().setAttribute("error", "用户名或密码错误!"); response.sendRedirect("login_failure.jsp"); } } catch (SQLException e) { e.printStackTrace(); } finally { // 最终关闭连接 DBConn.close(conn, st, rs); } } }
DBConn.java 连接数据库
package demo.conn; import java.sql.*; public class DBConn { static { try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("驱动加载成功!"); } catch (Exception ex) { System.out.println("驱动加载失败!"); ex.printStackTrace(); } } public static Connection getConn() { try { String url = "jdbc:mysql://localhost:3306/logindemo?" + "user=root&password=123&useUnicode=true&characterEncoding=utf8"; Connection conn = DriverManager.getConnection(url); System.out.println("获取数据库连接成功!"); return conn; } catch (Exception ex) { System.out.println("获取数据库连接失败!"); ex.printStackTrace(); return null; } } public static void close(Connection conn, Statement st, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException ex) { } } if (st != null) { try { st.close(); } catch (Exception ex) { } } if (conn != null) { try { conn.close(); } catch (Exception ex) { } } } }
web.xml Servlet配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>demo.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
Servlet是Sun公司提供的一门用于开发动态web网页的技术。Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可以运行了。
到底什么是Servlet呢?
通俗一点,只要是实现了servlet接口的java程序,均称Servlet。Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小程序。
Servlet基础
1、解读API文档,纯手工编写一个Servlet程序,并部署访问(如上所示)。
学习API是程序员学习和进步的最好工具。
大家可以在点进去看一看,从上图,可以看出Servlet接口定义三个实现类,分别是FacesServlet, GenericServlet, HttpServlet。下面我们简单的介绍一下。
2、Servlet接口实现类
(1)FacesServlet是一个用于管理利用JSF(JavaServer Faces)构建用户界面的web应用程序请求处理生命周期的Servlet。(FacesServletis a servlet that manages the request processing lifecycle for web applications that are utilizing JavaServer Faces to construct the user interface.)。
(2)GenericServlet是HttpServlet的父类,包含了servlet的常用方法。GenericServlet使得程序员写servlets更加简单,它提供了初始化和销毁生命周期的方法,以及实现了写日志文件的方法。
(3)HttpServlet指能够处理HTTP请求的servlet。这是开发人员在编写Servlet时,通常应继承这个类即可。
对于这三个实现类,只为大家做一个简单的介绍,如果想深入的研究,直接看API就好。
3、Servlet部署
客户端通过URL地址访问web服务器中的资源,所以若想访问Servlet必须要把servlet程序映射到一个URL地址上,在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成,如上面的实例。
*<servlet>用于注册Servlet,包含了<servlet-name>和<servlet-class>两个子元素,分别用于设置servlet的名称以及servlet的类名。
*<servlet-mapping>用于映射上面<servlet>中的对外访问路径,同样包含<servlet-name>和<url-pattern>两个元素,分别用于设置servlet的名称以及servlet的对外访问路径。
在servlet映射到URL有两种格式:
1.“*.扩展名”
2.以正斜杠(/)开头并以“/*”结尾。
servlet对url的匹配规则以及路径问题,大家可以上网查,有很多相关的资料。
4、Web服务器调用Servlet过程(Servlet生命周期)
servlet程序是由web服务器调用,web服务器实现了对servlet生命周期的管理。servlet的生命周期分为四步:
1)实例化以及加载servlet,new的过程。
2)初始化init(ServletConfig)。
3)处理请求,调用servlet的service,doget,dopost方法将Request和Response,作为参数传递。
4)退出服务,调用destory方法释放资源。
注意:
1、servlet只实例化一次。感觉有点单例模式的意思,大家可以研究一下Tomcat的实现原理。
2、init方法也只执行一次。servlet实例只创建一次,所以init初始化只调用一次。
5、Servlet线程安全问题
当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用service方法,因此,service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。大家重点理解下面两句即可:
(1) Servlet是单实例多线程的,如果存在可以修改的成员变量将会出现线程安全问题。
(2) 使用Servlet最好保证Servlet是无状态的,也就是没有可以修改的成员变量。
相关推荐
Servlet和jdbc登录示例源代码(内附数据库脚本)博客链接:http://hyz301.iteye.com/blog/2226197
jsp_servlet_jdbc_oracle登陆示例
项目名称为Leaf,Servlet(com.leaf.web.LeafKingLaServlet)简单实现跳转示例,用户名密码访问示例。数据库采用Sqlite3,需要在数据库操作对象... ... 本代码仅为入门示例,代码有不严谨、不工整之处,请见谅。谢谢。
JSP+Servlet+JavaBean+JDBC示例程序
NULL 博文链接:https://colbybobo.iteye.com/blog/1994975
主要介绍了Servlet+JDBC实现登陆功能的小例子(带验证码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
使用servlet,jdbc将mysql中数据显示在jsp页面中
JDBC,JNDI和servlet小例子
一个简单的servlet示例,示例程序使用servlet+JSP+JDBC+mysql实现了用户登录的功能
Servlet和JSP CRUD示例 配置 SQL / ServletDB this sql file import your db src / orm / DBUtils.java static String url = "jdbc:mysql://localhost/YOUR_DATABASE_NAME"; static String username = "USERNAME";...
一个使用DAO介绍用户登录的例子,使用Servlet,JDBC等
学习卡 这是一个名为“学习卡”的简单网络应用程序的草稿。 你可以: 选择一组卡片,学习条款,然后查看您的改进统计信息。 所有术语都有成功和失败的统计信息。... 并从“ XMLcollectionExample.xml”添加示例数据。
请参阅 JSP 页面和 servlet 参考资料), 但是,由于使用了 DataSource 对象, 因此只需对代码做一些细微修改就可使其应用到其它数据库。 本教程假定您十分熟悉 Java 编程语言, 但对 servlet 或 JSP 技术却不...
登录应用#Jsp 和 Servlet 登录示例。 ORM Hibernate。 Jsp 和 Servlet。 mysql 数据库管理系统。 #准备 : 需要Mysql dbms 安装OR 和DBMS 服务器并将其驱动程序放在WEB-INF/lib 下。 com.mysql.jdbc.Driver 更改 ...
17.2 基本jdbc示例 17.3 用jdbc实用工具简化数据库访问 17.4 使用预备语句 17.5 创建可调用语句 17.6 使用数据库事务 17.7 使用orm框架将数据映射到对象 第18章 配置msaccess,mysql和oracle9i 18.1 ...
11.1 JDBC2.0和JDBC数据库连接池 11.1.1 JDBC2.0新功能概述 11.1.2 结果集增强功能 11.1.3 批处理更新 11.1.4 对Java对象的持久性 11.1.5 数据库连接池使用实例 11.2 文件上载 11.2.1 实现机理 11.2.2 文件...
:使用spring jdbc的示例 :使用spring web和servlet api 3的示例spring-aop-example :使用spring aop和AspectJ的示例待办事项:Spring Boot,Spring Web MVC 完整的例子complete-example :包含所有这些元素的微型...
而且在上一篇中,相应的示例servlet使用了原始JDBC存取我们的MySQL数据库。在本篇中,相应的示例servlet则使用Hibernate(不再是原始JDBC)存取MySQL数据库,但是将继续使用相同的Context.xml文件(没有作任何改变)...
SQL网关是一个允许使用基于 Web 的界面来执行任何类型的 SQL 语句的... ###使用的技术Java EE:JDBC、JSP、Servlet MySQL XML Apache Tomcat CSS 和 HTML ####J 连接器是从 MySQL 网站的mysql-connector-java-5.0.8-