crm遇错记录
bug
thymeleaf 共享域对象
如果需要将对象的数据显示到前台页面我们可以通过使用thymeleaf实现这一点,Thymeleaf是一个动态渲染页面用的,他简单易懂,不像jsp技术那样需要将html页面改成jsp文件,thymeleaf可以直接在html页面上进行操作。通常我们使用到的是session作用域,说回我的项目crm,在查看市场活动的详情的阶段:
首先说明需求:
点击市场活动的名称时页面跳转到对应市场活动的详情页,在详情页就是该市场活动所对应的各个数据详细展示,如何实现,显然页面跳转到详情页就是同步请求而非异步请求,在请求的地址栏中带上对应市场活动的id,然后在后台控制层接收参数,并通过这个id去到数据库中查询对应的市场活动,得到市场活动的实体,并将该实体类保存在session作用域,然后返回页面的名,通过视图解析器解析到该页面,然后在页面上通过thymeleaf的形式获取会话域中的市场活动实体中的各个数据并显示。
@RequestMapping("/testSession")
public String testSessionByServlet(String id,HttpSession session) {
Activity activity = activityService.selectActivityById(id); //从数据库中查询id对应的市场活动
session.setAttribute("activity",activity);
return "detail";//通过试图解析器解析到detail.html页面
}
熟悉下面的这种thymeleaf的写法,否则每次写的时候多需要查,很费时,这次的crm的第一的开发就遇到的thymeleaf的语法写错而出现报错的情况,th:text="${activity.owner}" 这种写法它
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p th:text="${session.activity.owner}">市场活动的所有者</p>
</body>
</html>
其他的域对象相关的也需要了解下,下面是各个方式的代码简单熟悉下:
@Controller
public class ScopeController {
/**
* 使用servletAPI 向request域对象共享数据
*
* @return
*/
@RequestMapping("/testRequestByServletAPI")
public String testScope(HttpServletRequest request) {
request.setAttribute("testRequestScope", "通过servletAPI实现request域对象的数据共享");
return "nice";
}
/**
* 1,向request域对象共享数据
* 2,设置视图名称
*
* @return ModelAndView
*/
@RequestMapping("/testModelAndView")//建议使用这种方式
public ModelAndView testModelAndView() {
ModelAndView modelAndView = new ModelAndView();
//首先处理模型数据,即向请求域request共享数据
modelAndView.addObject("testRequestScope", "ModelAndVeiw的使用");
//设置试图名称
modelAndView.setViewName("nice");
System.out.println(modelAndView.getClass().getName());
return modelAndView;
}
/*
下面的三种方式利用的都是同一个对象实例化的 --> org.springframework.validation.support.BindingAwareModelMap
*/
@RequestMapping("/testModel")
public String testModel(Model model) {
model.addAttribute("testRequestScope", "使用model共享request域中的数据");
System.out.println(model.getClass().getName());//
return "nice";
}
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map) {
map.put("testRequestScope", "以map集合的方式");
System.out.println(map.getClass().getName());
return "nice";
}
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap) {
modelMap.addAttribute("testRequestScope", "使用modelmap共享request请求域中的数据");
System.out.println(modelMap.getClass().getName());
return "nice";
}
//-----------------------------------------------------------------------------------------------------------------------------
//向session域共享数据
@RequestMapping("/testSession")
public String testSessionByServlet(HttpSession session) {
User user = new User(12,"king","23");
session.setAttribute("user",user);
session.setAttribute("sessionTest","在会话域的使用中建议使用原生的Servlet的方式(简单)");
return "nice";
}
//application 域共享数据
@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
ServletContext application = session.getServletContext();
application.setAttribute("testApplication","application域");
return "nice";
}
}