注:前端页面都已经有了,这里只注重后端代码,以及前端动态内容显示部分。
案例目标:
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>¥</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/方法名')即可找到改方法。