四. MVC设计模式

M V C
Model View Controller
模型 视图 控制器

1. Model

一个功能
用JavaBean实现

2. Controller

接收 请求,将请求跳转到模型进行处理;
模型处理完毕后,再将结果 返回 给请求处。

3. View

用于展示、与用户交互。
用html、js、css、jsp、jquery等前端技术实现

4.Servlet

符合规范的Java类

  • a. 必须继承 javax.servlet.http.HttpServlet
  • b. 必须重写其中的doGet()或doPost()方法

doGet ():接收 并 处理 所有g e t 提交的请求
doPost():接收 并 处理 所有post 提交的请求

a. Servlet要使用必须配置:

  1. Servlet2.5:web.xml
    在这里插入图片描述
    👇映射关系流程:
    请求 👉 <url-pattern> 拦截 👉 根据 <servlet-name>配对<servlet>中的name 👉 请求交由 <servlet-class>

  2. Servlet3.0:@WebServlet
    不需要在web.xml中配置,只需要在Servlet类的定义处写上注解:@WebServlet(“url-pattern值”)
    在这里插入图片描述

注意:

  1. 如果.jsp文件不是根目录就需要用../来返回根目录,类似: <a href="../../WelcomeServlet">

  2. .xml文件中的 / 代表: localhost:8081/项目名 /
    .jsp文件中的 / 代表: localhost:8081 /

b.Servlet的生命周期

五个阶段

加载 👉 初始化 👉 服务 👉 销毁 👉 卸载

加载、卸载:Servlet容器自动处理
加载:
初始化:init() ,该方法会在Servlet被加载并实例化的以后执行
服务:service()👉doGet()、doPost()
销毁:destory(),Servlet被系统回收时
卸载:

init():默认第一次访问时会被执行(只执行一次)

修改执行时间为服务一开启就执行init():

  1. Servlet2.5:
    在这里插入图片描述
  2. Servlet3.0:
    在这里插入图片描述
service()👉doGet()、doPost():调用几次执行几次
destory():关闭服务时,执行一次

5.Servlet API

由两个软件包组成:对应HTTP协议的软件包,对应于除了HTTP协议以外的其他软件包
即Servlet API可适用于任何通信协议
在这里插入图片描述

6. Servlet的继承关系

在这里插入图片描述

ServletConfig:接口

a. ServletContext getServletContext () :

获取Servlet.上下文对象 可用于创建application

ServletContext中的常见方法(application):

  • getContextPath() :相对路径
  • getRealPath(): 绝对路径
  • setAttribute() 、getAttribute()
  • String getInitParameter (String name) ;在当前Web容器范围内,获取名为name的参数值(初始化参数)

servlet2.5:
在这里插入图片描述

在这里插入图片描述
servlet3.0:

@WebServlet(value = "/WelcomeServlet",loadOnStartup = 1,initParams = {@WebInitParam(name="servletparaname30" ,value="servletparavalue30")})

注解只隶属于某一个具体的Servlet
全局参数还是在web.xml中配置

b. String getInitParameter (String name) :

在当前Servlet范围内,获取名为name的参数值(初始化参数)

HttpServletRequest中的方法:同request,

在这里插入图片描述

HttpServletResponse同上

7. MVC案例

login.jsp👇

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页</title>
</head>
<body>
    <form action="../../LoginServlet" method="post">
        用户名:<input type="text" name="uname"><br/>
        密码:<input type="password" name="upwd"><br/>
        <input type="submit" value="登陆">
        <input type="reset" value="取消"><br>
    </form>
</body>
</html>

welcome.jsp👇

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>欢迎页面</title>
</head>
<body>
登陆成功!
</body>
</html>

Login.java👇

package qsx;

/**
 * @Author: qsX
 * @Time: 2020-05-03 17:07
 * @Description:封装数据JavaBean,用于放置要传递的数据
 */
public class Login {
private int id ;
private String uname ;
private String upwd ;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpwd() {
        return upwd;
    }

    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }

    public Login(int id, String uname, String upwd) {
        this.id = id;
        this.uname = uname;
        this.upwd = upwd;
    }
    public Login(String uname, String upwd) {
        this.uname = uname;
        this.upwd = upwd;

    }
    public Login() {

    }
}

LoginServlrt.java👇

package qsx;

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;

/**
 * @Author: qsX
 * @Time: 2020-05-03 21:20
 * @Description: 控制器层,用于接收view中的请求,并分发给model
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理登陆
        req.setCharacterEncoding("utf-8");
        String name = req.getParameter("uname");
        String pwd = req.getParameter("upwd");
        Login login = new Login(name,pwd);
        //调用模型层的登录功能
        int result = LoginDao.login(login);

        if ( result == -1) {
            //系统异常
            resp.sendRedirect("/demo/mvc/login.jsp");
        } else if (result == 0) {
            //账号密码错误!
            resp.sendRedirect("/demo/mvc/login.jsp");
        } else if (result == 1) {
            //登陆成功
            resp.sendRedirect("/demo/mvc/welcome.jsp");
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

}

LoginDao.java👇

package qsx;
import javax.servlet.annotation.WebServlet;
import java.sql.*;
/**
 * @Author: qsX
 * @Time: 2020-04-29 23:28
 * @Description:模型层,用于处理登陆操作
 */
public class LoginDao {
    public static int login(Login login) {
        String URL = "jdbc:oracle:thin:@localhost:1521:ORCL";
        String USERNAME = "scott";
        String PWD = "tiger";
        Connection connection = null;
        Statement statement = null;
        ResultSet rs = null;
        PreparedStatement preparedStatement = null;
        try {
// a. 导入驱动,加载具体的驱动类
            Class.forName("oracle.jdbc.OracleDriver");//加载具体的驱动类
// b. 与数据库建立连接
            connection = DriverManager.getConnection(URL, USERNAME, PWD);
// c. 发送sql,执行(查)
            String sql = "SELECT count(*) FROM login where uname=? and upwd=? group by uname";
            preparedStatement = connection.prepareStatement(sql);

            preparedStatement.setString(1, login.getUname());
            preparedStatement.setString(2, login.getUpwd());

            // 返回值表示,查询内容
            rs = preparedStatement.executeQuery();
// d. 处理结果集(查询)(可选操作,没有返回就忽略)
            int count = -1;
            if (rs.next()) {
                count = rs.getInt(1);
                return count;
            }
            return count + 1;
        } 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 (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