最开始只是想让页面能够映射出我的字典值,然而却发现了更大的问题。

假如你自己做一个 demo ,需要前台页面映射出字典数据你会怎么做呢?大致的思路应该是有的,准备字典,准备数据,然后将两部分进行映射。

在做的过程中,我也在思考,该如何保存字典数据呢?有一种比较简单的方法,这种方法也很是巧妙,使用一个工具类,使用枚举法来保存字典值。在该类中还可以加载配置文件。

  1. import java.io.IOException;
  2. import java.util.Properties;
  3.  
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6.  
  7. public class Keys {
  8.  
  9. private final static Logger logger = LoggerFactory.getLogger(BaseDictUtil.class);
  10.  
  11. public static String project_name;
  12.  
  13. // 加载配置文件
  14. static {
  15. logger.info("======= Start load Properties =====");
  16. Properties webapp_prop = new Properties();
  17. try {
  18. webapp_prop.load(BaseDictUtil.class.getResource("/webapp.properties").openStream());
  19. project_name = webapp_prop.getProperty("webapp_project_name");
  20.  
  21. logger.info("======= End load Properties =====");
  22. } catch (IOException e) {
  23. logger.error(e.getMessage(), e);
  24. }
  25. }
  26.  
  27. // 配置性别字典
  28. public enum Gender {
  29. Gender_1("男生", 1), Gender_2("女生", 2);
  30.  
  31. public static String getName(int index) {
  32. for (Gender c : Gender.values()) {
  33. if (c.getIndex() == index) {
  34. return c.name;
  35. }
  36. }
  37. return null;
  38. }
  39.  
  40. private Gender(String name, int index) {
  41. this.name = name;
  42. this.index = index;
  43. }
  44.  
  45. private String name;
  46.  
  47. private int index;
  48.  
  49. public String getName() {
  50. return name;
  51. }
  52.  
  53. public void setName(String name) {
  54. this.name = name;
  55. }
  56.  
  57. public int getIndex() {
  58. return index;
  59. }
  60.  
  61. public void setIndex(int index) {
  62. this.index = index;
  63. }
  64. }
  65. }

上面这种方式,在字典很少的情况下,用起来方便快捷,但是有个问题很明显,若是需要新添加一个字典还要改动代码,很是麻烦。

下面看一下另外一种方式,也是用的比较多的一种,这种方法就需要使用数据库了,把字典统一保存保存在一张表中,当项目启动的时候加载到一个 Map 中。

Map 中的值有一定的规律,map 的就 key 怎么定义看你自己,一般是将字典先分组再取对应关系。比方说城市组的代号是 city,在 city 下的 001 代表的是北京。那 Map 的结构可以是 city 为主键 value 是一个子 Map。子 Map 中存放的就是城市编号和具体城市的映射。

我在网上看到另一种分组的,拿过来和大家分享一下。一条 dict 记录可以分为哪个表下的哪个字段什么值,表示的什么值,对应到数据库和 Map 中我们可以这样设计。

