IDEA+springMVC+mybatis构建maven的web项目

 

IDEA+springMVC+mybatis构建maven的web项目

应用maven构建SpringMVC整合Mybatis+MySQL8.0.15(流行框架)的web项目

目的:快速构建一个简洁纯净版的web应用工程,将其作为一个基础web-demo,便于复用

一、IDEA下构建maven的web项目

1、新建工程New-->Project,创建maven的web项目,选择maven-archetype-webapp,并配置Project SDK,本次选用的是本机已安装的jdk1.8,如下图所示:

IDEA+springMVC+mybatis构建maven的web项目_第1张图片

 

 

2、填写自己项目的GroupId,ArtifactId,如下图:

IDEA+springMVC+mybatis构建maven的web项目_第2张图片

3、设置maven的安装目录,代替IDEA自带的maven版本,我换成了自己手动安装的maven版本,路径存在D盘;

  设置maven本地的仓库,我配置了本项目单独的仓库,但没去复用之前项目所用的maven仓库,为的是让本工程的依赖jar包保持纯净

IDEA+springMVC+mybatis构建maven的web项目_第3张图片

4、设置工程的Project Name

IDEA+springMVC+mybatis构建maven的web项目_第4张图片

 5、Finish,maven的web项目就创建完成,接下来maven会下载相应的资源,下载时速度会很慢(maven加载jar包过程,默认的是先扫描本地仓库,若本地仓库没有,则扫描远程仓库下载。默认的conf/settings.xml文件没有配置远程仓库,所以扫描的是maven的中央仓库(资源镜像一般在国外),所以慢);如果大家想快一点,也可以参考网上配置maven使用国内镜像的教程。

二、搭建基于SpringMVC整合mybatis的web工程

   1、等待maven下载资源完成后,工程目录中会出现src的文件夹,src下默认会存在main目录,main下默认存在resources和webapp文件夹,

其中resources文件夹主要存放项目的配置或属性等文件,webapp则是web应用的根目录,会存放HTML,CSS,js,JSP或资源文件等。

注意:intellij idea刚装的时候,创建maven项目是默认没有resource文件夹

解决: 

1】点击File-->project structure...(快捷键:Ctrl+Alt+Shift+s) 

2】Modules-->Sources-->main右键-->New Folder, 输入resources

3】选择resources右键,点击Resources(选择文件资源类型),然后Apply,OK即可(添加test也一样)

我们需要在main目录下创建java文件夹,因为java是普通的文件夹,要设置为Source Root 解决步骤:右键点击Java—>Mark Directory as->sources Root

java目录下存放的将是Java程序的package及class文件等。

由于我们将搭建springMVC框架,我们可以提前搭建好项目的文件目录结构,如下图所示:

IDEA+springMVC+mybatis构建maven的web项目_第5张图片

 

 其中,java下创建项目的package  com.simple,其下可以再分类不同的package,包括common,controller,dao,dao-->mapper,dao-->xml,entity,service,service-->impl,util等,这些包是基于springmvc+mybatis所需的,还有可以存放一些公共类或工具类。

  webapp下可创建css,js,image,WEB-INF-->views等。

  src可创建main的同级目录test,可以用于后续项目开发过程中的Junit程序测试。

2、配置pom.xml文件,maven添加web项目必需的以及SpringMVC所必需的dependencies包。

2.1、以下是引入Junit,日志,MySQL驱动的依赖包,注意此次引入的是最新的mysql-connector-java-8.0.15,会影响后续的SpringMVC及jdbc等的特殊配置,这将和旧版本的mysql驱动包有区别。


        
            junit
            junit
            4.12
            test
        
        
        
            org.slf4j
            slf4j-log4j12
            1.8.0-alpha2
        
        
        
            mysql
            mysql-connector-java
            8.0.15
        

 

 

这样,已经支持了日志的输出,我们仍然需要日志的属性文件,在resources目录下,新增日志属性文件log4j.properties,并配置如下(配置方式很多种,大家选择一种即可):

