1. 程式人生 > >interlij idea給Web專案新增SSM(零配置檔案

interlij idea給Web專案新增SSM(零配置檔案

0、前言

    這裡說的零配置檔案是Spring上的零配置檔案,Mybatis不想去折騰了,雖然也可以零配置檔案,其實我覺得,如果真的零配置檔案就有點倒退了,畢竟出現xml,是因為修改xml可以不改變程式,就改變程式行為的目的,而全用類來配置,每次都要修改然後編譯,各有好處,不是新的一定好,也不是因循守舊,找到合適自己的才是最重要的,同時掌握它的程式設計技巧,自己能看到其他人程式碼即可,畢竟只是編碼,花太多精力不太好。

Mybatis的零配置可以看這個:mybatis-Java API
Spring的零配置的話,我是看書的,而且我去Spring官網好像也找不到SpringMVC的專欄。現在Spring的最新版4.0(包括Spring MVC),Spring 5.0也快出來了。

這裡說下將xml轉換成class的技巧。先將以下知識:

  • 1、WebApplicationInitializer是Spring提供用來配置Servlet3.0+配置的介面,從而實現了替代web.xml的位置。實現此介面將會自動被SpringServletContainerInitializer(用來啟動Servlet3.0容器)獲取到
  • 2、Spring配置檔案同樣是一個普通的Class,通過程式碼註冊到WebApplicationInitializeronStartup中即可,同時繼承WebMvcConfigurerAdapter,重寫其方法可對Spring MVC進行配置(前提是類上有@EnableWebMvc
    ),不繼承就沒Spring MVC的功能咯

說到這裡兩個重要的檔案(web.xml、spring配置檔案)都可以用類來表示了。

我們瞭解一下bean節點的結構,無非就是id(例項名)、class(類名)、property(成員變數)。我們舉個例子:

<bean id="a" class"xxx.xxx.B">
    <property name="c" value="d"/>
    <property name="e">
        <value>f</value>
    </property>
</bean>
import xxx.xxx;
@Bean
public
B getB(){ B b = new B(); b.setC("d"); b.setE("f"); return B; }

只要在Spring配置檔案的類中做這種轉換,將bean標籤,變為@Bean註解的方法即可。

註解是Spring的一個構建的一個重要手段,減少寫配置檔案,下面解釋一下一些要用到的註解:

  • @Configuration 作用於類上面,聲明當前類是一個配置類(相當於一個Spring的xml檔案)
  • @ComponentScan(“xxx”) 作用於類上面,自動掃描xxx包名下所有使用@Service、@Component、@Repository和@Controller的類,並註冊為Bean
  • @Bean 作用與類和方法上,相當於Spring配置檔案bean節點
  • @EnableWebMvc 作用於類,開啟一些預設配置,如一些ViewResolver或者MessageConverter
  • @RequestMapping 作用於類、方法,配置URL和方法之間的對映
  • @RequestBody 作用於引數前,允許request的引數在request體中,而不是在直接連結在地址後面
  • @ResponseBody 作用於返回值、方法上,支援將返回值放在response體中,而不是返回一個頁面。
  • @RequestParam 作用於引數前,將form的對應name值對映到當前引數中

1、系統環境

IDE:InterliJ IDEA 2017.1.5
jdk版本:1.8
Maven版本:3.5
Spring版本:4.3.9.RELEASE
Spring MVC版本:4.3.9.RELEASE
Mybatis版本:3.X
資料庫:MySQL 5.7 包含user表的sql指令碼

2、spring環境搭建(包含Spring MVC)

2.1、新增Maven依賴

在pom.xml根節點project下新增如下節點:

    <properties>
        <spring-framework.version>4.3.9.RELEASE</spring-framework.version>
        <logback.version>1.2.3</logback.version>
    </properties>

這是下面依賴要用到的一些全域性屬性
在dependencies節點下,新增如下依賴:

    <!-- ********************** Java Servlet API 4.0.0-b01 ********************** -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.0-b01</version>
    </dependency>

    <!-- ********************** 新增jstl(JSP Standard Tag Library)支援 ********************** -->
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>apache-jstl</artifactId>
        <version>9.4.6.v20170531</version>
    </dependency>

    <!-- ********************** Spring 4.2.4.RELEASE ********************** -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring-framework.version}</version>
    </dependency>

        <!-- ********************** Spring MVC ********************** -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>

        <!-- ********************** Spring and Transactions ********************** -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring-framework.version}</version>
        </dependency>

        <!-- ********************** spring單元測試依賴 ********************** -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring-framework.version}</version>
            <scope>test</scope>
        </dependency>

