首先明确MVC到底是个啥,应注意与三层架构的区别
M:model(模型)
V:view(视图)
C:controller(控制器)
视图层:所谓前端,进行人机交互的页面,通常是html css js jsp。
控制器:相当于上层与底层交互的中间层,将视图层的数据分发给模型层,将模型层返回的结果传回视图层 ,通常可以是Servlet文件。
模型层:处理业务逻辑(封装业务逻辑的Java bean) + 处理数据(封装数据的Java bean),例如对数据库的连接和SQL的处理,对数据库表中的各属性进行封装。
下面用一个登录的demo讲解,前提为创建一个web项目,并正确连接数据库,若不会,之前有博客
(环境:IDEA2019 Mysql 8.0.19 mysql driver:8.0.15 servlet:3.0以上版本)
数据库结构:
默认为index.jsp为首页,别忘了修改web.xml文件,设置为Login.jsp ,设置首页方法如下(真是操碎了心,怕你们又要404找半天原因0.0
<welcome-file-list>
<welcome-file>Login.jsp</welcome-file>
</welcome-file-list>
创建一个JSP文件代码如下(视图层)(Login.jsp)
<%--
Created by IntelliJ IDEA.
User: Laura Li
Date: 2020/3/1
Time: 18:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="LoginServlet" method="post">
Username: <input type="text" name="Uname"><br/>
Upwd: <input type="password" name="Upwd"><br/>
<input type="submit" value="Login">
</form>
</body>
</html>
创建Servlet文件(控制器),在src下创建一个com.Login.Servlet包,在该包下创建LoginServlet.java
package com.Login.Servlet;
import com.Login.Dao.LoginDao;
import com.Login.entity.User;
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;
//控制器层,用来接受view请求, 并分发给Model处理
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name = request.getParameter("Uname");
String pwd = request.getParameter("Upwd");
User login = new User(name, pwd);
//调用模型层的登录功能
int result = LoginDao.login(login);
if(result>0){
response.sendRedirect("Welcome.jsp"); //此处为登录成功后的跳转页面,自行自定义,就输出一句登录成功也好
}else if(result == 0){
response.sendRedirect("Login.jsp");
}else{
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
下面为模型层,分为两个 1.封装业务逻辑 2.封装数据
1.封装业务逻辑的Java bean,在src下创建一个com.Login.Dao包,在该包下创建LoginDao.java
package com.Login.Dao;
import com.Login.entity.User;
import java.sql.*;
//模型层:用于处理登录
public class LoginDao {
public static int login(User user){ //Login
int flag = -1; //默认登录失败
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int result = -1;
String Url="jdbc:mysql://localhost/User";
String User="root";
String Pwd="123456";
try{
//a.导入驱动,加载具体的驱动类
Class.forName("com.mysql.jdbc.Driver");//加载具体驱动类
//b.与数据库建立连接
connection = DriverManager.getConnection(Url, User,Pwd);
System.out.println("数据库连接成功");
String sql = "select count(*) from user where Username =? and Password =?";
pstmt = connection.prepareStatement(sql);
pstmt.setString(1,user.getUserName());
pstmt.setString(2,user.getPassWord());
rs = pstmt.executeQuery();
if(rs.next()){
result = rs.getInt(1);
}
if(result>0){
System.out.println("账号密码正确");
return flag = 1;
}else {
System.out.println("账号密码错误");
return flag = 0; //登录失败(用户名或密码错误)
}
}catch (Exception e){
e.printStackTrace();
System.out.println("系统异常");
return flag = -1 ; //登录异常
}finally {
try{
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(connection!=null) connection.close();
}catch (Exception e){}
}
}
}
2.封装数据的Java bean,在com.Login.entity包下创建User.java(其实应该创建Login.java比较合适,不过我不想改代码了,你们自行修改吧),可以自己写,也有两种方式进行软件自动生成,自动生成数据库实体类的方法,另开博客写,回头补链接
package com.Login.entity;
public class User {
private String userName;
private String passWord;
public User(String userName) {
this.userName = userName;
}
public User(String uname, String upwd){
this.userName = uname;
this.passWord = upwd;
}
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;
}
}
下面一个完整的登录模块便写完了,无图无真相,上图
账号密码正确
账号或密码错误