#FAQ:Frequently Asked Questions
#1. 服务端返回的JSON中的日期格式如何设置?
1)JS端直接设置(new Date(长整形).toLocaleDateString())
2)编写日期转换类继承JsonSerializer重写相关方法,然后在
对应实体对象的get方法上使用@JsonSerialize注解进行
标注要使用的类型转换器.
#2. Tomcat 启动时端口号被占用了?
1)window: jdk/bin 中去执行shutdown.bat
2)linux:
ps -ef|grep tomcat
kill -9 进程号(pid)
3)修改端口号(server.xml)
#3. Spring 中是如何为使用了@Resouce或 @Autowired
等注解修饰的属性注入值的?
注解应用规则:
@Resource (默认按名字注入,没有找到名字按类型注入)
@Autowired(默认按类型注入,假如没找可能会注入失败)
@Autowired假如希望按名字注入
注解应用原理:可以通过反射为使用了此注解的属性注入相关值.
#4. Spring中@ResponseBody注解的作用
将控制层方法的返回值通过第三方API(例如Jackson)转为
Json字符串,然后通过网络传输到客户端.
具体转换过程说一说:
1)JavaBean对象:调用对象的getXXX方法获取值.
2)Map对象:调用map的get(String key)获取值.
例如:
JsonResult—>"{“state”:1,“message”:“ok”,data:{}}"
#5. 项目中JsonResult这个类是如何封装的异常信息的
1)异常发生时
2)异常处理类中 : new JsonResult(异常对象);
#6. 项目添加时,在projectDao的insertObject方法中,假如
参数使用了@Param修饰,程序在运行时会出错,为什么?
insertObject(Project entity);没有@Param注解修饰
insertObject(@Param(“ety”) Project entity);
当mapper中写与此
insertObject(@Param(“entity”) Project entity)
方法绑定的mapper文件时,它的值再获取时需要
#{ety.属性},例如#{ety.code}
#7. 在添加项目信息时,对模态框的保存按钮上绑定的click
事件为什么需要解绑?
因为可能出现数据多次重复提交问题,应该模态框隐藏时
解除事件绑定操作.
#8. MyBatis 中$和#取值时有什么不同
#{}会用?代替 会防止sql注入问题
#9. 日期转换时@DateTimeFormat和@JsonSerialize有什么不同?
@DateTimeFormat 注解应用
1)归属Spring框架
2)定义服务端能接收的日期格式(spring默认格式yyyy/MM/dd)
@JsonSerialize 注解应用.
1)归属Jackson
2)再将控制层返回的对象转换json字符串时,可以按照 @JsonSerialize
定义的日期格式进行转换(默认会转换为长整型)
#10. MyBatis 映射文件中如何在resultType属性或paramterType
属性上使用自己定义的类的别名.
1)首先在mybatis配置文件中定义别名(两种方式)
例如:
<typeAliases>
<package name="cn.tedu.ttms.system.entity"/>
<package name="cn.tedu.ttms.product.entity"/>
</typeAliases>
或者
<typeAliases>
<typeAlias type="cn.tedu.ttms.product.entity.Team"
alias="team"/>
<typeAlias type="cn.tedu.ttms.product.entity.Project"
alias="project"/>
</typeAliases>
2)在映射文件中使用别名
<mapper …>
…
#11. Dao接口中的方法参数一般会如何定义?
Project findObjectById(Integer id);
List<Project>findPageObjects(
@Param("name") String name,
@Param("valid") Integer valid,
@Param("startIndex") Integer startIndex,
@Param("pageSize") Integer pageSize)
假如findPageObjects方法没有使用@Param注解
底层系统会将dao中的参数以及值存储到map
map.put("param1",name);
map.put("param2",valid);
.....
我们在mapper文件中使用值时可以#{param1};#{param2};
假如findPageObjects方法使用了@Param注解对参数
进行了定义,底层系统会将dao中的参数及其值按照如下
规则存储到map.
map.put("name",name);
map.put("valid",valid);
......
我们在mapper文件中使用值时可以#{name};#{valid};
int updateObject(Project entity);
mapper中直接使用#{对象get方法去掉get后的那个单词}取值
int updateObject(@Param(“e”) Project entity);
mapper中使用#{e.对象get方法去掉get后的那个单词}取值
#12. 为什么返回JsonResult
/*
刷新整个project_list.jsp的一种写法(不推荐)
@RequestMapping("doValidById")
public String doValidById(Integer valid,
String ids){
projectService.validById(valid, ids);
return "redirect:listUI.do?t="+System.currentTimeMillis();
}
*/
@RequestMapping("doGetPageObjects")
@ResponseBody
public JsonResult doGetPageObjects(
String name,
Integer valid,
Integer pageCurrent){
log.info("name="+name);//乱码
log.info("valid="+valid);
log.info("pageCurrent="+pageCurrent);
Map<String,Object> map=
projectService.findPageObjects(
name,valid,pageCurrent);
log.info("map="+map);
return new JsonResult(map);//map对象转换为json串的表示形式如下
/*{
* state:1,
* message:"ok"
* data:
* {
"list":[{id:1,name:"环球游",...},{...}]
"pageObject":{pageCurrent:1,pageCount:2,...}
}
}
*/
#13. 客户端传的Json param 如何转为对象
/**
* name="东欧游"&code="..."&beginDate="..."
* spring 获得参数数据以后会对数据进行解析然后
* 调用project对象的setXXX方法将数据存储到project
* 对象.
*/
@RequestMapping("doSaveObject")
@ResponseBody
public JsonResult doSaveObject(Project entity){
projectService.saveObject(entity);
return new JsonResult("insert ok");
}