JavaWeb 综合案例 --- 黑马旅游网

注:前端页面都已经有了,这里只注重后端代码,以及前端动态内容显示部分。

案例目标:

1.注册功能 -(姓名、密码、邮箱....的校验)

 

2、登录功能

               

3、点击菜单的某一项,会显示相应内容

4、通过搜索框,可以搜索相关旅游线路

5、分页效果

6、显示旅游线路详细信息

7、收藏旅游线路

 

---------------------------------------------------------------------------------------------------------------------------

完成步骤、

一、创建数据库以及相关表

2、创建相关试题类 -- 由于需要分页效果,所以要额外创建分页的实体类

// 用户表
public class User implements Serializable {
    private int uid;//用户id
    private String username;//用户名,账号
    private String password;//密码
    private String name;//真实姓名
    private String birthday;//出生日期
    private String sex;//男或女
    private String telephone;//手机号
    private String email;//邮箱
    private String status;//激活状态,Y代表激活,N代表未激活
    private String code;//激活码(要求唯一)
// 商家表
public class Seller implements Serializable {
    private int sid;//商家id
    private String sname;//商家名称
    private String consphone;//商家电话
    private String address;//商家地址
// 旅游线路实体类
public class RouteImg implements Serializable {
    private int rgid;//商品图片id
    private int rid;//旅游商品id
    private String bigPic;//详情商品大图
    private String smallPic;//详情商品小图
// 旅游线路实体类
public class Route implements Serializable {

    private int rid;//线路id,必输
    private String rname;//线路名称,必输
    private double price;//价格,必输
    private String routeIntroduce;//线路介绍
    private String rflag;   //是否上架,必输,0代表没有上架,1代表是上架
    private String rdate;   //上架时间
    private String isThemeTour;//是否主题旅游,必输,0代表不是,1代表是
    private int count;//收藏数量
    private int cid;//所属分类,必输
    private String rimage;//缩略图
    private int sid;//所属商家
    private String sourceId;//抓取数据的来源id

    private Category category;//所属分类
    private Seller seller;//所属商家
    private List<RouteImg> routeImgList;//商品详情图片列表
// 封装相关返回前端信息的实体类-- 错误,错误信息
public class ResultInfo implements Serializable {
    private boolean flag;//后端返回结果正常为true,发生异常返回false
    private Object data;//后端返回结果数据对象
    private String errorMsg;//发生异常的错误消息
// 分页相关信息实体类
public class PageBean<T> {

	private int pageSize; // 每页显示条数
	private int totalCount; // 总记录数
	private int currentPage; // 当前页
	private int totalPage; // 总的页数
	private List<T> list;  // 相关页的数据
// 收藏相关实体类
public class Favorite implements Serializable {
    private Route route;//旅游线路对象
    private String date;//收藏时间
    private User user;//所属用户
// 分类的实体类
public class Category implements Serializable {