#配置根Logger 后面是若干个Appender
log4j.rootLogger=DEBUG,A1,R
#生产环境时,可设置为INFO模式  log4j.rootLogger=INFO,A1,R
# ConsoleAppender 输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n
# File 输出 一天一个文件,输出路径可以定制,一般在根路径下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

2.2、引入SpringMVC所必需的依赖包,由于maven自动依赖功能,引入以下包时,会自动引入其他相关的依赖包,其中就包括spring-core,spring-context等重要的包(注意只要能够引入所有的Spring依赖包即可)。


        
            org.springframework
            spring-web
            4.3.8.RELEASE
        
        
            org.springframework
            spring-webmvc
            4.3.8.RELEASE
        
        
            org.springframework
            spring-context-support
            4.3.8.RELEASE
        
        
            org.springframework
            spring-oxm
            4.3.8.RELEASE
        
        
            org.springframework
            spring-tx
            4.3.8.RELEASE
        
        
            org.springframework
            spring-test
            4.3.8.RELEASE
        
        
            org.springframework
            spring-jdbc
            4.3.8.RELEASE
        
        
        
            org.aspectj
            aspectjweaver
            1.8.10
        
        
            org.aspectj
            aspectjrt
            1.8.10
        

2.3、以下是引入JSP的包,以支持jsp视图的功能。


        
            javax.servlet
            jstl
            1.2
        
        
            taglibs
            standard
            1.1.2
        
        
        
            javax.servlet
            servlet-api
            3.0-alpha-1
        
        
            javax.servlet.jsp
            jsp-api
            2.2.1-b03
        

2.4、以下是引入datasource数据源的包,引入了2种方式,但本次项目中,我们使用的是alibaba的Druid DataSource。


        
            com.mchange
            c3p0
            0.9.5.2
        
        
        
            com.alibaba
            druid
            1.0.29
        

需要配置jdbc属性文件,在resources下创建jdbc.properties文件

#JDBC Global Setting
#jdbc.driver=com.mysql.jdbc.Driver
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=58624

##DataSource Global Setting
#配置初始化大小、最小、最大
ds.initialSize=1
ds.minIdle=1
ds.maxActive=20

#配置获取连接等待超时的时间
ds.maxWait=60000

#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
ds.timeBetweenEvictionRunsMillis=60000

#配置一个连接在池中最小生存的时间,单位是毫秒
ds.minEvictableIdleTimeMillis=300000

其中,配置了mysql数据库的连接,用户名,密码等信息。由于使用了最新版本的mysql-connector-java-8.0.15驱动,这要求driver和url的特殊配置,否则项目启动时会报1个警告和2个异常。

问题1:警告信息Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

解决:jdbc.driver配置为com.mysql.cj.jdbc.Driver

 

问题2:web应用中连接mysql数据库时后台会出现这样的提示:

Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
原因是MySQL在高版本需要指明是否进行SSL连接。
解决:
在mysql连接字符串url中加入ssl=true或者false即可,即:jdbc.url里添加useSSL属性---配置为true;如下所示。
url=jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=true
 
问题3.出现The server time zone value ‘?й???????’ is unrecognized or represents more than one time zone的错误,
解决:需添加serverTimezone属性,即设置时区,设置为GMT%2B8即可解决,GMT%2B8即东八区。
 

 2.5、以下是引入一些其他可能需要的包,包括文件上传等。


        
            org.apache.commons
            commons-lang3
            3.5
        
        
            commons-fileupload
            commons-fileupload
            1.3.2
        

3、配置pom.xml文件,设置项目的编译属性,编译后的war包名称(即finalName),存放配置或属性文件到resources目录下。

 
        SimpleWebDemo
       
           
           
                ${basedir}/src/main/java
               
                    **/*.properties
                    **/*.xml
               

           

           
                ${basedir}/src/main/resources
           

       

   
 经过以上的pom.xml的配置,项目及springmvc所需的依赖包就已经基本引入了
