资讯专栏INFORMATION COLUMN

轰轰烈烈的搭建Spring + Spring MVC + Mybatis

Fourierr / 2661人阅读

摘要:配置和编码格式使用提供过滤器处理字符编码。请求从不改变资源的状态,无副作用。中添加,采用默认配置已经足够面对大多数场景注入参考链接手把手教你整合最优雅框架我的编码习惯接口定义设计最佳实践

创建项目

打开IDEA -> Create New Project
勾选Create from archetype

选择使用的maven的本地位置,这个根据实际情况选择就好

这一步会填写项目名称,根据实际来就好了。

一个空的项目就已经完成了。

搭建项目基础目录

创建java文件夹

设置java文件夹为Sources Root,只有在Rources RootxiaIRDEA才提供创建Java文件的选项

创建Package

配置Tomcat Service

选择Deployment

选择带exploded的

然后OK,添加刚才的tomcat到配置里面

运行tomcat

运行成功

以上完成基础的搭建,下面会引入框架

配置Spring pom.xml 添加Spring

         
     ...
     
    
        5.0.4.RELEASE
    
    
    
    
        ...
        
        
        
            org.springframework
            spring-core
            ${spring.version}
        
        
            org.springframework
            spring-beans
            ${spring.version}
        
        
            org.springframework
            spring-context
            ${spring.version}
        
        
        
            org.springframework
            spring-jdbc
            ${spring.version}
        
        
            org.springframework
            spring-tx
            ${spring.version}
        
        
        
            org.springframework
            spring-web
            ${spring.version}
        
        
            org.springframework
            spring-webmvc
            ${spring.version}
        
        
            org.springframework
            spring-test
            ${spring.version}
        
        
        ...
        
    

    ...

创建resources目录下的配置文件

spring-mvc.xml



    
    
    
    

    
    

    
    

    
    

如上配置,加入了一个InternalResourceViewResolver(视图解析器),这个视图解析器根据Controller的方法返回字符串或者ModelAndView,找到对应的视图(页面),可以再视图中加入EL表达式等代码绑定数据。
InternalResourceViewResolver中包含两个参数prefix和suffix,他们分别是视图解析器的前缀和后缀,比如,上面配置了prefix的值为‘/WEB-INF/jsp/’,那么当Controller返回字符串‘index’时,视图解析器回找到‘/WEB-INF/jsp/index’;如果再加上suffix属性,值为‘.jsp’,那么视图解析器就会去找‘/WEB-INF/jsp/index.jsp’。

web.xml 配置Spring MVC和编码格式


    Archetype Created Web Application

    
    
        characterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
        
            forceEncoding
            true
        
    
    
        characterEncodingFilter
        /*
    

    
    
        SpringMVC
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:conf/spring-*.xml
        
        1
    
    
        SpringMVC
        /
    

如上面代码所示,这样配置的目的是把请求交给Spring框架的DispatcherServlet处理,由它找到请求路径所对应的Controller,把请求交由这个Controller处理。

pom.xml 添加servlet web

         
    ...
         
    
    
        ...
        
        
        
            jstl
            jstl
            1.2
        
        
            taglibs
            standard
            1.1.2
        
        
            javax.servlet
            javax.servlet-api
            3.1.0
        
        
        ...
        
    
    
    ...
    

创建UserController.java和userIndex.jsp文件

创建UserController.java

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/index")
    public ModelAndView index(ModelAndView modelAndView){
        modelAndView.setViewName("/user/userIndex");
        return modelAndView;
    }
}

创建userIndex.jsp

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



    User Index


User Index

此时,运行系统,可通过Spring注解进入jsp页面,如:/user/index

Spring & Mybatis 创建mapper层

pom.xml 引入 mybatis 和 jdbc


         
     ...
     
     
     
        ...
     
        
        
            mysql
            mysql-connector-java
            5.1.37
            runtime
        
        
        
            org.mybatis
            mybatis
            3.4.5
        
        
            org.mybatis
            mybatis-spring
            1.3.1
        
    
        ...
        
    
    
    ...

创建数据库mybatis

create database mybatis;

创建表user

CREATE TABLE user(
    id INT PRIMARY KEY auto_increment,
    username VARCHAR ( 20 ),
    password VARCHAR ( 20 ),
    sex VARCHAR ( 10 ),
    address VARCHAR ( 20 ) 
);

在 resources 目录下创建 jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3307/mybatis?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
在 resources 目录下创建 conf/spring-mybatis.xml



    
    

    
    

    
    

    
    

    
    

在 resources 目录下创建 conf/mybatis-config.xml



    
    
        
        

        
        

        
        
    

创建UserMapper

public interface UserMapper {

    /**
     * 查询一个用户
     *
     * @param  id 用户id
     * @return User
     */
    public User getUser(Integer id) throws Exception;

    /*
     * 新增用戶
     * @param user
     * @return
     * @throws Exception
     */
    public int insertUser(User user) throws Exception;

    /*
     * 修改用戶
     * @param user
     * @param id
     * @return
     * @throws Exception
     */
    public int updateUser(User user) throws Exception;

    /*
     * 刪除用戶
     * @param id
     * @return
     * @throws Exception
     */
    public int deleteUser(Integer id) throws Exception;

    /*
     * 查询所有的用户信息
     * @return
     * @throws Exception
     */
    public List getUsers() throws Exception;
}