而 Map 中的 key 为 tableName_fieldName_fieldValue 值为 field_detail 。同样的在这里我们可以加载配置文件到 Map 中,这里可以选择加载一些系统级的配置。

  1. public class BaseDictUtil {
  2.  
  3. @Autowired
  4. private static BaseDictDao dicDao;
  5.  
  6. private static HashMap<String, String> hashMap = new HashMap<>();
  7.  
  8. private final static Logger logger = LoggerFactory.getLogger(BaseDictUtil.class);
  9.  
  10. // 静态方法在程序启动的时候只加载一次,这样为了让查询方法只去数据库查询一次
  11. static {
  12. // 获取应用上下文对象
  13. @SuppressWarnings("resource")
  14. ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext-dao.xml");
  15. // 获取dicDao实例
  16. dicDao = ctx.getBean(BaseDictDao.class);
  17. queryDic();
  18. }
  19.  
  20. // 加载配置文件
  21. static {
  22. logger.info("======= Start load Properties =====");
  23. Properties webapp_prop = new Properties();
  24. Properties base_prop = new Properties();
  25. try {
  26. webapp_prop.load(BaseDictUtil.class.getResource("/webapp.properties").openStream());
  27. hashMap.put("webapp_project_name", webapp_prop.getProperty("webapp_project_name"));
  28.  
  29. base_prop.load(BaseDictUtil.class.getResource("/base_dict.properties").openStream());
  30. hashMap.put("base_dict.dict_type_code.001", base_prop.getProperty("base_dict.dict_type_code.001"));
  31.  
  32. logger.info("======= End load Properties =====");
  33. } catch (IOException e) {
  34. logger.error(e.getMessage(), e);
  35. }
  36. }
  37.  
  38. // 从数据库中取值放入到HashMap中
  39. public static void queryDic() {
  40. List<BaseDict> dics = dicDao.selectAll();
  41. for (int i = 0; i < dics.size(); i++) {
  42. BaseDict dic = dics.get(i);
  43. String tableName = dic.getTable_name();
  44. String fieldName = dic.getField_name();
  45. String fieldValue = dic.getField_value();
  46. String key = tableName + "_" + fieldName + "_" + fieldValue;
  47. String value = dic.getField_detail();
  48. logger.info(key + " ---> " + value);
  49. hashMap.put(key, value);
  50. }
  51. }
  52.  
  53. public static String getFieldDetail(String tableName, String fieldName, String fieldValue) {
  54. StringBuilder sb = new StringBuilder();
  55. StringBuilder keySb = sb.append(tableName).append("_").append(fieldName).append("_").append(fieldValue);
  56. String key = keySb.toString();
  57. String value = hashMap.get(key);
  58. return value;
  59. }
  60.  
  61. public static String getProperties(String key) {
  62. return hashMap.get(key);
  63. }
  64.  
  65. public static void main(String[] args) {
  66. String detail = BaseDictUtil.getFieldDetail("customer", "cust_level", "2");
  67. System.out.println(detail);
  68.  
  69. System.out.println(getProperties("webapp_project_name"));
  70. }
  71. }

到上面为止,我们已经把字典处理好了,获取实体中的数据很简单,但是现在来了一个问题,我们该如何将两者结合起来,是先在后台处理好数据传到前台还是分别传到前台再由前台处理映射关系呢?

这个问题可真的难为我了,有一个很蠢的办法,获取实体数据的时候我们一条一条的映射,最终返回给前台处理好的结果。可作为一个后台工程师,这不是我想的,然而,处理前台我功力又不行。唉

功能的事到此就结束了,后面主要想谈谈关于前后端分离的事,之前前后台不分家,后端工程师是又当爹又当妈。既要处理数据又要处理页面,很恶心。

但是曙光来了,现在提倡前后台分离,作为后端工程师的我来说,那真的是高兴呀。随之而来的就是 JSP 页面被抛弃了,改用 HTML + JS 或是前段框架 + JS 。

为什么要抛弃 JSP 呢 ?

1、数据和静态资源都放在一起,各种请求 CSS、JS、图片的请求会增加服务器的压力。

2、JSP 必须要在支持Java 的 web 容器中运行(类如 tomcat),无法使用 nginx。

3、第一次请求 JSP 必须在 web 容器中将 JSP 转化为 Servlet,所以首次访问比较慢。

4、JSP 页面中内容比较杂,有 html、各种标签、JS ,给前端看前端头疼,给后端看后端头疼,不易分工。

5、如果 JSP 中的内容很多,页面响应会很慢,因为是同步加载。

以前开发步骤是这样

1、客户端发出请求。
2、服务端的 Servlet 或 Controller 接收请求(路由规则由后端制定,整个项目开发的权重大部分在后端)。
3、调用 service、dao 代码完成业务逻辑。
4、返回 JSP。
5、JSP 展现一些动态的代码。

前后端分离之后是这样

1、浏览器发送请求。
2、直接到达 html 页面(路由规则由前端制定,整个项目开发的权重前移)。
3、html 页面负责调用服务端接口产生数据(通过 ajax 等等)。
4、填充 html,展现动态效果。

而前后端更多的是采用 JSON 来进行数据交互,通过 ajax 来异步加载数据,所以一个项目不管数据量多么复杂,都可以轻松的访问,不像以前那样通过一个请求一股脑的把所有的数据都返回。

