Freemarker具有丰富前端展现能力,SpringBoot默认使用Freemarker展现前台页面。
POM.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>Proj_Good</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Proj_Good Maven Webapp</name>
<url>http://maven.apache.org</url>
<!-- 定义公共资源版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>jconsole</artifactId>
</exclusion>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>tools</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--JSP支持的依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils-core</artifactId>
<version>1.8.3</version>
</dependency>
<!--
<dependency>
<groupId>com.test</groupId>
<artifactId>easyuitld</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/lib/utils.jar</systemPath>
</dependency>
-->
</dependencies>
<build>
<finalName>Proj_Good</finalName>
</build>
</project>
application.properties
#SpringBoot服务端口配置
server.port=6060
server.context-path=/
#spring.resources.static-locations=/css,/images,/img,/js
#SpringMVC JSP目录配置
#spring.mvc.view.prefix=/WEB-INF/jsp/
#spring.mvc.view.suffix=.jsp
spring.freemarker.template-loader-path=/WEB-INF/ftl/
spring.freemarker.suffix=.ftl
#Http编码配置
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
#数据源配置
spring.datasource.name=w2
spring.datasource.url=jdbc:mysql://localhost:3306/w2?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.maxActive=20
spring.datasource.initialSize=1
spring.datasource.maxWait=60000
spring.datasource.minIdle=1
#Mybatis实体类配置
mybatis.mapper-locations=classpath:mapper/*.xml
#Solr配置
spring.data.solr.host=http://localhost:8984/solr/new_core2
#日志配置
logging.file=d:/springboot.log
logging.level.com.test.mapper=DEBUG
logging.level.com.test.service.impl=DEBUG
Freemarker模板存放位置
Good.ftl
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="/js/base.css"/>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<title>商品列表</title>
<script>
function doquery()
{
goodForm.submit();
}
function doadd()
{
location.href="/add";
//window.open('/add','_self');
//window.open('/add','_blank');
}
function domodify(id)
{
window.open('/add?id='+id,'_self');
}
function selectAll()
{
$('input[name="chkid"]').each(function(){
this.checked = !this.checked;
})
}
function dodelete()
{
goodForm.action="/delete";
goodForm.submit();
}
function dosort()
{
var sort = $('#sort').val();
if('asc'==sort)
{
goodForm.action="/list?sort=desc";
}
else
{
goodForm.action="/list?sort=asc";
}
goodForm.submit();
}
</script>
</head>
<body>
<form id="goodForm" action="/list" method="POST">
商品名称
<input type="text" name="gname" value="${gname! }"/>
分类名称
<input type="text" name="tname" value="${tname! }"/>
<input type="hidden" id="sort" name="sort" value="${sort!}"/>
<input type="button" value="查询" onclick="doquery()"/>
<input type="button" value="添加" onclick="doadd()"/>
<!--
<table>
<tr>
<th><input type="checkbox" name="chkall" value="" onclick="selectAll()"/>全选</th>
<th>名称</th>
<th>价格
<#if sort=="desc">
<input id="sortbtn" type="button" value="升序" onclick="dosort()"/>
<#else>
<input id="sortbtn" type="button" value="降序" onclick="dosort()"/>
</#if>
</th>
<th>上架日期</th>
<th>分类名称</th>
<th>操作</th>
</tr>
<#list goods as g>
<tr>
<td><input type="checkbox" name="chkid" value="${g.id }"/></td>
<td>${g.name }</td>
<td>${g.price }</td>
<td>${g.dt }</td>
<td>${g.typeName }</td>
<td><input type="button" value="修改" onclick="domodify('${g.id }')"/></td>
</tr>
</#list>
</table>
-->
<#include "common.ftl">
<#assign nameList=["名称","价格-order","上架日期","分类名称","操作"]>
<#assign colList=["name","price","dt","typeName"]>
<#assign btnName="修改">
<#assign btnOnclick="domodify">
<@grid nameList goods colList btnName btnOnclick/>
${pageHtml }
<input type="button" value="批量删除" onclick="dodelete()"/>
</form>
</body>
</html>
Common.ftl
<#macro grid nameList valList colList btnName,btnOnclick>
<table>
<tr>
<th><input type="checkbox" name="chkall" value="" onclick="selectAll()"/>全选</th>
<#list nameList as c>
<#if c?string?ends_with("-order")>
<#local i=c?string?index_of("-order")>
<th>${c?string?substring(0,i)}
<#if sort=="desc">
<input id="sortbtn" type="button" value="升序" onclick="dosort()"/>
<#else>
<input id="sortbtn" type="button" value="降序" onclick="dosort()"/>
</#if>
</th>
<#else>
<th>${c}</th>
</#if>
</#list>
</tr>
<#list valList as v>
<tr>
<td><input type="checkbox" name="chkid" value="${v["id"]! }"/></td>
<#list colList as c>
<td>${v["${c}"]}</td>
</#list>
<td><input type="button" value="${btnName}" onclick="${btnOnclick}('${v["id"]!}')"/></td>
</tr>
</#list>
</table>
</#macro>
Add.ftl
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="/js/base.css"/>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<title>商品添加</title>
<script>
function dosave()
{
goodForm.submit();
}
function dolist()
{
location.href="/list";
//window.open('/add','_self');
//window.open('/add','_blank');
}
</script>
</head>
<body>
<form id="goodForm" action="/save" method="POST">
<input type="hidden" name="id" value="${good.id!}"/>
<table>
<tr>
<td>名称</td>
<td><input type="text" name="name" value="${good.name!}"/></td>
</tr>
<tr>
<td>价格</td>
<td><input type="text" name="price" value="${good.price!}"/></td>
</tr>
<tr>
<td>上架日期</td>
<td><input type="text" name="dt" value="${good.dt!}"/></td>
</tr>
<tr>
<td>分类</td>
<td>
<select name="typeId">
<#list types as t>
<option value="${t.id}" ${t.selected }>${t.name }</option>
</#list>
</select>
</td>
</tr>
</table>
<input type="button" value="保存" onclick="dosave()"/>
<input type="button" value="返回列表" onclick="dolist()"/>
</form>
</body>
</html>
GoodCtrl.java
package com.test.ctrl;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.test.bean.GoodInfo;
import com.test.bean.TypeInfo;
import com.test.service.IGoodService;
import com.test.util.PageUtil;
import com.test.util.PageUtil2;
@Controller
public class GoodCtrl {
@Autowired
private IGoodService serv;
@RequestMapping("/list")
public String list(HttpServletRequest req,Integer page,Integer rows)
{
if(page == null)
page = 1;
if(rows == null)
rows = 4;
String gname = req.getParameter("gname");
String tname = req.getParameter("tname");
String sort = req.getParameter("sort");
if(sort == null || "".equals(sort))
sort = "asc";
System.out.println("gname="+gname+",tname="+tname+",sort="+sort);
//分页插件
PageHelper.startPage(page, rows);
List<GoodInfo> list = serv.findGood(gname, tname,sort);
//定义分页对象
PageInfo<GoodInfo> pi = new PageInfo<GoodInfo>(list);
Long total = pi.getTotal();
List<GoodInfo> goods = pi.getList();
//page 当前页
//rows 每页记录数
//total 全部记录数
//url 列表URL
String url = "/list";
//String pageHtml = PageUtil.toHtml(url, page, rows, total);
PageUtil2 pu2 = new PageUtil2(url, page, rows, total);
String pageHtml = pu2.toHtml();
req.setAttribute("pageHtml", pageHtml);
req.setAttribute("goods", goods);
req.setAttribute("gname", gname);
req.setAttribute("tname", tname);
req.setAttribute("sort", sort);
return "good";
}
@RequestMapping("/add")
public String add(HttpServletRequest req)
{
String id = req.getParameter("id");
List<TypeInfo> types = serv.findType();
if(id != null)
{
GoodInfo gi = serv.findGoodById(new Integer(id));
req.setAttribute("good", gi);
for(TypeInfo ti:types)
{
if(gi.getTypeId() == ti.getId())
ti.setSelected("selected");
}
}
else
{
req.setAttribute("good", new GoodInfo());
}
req.setAttribute("types", types);
return "add";
}
@RequestMapping("/save")
public String save(HttpServletRequest req,GoodInfo gi)
{
Integer id = gi.getId();
System.out.println("id==="+id);
if(id != null)
{
//修改
serv.updateGood(gi);
}
else
{
//新增
serv.saveGood(gi);
}
return "redirect:/list";
}
@RequestMapping("/delete")
public String delete(HttpServletRequest req,Integer[] chkid)
{
if(chkid != null)
{
for(Integer id:chkid)
serv.deleteGood(id);
}
return "redirect:/list";
}
}
IGoodService.java
package com.test.service;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import com.test.bean.GoodInfo;
import com.test.bean.TypeInfo;
public interface IGoodService {
public List<GoodInfo> findGood(String gname,String tname,String sort);
public List<TypeInfo> findType();
public GoodInfo findGoodById(Integer id);
public void saveGood(GoodInfo gi);
public void updateGood(GoodInfo gi);
public void deleteGood(Integer id);
}
GoodServiceImpl.java
package com.test.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.test.bean.GoodInfo;
import com.test.bean.TypeInfo;
import com.test.mapper.GoodMapper;
import com.test.service.IGoodService;
@Service
public class GoodServiceImpl implements IGoodService{
@Autowired
private GoodMapper mapper;
@Override
public List<GoodInfo> findGood(String gname, String tname,String sort) {
try
{
return mapper.findGood(gname, tname,sort);
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
@Override
public List<TypeInfo> findType() {
try
{
return mapper.findType();
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
@Transactional(readOnly=true)
@Override
public GoodInfo findGoodById(Integer id) {
try
{
return mapper.findGoodById(id);
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
@Transactional
@Override
public void saveGood(GoodInfo gi) {
try
{
mapper.saveGood(gi);
//typeServ.saveType()
}
catch(Exception e)
{
e.printStackTrace();
}
}
@Override
public void updateGood(GoodInfo gi) {
try
{
mapper.updateGood(gi);
}
catch(Exception e)
{
e.printStackTrace();
}
}
@Override
public void deleteGood(Integer id) {
try
{
mapper.deleteGood(id);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
效果图
代码下载