(1) 新建用户注册表单页 index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<form action="login" method="post" id="myform">
<table align="center">
<tr>
<td>用户名:</td>
<td><input type="text" name="name" title="用户名"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="pwd" title="密码" /></td>
</tr>
<tr>
<td>性别:</td>
<td>
<input type="radio" name="sex" value="男" title="性别"/>男
<input type="radio" name="sex" value="女" title="性别"/>女
</td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" name="age" title="年龄" /></td>
</tr>
<tr>
<td>Email:</td>
<td><input type="text" name="email" title="Email" /></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" value="注 册" onclick="check()"/>
<input type="reset" value="重 置" />
</td>
</tr>
</table>
</form>
</body>
<script type="text/javascript">
// 检查表单元素的值是否为空
function check(){
var myform = document.getElementById("myform");
for(var i=0; i<myform.length; i++ ){
if(myform.elements[i].value == ""){
alert(myform.elements[i].title + "不能为空");
myform.elements[i].focus();
return;
}
}
myform.submit(); // 表单中最后input提交标签用的是button类型,首先不提交表单,在js判断表单项都不为空时 再提交表单。
}
</script>
</html>
(2) 新建名为UserInfo的JavaBean类,用于封装用户的注册信息。
package com.user;
/**
* UerInfo的JavaBean类,该类用于封装用户的注册信息
*
* @author yilong
*
*/
public class UserInfo {
private String userName;
private String userPwd;
private String userSex;
private int userAge;
private String email;
public UserInfo() {
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
(3) 在servlet中使用JDBC访问数据库。可以将数据库连接的代码单独写成一个类,这样在其他的功能模块中可以实现代码的重用。新建名为MySQLDBCon的类,该类主要包含一个建立数据库连接的方法
package com.dbCon;
import java.sql.Connection;
import java.sql.DriverManager;
public class MySQLDBCon {
private static Connection conn = null;
public static Connection getCon() {
try {
Class.forName("com.mysql.jdbc.Driver");
String user = "root";
String pwd = "123456";
String url = "jdbc:mysql://localhost:3306/login_user";
conn = DriverManager.getConnection(url, user, pwd);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
(4) 新建名为LoginDao的类,该类中包含一个保存用户注册信息到数据库的方法和一个获得本实例的静态方法
package com.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.dbCon.MySQLDBCon;
import com.user.UserInfo;
public class LoginDao {
private static LoginDao instance = null;
public static LoginDao getInstance() {
if (instance == null) {
instance = new LoginDao();
}
return instance;
}
// 保存用户注册信息
public boolean saveUser(UserInfo user) {
Connection conn = null;
try {
conn = MySQLDBCon.getCon(); // 建立数据库连接
String sql = "insert into userinfo(userName,userPwd,userSex,userAge,email) values(?,?,?,?,?)"; // insert
// SQL语句=
PreparedStatement pstmt = conn.prepareStatement(sql); // 创建用户操作执行SQL语句的PreparedStatement对象
pstmt.setString(1, user.getUserName());
pstmt.setString(2, user.getUserPwd());
pstmt.setString(3, user.getUserSex());
pstmt.setInt(4, user.getUserAge());
pstmt.setString(5, user.getEmail());
pstmt.executeUpdate(); // 编译执行insert语句
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return false;
}
}
(5) 新建名为LoginServlet的Servlet类,在该类的doPost()方法中获得表单提交的用户注册信息,并将这些信息封装到用户信息类UserInfo中,然后调用LoginDao中的方法将注册信息保存到数据库中
package com.servlet.login;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.dao.LoginDao;
import com.user.UserInfo;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
request.setCharacterEncoding("UTF-8"); // 设置请求的字符编码格式,与JSP登陆界面的字符编码保持一致
/** 以下是获得表单提交过来的值 **/
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String sex = request.getParameter("sex");
String age = request.getParameter("age");
int userAge = 0;
if (age != null && !age.equals("")) {
userAge = Integer.parseInt(age);
}
String email = request.getParameter("email");
/** 以下代码将获得的表单值封装到用户信息对象中 **/
UserInfo user = new UserInfo();
user.setUserName(name);
user.setUserPwd(pwd);
user.setUserSex(sex);
user.setUserAge(userAge);
user.setEmail(email);
boolean flag = LoginDao.getInstance().saveUser(user); // 将用户注册信息保存到数据库
// [request.getRequestDispatcher]和[response.sendRedirect]两种请求转发的区别:
// 前者转发时,URL地址不会改变,而后者转发时URL会发生变化。其次,前者的请求响应为同一个,而后者是重新创建新的请求与响应对象。
if(flag){ // 当注册成功时,转发到success.jsp页面
request.getSession().setAttribute("userName", user.getUserName());
request.getRequestDispatcher("success.jsp").forward(request, response);
}else{ // 否则,转发到errorpage.jsp页面,显示错误信息!
response.sendRedirect("errorpage.jsp");
}
}
}
(6) 新建错误页面errorpage.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>
</head>
<body>
<h2>登陆失败,请重新登陆!</h2>
<!-- 保留原页面信息的脚本回退方式 -->
<a href="javascript:history.back()">返回</a>
<!-- 保留原页面信息的脚本回退方式 -->
<!-- <a href="index.jsp">返回</a> -->
</body>
</html>
将获取数据库连接的代码、表单数据以及数据库的操作都封装在独立的类中,而Servlet只是负责调用这些类,这样便充分地体现了Servlet作为控制器(Controller)角色的作用。