MVC与三层架构(附servlet的使用)

目录

什么是三层架构

什么是MVC模式

MVC工作流程

三层架构与MVC

三层架构与MVC练习

附:sevlet的使用



什么是系统架构

即整合应用系统程序大的结构,经常提到的系统架构:三层架构、mvc;两者既有区别又有联系,但目的都是解耦。


什么是三层架构

三层架构=视图层+业务逻辑层+数据访问层

视图层 View   用于接收用户提交请求的代码

业务逻辑层 Service  系统的业务逻辑

数据访问层 Dao  直接操作数据库的代码

为了更好的降低各层间的耦合度,在三层架构程序设计中,采用面向抽象编程。即上层对下层的调用,是通过接口实现的而下层对上层的真正服务提供者,是下层接口的实现类。服务标准(接口)是相同的,服务提供者(实现类)可以更换。这就实现了层间解耦合。

只要包含了视图层、应用层、数据访问层就是三层架构。

开发中,业务才是核心,技术辅助业务

简单业务  只开启一个事务

普通业务 开启三个事务

复杂业务  开启七个事务


什么是MVC模式

MVC=Model+View+Controller(模型+视图+控制器)

模型:数据模型 entity  业务模型 service

视图 jsp:展示页面

控制器 sevlet:处理用户请求的


MVC工作流程

  • 用户通过 View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等
  • 服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的 Model 对用户请求进行处理
  • Model 处理后,将处理结果再交给 Controller
  • Controller 在接到处理结果后,根据处理结果找到要作为向客户端发回的响应 View 页面。页面经渲染(数据填充)后,再发送给客户端。


三层架构与MVC

高内聚低耦合

一个类只做一种事

一个方法只做一件事

写只写一次

面向对象设计原则--重构原则

事不过三,三则重构(提取方法、类)

三层架构与MVC练习

1.创建文件夹login-demo,用idea打开

2.初始操作

  • 创建pom.xml


    4.0.0

    com.example
    login-demo
    1.0.0-SNAPSHOT
    war
  •  当前maven项目并没有被idea托管,点击maven-->加号-->选择pom.xml

MVC与三层架构(附servlet的使用)_第1张图片

  •  配置sdk,添加tomcat
  • 创建文件夹

          main / java resources webapp(web-inf/web.xml)

          test / java

         创建java下边的包  com.funtl.login.demo  / web(controller  ) service dao     entity                         

         项目结构如图

                       MVC与三层架构(附servlet的使用)_第2张图片

         这就是一个三层架构(只要包含视图层、业务逻辑层、数据访问层就叫三层架构)和MVC

3.写实体类User

package com.example.login.demo.entity;

import java.io.Serializable;

public class User implements Serializable {
    private String username;
    private String loginId;
    private String loginPwd;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public String getLoginPwd() {
        return loginPwd;
    }

    public void setLoginPwd(String loginPwd) {
        this.loginPwd = loginPwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", loginId='" + loginId + '\'' +
                ", loginPwd='" + loginPwd + '\'' +
                '}';
    }
}

 

写UserDao

package com.example.login.demo.dao;

import com.example.login.demo.entity.User;

public interface UserDao {
    public User login(String loginId, String loginPwd);
}

写UserDaoImpl

package com.example.login.demo.dao;

import com.example.login.demo.entity.User;

public class UserDaoImpl implements UserDao {
    public User login(String loginId, String loginPwd) {
        User user=null;
        if("admin".equals(loginId)){
            if("admin".equals(loginPwd)){
                user=new User();
                user.setLoginId("admin");
                user.setLoginPwd("admin");
                user.setUsername("lisa");
            }
        }
        return user;
    }
}

写UserService

package com.example.login.demo.service;

import com.example.login.demo.entity.User;

public interface UserService {
    public User login(String loginId, String loginPwd);
}

写UserServiceImpl

package com.example.login.demo.service;

import com.example.login.demo.dao.UserDao;
import com.example.login.demo.dao.UserDaoImpl;
import com.example.login.demo.entity.User;

public class UserServiceImpl implements UserService {
    public UserDao userDao=new UserDaoImpl();
    public User login(String loginId, String loginPwd) {
        return userDao.login(loginId,loginPwd);
    }
}

 

创建LoginController,其实是sevlet,因此需要先引包


            javax.servlet
            javax.servlet-api
            4.0.1
package com.example.login.demo.web.controller;

import com.example.login.demo.entity.User;
import com.example.login.demo.service.UserService;
import com.example.login.demo.service.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;

@WebServlet(name = "LoginController", urlPatterns = "/login")
public class LoginController extends HttpServlet{

    UserService userService=new UserServiceImpl();

    protected void doGet(HttpServletRequest req, HttpServletResponse resq) throws ServletException, IOException{

    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resq) throws ServletException, IOException{
        String loginId=req.getParameter("loginId");
        String loginPwd = req.getParameter("loginPwd");

        User user=userService.login(loginId,loginPwd);

        //登录失败的处理
        if(user==null){
            req.getRequestDispatcher("/fail.jsp").forward(req,resq);
        }

        //登录成功的处理
        else{
            req.getRequestDispatcher("/success.jsp").forward(req,resq);
        }

    }
}

 

get与post区别:

1.语义区别:获取、提交

2.post请求是2次,get是两次

创建登录成功与失败页面

在webapp下创建index.jsp fail.jsp success.jsp

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    登录


fail.jsp 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    登录


登录失败


success.jsp 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    登录


登录成功


 

 4.点击运行,出现如下错误

MVC与三层架构(附servlet的使用)_第3张图片

 突然发现webapp没有标识

MVC与三层架构(附servlet的使用)_第4张图片

只需要配置一下,将webapp文件夹关联上就可以了,如下图:

MVC与三层架构(附servlet的使用)_第5张图片

MVC与三层架构(附servlet的使用)_第6张图片

MVC与三层架构(附servlet的使用)_第7张图片

 

然后主页面就出现了,然而提交之后/login还是404,肯定是sevlet出现了问题

检查发现web.xml位置不对,修改如下:
MVC与三层架构(附servlet的使用)_第8张图片

然而并没有好,检查许久发现/login路径不对

如图:

MVC与三层架构(附servlet的使用)_第9张图片

MVC与三层架构(附servlet的使用)_第10张图片

我改了一下tomcat的设置

MVC与三层架构(附servlet的使用)_第11张图片

就可以完美运行了!

我把源码放在https://download.csdn.net/download/shmily_syw/11235084

 

 

附:sevlet的使用

1.pom.xml中引入依赖

 
            javax.servlet
            javax.servlet-api
            4.0.1

2.配置

方法一:web.xml中进行配置


        LoginController
        com.example.my.shop.Controller.LoginController


        LoginController
        /login

    两个sevlet-name要相同

方法二:使用注解的方式

@WebServlet(name = "LoginController", urlPatterns = "/login")
public class LoginController extends HttpServlet {
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resq) throws ServletException, IOException {

    }
    protected void doPost(HttpServletRequest req, HttpServletResponse resq) throws ServletException, IOException{

    }

}

3.通过注解访问sevlet

 
.....

 

你可能感兴趣的:(spring)