    private int cid;//分类id
    private String cname;//分类名称

3、注册相关校验以及后端代码

<script type="text/javascript">
	$(function() {
		$("#registerForm").submit(  // 当表单点击提交时
				function() {
					if (checkUserName() && checkPassword() && checkEmail()
							&& checkName() && checkTel() && checkDate()
							&& checkCode()) {  // 校验所有框内容是否正确,正确提交
						$.post("user/register", $(this).serialize(), function(
								data) {

							if (data.flag) {
						location.href = "register_ok.html"; // 注册成功,跳转到成功页面
							} else {
								$("#errMsg").html(data.errorMsg);
							}
						})
					}
					return false;
				})
		$("#username").blur(checkUserName); // 校验用户名 --当焦点离开该内容框时校验
		$("#password").blur(checkPassword);
		$("#email").blur(checkEmail);
		$("#name").blur(checkName);
		$("#telephone").blur(checkTel);
		$("#birthday").blur(checkDate);
		$("#check").blur(checkCode);
	})
	// 检验用户名
	function checkUserName() {
		var username = $("#username").val();
		var reg = /^\w{8,20}$/;// 正则表达式 -- 开头结尾都为字符 且在8-20位
		var flag = reg.test(username);
		if (flag) {
			$("#username").css("border", "1px solid green"); // 正确显示边框绿色
		} else {
			$("#username").css("border", "1px solid red"); // 否则红色
		}
		return flag;
	}
	// 校验密码
	function checkPassword() {
		var password = $("#password").val();
		var reg = /^\w{8,20}$/; 
		var flag = reg.test(password);
		if (flag) {
			$("#password").css("border", "1px solid green");
		} else {
			$("#password").css("border", "1px solid red");
		}
		return flag;
	}
	// 校验邮件
	function checkEmail() {
		var email = $("#email").val();
		var reg = /^\w+@\w+\.\w+$/;
		var flag = reg.test(email);
		if (flag) {
			$("#email").css("border", "1px solid green");
		} else {
			$("#email").css("border", "1px solid red");
		}
		return flag;
	}
	//校验姓名
	function checkName() {
		var name = $("#name").val();
		if (name != null && name != "") {
			$("#name").css("border", "1px solid green");
			return true;
		} else {
			$("#name").css("border", "1px solid red");
			return false;
		}
	}
	// 校验手机号
	function checkTel() {
		var telephone = $("#telephone").val();
		var reg = /^1([38]\d|5[0-35-9]|7[3678])\d{8}$/;
		var flag = reg.test(telephone);
		if (flag) {
			$("#telephone").css("border", "1px solid green");
		} else {
			$("#telephone").css("border", "1px solid red");
		}
		return flag;
	}
	//校验生日
	function checkDate() {
		var date = $("#birthday").val();
		if (date != null && date != "") {
			$("#birthday").css("border", "1px solid green");
			return true;
		} else {
			$("#birthday").css("border", "1px solid red");
			return false;
		}
	}
	// 校验验证码
	function checkCode() {
		var check = $("#check").val();
		if (check != null && check != "") {
			$("#check").css("border", "1px solid green");
			return true;
		} else {
			$("#check").css("border", "1px solid red");
			return false;
		}
	}
</script>
// servlet
@WebServlet("/regUserServlet")
public class RegUserServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 获取map类型 key - value 值
		Map<String, String[]> map = req.getParameterMap();
		// 创建user对象
		User u = new User();
		try {
			// beanutils 封装数据对象
			BeanUtils.populate(u, map);
		} catch (IllegalAccessException | InvocationTargetException e) {
			e.printStackTrace();
		}


		// 创建service对象
		RegUserService regService = new RegUserServiceImpl();
		// 调用service方法,进行注册
		boolean reg_flag = regService.regUser(u);
		// 创建结果信息对象,封装关于错误信息
		ResultInfo info = new ResultInfo();
		if (reg_flag) {
			// 注册成功
			info.setFlag(true);
		} else {
			info.setFlag(false);
			info.setErrorMsg("注册失败");
		}
		// 序列化结果信息对象,返回前台 -- 使用Jackson
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(info);
		// 返回 前台 设置 响应格式
		resp.setContentType("application/json;charset=utf-8");
		// 响应
		resp.getWriter().write(json);
	}
}
// service
public class RegUserServiceImpl implements RegUserService {

	RegUserDao userDao = new RegUserDaoImpl();

	/**
	 * 注册账户
	 */
	@Override
	public boolean regUser(User u) {
		// 判断该用户名是否已经被注册
		User user = userDao.findByUsername(u);
		// 被注册过,需要更改用户名,注册失败
		if (user != null) {
			return false;
		}
		// 注册成功,保存用户信息
		// 注册成功,发送一封邮件,告知激活
		// 获取激活码
		u.setCode(UuidUtil.getUuid());
		// 设置激活状态
		u.setStatus("N");
		userDao.saveUser(u);
		// 设置邮件正文
		String text = "点击此处激活<a href='http://localhost:8080/travel/user/activeUser?uuid=" + u.getCode()
				+ "'>XX旅游网</a>";
		MailUtils.sendMail(u.getEmail(), text, "激活邮件");
		return true;
	}

