2021-05-05
发布日期:2021-05-08 01:42:10 浏览次数:23 分类:原创文章

本文共 7947 字,大约阅读时间需要 26 分钟。

MVC的使用

使用MVC的实现登录注册功能

M:代表模型层,解决问题的功能具体实现。比如向数据库添加数据、查询数据
V:代表视图,用户和机器的交互页面。用来展示信息(一般用html,js,css…)
C:控制层,用来连接用户提交的操作和调用后台功能(servlet实现)

先写V层:
简单的html页面,这里只显示登录界面,其他的界面很容易写,简单的页面跳转。
提示。登录页面: action=“servletControll”。将登录的内容提交都处理登录的的servlet.注册页面的数据提交到处理注册页面的servelet。

登录页面<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>登录页面</title></head><body>            <form action="servletControll" method="post">                 用户名:<input type="text" name="uname"/>         密码:<input type="password" name="upwd"/><br><br>         <input type="submit" value="登录"/>         <input type="reset" value="重置"/>         <a href="register.jsp">注册新用户</a>                        </form></body></html>
注册页面<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>注册页面</title></head><body>       <form action="servletControllRegiser" method="post">              用户名:<input type="text" name="uname"/>       密码:<input type="password" name="upwd"/>       <input type="submit" value="注册"/>       </form></body></html>

servletControll:编写的servlet层,表示将提交的页面内容信息传给servletControll处理。
提交的方式:post:表示提交的内容不显示在浏览器文本框里,get:提交的内容显示出来较不安全。

servlet层:
将前端和后端进行连接的桥梁。
servlet层主要是获得视图层提交的表单信息。调用model层提供的功能根据传入的参数进行操作。然后将操作的信息返回给前端显示。
放置提交的信息发生乱码:request.setCharacterEncoding(“utf-8”);还有相应的信息也需要设置响应编码。目前这里不需要用到response设置相应的信息。
通过request.getParameter(“uname”)取得值。根据uname取得姓名的值。