通过IDEA右侧栏中的maven projects的reimport按钮实现依赖包的引入下载(并且,其中常用的是clean,package,install等,clean可以清除生成的target目录,install可以重新生成target目录)
若pom.xml中引入/修改了新的依赖包/插件或者Dependencies存在红色提示,需要重新reimport以下。

IDEA+springMVC+mybatis构建maven的web项目_第6张图片

4、配置项目的web.xml文件,包括首页,异常跳转,会话超时,字符编码过滤器CharacterEncodingFilter,监听器ContextLoaderListener,前置控制器DispatcherServlet,静态文件单独处理等等。代码及解释如下:



         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

  Archetype Created Web Application
  
  
    index.jsp
  
  
  
    404
    /WEB-INF/NoPage.html
  
  
  
    java.lang.NullPointerException
    /WEB-INF/error.html
  
  
  
    360
  

  
  
    characterEncodingFilter
    class>org.springframework.web.filter.CharacterEncodingFilterclass>
    
      encoding
      UTF-8
    
    
      forceEncoding
      true
    
  
  
    characterEncodingFilter
    /*
  

  
  
  
    org.springframework.web.context.ContextLoaderListener
  
  
  
    contextConfigLocation
    classpath:applicationContext.xml
  

  
  
  
  
    default
    *.css
  
  
    default
    *.swf
  
  
    default
    *.gif
  
  
    default
    *.jpg
  
  
    default
    *.png
  
  
    default
    *.js
  
  
    default
    *.html
  
  
    default
    *.xml
  
  
    default
    *.json
  
  
    default
    *.map
  

  
  
  
  
    
    springMVC
    org.springframework.web.servlet.DispatcherServlet
    
      
      contextConfigLocation
      
      
      
      
      
      classpath:spring-mvc.xml
    
    
    1
    true
  
  
    
    
    springMVC
    
    
    
    /
  

5、由web.xml的配置中看出,我们还需要配置applicationContext.xml和spring-mvc.xml,

我们在spring-mvc.xml中配置springmvc的相关配置,如下:


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">

















































application/json;charset=UTF-8



其中:

  注解配置:

  注解驱动:

  自动扫描controller类,自动扫描service类:context:component-scan;

  静态资源映射(我们springmvc配置的是拦截“/”,例如:/user/getUserInfo,REST风格,但会导致静态文件(jpg,js,css等)被拦截后不能正常显示):mvc:resources;

  模型视图名称的解析(默认路径及后缀):InternalResourceViewResolver;

  支持返回json格式(前后端分离场景下,返回数据格式):AnnotationMethodHandlerAdapter,MappingJackson2HttpMessageConverter。

通常在前后端分离项目中,后台要向前端返回json格式的相应数据,以上已经在spring-mvc.xml中配置了json格式转换的处理,我们仍需要引入json支持的依赖包,

在pom.xml文件中添加以下:


        
            org.codehaus.jackson
            jackson-core-asl
            1.9.13
        
        
            org.codehaus.jackson
            jackson-mapper-asl
            1.9.13
        
        
        
            com.fasterxml.jackson.core
            jackson-core
            2.9.0.pr3
        
        
            com.fasterxml.jackson.core
            jackson-databind
            2.9.0.pr3
        
        
            com.fasterxml.jackson.core
            jackson-annotations
            2.9.0.pr3
        
        
        
            com.google.code.gson
            gson
            2.8.0
        

注意到,json依赖包存在旧包和新包,由于本项目使用的spring4.3.8,所以mappingJacksonHttpMessageConverter使用的是MappingJackson2HttpMessageConverter,代替了MappingJacksonHttpMessageConverter,否则项目启动时会报错;

而使用MappingJackson2HttpMessageConverter时,我们就需要引入新的json依赖包了,如以上程序注释所示(jackson-core,jackson-databind,jackson-annotations)。我们还添加了google的json格式依赖包Gson,Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化,后续的json数据返回程序示例中会再次提及。

6、配置applicationContext.xml文件,在这里我们配置数据源以及与mybatis的整合配置,内容如下所示:


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">








classpath*:jdbc.properties

















































































p:dataSource-ref="dataSource"/>




在这里,我们引入了之前配置的jdbc.properties属性文件来配置我们的DataSource;配置了对dataSource 数据源进行事务管理;使用annotation注解方式配置事务,启用对事务注解的支持;

  注意在这里我们添加了对mybatis的设置,实现springmvc与mybatis的整合,配置可扫描所有mapper.xml和mapper dao文件以及对事务的管理。

  Springmvc整合mybatis,需要引入mybatis包,在pom.xml中添加以下依赖包:


        
            org.mybatis
            mybatis
            3.4.4
        
        
        
            org.mybatis
            mybatis-spring
            1.3.1
        

我们如果想使用mybatis逆向工程插件生成mybatis的mapper,entity等代码,则需要在之前的标签下添加mybatis-generator插件:

 
       
           
           
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.5
               
                    true
                    true
               

           

       

   

添加后,我们reimport下,会在maven project下新增出相应的插件,我们之后会使用到mybatis-generator:generate自动生成实体类,mapper文件,如下图:

IDEA+springMVC+mybatis构建maven的web项目_第7张图片

7、在applicationContext.xml的配置中看出,我们仍需要配置mybatis.xml的文件,进行mybatis相关的配置,如下所示:


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

    
    
        
        
        
        
        
        
        
        
        
        
        
        

        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

OK,该web-demo项目的环境搭建就基本完成了。

三、web实例

  webdemo环境搭建完成后,我们进行程序的实例,实现springmvc+mybatis的逻辑层级,数据库的访问及视图展示等。

  示例数据准备:在数据库中创建表user,并插入一条数据:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
 `password` varchar(50) NOT NULL COMMENT '密码',

  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

1、通过mybatis-generator插件,生成User表相应的实体类,mapper文件,

我们首先需要在resources下创建一个generatorConfig.xml文件,内容如下(注意xml中&特殊字符的转义,使用&表示):


DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">


    
    
    
        
            
            
        
        
        
                        connectionURL="jdbc:mysql://localhost:3306/user?characterEncoding=UTF-8&useSSL=true&serverTimezone=GMT%2B8"
                        userId="root"
                        password="58624">
        
        
        
            
        
        
        
                            targetProject="src\main\java">
            
            
            
            
        
        
        
                         targetProject="src\main\java">
            
            
        

        
        
                             targetPackage="com.simple.dao.mapper"
                             targetProject="src\main\java">
            
            
        

        
        

我们需要设置相应的mysql驱动包的路径,本demo中使用的是mysql-connector-java-8.0.15.jar;设置数据库连接信息;指定mybatis-generator生成的实体类、mapper映射文件、mapper接口文件的包路径;并指定需要生成的数据库表,本示例演示的是user表。我们通过执行maven projects的mybatis-generator:generate来生成相应的程序,如下图所示:IDEA+springMVC+mybatis构建maven的web项目_第8张图片

IDEA+springMVC+mybatis构建maven的web项目_第9张图片

执行完毕,会生成相应的实体类及dao文件,如下目录结构所示:

IDEA+springMVC+mybatis构建maven的web项目_第10张图片

 

2、在controller包下,编写UserController.java类,代码如下:

package com.simple.controller;

import com.simple.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Controller
@RequestMapping(value = "/user")
public class UserController extends GenericController {
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private UserService userService;

    //返回jsp视图展示
    @RequestMapping(value = "/getUserModel",method = RequestMethod.GET)
    public ModelAndView getUsers1(@RequestParam Integer userId) {
        ModelAndView modelAndView = new ModelAndView();
        //调用service方法得到用户列表
        List users = userService.getUsers(userId);
        //将得到的用户列表内容添加到ModelAndView中
        modelAndView.addObject("users",users);
        //设置响应的jsp视图
        modelAndView.setViewName("getUsers");
        logger.info("===============================成功查询用户列表!");
        return modelAndView;
    }
    //返回json格式数据,形式1
    @RequestMapping(value = "/getUserJson1",method = RequestMethod.GET)
    @ResponseBody
    public List getUsers2(@RequestParam Integer userId, HttpServletRequest request, HttpServletResponse response) {
        //调用service方法得到用户列表
        List users = userService.getUsers(userId);
        logger.info("===============================成功查询用户列表!");
        return users;
    }
    //返回json格式数据,形式2(自定义了返回的格式)
    @RequestMapping(value = "/getUserJson2",method = RequestMethod.GET)
    public void getUsers3(@RequestParam Integer userId, HttpServletRequest request, HttpServletResponse response) {
        //调用service方法得到用户列表
        List users = userService.getUsers(userId);
        logger.info("===============================成功查询用户列表!");
        renderSuccessString(response, users);
    }

    private void renderSuccessString(HttpServletResponse response, List users) {
    }
}

 其中,@controller注解标注本类为controller类;

  @RequestMapping注解实现web REST风格请求的映射;

  @Autowired用来绑定service实现类;

  方法getUsers1实现了JSP视图的解析和展示,由于在spring-mvc.xml中已经设置了jsp视图解析的配置,这里modelAndView.setViewName("getUsers")就直接响应的jsp视图为/WEB-INF/views下的getUsers.jsp文件(详见github项目代码)。

  由于在spring-mvc.xml中已经配置了支持json数据的处理,这里我们可直接使用@ResponseBody注解就可实现json格式数据的返回,如方法getUsers2所示。

  方法getUsers3则使用的Gson的json格式支持,我们在程序中,通过common包下的GenericController类的renderSuccessString等方法结合Result自定义类自定义了返回数据的json内容。

    以上3种方法的效果会在后续介绍中展示。

  3、在dao-->mapper包下,编写UserMapper.java,@Repository注解标注本类为mapper dao类,本次示例我们直接使用selectByExample方法。

package com.simple.dao.mapper;

import com.simple.entity.User;
import com.simple.entity.UserExample;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface UserMapper {
    long countByExample(UserExample example);

    int deleteByExample(UserExample example);

    int deleteByPrimaryKey(Integer id);

    int insert(User record);

    int insertSelective(User record);

    List selectByExample(UserExample example);

    User selectByPrimaryKey(Integer id);

    int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);

    int updateByExample(@Param("record") User record, @Param("example") UserExample example);

    int updateByPrimaryKeySelective(User record);

    int updateByPrimaryKey(User record);
}

dao文件对应的mapper映射文件UserMapper.xml,使用的是mybatis-generator默认生成的,此处不再描述。

  4、在service包下编写UserService.java类,并在service-impl包下编写UserServiceImpl.java实现此类的方法,如下:

  UserService.java

package com.simple.service;

import java.util.List;

public interface UserService {

    List getUsers(Integer userId);
}

UserServiceImpl.java(使用@Service注解,标注为service实现类,并@Autowired绑定相应的UserMapper)

package com.simple.service.impl;
import com.simple.entity.User;
import com.simple.dao.mapper.UserMapper;
import com.simple.entity.UserExample;
import com.simple.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    public List getUsers(Integer userId) {
        UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        if (!"".equals(userId == null ? "" : userId)) {
            criteria.andIdEqualTo(userId);
        }
        return userMapper.selectByExample(example);

    }
}

至此,我们的程序示例编写完成

 大多数代码的参考文http://www.cnblogs.com/helloyy/p/6826101.html

  参考文的github源代码链接

你可能感兴趣的:(IDEA+springMVC+mybatis构建maven的web项目)