代码未动,思想先行,站在高处看,站在远处望
web开发的本质就是完成人和计算机之间的数据交互: 比如查询数据,增加一条数据
站在设计模式的角度来分析一下:
交互的数据,称之为model(数据模型),简称为M
人在看到的页面上操作,称之为View(显示区),简称V
操作会触发事件(比如点击,下拉等),然后交给一个对象处理,称之为Controller(控制器),简称为C
交互前后端都采用了经典的mvc设计模式,具体的过程后面的文章再详细阐述.
简单说就是一个人在看得见的地方(V)触发了(事件),封装数据M,交给控制器C,操作数据返回给V,完成交互.
交互具体是如何完成的呢?如下图.发请求(request),得响应(response)完成的
思考几个问题:谁发请求?发到那里?请求是什么,响应又是什么?
1.客户端(client)发的请求.最常见的就是浏览器,后续还会学其他的
2.发到服务端,最先接到请求的是控制层controller,再调用服务层(service),再调用数据操作层(dao)
3.请求(request),是向服务器端发送的对象,常见包括3个要素(url,method,data)
a.url是请求要发送的地址,组成由 协议+ip+port+控制器名称+控制器方法名
协议:web是http
ip:服务器ip地址
port:web服务器端口,常见的web服务器比如tomcat
控制器名称:一般写在@RequestMapping,注解中
控制器方法名:一般写在@RequestMapping,@GetMapping,@PostMapping注解中
b.method是请求方式,常见的get,post等
c.data是请求数据,现在都是用json对象格式,曾经也用过xml
4.响应(response),是服务器端向客户端返回的对象,包括返回的数据,状态
代码实现:纯原生Java实现mvc三个对象,这里最原生实现,客户端和服务器端都在后台。模拟发请求,得响应得交互完成业务,核心类用的是Scanner来完成查询所有用户,增加用户的业务
架构图:
client客户端区初始化显示的由MainApplication类启动显,View类负责针对用户输入数据切换显示内容和封装数据.代码如下:
package com.rengl.javamvc.dao;
import com.rengl.javamvc.model.User;
import java.util.ArrayList;
import java.util.List;
public class UserMapper {
List<User> userList = new ArrayList<>();//内存
public void add(User user){
userList.add(user);
}
public List<User> list() {
return userList;
}
}
package com.rengl.javamvc.view;
import com.rengl.javamvc.controller.UserController;
import com.rengl.javamvc.model.User;
import java.util.List;
import java.util.Scanner;
/**
* V-显示层
* 纯java下用最简单的交互可以用控制台来实现模拟web请求
* 当然如果就是单机应用也可以用java自带的显示组件库awt,swing
*
* 显示层作用:
* 1.内容显示
* 2.数据收集
* 3.对象封装
*/
public class View {
private UserController userController = new UserController();
/**
* 前端mvc从下面方法中已经进行标记
* 代码就是一般的代码,但是要从中看出mvc模式来,应为后面代码就会变成别的展现,但是mvc思想是不变的
* 注册页
*/
public void registerPage(Scanner scanner){
//V
System.out.println("请输入账号:");
String username = scanner.next();
System.out.println("请输入密码:");
String password = scanner.next();
//M
User user = new User(username,password);
System.out.println(user);
//C
userController.register(user);
//查询所有用户
showUser();
}
/**
* 列表页
*/
public void showUser(){
//查询所有用户
List<User> list = userController.list();
System.out.println("===================================用户列表=========================================");
System.out.println("--------账号----------密码-----------");
for (User user : list) {
System.out.println(" "+user.getUsername()+" "+user.getPassword()+" ");
}
}
}
交互数据类为User,代码如下:
package com.rengl.javamvc.model;
public class User {
private String username;
private String password;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
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;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
服务器端代码为三层设计,控制层,业务层,数据库操作层,其中数据操作因为因为用java原生还没有数据库的接入,会将数据存储在List,List是存在内存中的对象代码如下:
package com.rengl.javamvc.controller;
import com.rengl.javamvc.model.User;
import com.rengl.javamvc.service.UserService;
import com.rengl.javamvc.service.impl.UserServiceImpl;
import java.util.List;
/**
* 控制器
*/
public class UserController {
private UserService userService = new UserServiceImpl();
/**
* 用户注册
* 接
* 调
* 返
*/
public String register(User user){//接[
//调
userService.add(user);
//返
return "success";
}
public List<User> list() {//接
List<User> list = userService.list();//调
return list;
}
}
package com.rengl.javamvc.service;
import com.rengl.javamvc.model.User;
import java.util.List;
public interface UserService {
public void add(User user);
List<User> list();
}
package com.rengl.javamvc.service.impl;
import com.rengl.javamvc.dao.UserMapper;
import com.rengl.javamvc.model.User;
import com.rengl.javamvc.service.UserService;
import java.util.List;
public class UserServiceImpl implements UserService {
private UserMapper userMapper = new UserMapper();
@Override
public void add(User user) {
userMapper.add(user);
}
@Override
public List<User> list() {
return userMapper.list();
}
}
package com.rengl.javamvc.dao;
import com.rengl.javamvc.model.User;
import java.util.ArrayList;
import java.util.List;
public class UserMapper {
List<User> userList = new ArrayList<>();//内存
public void add(User user){
userList.add(user);
}
public List<User> list() {
return userList;
}
}
这里提到类和对象解释一下.这不是java语言中特有的。其实就是这个世界真实的表达方式.所有的物种都归了类,如果现实存在,就是类具体的实例化表现.所有的类都只包含2种东西,一是属性(特征),二是方法(功能)
举个例子 人类 就是抽象出的概念 人的属性就是性别,年龄,身高,体重等等.方法就比如吃喝拉撒等等
恐龙类也是抽象出的概念 恐龙属性和方法都和人差不多。因为同属动物类。
但是区别在于.人是目前在世界存在,在java中实例化有意义.恐龙这个类虽然存在,但是没有活体对象了,即便在java能通过new的方式创建出来是仅仅在计算机中象征性的存活,就像在电影中一样。实际上没有实际的意义了
ArrayList 可以理解就是个能装东西的,再准确一些就是装对象的,这里用来装用户对象
在java中的交互用的是Scanner 来扫描控制台的单行输入,相当于在模拟发请求这一步骤
代码测试,如图: