个人觉得,前后端交互的目的无非就是为了实现视图和业务逻辑的转换,前端发出请求,后端根据前端请求进行相应的数据处理然后给出不同响应
先以Servlet为基础的Model工作流程了解一下前后端交互流程
前后端交互有许多种实现方式,但都是围绕MVC编程模式来实现的,MVC编程模式。MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
针对MVC编程又产生了一些框架中最出名即SpringMVC了,SpringMVC是基于Model2实现的技术框架;Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。在SpringMVC中,Action不叫Actin,而被成为Controller;Controller接受参数request和response,并返回ModelAndView。这就是MVC编程的核心流程,通过对response和request对象进行一些操作再返回ModelAndView不正是V和M的转换吗。
而SpringMVC的实现步骤分为6步:
以上是SpringMVC的实现基本实现原理,下面我们通过一个SSM框架的简单登录小实例来了解一下实现过程
首先看一下项目架构图:
数据库表结构图:
基本配置文档spring-mybatis.xml
spring-mvc.xml
spring-transaction.xml
web.xml
//注册HandlerMapping
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-*.xml
springmvc
*.action
//配置过滤器
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
//添加参数,为防止乱码将所有请求编码格式统一设为utf-8
encoding
UTF-8
characterEncodingFilter
/*
数据持久化类Manager.java
package cgl.xyhs.ssm.pojo;
public class Manager {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
ManagerMapper.java
package cgl.xyhs.ssm.mapper;
import org.springframework.stereotype.Repository;
import cgl.xyhs.ssm.pojo.Manager;
@Repository
public interface ManagerMapper {
Manager selectByUserName(String name);
}
ManagerMapper.xml sql映射文件,文件中配置了操作数据库的sql语句
//数据库匹配
ManagerMapper.java和ManagerMapper.xml文件都都要放在前面所配置的mapper扫描器所设置扫描的包下,不然会抛出异常找不到该注解。
现在写项目的服务层
ManagerService.java
package cgl.xyhs.web.service;
import cgl.xyhs.ssm.pojo.Manager;
public interface ManagerService {
boolean login(Manager vo);
}
boolean login(Manager vo);
}
服务实现层
UserServiceImpl.java
package cgl.xyhs.web.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import cgl.xyhs.ssm.mapper.ManagerMapper;
import cgl.xyhs.ssm.pojo.Manager;
import cgl.xyhs.web.service.ManagerService;
@Service
public class ManagerServiceImp implements ManagerService {
private final ManagerMapper mapper;
@Autowired //调用注解自动注入
public ManagerServiceImp(ManagerMapper mapper) {
this.mapper = mapper;
}
@Override //验证用户名密码 也可在ManagerMapper写在接口中验证
public boolean login(Manager vo) {
Manager manager = mapper.selectByUserName(vo.getName());
if (manager == null) return false;
else if (manager.getPassword().equals(vo.getPassword())) {
vo.setId(manager.getId());
return true;
} else return false;
}
private final ManagerMapper mapper;
@Autowired //调用注解自动注入
public ManagerServiceImp(ManagerMapper mapper) {
this.mapper = mapper;
}
@Override //验证用户名密码 也可在ManagerMapper写在接口中验证
public boolean login(Manager vo) {
Manager manager = mapper.selectByUserName(vo.getName());
if (manager == null) return false;
else if (manager.getPassword().equals(vo.getPassword())) {
vo.setId(manager.getId());
return true;
} else return false;
}
}
最后编写相应的控制器ManagerController.java
package cgl.xyhs.web.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import cgl.xyhs.ssm.pojo.Manager;
import cgl.xyhs.web.service.ManagerService;
@Controller
public class ManagerSetController {
private final ManagerService managerService;
@Autowired
public ManagerSetController(ManagerService managerService) {
this.managerService = managerService;
}
@RequestMapping(value = "/login") //登录
public String skipPacks(Model model, HttpServletRequest request) {
String error = request.getParameter("error");
if (error != null) {
model.addAttribute("error", "账号密码错误");
}
return "/backer/login.jsp";
}
@RequestMapping(value = "/submitLogin") //提交登录
public String submitLogin(Model model, Manager vo, HttpServletRequest request) {
if (managerService.login(vo)) {
request.getSession().setAttribute("manager", vo); //如果登陆成功则把用户信息放入session中 后面可以用来检测用户是否登录
return "/backer/success.jsp"; //可直接返回方法、action、和jsp文件
} else {
return "redirect:login.action?error=" + 1; //如果验证不成功则继续返回登录界面
}
}
}
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
登录
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
登录成功
登录成功
这只是一个简单的登录测试,其余功能大家可以自由发挥
代码中的Model类是用来给前端JSP传递数据来生成前端html页面数据用的, 实为数据库在代码中的一种映射, 用来承载 如同数据表结构一般信息的存在,且用其在程序中传输 也就是说后端把值传到jsp页面可以用Model类
运行项目后登录流程为