创建UserMapper.xml




    
    
        
        
        
        
        
    

    
    
    
    
    
        insert into user (username,password,sex,address) values
        (#{username},#{password},#{sex},#{address})
    

    
        update user set
        address=#{address} where
        id=#{id}
    

    
        delete from user where
        id=#{id}
    

    

    
    

    

创建Service层

User

public class User {

    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;

    // getter and setter
    
}

UserService.java

public interface UserService {

    /**
     * 查询一个用户
     *
     * @param  id 用户id
     * @return User
     */
    public User getUser(Integer id) throws Exception;

    /*
     * 新增用戶
     * @param user
     * @return
     * @throws Exception
     */
    public int insertUser(User user) throws Exception;

    /*
     * 修改用戶
     * @param user
     * @param id
     * @return
     * @throws Exception
     */
    public int updateUser(User user) throws Exception;

    /*
     * 刪除用戶
     * @param id
     * @return
     * @throws Exception
     */
    public int deleteUser(Integer id) throws Exception;

    /*
     * 查询所有的用户信息
     * @return
     * @throws Exception
     */
    public List getUsers() throws Exception;
}

UserServiceImpl.java

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    /**
     * 查询一个用户
     *
     * @param  id 用户id
     * @return User
     */
    public User getUser(Integer id)  throws Exception {
        return userMapper.getUser(id);
    }

    /*
     * 新增用戶
     * @param user
     * @return
     * @throws Exception
     */
    public int insertUser(User user) throws Exception {
        return userMapper.insertUser(user);
    }

    /*
     * 修改用戶
     * @param user
     * @param id
     * @return
     * @throws Exception
     */
    public int updateUser(User user) throws Exception {
        return userMapper.updateUser(user);
    }

    /*
     * 刪除用戶
     * @param id
     * @return
     * @throws Exception
     */
    public int deleteUser(Integer id) throws Exception {
        return userMapper.deleteUser(id);
    }

    /*
     * 查询所有的用户信息
     * @return
     * @throws Exception
     */
    public List getUsers() throws Exception {
        return userMapper.getUsers();
    }
}
spring-service.xml



    
    
修改web.xml
classpath:spring/spring-mvc.xml
# 改成 -->
classpath:spring/spring-*.xml
Controller层

创建相应文件

编写返回的Bean,统一返回格式,ResultBean
public class ResultBean implements Serializable {

    /**
     * 错误代码
     */
    private static final int SUCCESS = 0; // 成功
    private static final int CHECK_FAIL = 1; // 失败
    private static final int UNKNOWN_EXCEPTION  = -99; // 抛出异常
    /**
     * 接口返回状态码,0表示成功,其他的看对应定义
     *
     * 推荐:
     * 0  : 表示成功
     * >0 :  表示已知的异常(需要在调用的地方多带带处理)
     * <0 :  表示未知的异常(不需要多带带处理,调用方统一处理)
     */
    private int code = SUCCESS; // 返回状态

    /**
     * 返回信息(出错的时候使用)
     */
    private String msg = "success";

    /**
     * 返回的数据
     */
    private T data;

    /**
     * 请求正确(新增、修改、删除信息),返回调用
     */
    public ResultBean() {
        super();
    }

    /**
     * 请求数据正确,返回调用
     * @param data 返回数据
     */
    public ResultBean(T data) {
        super();
        this.data = data;
    }

    /**
     * 请求出错,返回调用
     * @param msg 错误提醒语句
     */
    public ResultBean(String msg) {
        this.code = CHECK_FAIL;
        this.msg = msg;
    }

    /**
     * 请求异常,返回调用
     * @param e 异常
     */
    public ResultBean(Throwable e) {
        super();
        this.msg = e.toString();
        this.code = UNKNOWN_EXCEPTION;
    }
    
    /**
     * getter and setter
     * 
     * 因为属性是private的,所以属性必须有getter才能在被获取
     */

}
接口采用RESTful API

使用四种HTTP方法POST,GET,PUT,DELETE可以提供CRUD功能(创建,获取,更新,删除)。

获取:使用GET方法获取资源。GET请求从不改变资源的状态,无副作用。GET方法是幂等的。GET方法具有只读的含义。因此,你可以完美的使用缓存

创建:使用POST创建新的资源。对同一URL进行多次请求会生成多份资源,所以POST不是幂等的

更新:使用PUT创建或更新现有资源。对同一URL多次PUT都是相同的,所以PUT方法是幂等的

删除:使用DELETE删除现有资源,有副作用,但DELETE方法是幂等的

幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同
--- POST - 创建 GET - 获取 PUT - 更新 DELETE - 删除
/users 创建一个用户 获取用户列表 批量更新用户信息 批量删除用户信息
/users/{id} --- 获取单个用户信息 更新单个用户信息 删除单个用户信息

完成UserController的编码