若Maven依賴下載特別慢,請自行新增國內Maven映象。

2.2、匯入靜態資源

在WEB-INF中,直接貼上boostrap的標準資源,並新建一個views資料夾,將index.jsp拉進去,將自己寫的Login.jsp(這個頁面要的話去碼雲找吧)複製進去,效果如下(順便刪了web.xml):


這裡寫圖片描述

2.3、建立SpringConfig類(Spring配置檔案)

首先新建資料夾space.xxhui.config,新建類SpringConfig類,繼承WebMvcConfigurerAdapter,並配置一些必要的方法

@Configuration
@EnableWebMvc//若無此註解,WebMvcConfigurerAdapter無效
@ComponentScan("space.xxhui")
public class SpringConfig extends WebMvcConfigurerAdapter {//繼承WebMvcConfigurerAdapter,重寫其方法可對Spring MVC進行配置'
    //新增一個ViewResolver解析view
    @Bean
    public InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setViewClass(JstlView.class);
        return viewResolver;
    }
    //註冊靜態資源,沒註冊的話,網站是訪問不了的
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/js/");
        registry.addResourceHandler("/fonts/**").addResourceLocations("/WEB-INF/fonts/");
    }
    //根目錄的時候直接跳轉到登入介面
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("Login");
    }
}

看一下對比圖:


這裡寫圖片描述

2.4、建立WebInitializer類(web.xml)

在congfig下建立WebInitializer類,實現WebApplicationInitializer介面,實現方法,方法內容如下:

        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        ctx.setServletContext(servletContext);
        ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatcher",new DispatcherServlet(ctx));
        dynamic.addMapping("/");
        dynamic.setLoadOnStartup(1);

配置檔案和類版本對比:


這裡寫圖片描述

在上寫文中註冊Spring配置檔案,新增DispatcherServlet到上下文中。

2.5新增LoginController

新建資料夾controller


這裡寫圖片描述

在controller資料夾,新建一個LoginController類,在類上,新增@Controller註解,詳細程式碼如下:
package space.xxhui.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class LoginController {

    @RequestMapping("/login")
    public String login(@RequestParam("username") String username, @RequestParam("pwd") String pwd) {
        String forword = null;
        if (username.equals("Hitvz") && pwd.equals("123456")) {
            forword = "index";//登入成功跳轉到index.jsp
        } else {
            System.out.println("no such user");
            forword = "Login";//登入失敗跳轉到Login.jsp繼續登入操作
        }
        return forword;
    }

}

根目錄的跳轉在SpringConfig.java中已經新增相應ViewController。
新增tomcat,執行


這裡寫圖片描述

正常執行和跳轉。

3、Spring整合MyBatis

追加如下依賴:

        <!-- ********************** Mysql JDBC驅動 ********************** -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <!-- ********************** Mybatis依賴 ********************** -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.4</version>
        </dependency>

        <!-- ********************** Mybatis-Spring外掛********************** -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- ********************** Druid資料庫連線池 ********************** -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.31</version>
        </dependency>
        <!-- ********************** junit單元測試依賴 ********************** -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

3.1新增對映檔案

在space.xxhui下,新建資料夾DAO、POJO,resource資料夾下,新建資料夾mapper
效果如下:


這裡寫圖片描述

在POJO資料夾下,新建一個User實體類:
package space.xxhui.POJO;

import java.util.Date;

public class User {

    private int id;
    private String name;
    private Date birth;
    private Integer sex;
    private Integer age;
    private String phone;
    private String email;
    private String pwd;
// 省略各屬性getter和setter方法、toString方法
}

