Java+freemarker生成HTML模板页
需求有多个样式板式结构不一样模板页:用户选择自己喜欢的样式结构页面,然后就渲染出改html页面。不选择就显示默认的样式结构HTML页面
package com.school.web.controller;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import com.school.business.CategoryManager;
import com.school.business.CourseInstructorManager;
import com.school.business.CourseManager;
import com.school.domain.Category;
import com.school.domain.CourseBean;
import com.school.domain.LiveCourse;
import com.school.domain.User;
import com.school.util.PageRequest;
import com.school.util.Pageable;
import com.school.util.Paginator;
import com.school.util.SystemMailConfig;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
/**
* 课程浏览查询的控制器。
*/
@Controller
@RequestMapping("/course/explore")
public class ExploreCourseController extends AbstractController {
@Autowired
private CourseManager courseManager;
@Autowired
private CategoryManager categoryManager;
@Autowired
private CourseInstructorManager courseInstructorManager;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
/**
* 浏览所有课程。
*/
@RequestMapping
public ModelAndView index(HttpServletRequest request,HttpServletResponse response) {
return this.doResponse(null, request,response);
}
/**
* 根据分类ID浏览课程。
*/
@RequestMapping("/{categoryId}")
public ModelAndView explore(@PathVariable String categoryId, HttpServletRequest request,HttpServletResponse response) {
return this.doResponse(categoryId, request,response);
}
/**
* 处理请求。
*/
private ModelAndView doResponse(String categoryId, HttpServletRequest request,HttpServletResponse response) {
String schoolId = this.getSchoolId(request); // 网校ID
String sort = ServletRequestUtils.getStringParameter(request, "sort", ""); // 排序方式
// 分页查询
int page = ServletRequestUtils.getIntParameter(request, "page", 1); // 第几页
Pageable pageable = new PageRequest(page, 16);
// 分页课程信息
Paginator<CourseBean> paginator = null;
if ("popular".equals(sort)) {
paginator = courseManager.getPopularCourseBeans(schoolId, categoryId, pageable);
} else if ("latest".equals(sort)) {
paginator = courseManager.getLatestCourseBeans(schoolId, categoryId, pageable);
} else if ("recommended".equals(sort)) {
paginator = courseManager.getRecommendedCourseBeans(schoolId, categoryId, pageable);
} else { // 默认按热门课程排序
sort = "popular";
paginator = courseManager.getPopularCourseBeans(schoolId, categoryId, pageable);
}
//创建者、教师
if(paginator.getContents().size()>0){
for(int i=0;i<paginator.getContents().size();i++){
String courseId=paginator.getContents().get(i).getCourseId();
List<User> instructor=courseInstructorManager.getInstructors(schoolId, courseId);
if(instructor.size()>0){
paginator.getContents().get(i).setUserId(instructor.get(0).getUserId());
paginator.getContents().get(i).setCreatorNickname(instructor.get(0).getNickname());
paginator.getContents().get(i).setCreatorAvatar(instructor.get(0).getAvatar());
}
}
}
// 课程分类
List<Category> categories = categoryManager.getCategories(schoolId);
String categoryName = ""; //当前课程分类名称
if(null != categories){
for(Category category : categories){
if(category.getCategoryId().equals(categoryId)){
categoryName = category.getName();
}
}
}
categoryName = categoryName.trim().length()==0 ? "全部":categoryName;
boolean test=false;
if(test){
// 渲染FreeMarker模版用到的数据模型
//参数列表
Map<String, Object> rootMap = new HashMap<String, Object>();
rootMap.put("schoolId", schoolId);
rootMap.put("currentUser", this.getCurrentUser(request));
rootMap.put("sort", sort);
rootMap.put("categoryId", categoryId);
rootMap.put("categories", categories);
rootMap.put("categoryName", categoryName);
// 分页代码
String queryString = "sort=" + sort;
rootMap.put("paginator", paginator);
rootMap.put("paginationHtml", paginator.toPaginationHtml(queryString));
rootMap.put("totalCourse", paginator.getTotalItems());
// 处理模版
PrintWriter out = null;
String templateName = "explore";//模板页的标记名称
Configuration cfg = freeMarkerConfigurer.getConfiguration();
String templateSource="";
InputStream inStream = null;
try {
inStream = SystemMailConfig.class.getResourceAsStream("/explore.ftl");
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] data = new byte[4096];
int count = -1;
while ((count = inStream.read(data, 0, 4096)) != -1) {
outStream.write(data, 0, count);
}
templateSource = outStream.toString("UTF-8");
} catch (Exception e) {
logger.error("读取忘记密码邮件模板时发生异常,Cause: ", e);
} finally {
if (null != inStream) {
try {
inStream.close();
} catch (IOException e) {
}
}
}
logger.info("测试代码:{}",templateSource);
Reader reader = new StringReader(templateSource);
try {
out = response.getWriter();
Template template = new Template(templateName, reader, cfg, "UTF-8");
template.process(rootMap, out, new DefaultObjectWrapper());//动态加载模板
} catch (Exception e) {
logger.error("处理网校自定义首页模版出错,templateId=" + templateName, e);
return new ModelAndView(new RedirectView("/school?from=home")); // 使用默认首页
} finally {
if (null != out) {
out.close();
}
}
return null;
}else{
// 页面模版
ModelAndView mav = this.createModelAndView(request);
mav.setViewName(getFrontViewDir(request) + "/course/explore");
mav.addObject("sort", sort);
mav.addObject("categoryId", categoryId);
mav.addObject("categories", categories);
mav.addObject("categoryName", categoryName);
// 分页代码
String queryString = "sort=" + sort;
mav.addObject("paginator", paginator);
mav.addObject("paginationHtml", paginator.toPaginationHtml(queryString));
mav.addObject("totalCourse", paginator.getTotalItems());
return mav;
}
}
}