说了这么多前后端分离的好,然,我自己写的 demo 并没有前台来照顾,不说了,默默的搬砖去了……

学习字典才联想到要和 JSP 说再见了的更多相关文章

  1. springboot学习入门之五---开发Web应用之JSP篇

    转载:http://tengj.top/2017/03/13/springboot5/ 1整体结构 整体的框架结构,跟前面介绍Thymeleaf的时候差不多,只是多了webapp这个用来存放jsp的目 ...

  2. Servlet和JSP学习指导与实践(三):JSP助阵

    前言: JSP(Java Server Page)虽然作为一门服务端的语言,但它并没有创新新的语言标准.有些人一接触jsp之后发现易学易懂.实际上,jsp的内部原理仍然是基于Servlet,它是Ser ...

  3. .Net程序员之Python基础教程学习----字典的使用 [Third Day]

      今天学习了字典的使用, 所谓的字典其实就是键值对数据, 一个字典里面有唯一的Key对应一个value,Key是唯一的,Value不唯一. 在.net添加相同的Key会报错,在Python,若出现相 ...

  4. JavaEE学习总结(十三)—JavaWeb、JSP、Servlet与DVD管理系统

    一.JSP基础知识 1.0.创建数据库与表 /* Navicat MySQL Data Transfer Source Server : 127.0.0.1 Source Server Version ...

  5. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  6. Python学习--字典

    在Python中通过名字来引用值的数据结构称为映射(mapping).字典是Python中唯一内建(Python解释器本身支持,不需要import)的映射类型.字典中的值没有特殊的顺序,都存储在一个特 ...

  7. Python基础学习----字典常用操作

    字典的常见操作: # 字典: # 格式:{键值对,键值对} dict_demo={"name":"bai-boy","age":17} # ...

  8. redis学习-字典

    1.字典作用 实现数据库键空间(key space): 用作 Hash 类型键的底层实现之一: 2.字典实现的数据结构 typedef struct dict { // 特定于类型的处理函数 dict ...

  9. Python学习——字典

    字典 字典是另一种可变容器模型,且可存储任意类型对象. 1.创建字典 字典由键和对应值成对组成.每个键与值之间用:隔开,每对之间逗号隔开. 每个键应当互不相同,值可以相同.若同时出现两个相同的键,则后 ...

随机推荐

  1. 将句子表示为向量(上):无监督句子表示学习(sentence embedding)

    1. 引言 word embedding技术如word2vec,glove等已经广泛应用于NLP,极大地推动了NLP的发展.既然词可以embedding,句子也应该可以(其实,万物皆可embeddin ...

  2. arcgis10.2连接表xlsx格式失败

    需要安装 2007 Office System 驱动程序(AccessDatabaseEngine.exe)

  3. POJ - 2513 Colored Sticks(欧拉通路+并查集+字典树)

    https://vjudge.net/problem/POJ-2513 题解转载自:優YoU  http://user.qzone.qq.com/289065406/blog/1304742541 题 ...

  4. POJ - 3026 Borg Maze(最小生成树)

    https://vjudge.net/problem/POJ-3026 题意 在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的 ...

  5. 何凯文每日一句打开||DAY8

  6. AngularJS 启程

    <!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...

  7. python中的__enter__ __exit__

    我们前面文章介绍了迭代器和可迭代对象,这次介绍python的上下文管理.在python中实现了__enter__和__exit__方法,即支持上下文管理器协议.上下文管理器就是支持上下文管理器协议的对 ...

  8. Linux下创建软Raid

    1- Linux下创建软Raid   步骤1.创建磁盘,并转换为fd #fdisk /dev/sdb //这里使用新的磁盘sdb 然后输入n ,创建分区 使用默认的起始点 输入大小为+100M 然后重 ...

  9. makefile 中 foreach

    四.foreach 函数 foreach函数和别的函数非常的不一样.因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语 ...

  10. [Android]使用 Eclipse 给 APK 签名时遇到的两个问题及解决办法

    问题 今天用 APK 反编译工具看了一下自己项目生成的 APK 文件,发现代码并没有混淆,于是设置了用 ProGuard 混淆代码,可是混淆是必须在非 Debug 模式才会生效的,即使你是以 Rele ...