	/**
	 * 激活账户 -- 注册时会发一封邮件给用户,点击邮件后激活
	 */
	public boolean activeUser(String code) {
		User user = userDao.findByCode(code);
		if (user != null) {
			userDao.activeUser(user);
			return true;
		}
		return false;
	}

	/**
	 * 登录验证
	 */
	@Override
	public User login(User u) {
		User user = userDao.finByUsenameAndPassword(u);
		return user;
	}

}
package cn.itcast.travel.dao.impl;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import cn.itcast.travel.dao.RegUserDao;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.util.JDBCUtils;

public class RegUserDaoImpl implements RegUserDao {

	private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());

	/**
	 * 查询用户名是否存在 -- 用于显示登录后显示 登录者的名字
	 */
	@Override
	public User findByUsername(User u) {
		User user = null;
		try {
			String sql = " select * from tab_user where username = ?";
			user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), u.getUsername());
		} catch (Exception e) {

		}
		return user;
	}

	/**
	 * 保存用户注册信息
	 */
	@Override
	public void saveUser(User u) {
		String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email,status,code)values(?,?,?,?,?,?,?,?,?)";

		int index = template.update(sql, u.getUsername(), u.getPassword(), u.getName(), u.getBirthday(), u.getSex(),
				u.getTelephone(), u.getEmail(), u.getStatus(), u.getCode());

	}

	/**
	 * 查询该激活码账户是否存在 
	 * 
	 * @param code
	 * @return
	 */
	public User findByCode(String code) {
		User user = null;
		String sql = "select * from tab_user where code=?";
		try {
			user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), code);

		} catch (Exception e) {
			e.printStackTrace();
		}
		return user;
	}

	/**
	 * 激活账户
	 * 
	 * @param u
	 */
	public void activeUser(User u) {
		String sql = "update tab_user set status='Y' where uid=?";
		template.update(sql, u.getUid());
	}

	/**
	 * 登录验证,查询账户密码
	 */

	@Override
	public User finByUsenameAndPassword(User u) {
		User user = null;
		String sql = "select * from tab_user where username=? and password=?";
		try {
			user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), u.getUsername(),u.getPassword());
		} catch (Exception e) {
		}
		return user;
	}

}

4、登录相关校验


$(function() {
		$("#sub_btn").click(function() {
            // 异步请求,判断验证是否通过
			$.post("user/login", $("#loginForm").serialize(), function(data) {
				if (data.flag) {  //serialize() 方法通过序列化表单值,创建 URL 编码文本字符串。
				//	alert("登录成功")
					location.href = "index.html";
					return true;
				} else {
					$("#errorMsg").html(data.errorMsg);
					changeCheckCode(); // 错误,更换验证码
					return false;
				}
			})
		})
	})

