黑马旅游网前台
1、显示用到的异步提交技术
1.1 ajax异步提交技术
1.1.1 语法
$.post("请求路径",{请求参数(json格式),回调函数})
关于请求参数的设置:
如果是提交整个表单,在jauery中提供了一个序列化方法serialize()
eg:$(juery对象).serialize()
2、后台相关处理
2.1 关于baseServlet
2.1.1servlet的方法转发(baseServlet)
/**
* @description:方法的转发执行
* @param req
* @param resp
* @return: void
* @author: Sw_Ljb
* @time: 2022/5/29 上午10:44
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//第一步获取请求路径
String uri = req.getRequestURI();
//第二部获取请求路径的方法m名
String methodName = uri.substring(uri.lastIndexOf('/' )+ 1);
//获取方法对象==》通过反射==》this关键字==》谁调用我 我代表谁
System.out.println(methodName);
try {
Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//暴力破解访问权限问题 但是这对于我们想要保护的方法里 因此我们在类中修改方法的修饰符
//执行
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
2.1.2servlet将后台要返回给前台的数据序列化为json
采用jackson包中的ObjectMapper()对象中的writeValue方法
//序列化方法
public void writerValue(Object obj,HttpServletResponse resp) throws IOException {
ObjectMapper mapper = new ObjectMapper();
resp.setContentType("application/json;charset=utf-8");
mapper.writeValue(resp.getWriter(),obj);
}
public String writerValueToString(Object obj,HttpServletResponse resp) throws IOException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(obj);
}
2.2 关于其他向外暴露的servlet全部继承baseServlet
2.2.1 关于路径的配置
在@WebServlet(“/自定义目录/*”):/*是匹配自定义目录下的所有
2.2.2 关于方法修饰符与方法名
修饰符:由于继承了baseServlet,而在这之中,需要获取方法名,如果加上权限修饰符,就会导致外部类 无法访问到该方法,如果必须访问 就需要在反射中暴力破解 (decare方法与set....(true)),但是显然这是不合理的(在该类中 不想被外部访问的方法 在暴力破解后 也会被访问到) 因此最好的解决方法是将方法修饰符改为public ;
方法名:关于方法名最好的这个方法要干的事来起(在自定义目录下唯一)
2.2.3 关于方法提中的具体操作顺序
1、获取参数
2、处理参数
3、封装数据(封装到莫一个对象中(如果闯过来的json数据都属于一个对象))
4、调用相应service进行处理
5、将service进行处理后的数据序列化为json格式 返回给前台
3.关于前后台联动的分页查询
分析:显而易见、分页查询涉及的部分参数,是需要前台通过异步请求的方式提交给后台的,这部分参数包括:pageSize(每页最多显示条数),currentPage(当前页码);前台将二者传递给后台,后台对二者进行处理(判空(空字符串)给默认值)。将前台传过来的参数方法放到相应service参数中,在service中的对应方法,该方法的方返回值为一个pageBean对象,
这个对象由
private int totalCount;//总记录数
private int totalPage;//总页面
private int currentPage;//当前页面
private int pageSize;//页面吸显示条数
private List list;//每页的数据集合
属性,在方法中分别对以上属性进行set方法设置值 缺啥就去数据库中用sql语法去查询,注意在查询每页的数据集合的sql语法中涉及一个limit ?,?语法 第一个问号是指起始序号(从0开始)后一个是大小
关于起始序号计算公式:(current -1)*pageSize
pageBean
package com.project.travelbg.domain;
import java.util.List;
/**
* @description:分类查询 基础类
* @author: Sw_Ljb
* @PACKAGE_NAME:cn.itcast.travel.domain
* @time: 2022/5/29 下午6:27
* @version: 1.0
*/
public class PageBean<T> {
private int totalCount;//总记录数
private int totalPage;//总页面
private int currentPage;//当前页面
private int pageSize;//页面吸显示条数
private List<T> list;//每页的数据集合
public PageBean() {
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
分页查询方法
/**
* 分页查询
* @param currentpage
* @param pageSize
* @param uid
* @return
*/
@Override
public PageBean<FavoritePro> pageQueryFavorite(int currentpage, int pageSize,int uid) {
PageBean<FavoritePro> pageBean = new PageBean<>();
//设置当前页面
pageBean.setCurrentPage(currentpage);
//设置页面大小
pageBean.setPageSize(pageSize);
//获取总条目
int totalCount = favoriteProDAO.findAllFavorites(uid);
//设置总条目
pageBean.setTotalCount(totalCount);
//获取总页码
int totalPage=totalCount%pageSize==0?totalCount/pageSize:(totalCount/pageSize+1);
//设置总页码
pageBean.setTotalPage(totalPage);
int start=(currentpage-1)*pageSize;
//获取route的list集合
List<FavoritePro> collectRouteList = favoriteProDAO.findCollectRoutes(start,pageSize,uid);
List<FavoritePro> favoriteProList = new ArrayList<>();
for (FavoritePro favoritePro : collectRouteList) {
Route route = routeDAO.selectOneRouteByRid(favoritePro.getRid());
favoritePro.setRoute(route);
favoriteProList.add(favoritePro);
}
//设置所有
pageBean.setList(favoriteProList);
return pageBean;
}
4.关于前后台联动的模糊查询
分析:模糊查询主要设置对前台传过来的数据进行判空处理,以及在sql语法的拼接操作
项目下载:(需要自建表)
「travel」https://www.aliyundrive.com/s/zemnFHis2z3 提取码: 3b0k
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。