异步提交表单
后台获取并处理数据
将数据封装为map
Map<String, String[]> map = req.getParameterMap();
封装对象,将map封装为user对象
BeanUtils.populate(user,map)
将注册结果序列化为json,利用Jackson中的ObjectMapper对象
// 将结果序列化为json返回
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(resultInfo);
// resp.getOutputStream().write(json.getBytes());
resp.setContentType("application/json;charset=utf-8");
resp.getWriter().write(json);
如上图在返回json数据时一定要加上setContentType,否则中文将会返回失败,为undefined
使用BeanPropertyRowMapper进行封装的时候,若查询结果为null会报异常。需要进行捕获,才能正常执行
邮件激活部分
获取授权码
servlet抽取分发请求
- 创建BaseServlet继承HttpServlet
- 创建UserServlet继承BaseServlet
-在base中通过反射执行方法,注意user中的方法必须为public才能被反射到,否则需要暴力反射
缓存优化(分类Category的数据在每一次加载后,都会重新请求数据库进行加载,对数据库压力较大。并且该数据不会经常发生变化,可以使用redis来进行缓存优化);
旅游线路的分页展示_类别id传递
Set<Tuple> categorys = jedis.zrangeWithScores("category", 0, -1);
线路查询的参数传递
给搜索框绑定click事件,通过跳转至route_List.heml页查询
$("#search_btn").click(function () {
//获取要搜索的内容
var ranme = $("#route_search").val();
//获取cid
var cid = getParameter("cid");
if (cid != null){
location.href = "http://localhost/travel/route_list.html?cid=" + cid + "&rname=" + ranme;
}else {
location.href = "http://localhost/travel/route_list.html?rname=" + ranme;
}
});
在servlet中获取rname,rname为中文将会出现乱码需要转码
if (rname != null && rname.length() > 0){
rname = new String(rname.getBytes("iso-8859-1"), "utf-8");
}
更改dao代码
通过StringBuilder构成sql
将所有查询的参数放入Arrays中
public List<Route> findByPage(int cid, int start, int pageSize, String rname) {
//定义sql模板
StringBuilder sql = new StringBuilder("select * from tab_route where 1=1");
//判断cid, rname分别是否存在
//存储参数
List<Object> params = new ArrayList<>();
if (cid != 0){
sql.append(" and cid = ?");
params.add(cid);
}
if (rname != null && rname.length() > 0){
sql.append(" and rname like ?");
params.add("%"+rname+"%");
}
params.add(start);
params.add(pageSize);
sql.append(" limit ? , ?");
try {
return template.query(sql.toString(), new BeanPropertyRowMapper<Route>(Route.class), params.toArray());
} catch (Exception e) {
}
return null;
}
分页功能实
页码分页
通过servlet返回的参数获取页码总数
$("#totalPage").html(pb.totalPage);
设置每次分页开始和结束的页码
//将页码分页
var begin = currentPage - 5;
var end = currentPage + 5;
if(begin < 0){
begin = 0;
}
if (currentPage <= 4){
end = begin + 10;
}
if (end > pb.totalPage){
end = pb.totalPage;
}
``
点击页码时,判断点击的是否为当前页,需要给本页页码加上特定的样式