5、显示分类菜单下的所有信息

	$(function() {
		var cid = getParameter("cid"); // cid -- 该分类的ID,通过ID查询相关分类下旅游线路
		var rname = getParameter("rname"); // rname - 用其进行模糊查询 - 搜索框内容
		
		if(rname){  // 需要解析中文发过来被加密  -rname 表示该分类下旅游线路的
			rname = window.decodeURIComponent(rname);
		}
		
		// ajax 请求,显示分页数据,刚进入页面,显示第一页数据
		load(cid,1,rname);
	});
	
	
	function load(cid,currentPage,rname){
		$.get("route/pageQuery",
				{cid : cid,
			currentPage:currentPage,
			rname:rname
				},
				function(data) {
               // 分页显示要求,导航每次显示10页,前五后四
					// 设置总页数,总记录数
					$("#totalPage").html(data.totalPage);
					$("#totalCount").html(data.totalCount);
					// 设置分页
					var preNum = currentPage-1;
					if(preNum<=0){
						preNum=1;
					}
					var fristPage = '<li onclick="javascript:load('+cid+',1,\''+rname+'\')"><a href="javascript:void(0);">首页</a></li>';
					var prePage = '<li class="threeword" onclick="javascript:load('+cid+','+preNum+',\''+rname+'\')"><a href="javascript:void(0);">上一页</a></li>';
					var lis = '';
					lis += fristPage;
					lis += prePage;
					
					var begin;
					var end;
					// 总页数不足10页
					if(data.totalPage<10){
						begin=1;
						end=data.totalPage;
					}else{
						// 总页数超过10页
						begin = data.currentPage-5;
						end = data.currentPage + 4;
						
						if(begin<1){
							begin=1;
							end = begin+9;
						}
						
						if(end>data.totalPage){
							end = data.totalPage;
							begin = end-9;
						}
					}
					

					for (var i = begin; i <= end; i++) {
						var li="";
						if(i==currentPage){
							li = '<li class="curPage" onclick="javascript:load('+cid+','+i+',\''+rname+'\')"><a href="javascript:void(0);">' + i + '</a></li>';
						}else{
							li = '<li onclick="javascript:load('+cid+','+i+',\''+rname+'\')"><a href="javascript:void(0);">' + i + '</a></li>';
							}
						lis += li;
					}
					
					
					var nextNum = currentPage+1;
					if(nextNum>=data.totalPage){
						nextNum=data.totalPage;
					}
					var lastPage = '<li class="threeword" onclick="javascript:load('+cid+','+data.totalPage+',\''+rname+'\')"><a href="javascript:void(0);">末页</a></li>';
					var nextPage = '<li class="threeword" onclick="javascript:load('+cid+','+nextNum+',\''+rname+'\')"><a href="javascript:void(0);">下一页</a></li>';
					lis += nextPage;
					lis += lastPage;
					$("#pageNum").html(lis);

					// 显示当前页数据

					// 获取json 中相关信息
					var infos = ""; // 通过拼接字符串,控制显示在页面内容
					for (var i = 0; i < data.list.length; i++) {
						var route = data.list[i];
						var info = '<li><div class="img" ><img src="'+route.rimage+'" style="width:299px"></div><div class="text1"><p>'+route.rname+'</p><br /><p>'+route.routeIntroduce+'</p></div><div class="price"><p class="price_num"<span>&yen;</span> <span>'+route.price+'</span> <span>起</span></p><p><a href="route_detail.html?rid='+route.rid+'">查看详情</a></p></div></li>'
						infos+=info;
					}
					$("#route_body").html(infos);
					// 控制每次刷新页面显示的位置
					window.scrollTo(0, 300);
					
				})
		
	}

6、显示该登录者名字以及分类数据展示

$(function() {
        // 登录者的名字
		$.get("user/findName", {}, function(data) {
			//alert(data)
			var msg = "欢迎回来," + data.name;
			$("#name_span").html(msg);
		});

		$.get("category/findAll", {}, function(data) {
            // 拼接分类数据,展示的一级菜单
			var lis = '<li class="nav-active"><a href="index.html">首页</a></li>'
			for (var i = 0; i < data.length; i++) {
				var li = '<li><a href="route_list.html?cid=' + data[i].cid + '">'
						+ data[i].cname + '</a></li>'
				lis += li;
			}
			lis += '<li><a href="favoriterank.html">收藏排行榜</a></li>';

			$("#category").html(lis)
      
			$("#search-button").click(function(){
				
				var cid = getParameter("cid");
				var rname = $("#search_input").val();
				
				location.href="http://localhost:8080/travel/route_list.html?cid="+cid+"&rname="+rname
				
			})
			
		})
	})

7、旅游线路详细信息

 $(document).ready(function() {
       goImg();
    });
	
    $(function(){
	    showMain();
	    isFavorite();
    })

