框架实践
ServletRequest request类似于@RequestParam
可以获取传过来的参数。(非地址栏post)
前端控制器return 的值 是在WEB-INF/view的文件,与地址栏输入的无关
如映射到/doem return /system 则显示的是/system
地址栏传参数@RequestMapping("/delete/{id}")+@PathVariable String id
@PathVariable 和 @RequestParam一样都可以获得参数。但是它需要看映射时定义参数{id}
RedirectAttributes 重定向。其作用是在地址栏增加参数
第一种redirectAttributes.addAttributie("param1",value1);是在地址栏显性的增加参数param1=value1.
第二种redirectAttributes.addFlashAttributie("param1",value)是在地址栏隐式的增加参数
setRedirectResult(redirectAttributes, true, ADD_SUCCEED);是设置此次任务的状态
地址栏用redirect:经行重定向
预编译语句及存储过程创建回调https://blog.csdn.net/dyllove98/article/details/7772463
https://blog.csdn.net/xuebing1995/article/details/72235380
assert格式断言表达式
(1)assert [boolean 表达式]
如果[boolean表达式]为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
分页的对象转化
查出来的对象一般都是list 那么可以用new PageImpl来把list对象变为Page对象集
@ResponseBody
作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
就可以直接返回一个对象,解系后会变成json返回到页面
Param
${param.name} 等价于request.getParamter(“name”),主要是服务器从页面或者客户端获取信息的方法。
如果要在多选框中经行查询,用sql的时候就不要使用预查询,并且要经行判断,如果这个值不为空才经行条件查询。
<%Out.print()%>在jsp输出Java
可用用oncick绑定,ajax传表单数据,name作为识别数据的key,经行数据传送
onchange 事件会在域的内容改变时发生。
DozerBeanMapper
Dozer是一个JavaBean映射工具库。
用途映射:http://www.cnblogs.com/jingmoxukong/p/5952447.html?utm_source=gold_browser_extension
转化(对象转Map,colletion,对象复制等):
https://blog.csdn.net/cbjcry/article/details/70155357
beanInfo
获得一个对象的属性等beanInfo = Introspector.getBeanInfo(type);
T obj = type.newInstance(); // 创建 JavaBean 对象
PropertyDescriptor是一个可以通过反射得到对象get,set方法的对象。
// 给 JavaBean 对象的属性赋值这里propertyDescriptors就获得了type的属性
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
它可以通过得到的属性反射到对应的方法
// 获取getter方法,反射获取id值
Object str = prop.getReadMethod().invoke(p);
// 获取setter方法,反射赋值
prop.getWriteMethod().invoke(p, "1");
@PostConstruct和@PreDestroy
这两个作用于Servlet生命周期的注解,实现Bean初始化之前和销毁之前的自定义操作
数据字典实现
jsp页面中可以用标签来实现数据字典,标签可以自定义一个,可以用标签库中已有的标签(在里面添加方法即可)。
<%@ taglib prefix="dict" uri="http://www.summer.org/tags/dict" %>(已有的标签)
${dict:display('processAreaType',processArea.processAreaType) }(调用标签方法)
在uri的文件中会配置方法类,在类中实现方法就可以了
数据字典结构。
bean对象,对应着数据库中的字典对象。
一个字典类(就是uri中配置的那个类) 用于方法调用,相当于控制器
一个service以及其实现类,这个实现类很重要,它要做两件事:
[if !supportLists]1. [endif]从数据库中获得所有的字典对象,装在一个List中,再将其用groupcode经行分类储存(牵涉到初始化方法@PostConstruct和map中LinkedHashMap),map中每一个groupcode可能对应了多个对象,都存在一个list中并根据groupcode再放入map。
[if !supportLists]2. [endif]写具体的方法实现(根据groupcode找code)
数据字典数据库结构
Groupcode1 groupcode2 code
(人名)(公司名)(Int)
张三tench 1
.... .... ....
一般1返回的是一个传入的groupcode的list,2中只用把这个list中符合code相同的对象找出来就行了
在linkedHashMap时项目中用了import com.google.common.collect.Maps;
Maps.newLinkedHashMap();我猜这个是缓存Map吧。这样节约了内存遍历
*如果是实在下拉列表里使用字典,需要自定义组件https://www.cnblogs.com/flying607/p/5063207.html
Validate
来自org.apache.commons.lang3.Validate的外接校验工具
它可以校验是否为空,在某一区间,是否为实体等等,如果错误还自动抛出异常
用法Validate.函数名 即可
分页查询
如果是jpa查询会有函数的参数可以直接是pageable返回的也是Page对象
如果是jdbcTemplate,那么就要手动封装,Page是new PageImpl得到的。传入结果集,pageable,maxcount就可以了
在日志输出的时候,可以打印出日志信息所在类如:Logger logger = LoggerFactory.getLogger(com.Book.class);logger.debug("日志信息");将会打印出: com.Book : 日志信息
从jsp传对象到控制器,要上传的数据的name属性设置为该对象的内部属性,如bean中有name属性,那么设置name=”name”,再控制器的参数中写入该bean,有格式要求,如TempName(一定要用驼峰原则)写参数就是(TempName tempName)
文件下载:从TFP端的下载。架构:首先前端传到控制器时,控制器要有一个处理类,这个类做的是接收文件名,请求远端FTP将该文件传通过流到本地,将本地文件流给用户。
因为远程端获取是共同步骤,可以专门写一个FTP工具,工具包括了登陆FTP和长传下载等等功能。
下载时,传来一个全路径文件名和控制器端out流,FTPclient通过文件路径找到文件,把流写到控制器的流里面去。然后控制器得到该流后,写入一个文件当中,用http文件头说明文件路径即可。
控制器端:主要作用是的到参数并处理,获取数据库数据,数据发送给前端,设置状态,返回页面
参数获得:如果一个方法只处理一个动作,可以用地址栏传参也可以用post传参,地址栏传参通过@PathVariable获得数据(如果没有设置该注解的value,那么数据名称应和前端传来的参数名一致),获取post传来的参数可以用@RequestParam规则和@PathVariable一样,只不过它还有一个属性(require)如果是false就是不必须的参数,默认是true如果没有该参数就会报错。还有就是不加任何注解,这时候变量名应和参数名一直且默认require为false
如果查询来的是多个参数,可以考虑用BeanMapper.convertMap将参数封装为一个对象。如果参数少没必要使用。
数据库查询参数:如果用于单个的选择性数据key+name
返回的数据一般都是list的形式
dao层:主要步骤 sql语句,mapper.class,调用函数提交sql
Sql:如果没有动态赋值的情况下用stringBuffer(用的时候注意变量用’’单引号包住),写sql语句时注意,如果是插入对象,对表中对象挨个写,且id用UUID生成。如果是查询想保证数据唯一性用group by ...。
mapper如果要返回list<pojo>一般用ParameterizedRowMapper(返回单个对象也可以用它,他继承了Mapper)
提交:query用于查询操作,查询出的是集合,queryForObject..等函数返回的是单个值,update一般用预编译更新或者删除