生成DAO和mapper的xml檔案:(這個外掛新增,可以去 interlij idea建立給Web專案新增Mybatis瞭解
alt+insert快捷鍵,選最後一個


這裡寫圖片描述




圖片忘了標出,去掉下面第一個和第四個的複選框,自己注意去掉,這裡沒有所以我沒生成。
在UserDAO.xml的mapper節點下,新增如下:
    <select id="getUserById" resultType="space.xxhui.POJO.User">
        SELECT * FROM USER WHERE id = #{id};
    </select>

在UserDAO.Java新增如下:

    //使用xml配置檔案
    User getUserById(int id);
    //不使用配置檔案使用註解
    @Select("Select * from user where id = #{id}")
    User getUserByIdForAnnotation(int id);
    @Select("Select * from user where name = #{user.name} and pwd = #{user.pwd}")
    User checkUser(@Param("user") User user);





3.2、新增配置檔案


這裡寫圖片描述

刪去environments節點。
要這個檔案的主要目的是要一個settings節點
    <settings>
        <!--當返回行的所有列都是空時,MyBatis預設返回null-->
        <setting name="returnInstanceForEmptyRow" value="true"/>
    </settings>

當然不用這個設定功能,可以完全不建這個xml。

在config資料夾下,新建SpringBean類

@Configuration
@EnableWebMvc//若無此註解,WebMvcConfigurerAdapter無效
@ComponentScan("space.xxhui")
public class SpringBean {

    @Bean
    public DriverManagerDataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/networkalbum?useSSL=false&serverTimezone=GMT%2B8");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(){
        SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
        sqlSessionFactory.setDataSource(dataSource());
        sqlSessionFactory.setMapperLocations(new Resource[]{new ClassPathResource("mapper/UserDao.xml")});
        sqlSessionFactory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
        return sqlSessionFactory;
    }

    @Bean
    public MapperScannerConfigurer mapperScanner(){
        MapperScannerConfigurer mapperScanner = new MapperScannerConfigurer();
        mapperScanner.setSqlSessionFactoryBeanName("sqlSessionFactory");
        mapperScanner.setBasePackage("space.xxhui.DAO");
        return mapperScanner;
    }

}

對比圖:
這裡寫圖片描述
bean標籤節點是這麼寫,其他標籤相信也是差不多方法寫出來的。

3.3、編寫測試用例

package space.xxhui;

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import space.xxhui.DAO.UserDao;
import space.xxhui.POJO.User;
import space.xxhui.config.SpringBean;
import space.xxhui.config.SpringConfig;

/**
 * Created by hui on 2017/7/25.
 */

/**
 * 配置spring和junit整合,junit啟動時載入springIOC容器 spring-test,junit
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfig.class ,SpringBean.class})
@WebAppConfiguration("src/main/space/xxhui/config")
public class UserDAOTest {

    @Autowired
    private UserDao userDao;

    @org.junit.Test
    public void getMapper(){
        User user = userDao.getUserById(1);
        System.out.println(user.toString());
        User user1 = userDao.getUserByIdForAnnotation(2);
        System.out.println(user1.toString());
    }
}

這裡寫圖片描述

code 0說明正常退出。

4、整合SpringMVC和Mybatis

其實就是controller呼叫DAO而已
LoginController.java新增如下:

@Autowired
    private UserDao userDao;
    //login方法替換為如下方法
    @RequestMapping("/login")
    public String login(@RequestParam("username") String username , @RequestParam("pwd") String pwd){
        String forword = null;
        User userEntity =new User();
        userEntity.setName(username);
        userEntity.setPwd(pwd);
        //mybatis配置檔案中設定了,如果沒有查詢到返回null
        User entity = userDao.checkUser(userEntity);
        //if (username.equals("Hitvz") && pwd.equals("123456")) {
        if(entity!=null){
            forword = "404page";
        } else {
            System.out.println("no such user");
            forword = "Login";
        }
        return forword;
    }



最後成功執行登入的我就不展示了。
原始碼:碼雲-SpringMVCDemoByClass
原始碼:碼雲-SpringMVCDemoByXml