Javaweb要实现一个较为完整的程序,要有前台页面、后台和数据库数据。
我们在写注册与登录界面之前先了解一下Javaweb中比较重要的MVC模式
一、MVC
1、示意图
2、MVC作用
MVC本来是存在于Desktop程序中的,M(Model)是指数据模型,V(View)是指用户界面,C(Control)是控制器。
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。
了解完MVC模式之后就可以开始对我们要实现的登录和注册功能进行分析了。
在进行分析时,通常是从显示层(视图层)开始从上往下分析。
首先我们应编写好登录与注册页面,接着实现登录与注册以及其他相关功能的方法,然后调用方法,最后连接数据库并将前台数据传入数据库。
分析好后开始正式实现功能,实现功能时通常是从数据库开始从下往上实现
二、注册与登录
1、建立数据库User表
【字符集设为utf8】
2、编写数据库相关的信息文件
建立一个file文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_user
user=root
password=123456
3、利用类加载器读取到刚才新建的文件
package com.xinhua.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 使用普通java类读取外部资源文件
*
*/
public class ReadFile {
public static Properties readFile(String Path){
//利用类加载器读取文件
InputStream in = ReadFile.class.getClassLoader().getResourceAsStream(Path);
Properties p = new Properties();
try {
p.load(in);
String url = (String) p.get("url");
System.out.println(url);
} catch (IOException e) {
e.printStackTrace();
}
return p;
}
}
4、封装对数据库的连接等操作
import java.sql.*;
import java.util.Properties;
/**
* 封装对数据库的连接等
*/
public class DButils {
public static Connection getConnection(){
Properties properties = ReadFile.readFile("File/db.properties");
String driver = (String)properties.get("driver");
String url = (String)properties.get("url");
String user = (String)properties.get("user");
String password = (String)properties.get("password");
try {
Class.forName(driver);
Connection connection=DriverManager.getConnection(url,user,password);
return connection;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//关闭数据库连接
public static void closeDB(Connection conn, PreparedStatement ps, ResultSet rs){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
import com.xinhua.domain.User;
import com.xinhua.utils.DButils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DaoUser {
//用户登录
public boolean findUserByUsernameAndPassword(String username,String password){
Connection connection =null;
String sql =null;
PreparedStatement ps =null;
ResultSet rs =null;
Boolean flag=false;
try{
connection = DButils.getConnection();
sql = "SELECT id FROM USER WHERE username=? AND password=?";
ps = connection.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,password);
rs = ps.executeQuery();
while (rs.next()){
if (rs.getInt(1)>0){
flag=true;
}
}
}catch (SQLException e){
e.printStackTrace();
}
DButils.closeDB(connection,ps,rs);
return flag;
}
//查询用户
public static Boolean foundUserByUsername(String username){
Connection connection =null;
String sql =null;
PreparedStatement ps =null;
ResultSet rs =null;
Boolean flag=false;
try {
connection = DButils.getConnection();
sql = "SELECT id FROM USER WHERE username=?";
ps = connection.prepareStatement(sql);
ps.setString(1,username);
rs = ps.executeQuery();
while (rs.next()){
if (rs.getInt(1)>0){
flag=true;
}
}
} catch (SQLException e) {
e.printStackTrace();
}
DButils.closeDB(connection,ps,rs);
return flag;
}
public static int addUser(User user){
//添加用户
Connection conn = null;
String sql = null;
int i =0;
PreparedStatement ps =null;
try {
conn = DButils.getConnection();
sql="insert into user(username,password,gender,age,hobbies,remark) values(?,?,?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1,user.getUsername());
ps.setString(2,user.getPassword());
ps.setString(3,user.getGender());
ps.setInt(4,user.getAge());
ps.setString(5,user.getHobbies());
ps.setString(6,user.getRemark());
i = ps.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
}
DButils.closeDB(conn,ps,null);
return i;
}
}
5、封装用户登录与用户注册的相关方法
import com.xinhua.dao.DaoUser;
import com.xinhua.domain.User;
public class UserService {
/**
* 用户登录
*/
public boolean login(String username,String password){
DaoUser daoUser = new DaoUser();
boolean flag = daoUser.findUserByUsernameAndPassword(username,password);
return flag;
}
/**
* 注册用户
* 处理User对象的相关业务
*/
public int register(User user){
/**
* 注册用户
* 0(表示没有注册成功),1(表示注册成功),2(表示该用户一存在)。
*/
DaoUser daoUser = new DaoUser();
boolean flag = DaoUser.foundUserByUsername(user.getUsername());
int state=0;
if (flag){
state=2;
}else {
int i = DaoUser.addUser(user);
if (i>0){
state=1;
}else {
state=0;
}
}
return state;
}
}
import com.xinhua.domain.User;
import java.util.HashMap;
import java.util.Map;
/**
* 用户注册验证
*/
public class ValidateDome {
public static Map<String,String> validateUser(User user){
Map<String,String> error = new HashMap<>();
System.out.println(user.getUsername()+"11111");
System.out.println(user.getUsername()==null||"".equals(user.getUsername().trim()));
if (user.getUsername()==null||"".equals(user.getUsername().trim())){
error.put("username","用户名不能为空");
}else if (!(user.getUsername().matches("\\w{6,18}"))){
error.put("username","用户名不合法");
}
if (user.getPassword()==null||"".equals(user.getPassword().trim())){
error.put("password","密码不能为空");
}else if (!(user.getPassword().matches("[a-zA-Z0-9]{6,18}"))){
error.put("password","密码不合法");
}
return error;
}
}
/**
* 数组转字符串工具类
*/
public class ArrayToString {
public static String arrayToString(String[] arr) {
String arrayString = "";
for (int i = 0; i<arr.length;i++){
if (i!=arr.length-1){
arrayString = arrayString + arr[i] + ",";
}else {
arrayString = arrayString + arr[i];
}
}
return arrayString;
}
}
6、编写Conntroller层与前台相关网页
封装User对象
import java.util.Date;
/**
* 封装User对象
*/
public class User {
private String username;
private String password;
private String gender;
private String hobbies;
private String remark;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public String getHobbies() {
return hobbies;
}
public void setHobbies(String hobbies) {
this.hobbies = hobbies;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobby() {
return hobbies;
}
public void setHobby(String hobbies) {
this.hobbies = hobbies;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", hobbies='" + hobbies + '\'' +
", remark='" + remark + '\'' +
", age=" + age +
'}';
}
}
注册界面(register.jsp)
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%--
Created by IntelliJ IDEA.
User: jinyj
Date: 2023/9/21
Time: 11:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
String registerfail = request.getParameter("registerfail");
--%>
<%
HashMap<String, String> error = ((HashMap<String, String>)request. getAttribute("error"));
String registerfail = request.getParameter("registerfail");
%>
<%=registerfail==null?"":registerfail%>
<form name="form1" method="post" action="UserController">
<input type="hidden" value="register" name="userAction">
<table width="30%" heighe="300px"border="1" id="table1">
<tr align="center"><td colspan="2">注册</td></tr>
<tr><td>用户名</td><td><input type="text" id="username" name="username"/><span style="color:red"> <%=error==null?"":error.get("username")==null?"":error.get("username")%></span></td></tr>
<tr><td>密码</td><td><input type="password" id="password" name="password" /><span style="color:red"> <%=error==null?"":error.get("password")==null?"":error.get("password")%></span></td></tr>
<tr><td>年龄</td><td><input type="text" id="age" name="age" /></td></tr>
<tr><td>性别</td>
<td>
<input type="radio" value="female" name="gender">女
<input type="radio" value="male" name="gender">男
</td></tr>
<tr>
<td>爱好</td>
<td>
<input type="checkbox"value="篮球" name="hobbies" >篮球
<input type="checkbox"value="足球" name="hobbies" >足球
<input type="checkbox"value="羽毛球" name="hobbies" >羽毛球
</td>
</tr>
<tr><td>备注</td>
<td>
<input id="comments" name="remark" rows="4" cols="50">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交">
<input type="reset" value="重置">
</td>
</tr>
</table>
</form>
</body>
</html>
注册失败界面(registerfail.jsp)
<%--
Created by IntelliJ IDEA.
User: jinyj
Date: 2023/9/21
Time: 15:24
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>注册失败</h1>请<a href="register.jsp">返回</a>重新注册
</body>
</html>
注册成功界面(success.jsp)
<%--
Created by IntelliJ IDEA.
User: jinyj
Date: 2023/9/21
Time: 15:38
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>注册成功</h1><a href="login2.jsp">点击登录</a>
</body>
</html>
登录界面(login2.jsp)
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: jinyj
Date: 2023/9/27
Time: 10:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
HashMap<String, String> error = ((HashMap<String, String>)request. getAttribute("error"));
String fail = (String) request.getParameter("fail");
%>
<form action="UserController" method="post">
<input type="hidden" value="login" name="userAction">
<table border="1" align="center" bgcolor="#7fffd4">
<tr align="center"><th colspan="2">登录</th></tr>
<tr><td>账号:<input type="text" name="username"><%=fail==null?"":fail%><span style="color:red"> <%=error==null?"":error.get("username")==null?"":error.get("username")%></span></td></tr>
<tr><td>密码:<input type="text" name="password"><span style="color:red"> <%=error==null?"":error.get("password")==null?"":error.get("password")%></span></td></tr>
<tr align="center"><td colspan="2"><input type="submit" value="登录"><input type="reset" value="重置"></td></tr>
</table>
</form>
</body>
</html>
登录成功界面(index01.jsp)
<%--
Created by IntelliJ IDEA.
User: jinyj
Date: 2023/9/19
Time: 10:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<span style="color: red"> <%=request. getParameter("username")%></span>登录成功! Welcome to javaweb!
</body>
</html>
最后调用service层的方法发布项目即可
import com.xinhua.domain.User;
import com.xinhua.service.UserService;
import com.xinhua.utils.ArrayToString;
import com.xinhua.validate.ValidateDome;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
@WebServlet("/UserController")
public class UserController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("userAction");
//处理中文乱码
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
//登录
if ("login".equals(action)){
User user = new User();
try {
BeanUtils.populate(user,req.getParameterMap());
Map<String,String> error = ValidateDome.validateUser(user);
if (error.isEmpty()){
UserService userService = new UserService();
boolean flag = userService.login(user.getUsername(),user.getPassword());
if (flag){
resp.sendRedirect("index01.jsp?username="+ URLEncoder. encode(user.getUsername(),"utf-8"));
}else {
req.setAttribute("fail","登录失败");
req.getRequestDispatcher("login2.jsp").forward(req,resp);
}
}else {
req. setAttribute( "error", error);
req.getRequestDispatcher( "login2.jsp").forward(req,resp);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//注册
if ("register".equals(action)){
User user = new User();
try {
BeanUtils.populate(user,req.getParameterMap());
user.setHobbies(ArrayToString.arrayToString(req.getParameterValues("hobbies")));
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
Map<String,String> error = new HashMap<>();
if (error.isEmpty()){
//调用service
UserService userService = new UserService();
int state = userService.register(user);
if (state==0){
resp.sendRedirect("registerfail.jsp");
}
if (state==1){
resp.sendRedirect("success.jsp");
}
if (state==2){
resp.sendRedirect("register.jsp?registerfail="+ URLEncoder. encode( "该用户已经存在!", "utf-8"));
}
}else {
req. setAttribute( "error", error);
req.getRequestDispatcher( "/register.jsp").forward(req, resp);
}
}
}
}
最后给大家附上部分结果截图,谢谢观看
运行结果