JavaWeb之MVC模式

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

登录成功

失败会这样

如果对您有帮助,请点个赞支持一下,谢谢~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章