/**
 * 用户信息管理
 */
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    /*
     * 获取用户列表
     *
     * @return
     * @throws Exception
     */
    @ResponseBody
    @GetMapping("/users")
    public ResultBean> getUsers() throws Exception {

        List users = userService.getUsers();

        return new ResultBean>(users);
    }

    /*
     * 新增用户信息
     *
     * @return
     * @throws Exception
     */
    @ResponseBody
    @PostMapping("/users")
    public ResultBean insertUser(@RequestBody User user) throws Exception {

        int result = userService.insertUser(user);

        if (result > 0) {
            return new ResultBean();
        } else {
            return new ResultBean("新增失败");
        }
    }

    /*
     * 获取用户信息
     *
     * @param id 用户id
     * @return
     * @throws Exception
     */
    @ResponseBody
    @GetMapping("/users/{id}")
    public ResultBean getUser(@PathVariable Integer id) throws Exception {

        User user = userService.getUser(id);

        return new ResultBean(user);
    }

    /*
     * 修改用户信息
     *
     * @return
     * @throws Exception
     */
    @ResponseBody
    @PutMapping("/users/{id}")
    public ResultBean updateUser(@PathVariable Integer id, @RequestBody User user) throws Exception {

        user.setId(id);
        int result = userService.updateUser(user);

        if (result > 0) {
            return new ResultBean();
        } else {
            return new ResultBean("修改失败");
        }

    }

    /*
     * 删除用户信息
     *
     * @param id 用户id
     * @return
     * @throws Exception
     */
    @ResponseBody
    @DeleteMapping("/users/{id}")
    public ResultBean deleteUser(@PathVariable Integer id) throws Exception {

        int result = userService.deleteUser(id);

        if (result > 0) {
            return new ResultBean();
        } else {
            return new ResultBean("删除失败");
        }
    }
}
使用@RequestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等,本例子目标是处理application/json

使用@PathVariable Integer id映射@RequestMapping("/users/{id}") / @GetMapping("/users/{id}") / @DeleteMapping("/users/{id}")等请求中的{id}

引入fastjson
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

         
    ...
         
    
    
        ...
        
        
            com.alibaba
            fastjson
            1.2.47
        
        
        ...
        
    
    
    ...
    

/conf/spring-mvc.xml中添加FastJson,FastJson采用默认配置已经足够面对大多数场景




    ...

    
    
        
            
        
    

    ...

参考链接
手把手教你整合最优雅SSM框架
我的编码习惯-接口定义
RESTful API 设计最佳实践

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68874.html

相关文章

  • 写这么多系列博客,怪不得找不到女朋友

    摘要:前提好几周没更新博客了,对不断支持我博客的童鞋们说声抱歉了。熟悉我的人都知道我写博客的时间比较早,而且坚持的时间也比较久,一直到现在也是一直保持着更新状态。 showImg(https://segmentfault.com/img/remote/1460000014076586?w=1920&h=1080); 前提 好几周没更新博客了,对不断支持我博客的童鞋们说声:抱歉了!。自己这段时...

    JerryWangSAP 评论0 收藏0
  • 【Java】基于Maven搭建Spring+SpringMVC+Mybatis框架

    摘要:关于的配置,可以参考这篇文章的第一个小节配置模板引擎搭什么搭直接用脚手架不行吗下载就能用下载就能用下载就能用码云咳咳,开个玩笑,如果本着学习态度的话,那就慢慢啃吧搭建空的项目使用搭建基本的空项目填写和,,选择项目的地址,在新的窗口打开最 关于springMVC的配置,可以参考这篇文章的第一个小节:【java】intellij idea SpringMVC 配置FreeMarker模板引...

    edagarli 评论0 收藏0
  • 70 个 Spring 最常见面试题,Java 晋升必会

    摘要:容器自动完成装载,默认的方式是这部分重点在常用模块的使用以及的底层实现原理。 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了主要考察的内容。 这里说「天方夜谭」并不是说算法没用,不切实际,而是想说算法平时其实很少用到,甚至面试官都对自己出的算法题一知半解。 这里总结打磨了 70 道...

    Ashin 评论0 收藏0
  • SSM框架网站后台搭建(一)

    摘要:传统的代码中,在类中调用其他对象,都是自己出来一个对象,然后调用,这样代码的耦合度就比较高。日志对象和主程序的耦合度降到最低,即使更改日志对象的操作,主程序不受影响。 SSM框架网站后台搭建(一) 1.所用技术简单介绍 1.SSM中的S:Spring Spring在百度词条上的解释是: Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向...

    ZweiZhao 评论0 收藏0
  • springmvc简介和快速搭建

    摘要:简介和众多其他框架一样,它基于的设计理念,此外,它采用可松散耦合可插拔组件结构,比其他框架更具扩展性和灵活性。框架围绕核心展开,是框架的总导演,总策划,它负责截获请求并将其分派给相应的处理器处理。 springmvc简介 springmvc和众多其他web框架一样,它基于MVC的设计理念,此外,它采用可松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性。 springmvc通过...

    Sike 评论0 收藏0

发表评论

0条评论

Fourierr

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<