// 设置图片相关操作
function goImg() {
	// 焦点图效果
	// 点击图片切换图片
	$('.little_img').on('mousemove', function() {
		$('.little_img').removeClass('cur_img');
		var big_pic = $(this).data('bigpic');
		$('.big_img').attr('src', big_pic);
		$(this).addClass('cur_img');
	});
	// 上下切换
	var picindex = 0;
	var nextindex = 4;
	$('.down_img').on('click', function() {
		var num = $('.little_img').length;
		if ((nextindex + 1) <= num) {
			$('.little_img:eq(' + picindex + ')').hide();
			$('.little_img:eq(' + nextindex + ')').show();
			picindex = picindex + 1;
			nextindex = nextindex + 1;
		}
	});
	$('.up_img').on('click', function() {
		var num = $('.little_img').length;
		if (picindex > 0) {
			$('.little_img:eq(' + (nextindex - 1) + ')').hide();
			$('.little_img:eq(' + (picindex - 1) + ')').show();
			picindex = picindex - 1;
			nextindex = nextindex - 1;
		}
	});
	// 自动播放
	// var timer = setInterval("auto_play()", 5000);
}
// 自动轮播方法
function auto_play() {
	var cur_index = $('.prosum_left dd').find('a.cur_img').index();
	cur_index = cur_index - 1;
	var num = $('.little_img').length;
	var max_index = 3;
	if ((num - 1) < 3) {
		max_index = num - 1;
	}
	if (cur_index < max_index) {
		var next_index = cur_index + 1;
		var big_pic = $('.little_img:eq(' + next_index + ')').data('bigpic');
		$('.little_img').removeClass('cur_img');
		$('.little_img:eq(' + next_index + ')').addClass('cur_img');
		$('.big_img').attr('src', big_pic);
	} else {
		var big_pic = $('.little_img:eq(0)').data('bigpic');
		$('.little_img').removeClass('cur_img');
		$('.little_img:eq(0)').addClass('cur_img');
		$('.big_img').attr('src', big_pic);
	}
}

// 设置添加收藏
function addFavorite() {
	var rid = getParameter("rid"); // rid 获取该旅游线路的ID
	$.get("user/findName",
					{},
					function(data) {
						if (data == null) {
							alert("请登录后执行此操作");
							location.href="http://localhost:8080/travel/login.html";
						} else {
							$.get("route/addFavorite",
											{
												rid : rid
											},
											function() {
												showMain();
												
												isFavorite();
												
											})

						}

					})

}


// 设置旅游线路详细页的信息
function showMain() {
	// 获取rid
	var rid = getParameter("rid");
	// 发送 ajax 请求
	$.get("route/findOne",
					{
						rid : rid
					},
					function(route) {
						// alert(route.rname);
						// 设置相应内容
						$("#rname").html(route.rname);
						$("#price").html("¥" + route.price);
						$("#routeIntroduce").html(route.routeIntroduce);
						$("#sname").html(route.seller.sname);
						$("#consphone").html(route.seller.consphone);
						$("#address").html(route.seller.address);
						$("#counts").html("已收藏" + route.count + "次")
						// 设置图片轮播

						var bigImg = '<img alt="" class="big_img" src="'
								+ route.routeImgList[0].bigPic + '">';
						$("#BigImg").html(bigImg);

						var ddStr = '   <a class="up_img up_img_disable"></a>';

						for (var i = 0; i < route.routeImgList.length; i++) {
							var aStr;
							if (i >= 4) {
								aStr = '<a title="" class="little_img" data-bigpic="'
										+ route.routeImgList[i].bigPic
										+ '" style="display:none;"><img src="'
										+ route.routeImgList[i].smallPic
										+ '"></a>'

							} else {
								aStr = '<a title="" class="little_img" data-bigpic="'
										+ route.routeImgList[i].bigPic
										+ '" "><img src="'
										+ route.routeImgList[i].smallPic
										+ '"></a>'
							}
							ddStr += aStr;
						}
						ddStr += '<a class="down_img down_img_disable" style="margin-bottom: 0;"></a>';
						$("#dd").html(ddStr);
						goImg();
					})
}
// 查询是否被收藏
function isFavorite() {
	// 如果已经收藏了,需要添加 already 以及disabled
	// class="btn already" disabled="disabled"
	var rid = getParameter("rid");
	$.get("route/isFavorite", {
		rid : rid
	}, function(data) {
		if (data) {
			$("#btn").addClass("already");
			$("#btn").attr("disabled", "disabled");
			$("#btn").removeAttr("onclick");
		} else {

		}
	})
}

8、通过BaseServlet,抽取其他servlet方法,写在一个servlet中

// BaseServlet

