zoukankan      html  css  js  c++  java
  • Java18-黑马旅游网学习制作

    1.注册、登录、退出

    image

    image

    在此使用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);
    	})


    用户邮件激活工作,分为发送邮件和激活操作,其中发送邮件可以在保存用户的下面进行发送邮件信息,而激活操作可以在用户进行相关操作

    image




    image

          考虑到我们的项目servlet文件较多,因此我们有必要一个功能一个servlet优化为一个模块一个servlet,相当于一个表格一个serlvet。在serlvet中,提供不同的方法来完成用户的请求。简单的说,就是模仿userserviceImpl来实现方法分解。

    image

    image

           切记,这个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.分类数据与分页数据

    image

    image


    分类数据的缓存优化

    image

    image


    缓存优化前


    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.旅游线路收藏



  • 相关阅读:
    CODE[VS] 2506 可恶的体育老师
    CODE[VS] 3411 洪水
    CODE[VS] 2692 小明过生日
    CODE[VS] 2291 糖果堆
    CODE[VS] 2008 你已经爱我多久了
    忽然之间
    Amazing grace 奇异恩典
    无处安放
    AC日记
    AC日记
  • 原文地址:https://www.cnblogs.com/rango0550/p/14436679.html
Copyright © 2011-2022 走看看