1.注册、登录、退出
在此使用ajax异步提交表单数据,是为了获取服务器的数据,因为我们前台使用的是html作为视图层,不能够直接从servlet相关的域对象获取值,只能通过ajax获取响应数据
传统同步提交方式
/** * 校验逻辑 */ $(function () { // 当表单提交时,去调用所有的校验方法 $("#registerForm").submit(function () { //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交 return checkUsername() && checkPassword() && checkEmail() && checkCheck() && checkBirthday() && checkTelephone(); }); // 当某个组件鼠标失去焦点时,去调用校验方法 失去焦点 blur方法,内赋值方法名即可 $("#username").blur(checkUsername); $("#password").blur(checkPassword); $("#email").blur(checkEmail); $("#birthday").blur(checkBirthday); $("#telephone").blur(checkTelephone); $("#check").blur(checkCheck); })
ajax提交方式
/** * 校验逻辑 */ $(function () { // 当表单提交时,去调用所有的校验方法 $("#registerForm").submit(function () { //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交 // return checkUsername() && checkPassword() && checkEmail() && checkCheck() && checkBirthday() && checkTelephone(); //异步修改 ///1.异步第一步:发送数据到服务器 if (checkUsername() && checkPassword() && checkEmail() && checkCheck() && checkBirthday() && checkTelephone()){ $.post("registUserServlet",$(this).serialize(),function (data) { //2.异步第二步:处理服务器响应的数据 data }) } //2. 跳转页面 return false; }); // 当某个组件鼠标失去焦点时,去调用校验方法 失去焦点 blur方法,内赋值方法名即可 $("#username").blur(checkUsername); $("#password").blur(checkPassword); $("#email").blur(checkEmail); $("#birthday").blur(checkBirthday); $("#telephone").blur(checkTelephone); $("#check").blur(checkCheck); })
用户邮件激活工作,分为发送邮件和激活操作,其中发送邮件可以在保存用户的下面进行发送邮件信息,而激活操作可以在用户进行相关操作
考虑到我们的项目servlet文件较多,因此我们有必要一个功能一个servlet优化为一个模块一个servlet,相当于一个表格一个serlvet。在serlvet中,提供不同的方法来完成用户的请求。简单的说,就是模仿userserviceImpl来实现方法分解。
切记,这个baseServlet是在userServlet中调用,因此baseservlet中的service中的this,指的是userServlet或者cateGooryServlet。
//@WebServlet("/baseServlet") 不需要被访问到 public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.进行方法的分发 //1.1 获取请求路径 String requestURI = req.getRequestURI(); System.out.println("请求uri: "+requestURI);///travel/UserServlet/add //1.2 获取方法名称 String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1); System.out.println("方法名称methodName: "+methodName);//方法名称methodName: add //1.3 获取方法对象method 此处this是谁调用,那是userServlet调用 try { Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); //1.4 执行方法 Object invoke = method.invoke(this, req, resp); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } @WebServlet("/UserServlet/*") public class UserServlet extends BaseServlet { protected void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void find(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
也就是baseServlet中的service获取前端请求的路径,获取方法名称,字节码文件获取方法对象,再通过invoke执行方法.当然要么暴力反射(会把其他私有也获取到,非常的危险,我们只要需要的即可),要买约束前面为public方法
package cn.itcast.travel.web.servlet; import cn.itcast.travel.domain.ResultInfo; import cn.itcast.travel.domain.User; import cn.itcast.travel.service.UserService; import cn.itcast.travel.service.impl.UserServiceImpl; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.beanutils.BeanUtils; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Map; @WebServlet("/user/*") public class UserServlet extends BaseServlet { /** * 声明userService的业务对象 */ private UserService userService = new UserServiceImpl(); /** *注册功能 * @param request * @param response */ public void regist(HttpServletRequest request, HttpServletResponse response) { try { //补充验证码操作,regist中验证码的name是 check,切记html页面中组件必须定义name,才能提交,便于后面获取 String checkCode = request.getParameter("check"); //从session中获取验证码 HttpSession session = request.getSession(); String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");//我们很清楚它是字符串,因此进行类型强转 //清楚session,保证验证码不能重复使用,比方说回退,为何会如此呢,因为异步提交,可能出现验证码不能及时生成,所以必须清除 session.removeAttribute("CHECKCODE_SERVER"); //比较 if (checkcode_server==null || !checkcode_server.equalsIgnoreCase(checkCode)){ //验证码错误 ResultInfo resultInfo = new ResultInfo(); resultInfo.setFlag(false); resultInfo.setErrorMsg("验证码错误"); //4.1将info对象序列化转为json,json的核心对象是ObjectMapper ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(resultInfo); //4.2设置响应头contentType response.setContentType("application/json;charset=utf-8"); response.getWriter().write(json);//写回客户端 return ; } //1.获取数据 Map<String, String[]> map = request.getParameterMap(); //2.封装对象 User user = new User(); BeanUtils.populate(user,map); //3.调用service完成注册 boolean flag=userService.regist(user); //4.根据service的返回,提示信息 //4.1将信息封装为resultInfo返回 ResultInfo resultInfo = new ResultInfo(); if (flag){ //注册成功 resultInfo.setFlag(true); }else { //注册失败 resultInfo.setFlag(false); resultInfo.setErrorMsg("用户名存在,请重新录入"); } //4.1将info对象序列化转为json,json的核心对象是ObjectMapper ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(resultInfo); //4.2设置响应头contentType response.setContentType("application/json;charset=utf-8"); response.getWriter().write(json);//写回客户端 } catch (Exception e) { e.printStackTrace(); } } /** * 登录功能 * @param request * @param response * @throws IOException */ public void login(HttpServletRequest request, HttpServletResponse response) throws IOException { try { //1.获取用户名密码 Map<String, String[]> parameterMap = request.getParameterMap(); //2.封装user对象 User user = new User(); //2.1开始封装 BeanUtils.populate(user,parameterMap); //3 调用service查询 User userInfo = userService.login(user); //4.封装结果集对象 ResultInfo resultInfo = new ResultInfo(); if (userInfo==null){ resultInfo.setFlag(false); resultInfo.setErrorMsg("用户名或密码错误"); }else if(userInfo!=null && !"Y".equals(userInfo.getStatus())){ resultInfo.setFlag(false); resultInfo.setErrorMsg("您尚未激活,请激活"); }else if (userInfo!=null && "Y".equals(userInfo.getStatus())){ request.getSession().setAttribute("user",userInfo); resultInfo.setFlag(true); } ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8"); mapper.writeValue(response.getOutputStream(),userInfo); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } /** * 查询用户功能 * @param request * @param response * @throws IOException */ public void find(HttpServletRequest request, HttpServletResponse response) throws IOException { // 从session中获取user信息 Object user = request.getSession().getAttribute("user"); // 将user返回给客户端 ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8"); mapper.writeValue(response.getOutputStream(),user); } /** * 退出功能 * @param request * @param response * @throws IOException */ public void exit(HttpServletRequest request, HttpServletResponse response) throws IOException { //1.销毁session request.getSession().invalidate(); //跳转页面 response.sendRedirect("login.html"); } /** * 激活功能 * @param request * @param response * @throws IOException */ public void active(HttpServletRequest request, HttpServletResponse response) throws IOException { //1.获取激活码 String code = request.getParameter("code"); if (code!=null){ UserService userService = new UserServiceImpl(); boolean flag= userService.active(code); String msg=null; //判断标记 if (flag){ msg="激活成功,请<a href='login.html'>登录</a>"; }else { msg="激活失败,请联系管理员"; } response.setContentType("text/html;charset=utf-8"); response.getWriter().write(msg); } } }
2.分类数据与分页数据
分类数据的缓存优化
缓存优化前
public class CategoryServiceImpl implements CategoryService { //定义一个类的实现类对象 private CategoryDao categoryDao = new CategoryDaoImpl(); /** * 查询所有的方法 * @return */ @Override public List<Category> findAll() { return categoryDao.findAll(); } }
缓存优化后-此处不为空是考虑到返回类型一致化,将set数据存入list中
/** * 查询所有的方法 * @return */ @Override public List<Category> findAll() { //1.redis中查询 Jedis jedis = JedisUtil.getJedis(); Set<String> categorys = jedis.zrange("category", 0, -1);//查询所有,首次肯定是空 List<Category> categoryList =null; //2.判断查询的集合是否为空 if (categorys==null || categorys.size()==0){ //3.如果为空,需从数据库查询,在将数据存入redis categoryList = categoryDao.findAll(); for (int i = 0; i < categoryList.size(); i++) { jedis.zadd("category", categoryList.get(i).getCid(), categoryList.get(i).getCname());//存储 } }else { //4.如果不为空,将 categoryList=new ArrayList<Category>(); for (String name : categorys) { Category category=new Category(); category.setCname(name); categoryList.add(category); } } return categoryList; }
旅游 线路分类展示。,旅游线路在tab-route中,而分类在tab-category中,两表有一定的关系。也就是说旅游线路与分类表是多对一关系,将来我们要去线路表中查不同分类如何查呢
select * from tab_route where cid= ? ;这个cid是点击页面时候,携带过来的
3. 旅游线路查询
4.旅游线路收藏