public class BaseServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 获取请求的uri
		String uri = req.getRequestURI();
		// 截取请求方法名称
		String methodStr = uri.substring(uri.lastIndexOf("/") + 1);
		// System.out.println(methodStr);
		try {
			// 获取方法
			Method method = this.getClass().getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);
			// 执行方法 通过反射
			method.invoke(this, req, resp);

		} catch (NoSuchMethodException | SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 将对象转换为json ,并响应
	 * 
	 * @param obj
	 * @param resp
	 * @throws IOException
	 */
	public void writeValue(Object obj, HttpServletResponse resp) {

		ObjectMapper mapper = new ObjectMapper();
		String json;
		try {
			json = mapper.writeValueAsString(obj);
			resp.setContentType("application/json;charset=utf-8");
			resp.getWriter().write(json);
		} catch (JsonProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

/**
 * 主要功能 -- 激活用户,登录、退出用户、注册、查询用户名字
 */
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {

	/**
	 * 激活用户
	 * 
	 * @param req
	 * @param resp
	 * @throws IOException
	 */
	public void activeUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		// 获取激活码
		String uuid = req.getParameter("uuid");
		String msg = null;
		if (uuid != null) {
			RegUserService us = new RegUserServiceImpl();
			boolean flag = us.activeUser(uuid);
			if (flag) {
				msg = "激活成功,点击<a href='/travel/login.html'>登录</a>";
			} else {
				msg = "激活失败,请联系管理员";
			}
		} else {
			msg = "激活码出错,请联系管理员";
		}
		resp.setContentType("text/html;charset=utf-8");
		resp.getWriter().write(msg);
	}

	/**
	 * 退出登录
	 * 
	 * @param req
	 * @param resp
	 * @throws IOException
	 */
	public void exitUser(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		HttpSession session = req.getSession();
		session.invalidate();
		resp.sendRedirect(req.getContextPath() + "/login.html");
	}

	/**
	 * 查询用户名字
	 * 
	 * @param req
	 * @param resp
	 * @throws IOException
	 */
	public void findName(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		// 获取User对象
		User user = (User) req.getSession().getAttribute("user");
		// 转换为json
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(user);
		resp.setContentType("application/json;charset=utf-8");
		resp.getWriter().write(json);
	}

	/**
	 * 登录
	 * 
	 * @param req
	 * @param resp
	 * @throws IOException
	 */
	public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		// 验证码 验证,如果验证码错误 直接返回
		// 获取用户输入验证码
		String userCode = req.getParameter("check");
		// 获取正确验证码
		Object sysCode = req.getSession().getAttribute("CHECKCODE_SERVER");
		// 移除session中的验证码,无论正确与否,此验证码已经失效,需要重新生成
		req.getSession().removeAttribute("CHECKCODE_SERVER");
		// System.out.println(userCode + " " + sysCode);
		// 比较
		// System.out.println(sysCode + ":" + userCode);
		if (userCode == null || !userCode.equalsIgnoreCase((String) sysCode)) {
			// System.out.println("验证码错误");
			ResultInfo info = new ResultInfo();
			info.setFlag(false);
			info.setErrorMsg("验证码错误");
			ObjectMapper mapper = new ObjectMapper();
			String json = mapper.writeValueAsString(info);
			// System.out.println(json);
			resp.setContentType("application/json;charset=utf-8");
			resp.getWriter().write(json);
			return;
		}

		/******************* 验证用户信息 *********************************************************************/
		// 获取用户提交信息
		Map<String, String[]> map = req.getParameterMap();
		User user = new User();
		// 封装到User 对象中
		try {
			BeanUtils.populate(user, map);
		} catch (IllegalAccessException | InvocationTargetException e) {
			e.printStackTrace();
		}

		RegUserService ls = new RegUserServiceImpl();
		User u = ls.login(user);
		// 创建结果信息对象
		ResultInfo info = new ResultInfo();
		if (u == null) {
			info.setFlag(false);
			info.setErrorMsg("用户名或密码错误,请重试");
		} else if (u.getStatus().equals("N")) {
			info.setFlag(false);
			info.setErrorMsg("用户未激活,请激活账户后登录");
		} else {
			info.setFlag(true);
			req.getSession().setAttribute("user", u);
		}
		// 使用Jackson序列化info为json对象
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(info);
		// 设置响应编码格式
		resp.setContentType("application/json;charset=utf-8");
		resp.getWriter().write(json);
	}

	/**
	 * 注册
	 * 
	 * @param req
	 * @param resp
	 * @throws IOException
	 */
	public void register(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		// 获取map类型 key - value 值
		Map<String, String[]> map = req.getParameterMap();
		// 创建user对象
		User u = new User();
		try {
			// beanutils 封装数据对象
			BeanUtils.populate(u, map);
		} catch (IllegalAccessException | InvocationTargetException e) {
			e.printStackTrace();
		}

		// System.out.println(u);

		// 创建service对象
		RegUserService regService = new RegUserServiceImpl();
		// 调用service方法,进行注册
		boolean reg_flag = regService.regUser(u);
		// 创建结果信息对象,封装关于错误信息
		ResultInfo info = new ResultInfo();
		if (reg_flag) {
			// 注册成功
			info.setFlag(true);
		} else {
			info.setFlag(false);
			info.setErrorMsg("注册失败");
		}
		// 序列化结果信息对象,返回前台 -- 使用Jackson
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(info);
		// 返回 前台 设置 响应格式
		resp.setContentType("application/json;charset=utf-8");
		// 响应
		resp.getWriter().write(json);
	}

}
/**
 * 主要功能 -- 查询分页信息、旅游线路收藏信息
 */
@WebServlet("/route/*")
public class RouteServlet extends BaseServlet {
	private RouteService rs = new RouteServiceImpl();
	private FavoriteService fs = new FavoriteServiceImpl();

	/**
	 * 分页信息,查询相关分页的信息
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	public void pageQuery(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		String pageSizeStr = req.getParameter("pageSize");
		String currentPageStr = req.getParameter("currentPage");
		String cidStr = req.getParameter("cid");
		String rname = req.getParameter("rname");

		int pageSize = 0;
		if (pageSizeStr != null && pageSizeStr.length() > 0) {
			pageSize = Integer.parseInt(pageSizeStr);
		} else {
			pageSize = 5;
		}

		int currentPage = 0;
		if (currentPageStr != null && currentPageStr.length() > 0) {
			currentPage = Integer.parseInt(currentPageStr);
		} else {
			currentPage = 1;
		}

		int cid = 0;
		if (cidStr != null && cidStr.length() > 0 && !"null".equals(cidStr)) {
			cid = Integer.parseInt(cidStr);
		}
		// 查询pageBean相关信息
		PageBean<Route> bean = rs.pageQuery(cid, currentPage, pageSize, rname);

		writeValue(bean, resp);

	}
	
	/**
	 * 查询单个旅游线路详细信息
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	public void findOne(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 接收 rid 参数
		String ridStr = req.getParameter("rid");
		// 调用service方法查询route对象
		Route route = rs.findOne(Integer.parseInt(ridStr));
		// 响应回前端页面
		writeValue(route, resp);
	}
	/**
	 * 判断旅游线路是否被收藏
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	public void isFavorite(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		User user = (User) req.getSession().getAttribute("user");
		String ridStr = req.getParameter("rid");
		int uid=0;
		if (user == null) {
			uid = 0;
		} else {
			uid = user.getUid();
		}
		//System.out.println(ridStr + ":" + uid);
		boolean flag = fs.isFavorite(Integer.parseInt(ridStr), uid);
		writeValue(flag, resp);
	}
	/**
	 * 添加收藏线路
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	public void addFavorite(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		User user = (User) req.getSession().getAttribute("user");
		String ridStr = req.getParameter("rid");
		int uid=0;
		if (user == null) {
			return ;
		} else {
			uid = user.getUid();
		}
		fs.addFavorite(Integer.parseInt(ridStr), user.getUid());
	}
}

9、细节

1、在分类数据,由于不会轻易改变、故采用redis数据库提升访问性能。

2、所有页面数据显示均采用ajax异步刷新。

3、service、dao层未记录。

4、@WebServlet("/user/*") ,servlet继承baseservlet 这样写的话,如果请求('user/方法名')即可找到改方法。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值