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,通過程式碼註冊到WebApplicationInitializer的onStartup中即可,同時繼承WebMvcConfigurerAdapter,重寫其方法可對Spring MVC進行配置(前提是類上有@EnableWebMvc
說到這裡兩個重要的檔案(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