一、基本思想是MVC模式,一个登录页面login.jsp,一个服务器处理程序Servlet.java,一个MySql数据库userinfo.
另外还有相关的数据封装类User和数据库连接类GetData,如果要加入密码验证,可能还要一个错误处理页面error.jsp。在这个小实例中,为了思路简单一点,暂时没有密码验证。
使用的工具是MyEclipse2015。
由于设计jdbc数据库的应用,需要准备mysql-connector-java-5.1.26-bin.jar开发包,拷贝到 WEB_INF下的lib文件夹。
二、建立login.jsp页面。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <% 3 request.setCharacterEncoding("utf-8"); 4 //从会话中获取登录信息 5 String lUserName = (String)session.getAttribute("lUserName"); 6 %> 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <meta charset="utf-8"> 11 <title>My JSP 'login.jsp' starting page</title> 12 </head> 13 14 <body> 15 <% if (lUserName != ""&&lUserName!=null) {%> 16 欢迎光临,<%=lUserName%><br><br> 17 <a href="loginserv?action=logout">退出登录</a> 18 <% } else { %> 19 <!-- 上下代码段说明:在页面加载时读取会话信息,如果读到有用户名数据,则显示欢迎语句,不显示表单。 20 如果没有读到用户名信息,则显示登陆请求表单。 21 如果在已登录状态,同时会显示一个退出登录的链接,点击之后发送“退出登录” 的请求,在servlet中将绘画信息中用户名清空在重定向。 --> 22 <form name="loginfrm" action="loginserv" method="post"> 23 <table> 24 <tr><td>用户名:</td><td><input type="text" name="username" value="zhangsan"></td></tr> 25 <tr><td>密 码:</td><td><input type="text" name="password" value="mm123456"></td></tr> 26 <tr><td colspan="2" ><input type="submit" value="登录"></td></tr> 27 </table> 28 </form> 29 <% } %> 30 </body> 31 </html>
三、建立用户数据封装类User,目的是封装通过验证得到的合法用户记录数据。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.kaly.data; 2 3 public class User { 4 private int id;//自增长id 5 private String usename;//用户名 6 private String nickname;//昵称 7 private String info;//信息 8 //无参构造方法 9 public User(){ 10 11 } 12 //有参构造方法 13 public User(int id, String usename, String nickname, String info) { 14 super(); 15 this.id = id; 16 this.usename = usename; 17 this.nickname = nickname; 18 this.info = info; 19 } 20 /** 21 * 快捷生成对象数据体 22 * @param usename 用户名 23 * @param nickname 昵称 24 * @param info 信息 25 */ 26 public void setUserData(String usename, String nickname, String info) { 27 //这个方法是设计为用一行代码填充实例,一面多行调用set方法显得代码冗长,作用相当于有参构造方法,但是作用会有点区别 28 this.usename = usename; 29 this.nickname = nickname; 30 this.info = info; 31 } 32 //下面是setter和getter方法群 33 public int getId() { 34 return id; 35 } 36 public void setId(int id) { 37 this.id = id; 38 } 39 public String getUsename() { 40 return usename; 41 } 42 public void setUsename(String usename) { 43 this.usename = usename; 44 } 45 public String getNickname() { 46 return nickname; 47 } 48 public void setNickname(String username2) { 49 this.nickname = username2; 50 } 51 public String getInfo() { 52 return info; 53 } 54 public void setInfo(String info) { 55 this.info = info; 56 } 57 //覆写toString是为了调试的时候便捷输出 58 @Override 59 public String toString() { 60 return "User [id=" + id + ", usename=" + usename + ", username2=" 61 + nickname + ", info=" + info + "]"; 62 } 63 }
四、创建数据库连接类GetData目的是在Servlet中使用时代码不致混乱,而且还可以重复使用。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.kaly.data; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 7 public class GetData { 8 //jdbc驱动类名 9 String driverStr="com.mysql.jdbc.Driver"; 10 //数据库url 11 String dataStr="jdbc:mysql://192.168.2.100:3306/userinfo"; 12 //访问数据库的用户名 13 String username="root"; 14 //访问数据库的密码 15 String password="admin"; 16 //数据库连接对象 17 private Connection conn; 18 //构造方法 19 public GetData(){ 20 try { 21 //加载驱动类 22 Class.forName(driverStr); 23 } catch (ClassNotFoundException e) { 24 e.printStackTrace(); 25 } 26 } 27 //获得数据库连接对象的方法 28 public Connection getConnection(){ 29 30 try { 31 conn = (Connection) DriverManager.getConnection(dataStr,username,password); 32 } catch (SQLException e) { 33 e.printStackTrace(); 34 } 35 return conn; 36 } 37 //关闭数据库连接 38 public void close(){ 39 if (conn!=null) { 40 try { 41 conn.close(); 42 } catch (SQLException e) { 43 e.printStackTrace(); 44 } 45 } 46 } 47 }
五、用模版建立Servlet程序loginserv.java。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.kaly.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.sql.Connection; 6 import java.sql.PreparedStatement; 7 import java.sql.ResultSet; 8 import java.sql.SQLException; 9 import java.sql.Statement; 10 11 import javax.mail.Session; 12 import javax.servlet.ServletException; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 import javax.servlet.http.HttpSession; 17 18 import com.kaly.data.GetData; 19 import com.kaly.data.User; 20 21 public class loginserv extends HttpServlet { 22 public void doGet(HttpServletRequest request, HttpServletResponse response) 23 throws ServletException, IOException { 24 doPost(request, response); 25 } 26 27 public void doPost(HttpServletRequest request, HttpServletResponse response) 28 throws ServletException, IOException { 29 String realusername=null;//经过验证的有效用户名 30 //以下两行主要解决中文乱码问题 31 request.setCharacterEncoding("utf-8"); 32 response.setCharacterEncoding("utf-8"); 33 //获得表单请求信息 34 String getUser=request.getParameter("username");//用户名 35 String getpassword=request.getParameter("password");//密码,这个小程序暂时未验证密码 36 String otherAction=request.getParameter("action");//获取退出登录等信息 37 //验证登录信息 38 GetData data=new GetData();//实例化自定义的GetData对象 39 Connection connection=data.getConnection();//从data中获得数据连接对象 40 ResultSet rs;//游标对象 41 User user=new User(); 42 try { 43 PreparedStatement pStatement=connection.prepareStatement("select * from user where username=?"); 44 pStatement.setString(1, getUser); 45 //把经过查询得到的符合条件的记录交给游标对象rs 46 rs=pStatement.executeQuery(); 47 //在游标对象rs中找到每一条记录,实际上如果用户名username不允许重复,则记录只有一条 48 while(rs.next()){ 49 //把查询的数据封装到User对象,以后使用时只需要使用这个对象就可以了 50 user.setUserData(rs.getString(2), rs.getString(4), rs.getString(5)); 51 } 52 data.close();//关闭数据连接 53 } catch (SQLException e) { 54 e.printStackTrace(); 55 } 56 HttpSession session=request.getSession();//获得会话对象 57 session.setAttribute("lUserName", user.getNickname());//向会话对象写入数据 58 if(otherAction=="logout"){ 59 //如果得到了"退出登录"的请求,则将登录的用户名信息置为null 60 session.setAttribute("lUserName", null); 61 } 62 //重定向到login.jsp页面 63 response.sendRedirect("login.jsp"); 64 } 65 66 }
六、查看WEB-INF下的web.xml。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 6 <servlet> 7 <description>This is the description of my J2EE component</description> 8 <display-name>This is the display name of my J2EE component</display-name> 9 <servlet-name>loginserv</servlet-name> 10 <servlet-class>com.kaly.servlet.loginserv</servlet-class> 11 </servlet> 12 13 <servlet-mapping> 14 <servlet-name>loginserv</servlet-name> 15 <url-pattern>/loginserv</url-pattern> 16 </servlet-mapping> 17 18 </web-app>
注意其中的<url-pattern>节点,系统默认配置的文件在这里容易出错。
七、工程为普通的Web Project。工程结构如下:
八、创建数据库userinfo,建立表user,并添加示例数据。
九、重启服务,加载页面login.jsp。
输入一个数据库中存在的用户名,点击"登录"。经过请求和跳转后,页面显示欢迎和昵称信息。
点击"退出登录"超链接。页面又经过请求和跳转,显示登录表单。
如果输入了数据库中没有的用户名,页面看似没有反应,但是根据页面表单value可以看出,页面其实已经经过了请求和跳转,又回到了原始状态。