注册package com.zyz.service;import java.io.IOException;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 com.zyz.funciton.RegisterDao;import com.zyz.login.Login;/** * Servlet implementation class servletControllRegiser */@WebServlet("/servletControllRegiser")public class servletControllRegiser extends HttpServlet {	private static final long serialVersionUID = 1L;	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		//注册功能、、向数据库添加数据				request.setCharacterEncoding("utf-8");		String name=request.getParameter("uname");		String pwd=request.getParameter("upwd");				Login log=new Login(name,pwd);//保存客户端输入的信息				int result=RegisterDao.register(log);		if(result>0) {			//注册成功			response.sendRedirect("successRegister.jsp");		}else {			//注册失败重新注册			response.sendRedirect("register.jsp");		}	}	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		doGet(request, response);	}}

在注册之前可以先调用查询有无此人,如果有此人可以编写提示信息。自己实现,很容易在注册函数调用之前先调用查询函数

登录package com.zyz.service;import java.io.IOException;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 com.zyz.funciton.LoginDao;import com.zyz.login.Login;/** * Servlet implementation class servletControll */@WebServlet("/servletControll")public class servletControll extends HttpServlet {	private static final long serialVersionUID = 1L;	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {				//取值		request.setCharacterEncoding("utf-8");		String name=request.getParameter("uname");		String pwd=request.getParameter("upwd");		//封装			Login log=new Login(name,pwd);				//调用业务逻辑层		int result =LoginDao.login(log);				if(result>0) {			//登录成功			response.sendRedirect("success.jsp");//重定向到成功界面		}else {			//登录失败			response.sendRedirect("notsuccess.jsp");//定位到失败页面		}						//请求转发	}	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		doGet(request, response);	}}

在servlet层获得的信息实际上就是一个用户的信息。可以设置一个封装了用户信息的实体类(数据库中的一张表)
Login log=new Login(name,pwd);
构造方法里的参数根据需要可以增加多个,根据需要自己定义。
然后调用Model层封装好的JavaBean功能函数

package com.zyz.login;public class Login {	// 封装实体类的JavaBean	private String name;	private String password;	public Login() {	}	// 构造方法用来传入数值	public Login(String name, String password) {		this.name = name;		this.password = password;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public String getPassword() {		return password;	}	public void setPassword(String password) {		this.password = password;	}}

model层(处理业务逻辑的JavaBean,封装实体类信息的JavaBean)
实际上就是操作数据库的一些增删改查。这里只需要编写添加新用户的信息,和查询登录。
数据库的连接可以看我以前写过的,:主要五个步骤1、加载驱动。不同的数据库有不同的驱动,去官网上下载很容易的,然后导入java(我连接的数据库是sqlserver)2、建立连接。3、建立sql语句操作数据库。4、处理结果集。(增删改使用的是executeupdate 查询使用的是executequery)。5、关闭连接。

查询是否存在此人。不存在提示注册package com.zyz.funciton;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.zyz.login.Login;//处理业务逻辑的JavaBeanpublic class LoginDao {	public static int login(Login login) {		int flag = -1;		String NAME = "登录数据库的用户名";		String PASSWORD = "登录数据库的个人密码";		String URL = "jdbc:sqlserver://localhost:1433;databaseName=自己的数据库名字";		Connection connection = null;		PreparedStatement pstmt = null;		ResultSet rs = null;		try {			// 1、加载驱动			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");			// 2、建立连接			connection = DriverManager.getConnection(URL, NAME, PASSWORD);			// 3、操作数据库			String sql = "select count(*) from admins where name=? and password=?";			pstmt = connection.prepareStatement(sql);			pstmt.setString(1, login.getName());			pstmt.setString(2, login.getPassword());			// 4、执行			rs = pstmt.executeQuery();			if (rs.next()) {				flag = rs.getInt(1);			}			if (flag > 0) {// 登录成功				return 1;			} else {				return 0;			}		} catch (ClassNotFoundException e) {			e.printStackTrace();			return -1;		} catch (SQLException e) {			e.printStackTrace();			return -1;		}catch (Exception e) {			e.printStackTrace();			return -1;		}finally {						try {				if(rs!=null) rs.close();				if(pstmt!=null) pstmt.close();				if(connection!=null) connection.close();			}catch(SQLException e) {				e.printStackTrace();			}catch(Exception e) {				e.printStackTrace();			}		}	}}
添加新的用户package com.zyz.funciton;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.zyz.login.Login;//封装注册功能业务逻辑的JavaBeanpublic class RegisterDao {		public static int register(Login login) {		int count =-1;String NAME = "登录数据库的用户名";		String PASSWORD = "登录数据库的个人密码";		//String URL = "jdbc:sqlserver://localhost:1433;databaseName=test";		String URL="jdbc:sqlserver://localhost:1433;databaseName=test";				Connection connection=null;		PreparedStatement pstmt=null;		ResultSet rs=null;				try {			//1、加载驱动			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");			//2、连接			connection=DriverManager.getConnection(URL,NAME,PASSWORD);			//操作数据库			String sql="insert into admins values(?,?)";//插入数据			pstmt=connection.prepareStatement(sql);			pstmt.setString(1, login.getName());			pstmt.setString(2, login.getPassword());						 count=pstmt.executeUpdate();			return count;					}catch(ClassNotFoundException e) {			e.printStackTrace();			return -1;		}catch(SQLException e) {			e.printStackTrace();			return -1;		}		catch(Exception e) {			e.printStackTrace();			return -1;		}finally {						try {				if(pstmt!=null) pstmt.close();				if(connection!=null) connection.close();			}catch(Exception e) {				e.printStackTrace();			}		}					}	}

提示:在建立操作数据库sql对象时.尽量使用PreparedStatement创建对象。相比Statement容易操作

String sql="insert into admins values(?,?)";//插入数据		pstmt=connection.prepareStatement(sql);		pstmt.setString(1, login.getName());		pstmt.setString(2, login.getPassword());

验证
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基本流程:
view 将信息提交给servelt层处理,servlet调用model层。servlet层再将处理后的内容发送到view层。

还有更加高级的三层模式。和mvc很像。但是更加方便。其中数据库的连接有大量的重复代码,可以单独编写一个辅助类。进行数据库的连接和关闭。

上一篇:RFID技术思维导图
下一篇:JSP中实现留言页面的编写并将留言信息展示出来

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月07日 18时43分48秒