本文主要是介绍JavaWeb 综合案例 --- 黑马旅游网,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
注:前端页面都已经有了,这里只注重后端代码,以及前端动态内容显示部分。
案例目标:
1.注册功能 -(姓名、密码、邮箱....的校验)
2、登录功能
3、点击菜单的某一项,会显示相应内容
4、通过搜索框,可以搜索相关旅游线路
5、分页效果
6、显示旅游线路详细信息
7、收藏旅游线路
---------------------------------------------------------------------------------------------------------------------------
完成步骤、
一、创建数据库以及相关表
2、创建相关试题类 -- 由于需要分页效果,所以要额外创建分页的实体类
// 用户表
public class User implements Serializable {private int uid;//用户idprivate 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;//商家idprivate String sname;//商家名称private String consphone;//商家电话private String address;//商家地址
// 旅游线路实体类
public class RouteImg implements Serializable {private int rgid;//商品图片idprivate int rid;//旅游商品idprivate 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;//抓取数据的来源idprivate Category category;//所属分类private Seller seller;//所属商家private List<RouteImg> routeImgList;//商品详情图片列表
// 封装相关返回前端信息的实体类-- 错误,错误信息
public class ResultInfo implements Serializable {private boolean flag;//后端返回结果正常为true,发生异常返回falseprivate 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;//分类idprivate 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 {@Overrideprotected 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("注册失败");}// 序列化结果信息对象,返回前台 -- 使用JacksonObjectMapper 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();/*** 注册账户*/@Overridepublic 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;}/*** 登录验证*/@Overridepublic 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());/*** 查询用户名是否存在 -- 用于显示登录后显示 登录者的名字*/@Overridepublic 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;}/*** 保存用户注册信息*/@Overridepublic 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());}/*** 登录验证,查询账户密码*/@Overridepublic 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>¥</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() {// 获取ridvar 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中
// BaseServletpublic class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求的uriString 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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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");// 转换为jsonObjectMapper 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("注册失败");}// 序列化结果信息对象,返回前台 -- 使用JacksonObjectMapper 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/方法名')即可找到改方法。
这篇关于JavaWeb 综合案例 --- 黑马旅游网的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!