Spring MVC前后端交互原理及实现(附实例代码)

   前后端交互主要目的

               个人觉得,前后端交互的目的无非就是为了实现视图和业务逻辑的转换,前端发出请求,后端根据前端请求进行相应的数据处理然后给出不同响应

              先以Servlet为基础的Model工作流程了解一下前后端交互流程

              Spring MVC前后端交互原理及实现(附实例代码)_第1张图片

  主要实现

          前后端交互有许多种实现方式,但都是围绕MVC编程模式来实现的,MVC编程模式。MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

  •    Model(模型)表示应用程序核心(比如数据库记录列表)
  •    View(视图)显示数据(数据库记录)
  •    Controller(控制器)处理输入(写入数据库记录) 

         针对MVC编程又产生了一些框架中最出名即SpringMVC了,SpringMVC是基于Model2实现的技术框架;Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。在SpringMVC中,Action不叫Actin,而被成为Controller;Controller接受参数request和response,并返回ModelAndView。这就是MVC编程的核心流程,通过对response和request对象进行一些操作再返回ModelAndView不正是V和M的转换吗。

          而SpringMVC的实现步骤分为6步:

 

  1. 客户端向Spring容器发起HTTP请求。
  2. 发起的请求被前端控制器(DispatcherServlet)所拦截,前端控制器回去寻找恰当的映射处理器来完成这次请求。
  3. DispatcherServlet根据处理器映射(HandlerMapping)来选择并决定将请求发送给哪一个控制器。
  4. 选定控制器之后,Dispatcher便将请求发送给它,在控制器中处理所发送的请求,并以ModelAndView(属性值和返回的页面)的形式返回给前端控制器DispatcherServlet,典型情况下是以JSP页面的形式返回。
  5. 返回给前端控制器的未必都是JSP页面,可能仅仅是一个逻辑视图名,通过逻辑视图名可以查找到实际的视图。前端控制器正式通过查询viewResolver对象将从控制器返回的逻辑视图名解析为一个具体的试图实现。
  6. 如果前端控制器找到相应的视图,则将视图返回给客户端,否则就抛出异常。

          以上是SpringMVC的实现基本实现原理,下面我们通过一个SSM框架的简单登录小实例来了解一下实现过程

 

首先看一下项目架构图:

Spring MVC前后端交互原理及实现(附实例代码)_第2张图片

 

数据库表结构图:

 

基本配置文档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类

 

运行项目后登录流程为

       Spring MVC前后端交互原理及实现(附实例代码)_第3张图片


                  

 

你可能感兴趣的:(Spring MVC前后端交互原理及实现(附实例代码))