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



posted @ 2021-02-23 16:19  芒果侠  阅读(146)  评论(0编辑  收藏  举报