1.MVC的含义
M - model(模型)
1.实体模型:每个对象的实体,即一个java类,它具有属性、设置和获取属性的方法
例:Student.java(学生类),Teacher.java(教师类),Food.java (食物类)...
2.业务模型:执行web项目的基本业务
例:Dao(数据访问层) ,Service(业务逻辑层)...
V - view (视图)
1.HTML 静态视图
2.JSP 动态视图
C - control (控制层)
Servlet获取不同的业务请求,去执行不同的业务逻辑,控制不同的响应反馈
例.登录功能 - 调用登录服务模型 - 调用登录数据访问模型 - 通过数据库拿到的数据反馈给视图
2.MVC具体执行顺序
上图中首先浏览器发送请求,Servlet通过Xml建立实例收到请求,通过分析决定这次业务是什么,连接到指定的业务Service,Service再通过Dao来访问数据库内的数据,JdbcUtils只是连接数据库的一个工具类;取回数据后原路返回至Servlet,Servlet将数据解析成jsp可识别的状态,然后转发至各个jsp页面,浏览器通过这些数据更改视图。
3.具体例子
假如我们现在需要一个登录功能,用户在页面输入用户名和密码,后台通过后台连接数据库验证账号密码,随后反馈给页面。
(1)login.html(没有使用jsp,因为html已经足够做完这个小例子)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>登录</title>
</head>
<body>
<form action="UserSevlet" method="post">
<div>
<ul>
<li><input name="uname" type="text"/></li>
<li><input name="upassword" type="password"/></li>
<li>
<input name="" type="submit"/>
<input name="" type="reset"/>
</li>
</ul>
</div>
</form>
</body>
</html>
(2)后台结构
(3)具体后台代码
3.1 JdbcUtil(jdbc的连接类,需要项目导入mysql驱动jar)
package com.hc.JDBCdemo.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class JdbcUtil {
//数据库驱动类
public static final String DRIVER = "com.mysql.cj.jdbc.Driver";
//数据库的连接地址
public static final String URL = "jdbc:mysql://localhost:3306/javawebjdbcdemo?serverTimezone=UTC";
//账号
public static final String UID = "root";
//密码
public static final String PWD = "123";
//获取Connection实例
public static Connection getCon() {
Connection con = null;
try {
Class.forName(DRIVER);//ClassNotFoundException
con = DriverManager.getConnection(URL, UID, PWD);//SQLException
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
//关闭Connection对象
public static void closeCon(Connection con, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (con != null) {
con.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2 User 实体类(跟数据库的属性对接)
package com.hc.JDBCdemo.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 4649979572893086618L;
private int uid;
private String uname;
private String upassword;
private String sex;
private String hobbys;
private String message;
public User(int uid, String uname, String upassword, String sex, String hobbys, String message) {
this.uid = uid;
this.uname = uname;
this.upassword = upassword;
this.sex = sex;
this.hobbys = hobbys;
this.message = message;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpassword() {
return upassword;
}
public void setUpassword(String upassword) {
this.upassword = upassword;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHobbys() {
return hobbys;
}
public void setHobbys(String hobbys) {
this.hobbys = hobbys;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
3.3 业务逻辑层
UserService (接口)
package com.hc.JDBCdemo.service;
import com.hc.JDBCdemo.entity.User;
public interface UserService {
//用户登录服务,通过账号密码登录
public User getUserByCon(String uid, String pass);
}
UserServiceImpl (实现接口的类)
package com.hc.JDBCdemo.service.serviceImpl;
import com.hc.JDBCdemo.dao.UserDao;
import com.hc.JDBCdemo.entity.User;
import com.hc.JDBCdemo.service.UserService;
public class UserServiceImpl implements UserService {
//内聚强,但是耦合度高。
//实例化用户Dao
UserDao dao = new UserDao();
@Override
public User getUserByCon(String uname, String upassword) {
return dao.getUser(uname,upassword);
}
}
3.4 dao 数据访问层
package com.hc.JDBCdemo.dao;
import java.sql.SQLException;
import com.hc.JDBCdemo.entity.User;
import com.hc.JDBCdemo.util.JdbcUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDao {
//声明JDBC_API
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
//通过账号密码获得用户
public User getUser(String uname, String upassword){
User user = null;
String sql = "select * from user where uname = ? and upassword = ?";
con = JdbcUtil.getCon();
try {
ps = con.prepareStatement(sql);
ps.setString(1, uname);
ps.setString(2, upassword);
rs = ps.executeQuery();
if(rs.next()){
user = new User(
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
rs.getString(5),
rs.getString(6)
);
}
} catch (SQLException e) {
e.printStackTrace();
} finally{
JdbcUtil.closeCon(con, ps, rs);
}
return user;
}
}
3.5 UserSevlet(Servlet控制层)
package com.hc.JDBCdemo.controller;
import com.hc.JDBCdemo.entity.User;
import com.hc.JDBCdemo.service.UserService;
import com.hc.JDBCdemo.service.serviceImpl.UserServiceImpl;
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.io.PrintWriter;
@WebServlet(name = "UserSevlet")
public class UserSevlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取用户接口的服务
UserService service = new UserServiceImpl();
//设置请求端的字符编码集
request.setCharacterEncoding("utf-8");
//获取请求的参数
String uname = request.getParameter("uname");
String upassword = request.getParameter("upassword");
//调用服务,传入参数,判断登录是否成功
User user = service.getUserByCon(uname, upassword);
if(user != null){
//转发到index.html
request.getRequestDispatcher("index.html").forward(request, response);
}else{
//输出登录失败信息
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.print("<h2>账号:</h2>"+uname);
pw.print("<h2>密码:</h2>"+upassword);
pw.print("<h2>是非法账号,请重新尝试</h2>");
pw.print("<h2><a href='login.html'>传送门</a></h2>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
3.6 web.xml中注册Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>UserSevlet</servlet-name>
<servlet-class>com.hc.JDBCdemo.controller.UserSevlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserSevlet</servlet-name>
<url-pattern>/UserSevlet</url-pattern>
</servlet-mapping>
</web-app>
(4)使用tomcat启动web项目
启动跳出login.html
查看一下数据库的数据(数据自己随便写几个)
输入小明和123
登录成功
失败会这样
如果对您有帮助,请点个赞支持一下,谢谢~