Freemarker作为前端展现层

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();
		}
	}
	
}

效果图
在这里插入图片描述

代码下载

https://pan.baidu.com/s/15kWRW-0h5Tlx-CTpYJxECw

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值