zoukankan      html  css  js  c++  java
  • 基于Spring MVC的前后端分离开发

    一.后台服务器端开发:先搭建一个springMVC项目

    1.新建一个web项目

    2.引入相关jar包,编写配置文件

    (1).引入spring包

    spring-framework-5.0.8.RELEASE,这个包里有相关Bean、context、core、web、webmvc、aop、aspect、jdbc、test等功能的相关包。就是把下载到spring-framework-5.0.8.RELEASE里所有包都加进来了。如下图(注意:要记得右键项目名称,选择Build Path把这些jar包引入到项目中)

     

    (2).在src目录下编写spring容器配置文件,applicationContext.xml

    位置如下

     

     该配置文件内容如下: 

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:util="http://www.springframework.org/schema/util" xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
        xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
            http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
            
    </beans>
    (3).编写web.xml文件,配置Servlet初始化时加载spring容器
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
      <servlet>
          <servlet-name>springMVC</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:applicationContext.xml</param-value> 
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>springMVC</servlet-name>
          <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      
      <display-name>spring_demo1</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    (4).在src目录下新创建一个包:com.cdd,如下图

     

    (5).配置配置spring容器的文件applicationContext.xml

    开启组件扫描,配置其他要用到的bean,包括HandlerMapping、HandlerAdapter等bean,并且支持@RequestMaping、@ResponseBody等注解。

     

    (6).启动该项目

    我们把该项目放进tomcat中,启动如下,说明我们前面的都配置成功了。

     

    3.配置数据库

    (1).数据说明

    在这里我们用的数据库类型是mysql,数据库名称是:jsd15077db,用的用户表是user。如下图:

     

    (2).引入数据库相关jar包
    数据库连接驱动包:
    mysql-connector-java-5.1.39-bin.jar
    数据库连接池相关包:
    commons-pool-1.6.jar、commons-dbcp-1.4.jar、commons-dbcp-1.4.jar

    向lib/目录下引入上面提到的jar包,如下图:

     

    (3).在Spring容器配置文件applicationContext.xml配置数据库信息

    注册数据库连接bean和jdbcTemplate的bean,如下图:

     

    (4).编写个测试类来测下我们的数据库是否配置成功

    在com_cdd包下再建个包test。在com.cdd.test包下建个测试类TestDB,代码如下:

    package com.cdd.test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    public class TestDB {
        public static void main(String[] args){
            String conf = "applicationContext.xml";
            ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
            JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
            System.out.println(jdbcTemplate);
        }
    }

    运行该测试类,查看控制台输出结果:

     

    已经打印出了JdbcTemplate类对象,说明我们的数据部分配置成功了。

    4.业务分析
    这次我们想要实现用户的登录功能,首先得有个用户实体类。
    我们希望以一个统一的数据结构向前端返回请求结果,得需要一个返回结果类。
    在登录中我们往往不希望暴露用户的真实密码,我们需要对密码进行MD5加密,所以我们还需要一个MD5加密工具类。

    (1).实体类
    先看下这个用户表user的字段,如下:

     

     在com.cdd包下新建一个包entity,在com.cdd.entity包下新建一个User类,代码如下:

    package com.cdd.entity;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
        private Integer id;    //用户id
        private String userName;  //用户登录名称
        private String pwd;  //密码
        private String name;     //昵称
        private String gender;    //性别
        public Integer getId() {
            return id;
        }
        public void setId(Integer id) {
            this.id = id;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPwd() {
            return pwd;
        }
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        
        public String toString() {
            return "User [id=" + id + ", userName=" + userName + ", pwd=" + pwd + ", name=" + name + ", gender=" + gender
                    + ", getId()=" + getId() + ", getUserName()=" + getUserName() + ", getPwd()=" + getPwd()
                    + ", getName()=" + getName() + ", getGender()=" + getGender() + ", getClass()=" + getClass()
                    + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";
        }
        
    }
    (2).返回结果类

    在com.cdd.entity包下编写一个返回结果类,如下:

    package com.cdd.entity;
    
    public class DataResult {
        private int status;   //响应状态码
        private String msg;   //响应信息
        private Object data;  //响应数据
        public int getStatus() {
            return status;
        }
        public void setStatus(int status) {
            this.status = status;
        }
        public String getMsg() {
            return msg;
        }
        public void setMsg(String msg) {
            this.msg = msg;
        }
        public Object getData() {
            return data;
        }
        public void setData(Object data) {
            this.data = data;
        }
        
        public String toString() {
            return "DataResult [status=" + status + ", msg=" + msg + ", data=" + data + "]";
        }
    }
    (3).MD5加密类

    在com.cdd包下新建一个包util。接着在com.cdd.util包下新建一个FirstUtil类,代码如下:

    package com.cdd.util;
    
    import java.security.MessageDigest;
    import org.apache.tomcat.util.codec.binary.Base64;
    
    public class FirstUtil {
    
        public static String md5(String str) throws Exception{
            //获取MD5加密器(该加密器还有SHA加密)
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] input = str.getBytes();
            byte[] output = md.digest(input);
            
            //将md5处理的output字节数组基于Base64位编码转换为字符串
            String strMD5 = Base64.encodeBase64String(output);
            return strMD5;
        }
        
    //    //测试下MD5加密方法
    //    public static void main(String[] args) throws Exception{
    //        String res = FirstUtil.md5("1234");
    //        System.out.println(res);
    //    }
    }

    5.开始写控制层,业务层,持久层
    通常我们认为:控制层是controller层、业务层是service层、持久层是dao层。

    (1).dao层
    首先在com.cdd包下再新建个包dao。接下来我们在com.cdd.dao包下编写UserDao类,代码如下:
    注意:JdbcTemplate的queryForObject方法此第2个参数Class requiredType只能是基本数据类型的封装类,如Integer、String,Character等基本类型,并且只能查到一个值。

    package com.cdd.dao;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    @Repository  //标注数据库访问组件
    public class UserDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
        
        /**
         * 验证用户登录
         * @param name  用户登录名称
         * @param pwd   密码
         * @return
         */
        public Integer checkLogin(String name, String pwd){
            String sql = "select count(*) from user where username=? and pwd=?";
            Object[] args = {name,pwd};
            Integer isExist = jdbcTemplate.queryForObject(sql, Integer.class, args);
            return isExist;
        }
    }
    (2).service层

    在com.cdd包下新建service包,在com.cdd.service包下新建UserService接口,代码如下:

    package com.cdd.service;
    import com.cdd.entity.DataResult;
    public interface UserService {    
        /**
         * 登录
         * @param name  登录名称
         * @param pwd   密码
         * @return
         */
        public DataResult Login(String name, String pwd);
    }

    在com.cdd包下新建serviceImpl包,在com.cdd.serviceImpl包下新建UserServiceImpl类,代码如下:

    package com.cdd.serviceImpl;
    
    import java.security.NoSuchAlgorithmException;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.cdd.dao.UserDao;
    import com.cdd.entity.DataResult;
    import com.cdd.entity.User;
    import com.cdd.service.UserService;
    import com.cdd.util.FirstUtil;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserDao userDao;
        
        public DataResult Login(String name, String pwd) {
            DataResult dataResult = new DataResult();
            //给密码进行md5加密
            try {
                pwd = FirstUtil.md5(pwd);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            
            }
            Integer isExist = userDao.checkLogin(name, pwd);
            if(isExist==null || isExist==0){
                dataResult.setStatus(-1);
                dataResult.setMsg("用户名或密码错误");
            }else{
                dataResult.setStatus(0);
                dataResult.setMsg("登录成功");
            }
            return dataResult;
        }
    }

    (3)Controller层
    在写Controller层之前,我们为了给前端返回DataResutl结构的json数据,在这里需要引入jackson-annotations-2.9.5.jar、jackson-core-2.9.5.jar、jackson-databind-2.9.5.jar这三个包,如下图:

     

     在com.cdd包下新建controller包,在com.cdd.controller包下新建UserController类,代码如下:

    package com.cdd.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.cdd.entity.DataResult;
    import com.cdd.service.UserService;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
        
        @RequestMapping("/login.do")
        @ResponseBody
        public DataResult login(@RequestParam(name="name",required=true) String name, @RequestParam(name="pwd",required=true) String pwd){
            DataResult dataResult = userService.Login(name, pwd);
            return dataResult;
        }
    }
    (4).测试

    这里我们用登录名称:cdd,密码:1234,来做登录测试,在浏览器输入:
    http://localhost:8080/spring_demo1/user/login.do?name=cdd&pwd=1234
    按下回车,可以看到下图:

     

     到这里我们的服务器端,即,后台代码已经开发完成了。

    二,前端页面开发:编写登录页面

    1.引入js包

    在WebContent/目录下新建一个js文件夹,在该文件夹下引入juqery包jquery.min.js。如下图:

     

    2.在WebContent/目录下新建一个页面login.html

    如果登录成功,页面跳转到gitHub网站的登录页面,代码如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>登录页面</title>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
        $(function(){
            //给登录按钮绑定点击事件
            $("#login").click(function(){
                var name = $("#name").val().trim();  //获取用户名称
                var pwd = $("#pwd").val().trim();     //获取密码
                //发送ajax登录请求
                $.ajax({
                    url:"http://localhost:8080/spring_demo1/user/login.do",
                    type:"post",
                    data:{"name":name,"pwd":pwd},
                    dataType:"json",
                    success:function(result){
                        //如果登录成功
                        if(result.status==0){
                            window.location.href="https://github.com/login";
                        }
                        alert(result.msg);
                    },
                    error:function(){
                        alert("登录发生异常");
                    }
                });
            });
        });
    </script>
    </head>
    <body>
        用户名:<input type="text" name="name" id="name"><br>
        密码:<input type="password" name="pwd" id="pwd"><br>
        <input type="button" value="登录" id="login">
        <hr>
    </body>
    </html>

    4.测试

    接下来在浏览器地址栏输入:http://localhost:8080/spring_demo1/login.html
    然后输入用户名:cdd,密码:1234。如下图:

     

     点击登录,会弹出登录成功提示框,并且跳转到gitHub的登录页面,如下图:

     

    到这里我们的就全部开发完了,针对一个业务,只要写好接口文档,前端工程师写页面,后台工程师写服务器,各干各的,互不影响。

     转自:https://blog.csdn.net/weixin_41968788/article/details/83590848

  • 相关阅读:
    自定义navigationItem与button的几种状态
    NSLog自动识别运行环境是发布还是测试(release |debug),从而决定是否需要打印。
    今天学了一个简单的新技能Xcode6以后创建工程后没有.pch文件,所以来个技能
    APP内部调用短信 、电话、邮件
    ShareSDK
    表视图的基本概念
    高仿新浪微博APP
    高仿网易新闻APP
    UI常用基本控件 的使用
    属性的介绍--OC语言
  • 原文地址:https://www.cnblogs.com/vickylinj/p/14465072.html
Copyright © 2011-2022 走看看