简介
此项目是针对thymeleaf模板和jsp模板共用的,调试视图解析器进行分辨
maven项目构建
1、进入http://start.spring.id官网进行生成springboot Maven项目
2.把生成的zip文件解压,我项目导入到workspace工作空间
目录结构
pom.xml
<!--核心模块,包括自动配置支持、日志和YAML -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 测试模块,包括JUnit、Hamcrest、Mockito -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--构建Web,包含RESTful风格框架SpringMVC和默认的嵌入式容器Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热部署 需要配置spring-boot-devtools 和 spring-boot-maven-plugin -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<!-- optional=true,依赖不会传递,该项目依赖devtools;之后依赖myboot项目的项目如果想要使用devtools,需要重新引入 -->
<optional>true</optional>
</dependency>
<!-- 依赖于hibernate jpa写法比如:继承JpaRepository来实现增删改查操作 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- springboot集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mybatis插件,自动生成代码 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator</artifactId>
<version>1.3.5</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!-- springBoot默认不支持jsp 导入以下的包start -->
<!-- 引入servlet依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<!-- 引入servlet-jstl依赖. -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!--SpringBoot默认不支持JSP,需要在项目中添加相关的依赖 -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.6.1</version>
</dependency>
<!-- jsp页面支持 end -->
Application.java
package com.zkrj.springBoot;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@MapperScan("com.zkrj.springBoot.mapper")
public class Application extends SpringBootServletInitializer {
//使用外部tomcat需要继承SpringBootServletInitializer,并且重写configure方法(不使用可以不写,没影响)
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
//启动项目直接运行
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
application.properties
#JDBC
spring.datasource.url=jdbc:mysql://127.0.0.1/springbootv1
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#mybatis yingshe
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.config-location=classpath:mybatis/mybatis-config.xml
以上基本配置就算完了,不比比,直接上基础代码
UserController.java
package com.zkrj.springBoot.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.zkrj.springBoot.bean.JsonResult;
import com.zkrj.springBoot.bean.User;
import com.zkrj.springBoot.service.UserService;
/*
* 采用Restful风格
*/
@RestController
@RequestMapping(value="/rest/user")
public class RestUserController {
@Autowired
private UserService userService;
/**
*
* 开发:冷小风
* 开发时间:2018年6月25日
* 功能:根据id查询用户
* @param id
* @return
*/
@RequestMapping(value="/getUserById/{id}",method = RequestMethod.GET)
public ResponseEntity<JsonResult> getUserById(@PathVariable(value="id") Integer id){
JsonResult result = new JsonResult();
try {
User user = userService.getUserById(id);
result.setResult(user);
result.setStatus("ok");
} catch (Exception e) {
result.setResult(e.getClass().getName());
result.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(result);
}
/**
*
* 开发:冷小风
* 开发时间:2018年6月25日
* 功能:查询用户列表
*/
@RequestMapping(value ="/getUserList",method = RequestMethod.GET)
public ResponseEntity<JsonResult> getUserList(){
JsonResult r = new JsonResult();
try {
List<User> users = userService.getUserList();
r.setResult(users);
r.setStatus("ok");
} catch (Exception e) {
r.setResult(e.getClass().getName() + ":"+e.getMessage());
r.setStatus("error");
e.printStackTrace();
}
return ResponseEntity.ok(r);
}
}
UserService.java
package com.zkrj.springBoot.service;
import java.util.List;
import com.zkrj.springBoot.bean.User;
public interface UserService {
User getUserById(Integer id);
public List<User> getUserList();
}
UserServiceImpl.java
package com.zkrj.springBoot.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zkrj.springBoot.bean.User;
import com.zkrj.springBoot.mapper.UserMapper;
import com.zkrj.springBoot.service.UserService;
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public User getUserById(Integer id) {
return userMapper.getUserById(id);
}
@Override
public List<User> getUserList() {
return userMapper.getUserList();
}
}
UserMapper.java
package com.zkrj.springBoot.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
import com.zkrj.springBoot.bean.User;
//@Mapper 这里可以使用@Mapper注解,但是每个mapper都加注解比较麻烦,所以统一配置@MapperScan在扫描路径在application类中
@Repository
public interface UserMapper {
@Select("SELECT * FROM tb_user WHERE id = #{id}")
User getUserById(Integer id);
@Select("SELECT * FROM tb_user")
public List<User> getUserList();
}
不想使用注解的话采用xml,把这个@Select注解这一行去掉,usermapper.xml的namespace名称指定到这个接口就可以使用,也可以一起使用,一起使用时,方法名不要冲突
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zkrj.springBoot.mapper.UserMapper" >
<resultMap id="BaseResultMap" type="com.zkrj.springBoot.bean.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="username" property="username" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
<result column="ctm" property="ctm" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List" >
id, username, age, ctm
</sql>
<select id="getUserList" resultMap="BaseResultMap" >//上面如果这个方法使用注解之后,这里的id名称就不能使用了,不能冲突使用
SELECT
<include refid="Base_Column_List" />
FROM tb_user
</select>
<select id="getUserById" parameterType="java.lang.Integer" resultMap="BaseResultMap" >
SELECT
<include refid="Base_Column_List" />
FROM tb_user
WHERE id = #{id}
</select>
</mapper>
User.java
package com.zkrj.springBoot.bean;
import java.util.Date;
public class User {
private int id;
private String username;
private int age;
private Date ctm;
//get set省略
}
效果展示
那么重点来了,怎么实现多视图。
实现多视图,需要导入jsp的包和thymeleaf的包,上面的pom.xml已经包含了。
针对不同的视图,区分它的访问路径,视图解析器中有前缀后缀来做区分。
直接上代码,根据我的路径放置时没问题的
WebConfig.java配置视图转发
package com.zkrj.springBoot;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
@SuppressWarnings("deprecation")
@Configuration//用来定义 DispatcherServlet 应用上下文中的 bean
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewNames("jsps/*");
resolver.setOrder(2);
return resolver;
}
@Bean
public ITemplateResolver templateResolver() {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setTemplateMode("HTML5");
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("utf-8");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
// templateEngine
return templateEngine;
}
@Bean
public ThymeleafViewResolver viewResolverThymeLeaf() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setCharacterEncoding("utf-8");
viewResolver.setOrder(1);
viewResolver.setViewNames(new String[]{"thyme/*"});
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
}
}
在来点跳转路径的代码
package com.zkrj.springBoot.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.zkrj.springBoot.bean.User;
import com.zkrj.springBoot.service.UserService;
@Controller
@RequestMapping(value="/user")
public class UserController {
@Autowired
private UserService userService;
/**
* html模板
* @return
*/
@RequestMapping(value="/page")
public ModelAndView page(){
List<User> users = userService.getUserList();
ModelAndView mv = new ModelAndView();
mv.addObject("users", users);
mv.setViewName("templates/html/index");
return mv;
}
/**
* JSP模板
* @return
*/
@RequestMapping(value="/page1")
public ModelAndView page1(){
List<User> users = userService.getUserList();
ModelAndView mv = new ModelAndView();
mv.addObject("users", users);
mv.setViewName("jsps/userList");
return mv;
}
}
根据以上的配置就可以实现多视图