
本文共 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很像。但是更加方便。其中数据库的连接有大量的重复代码,可以单独编写一个辅助类。进行数据库的连接和关闭。
发表评论
最新留言
关于作者
