基于javaweb+mysql的jsp+servlet电影票售票管理系统(java+jsp+servlet+javabean+mysql)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
后台:管理用户、影片、排片、影厅、订单、影评等
前台:注册登录、查看排片、详情,选座、购票等
后台
前台
技术框架
JSP Servlet MySQL C3P0 DBUtil Tomcat JavaScript CSS
基于javaweb+mysql的JSP+Servlet电影票售票管理系统(java+jsp+servlet+javabean+mysql)
ticket.ticketCount = ticket.seats.size();
ticket.price = String.format("%.2f", plan.price);
ticket.totalPrice = String.format("%.2f", order.amount);
//根据当前时间对比放映时间,判断订单状态
long currentTime = System.currentTimeMillis();
if (currentTime < plan.play_time) {
ticket.state = "待放映";
} else if (currentTime > plan.play_time && currentTime < plan.play_time + movie.duration * 60000) {
ticket.state = "正在放映";
} else {
ticket.state = "已放映";
}
return ticket;
}
}
return null;
}
private void forwardToOrderJsp(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = (User) req.getSession().getAttribute("user");
req.setAttribute("tickets", getTicketList(String.valueOf(user.id)));
req.setAttribute("chkItem", 2);
req.getRequestDispatcher("/tickets.jsp").forward(req, resp);
}
}
/**
* 描述: 写影评
*/
@WebServlet(urlPatterns = "/evaluate")
public class WriteEvaluateServlet extends BaseServlet {
private static final long serialVersionUID = -3514964050010797273L;
private EvaluateService evaluateService = BaseFactory.getService(EvaluateService.class);
private MoviceService moviceService = BaseFactory.getService(MoviceService.class);
//查询这个座位是否正确
String[] rc = key.split("_");
if (hall.rows >= Integer.valueOf(rc[0]) && hall.columns >= Integer.valueOf(rc[1])) {
if (count == 0) {
sb.append("|");
}
sb.append(key);
sb.append("|");
count++;
} else {
throw new MyException("选座失败,座位号与实际不符,请重新选座。");
}
}
}
if (sb.length() == 0) {
throw new MyException("请选择座位。");
}
order.seat = sb.toString();
order.amount = Math.floor(plan.price * count * 100) / 100;
} catch (MyException e) {
req.setAttribute("failed", e.getMessage());
req.setAttribute("session", session);
req.setAttribute("title", String.format("%s(%s)", plan.movie_name, DateUtils.formatDate(plan.play_time, "yyyy-MM-dd HH:mm")));
req.getRequestDispatcher("/seat.jsp").forward(req, resp);
return;
}
//选座成功
req.setAttribute("order", order);
req.setAttribute("session", session);
req.setAttribute("title", String.format("%s(%s)", plan.movie_name, DateUtils.formatDate(plan.play_time, "yyyy-MM-dd HH:mm")));
req.getRequestDispatcher("/seat.jsp").forward(req, resp);
return;
}
}
}
resp.sendRedirect(req.getContextPath() + "/");
}
}
if (plan != null) {
Hall hall = hallService.queryByName(plan.hall_name);
if (hall != null) {
List<List<Seat>> rowSeats = new ArrayList<>();
for (int i = 1; i <= hall.rows; i++) {
List<Seat> seats = new ArrayList<>();
for (int j = 1; j <= hall.columns; j++) {
Seat seat = new Seat();
seat.seat = i + "_" + j;
seat.sold = orderService.isSeatSold(String.valueOf(plan.id), seat.seat);
seats.add(seat);
}
rowSeats.add(seats);
}
req.setAttribute("price", plan.price);
req.setAttribute("session", session);
req.setAttribute("seats", rowSeats);
req.setAttribute("title", String.format("%s(%s %s)", plan.movie_name, hall.type, DateUtils.formatDate(plan.play_time, "yyyy-MM-dd HH:mm")));
req.getRequestDispatcher("/seat.jsp").forward(req, resp);
} else {
resp.sendRedirect(req.getContextPath() + "/");
}
} else {
resp.sendRedirect(req.getContextPath() + "/");
}
}
}
}
@WebServlet(urlPatterns = "/code")
public class ValicateImgServlet extends HttpServlet {
private static final long serialVersionUID = -8609971128908819964L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setIntHeader("Expires", -1);
forwardToMoviesJsp(service.queryAll(), req, resp);
}
private void doUpdateMovie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String movieName = req.getParameter("movie");
if (movieName != null) {
//查询到则返回,没有则返回影片管理
Movie movie = service.queryByName(movieName);
if (movie == null) {
forwardToMoviesJsp(service.queryAll(), req, resp);
} else {
Utils.fillAttr(req, movie);
req.setAttribute("add", false);
req.getRequestDispatcher("/admin/add_update_movie.jsp").forward(req, resp);
}
} else {
addOrUpdateMovie(false, req, resp);
}
}
private void doAddMovie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (!ServletFileUpload.isMultipartContent(req)) {
req.setAttribute("add", true);
req.getRequestDispatcher("/admin/add_update_movie.jsp").forward(req, resp);
} else {
addOrUpdateMovie(true, req, resp);
}
}
private void addOrUpdateMovie(boolean add, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//用来存参数
Map<String, String> map = new HashMap<>();
//上传图片
String uploadPath = getServletContext().getRealPath(GetImageServlet.IMG_SERVLET_DIR);
String tempPath = getServletContext().getRealPath("/WEB-INF/temp");
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 100);
factory.setRepository(new File(tempPath));
ServletFileUpload upload = new ServletFileUpload(factory);
String fileName = null;
try {
if (!ServletFileUpload.isMultipartContent(req)) {
String servletPath = req.getServletPath();
if (servletPath.contains("delete")) {
doDel(req, resp);
} else if (servletPath.contains("update")) {
doUpdate(req, resp);
} else {
String keyword = req.getParameter("keyword");
if (keyword == null) {
forwardToOrdersJsp(fillFields(orderService.queryAll()), req, resp);
} else {
forwardToOrdersJsp(fillFields(Collections.singletonList(orderService.query(keyword))), req, resp);
}
}
}
private void doUpdate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String id = req.getParameter("id");
String amount = req.getParameter("amount");
if (id != null && amount != null) {
Double value = Double.valueOf(amount);
value = Math.floor(value * 100) / 100;
orderService.update(id, value);
}
resp.sendRedirect(req.getContextPath() + "/admin/orders");
}
private List<Order> fillFields(List<Order> list) {
if (list != null) {
for (Order order : list) {
User user = userService.query(String.valueOf(order.user_id));
if (user != null) {
order.username = user.username;
}
}
}
return list;
}
private void doDel(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String id = req.getParameter("id");
if (id != null) {
orderService.delete(id);
}
resp.sendRedirect(req.getContextPath() + "/admin/orders");
}
private void forwardToOrdersJsp(List<Order> list, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (list != null) {
req.setAttribute("orders", list);
}
req.setAttribute("chkItem", 4);
/**
* 描述:
*/
@WebServlet(urlPatterns = "/sessions")
public class MovieSessionServlet extends BaseServlet {
private static final long serialVersionUID = 8082316534539662567L;
private PlanService planService = BaseFactory.getService(PlanService.class);
private HallService hallService = BaseFactory.getService(HallService.class);
private MoviceService moviceService = BaseFactory.getService(MoviceService.class);
@Override
protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String movieName = req.getParameter("movie");
if (Utils.isEmpty(movieName)) {
resp.sendRedirect(req.getContextPath() + "/");
} else {
Movie movie = moviceService.queryByName(movieName);
if (movie == null) {
resp.sendRedirect(req.getContextPath() + "/");
} else {
List<Plan> plans = planService.queryNotPlayPlansByMovieName(movie.name);
if (plans != null && !plans.isEmpty()) {
List<MovieSession> sessions = new ArrayList<>();
for (Plan plan : plans) {
MovieSession ms = new MovieSession();
ms.planInfo = String.format("%s_%s_%d", plan.movie_name, plan.hall_name, plan.play_time);
ms.date = DateUtils.formatDate(plan.play_time, "yyyy-MM-dd");
ms.time = DateUtils.formatDate(plan.play_time, "HH:mm");
long overTime = plan.play_time + movie.duration * 60000;
if (!DateUtils.isSame(Calendar.DATE, plan.play_time, overTime)) {
ms.overTime = "次日" + DateUtils.formatDate(overTime, "HH:mm");
} else {
ms.overTime = DateUtils.formatDate(overTime, "HH:mm");
}
ms.price = plan.price;
ms.hallName = plan.hall_name;
Hall hall = hallService.queryByName(plan.hall_name);
if (hall == null) {
resp.sendRedirect(req.getContextPath() + "/");
return;
} else {
ms.hallType = hall.type;
//用来存参数
Map<String, String> map = new HashMap<>();
//上传图片
String uploadPath = getServletContext().getRealPath(GetImageServlet.IMG_SERVLET_DIR);
String tempPath = getServletContext().getRealPath("/WEB-INF/temp");
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 100);
factory.setRepository(new File(tempPath));
ServletFileUpload upload = new ServletFileUpload(factory);
String fileName = null;
try {
if (!ServletFileUpload.isMultipartContent(req)) {
throw new MyException("请使用正确的表单");
}
upload.setFileSizeMax(1024 * 1024 * 3);
upload.setHeaderEncoding("utf-8");
List<FileItem> list = upload.parseRequest(req);
for (FileItem item : list) {
//普通字段
if (item.isFormField()) {
map.put(item.getFieldName(), item.getString("utf-8"));
} else {
String realName = FileUtils.getFileName(item.getName());
if (realName == null || "".equals(realName)) {
continue;
}
fileName = Utils.generateImgFileName(realName);
File f = new File(uploadPath);
if (!f.exists()) {
f.mkdirs();
}
File file = new File(f, fileName);
InputStream in = item.getInputStream();
PicUtils.resizeByHeight(in, file, 300);
IOUtils.close(in);
item.delete();
}
}
Movie movie = new Movie();
Utils.populateToBean(movie, map);
//校验参数有效性
Hall hall = hallService.queryByName(plan.hall_name);
if (hall == null) {
resp.sendRedirect(req.getContextPath() + "/");
return;
} else {
ms.hallType = hall.type;
}
sessions.add(ms);
}
req.setAttribute("sessions", sessions);
req.setAttribute("title", "选择场次: " + movie.name);
req.getRequestDispatcher("/sessions.jsp").forward(req, resp);
} else {
resp.sendRedirect(req.getContextPath() + "/");
}
}
}
}
}
@WebFilter(urlPatterns = "/*")
public class EncodingFilter implements Filter {
private String encoding = null;
@Override
public void destroy() {
public static int compare(Object o1, String s1, Object o2, String s2) {
if (o2 == null || s2 == null)
return 1;
if (o1 == null || s1 == null)
return -1;
String s3 = CharacterParser.getSelling(s1);
String s4 = CharacterParser.getSelling(s2);
return s3.compareTo(s4);
}
}
/**
* 描述:购票
*/
@WebServlet(urlPatterns = "/order")
public class GenerateOrderServlet extends BaseServlet {
private static final long serialVersionUID = -989924899669241621L;
private HallService hallService = BaseFactory.getService(HallService.class);
private PlanService planService = BaseFactory.getService(PlanService.class);
* 功能: 排片管理
*/
@WebServlet(urlPatterns = {"/admin/plans", "/admin/plans/add", "/admin/plans/cancel"})
public class PlanMgrServlet extends BaseServlet {
private static final long serialVersionUID = -6874708411049815744L;
private PlanService planService = BaseFactory.getService(PlanService.class);
private HallService hallService = BaseFactory.getService(HallService.class);
private MoviceService moviceService = BaseFactory.getService(MoviceService.class);
@Override
protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String servletPath = req.getServletPath();
if (servletPath.contains("cancel")) {//取消排片
doDel(req, resp);
} else if (servletPath.contains("add")) {//执行添加
doAdd(req, resp);
} else {
String keyword = req.getParameter("keyword");
if (Utils.isEmpty(keyword)) {
backListToPlansJsp(planService.queryAll(), req, resp);
} else {
req.setAttribute("keyword", keyword);
backListToPlansJsp(planService.queryPlansByKeyword(keyword), req, resp);
}
}
}
private void doDel(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String planInfo = req.getParameter("plan");
if (planInfo != null) {
//从数据库删除
String[] ss = planInfo.split("_");
planService.delete(ss[0], ss[1], ss[2]);
}
resp.sendRedirect(req.getContextPath() + "/admin/plans");
}
private void doAdd(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String movieName = req.getParameter("movie");
if (movieName != null) {
Movie movie = moviceService.queryByName(movieName);
if (movie != null) {
req.setAttribute("movie_name", movie.name);
} else {
resp.sendRedirect(req.getContextPath() + "/admin/movies");
return;
}
order.plan_id = plan.id;
order.user_id = user.id;
Map<String, String[]> map = req.getParameterMap();
int count = 0;
try {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] value = entry.getValue();
if (key.matches("\\d+_\\d+") && "1".equals(value[0])) {
//查询这个座位是否正确
String[] rc = key.split("_");
if (hall.rows >= Integer.valueOf(rc[0]) && hall.columns >= Integer.valueOf(rc[1])) {
if (count == 0) {
sb.append("|");
}
sb.append(key);
sb.append("|");
count++;
} else {
throw new MyException("选座失败,座位号与实际不符,请重新选座。");
}
}
}
if (sb.length() == 0) {
throw new MyException("请选择座位。");
}
order.seat = sb.toString();
order.amount = Math.floor(plan.price * count * 100) / 100;
} catch (MyException e) {
req.setAttribute("failed", e.getMessage());
req.setAttribute("session", session);
req.setAttribute("title", String.format("%s(%s)", plan.movie_name, DateUtils.formatDate(plan.play_time, "yyyy-MM-dd HH:mm")));
req.getRequestDispatcher("/seat.jsp").forward(req, resp);
return;
}
//选座成功
req.setAttribute("order", order);
req.setAttribute("session", session);
req.setAttribute("title", String.format("%s(%s)", plan.movie_name, DateUtils.formatDate(plan.play_time, "yyyy-MM-dd HH:mm")));
req.getRequestDispatcher("/seat.jsp").forward(req, resp);
return;
}
}
}
resp.sendRedirect(req.getContextPath() + "/");
}
}
req.getRequestDispatcher("/admin/add_update_movie.jsp").forward(req, resp);
} else {
addOrUpdateMovie(true, req, resp);
}
}
private void addOrUpdateMovie(boolean add, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//用来存参数
Map<String, String> map = new HashMap<>();
//上传图片
String uploadPath = getServletContext().getRealPath(GetImageServlet.IMG_SERVLET_DIR);
String tempPath = getServletContext().getRealPath("/WEB-INF/temp");
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 100);
factory.setRepository(new File(tempPath));
ServletFileUpload upload = new ServletFileUpload(factory);
String fileName = null;
try {
if (!ServletFileUpload.isMultipartContent(req)) {
throw new MyException("请使用正确的表单");
}
upload.setFileSizeMax(1024 * 1024 * 3);
upload.setHeaderEncoding("utf-8");
List<FileItem> list = upload.parseRequest(req);
for (FileItem item : list) {
//普通字段
if (item.isFormField()) {
map.put(item.getFieldName(), item.getString("utf-8"));
} else {
String realName = FileUtils.getFileName(item.getName());
if (realName == null || "".equals(realName)) {
continue;
}
fileName = Utils.generateImgFileName(realName);
File f = new File(uploadPath);
if (!f.exists()) {
f.mkdirs();
}
File file = new File(f, fileName);
InputStream in = item.getInputStream();
PicUtils.resizeByHeight(in, file, 300);
IOUtils.close(in);
item.delete();
}
}
Movie movie = new Movie();
Utils.populateToBean(movie, map);
//校验参数有效性
service.valicateMovie(movie);
movie.pic_name = fileName;
if (add) {
service.addMovie(movie);
} else {
for (Field field : fields) {
field.setAccessible(true);
Object obj = params.get(field.getName());
String[] value = null;
if (obj instanceof String) {
value = new String[]{(String) obj};
} else if (obj instanceof String[]) {
value = (String[]) obj;
}
if (value != null ) {
Class<?> clazz = field.getType();
if (clazz == String.class) {
field.set(bean, value[0]);
} else if (clazz == String[].class) {
field.set(bean, value);
} else if (!isEmpty(value[0])) {
if (List.class.isAssignableFrom(clazz)) {
field.set(bean, new ArrayList<>(Arrays.asList(value)));
} else if (clazz == int.class || clazz == Integer.class) {
field.set(bean, Integer.valueOf(value[0]));
} else if (clazz == long.class || clazz == Long.class) {
field.set(bean, Long.valueOf(value[0]));
} else if (clazz == short.class || clazz == Short.class) {
field.set(bean, Short.valueOf(value[0]));
} else if (clazz == float.class || clazz == Float.class) {
field.set(bean, Float.valueOf(value[0]));
} else if (clazz == double.class || clazz == Double.class) {
field.set(bean, Double.valueOf(value[0]));
}
}
}
}
}
/**
* 将提交的参数值赋值给对象
*/
public static <T> T populateToBean(Class<T> c, Map<String, ?> params) {
try {
T bean = c.newInstance();
populateBean(bean, params);
/**
* 描述:购票
*/
@WebServlet(urlPatterns = "/order")
public class GenerateOrderServlet extends BaseServlet {
private static final long serialVersionUID = -989924899669241621L;
private HallService hallService = BaseFactory.getService(HallService.class);
private PlanService planService = BaseFactory.getService(PlanService.class);
private UserService userService = BaseFactory.getService(UserService.class);
@Override
protected void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String session = req.getParameter("session");
if (session != null) {
//查询排片
String[] ss = session.split("_");
Plan plan = planService.query(ss[0], ss[1], ss[2]);
if (plan != null) {
//查询影厅
Hall hall = hallService.queryByName(plan.hall_name);
if (hall != null) {
User user = (User) req.getSession().getAttribute("user");
//看数据库是否还有用户信息,可能被删除了
if (userService.query(String.valueOf(user.id)) == null) {
resp.sendRedirect(req.getContextPath() + "/logout");
return;
}
Order order = new Order();
order.movie_name = plan.movie_name;
order.plan_id = plan.id;
order.user_id = user.id;
Map<String, String[]> map = req.getParameterMap();
int count = 0;
try {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] value = entry.getValue();
if (key.matches("\\d+_\\d+") && "1".equals(value[0])) {
//查询这个座位是否正确
String[] rc = key.split("_");
if (hall.rows >= Integer.valueOf(rc[0]) && hall.columns >= Integer.valueOf(rc[1])) {
if (count == 0) {
sb.append("|");
}
sb.append(key);
sb.append("|");
count++;
} else {
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) img.getGraphics();
g.setColor(Color.lightGray);
g.fillRect(0, 0, width, height);
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
String charTable = "1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
Color c = new Color(getRan(155), getRan(155), getRan(155));
g.setColor(c);
char ch = charTable.charAt(getRan(charTable.length()));
sb.append(ch);
Font font = new Font("粗体", Font.BOLD, 24);
g.setFont(font);
double theta = getRan(-45, 45) * Math.PI / 180;
g.rotate(theta, xoffset + step * i, yoffset);
g.drawString(ch + "", xoffset + step * i, yoffset);
g.rotate(-theta, xoffset + step * i, yoffset);
}
System.out.println(sb.toString());
request.getSession().setAttribute("valicateCode", sb.toString());
g.dispose();
ImageIO.write(img, "jpg", response.getOutputStream());
}
private Random ran = new Random();
private int getRan(int begin, int end) {
return ran.nextInt(end - begin) + begin;
}
private int getRan(int bound) {
return ran.nextInt(bound);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
return false;
}
Pattern pattern = Pattern.compile("\\s");
Matcher matcher = pattern.matcher(password);
//如果包含空白字符
if (matcher.find()) {
return false;
}
//只包含一种字符
return !password.matches("\\d+") && !password.matches("[a-z]+") && !password.matches("[A-Z]+") && !password.matches("\\W+");
}
public static void fillAttr(HttpServletRequest req, Map<String, ?> map, String key) {
Object value = map.get(key);
String s = null;
if (value instanceof String) {
s = (String) value;
} else if (value instanceof String[]) {
s = ((String[]) value)[0];
}
if (s != null) {
req.setAttribute(key, s);
}
}
public static void fillAttr(HttpServletRequest req, String key, String value) {
if (value != null) {
req.setAttribute(key, value);
}
}
public static void fillAttr(HttpServletRequest req, Object bean) {
try {
Field[] fields = bean.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Object value = field.get(bean);
if (value != null) {
req.setAttribute(field.getName(), value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String generateImgFileName(String fileName) {
User user = (User) req.getSession().getAttribute("user");
if (movie == null || evaId == null) {
resp.sendRedirect(req.getContextPath() + "/");
} else if (!evaId.isEmpty()) {
//检查提交的是否相符
Evaluate eva = evaluateService.query(evaId);
if (eva != null) {
String content = req.getParameter("evaluate_content");
//截取回复内容里的昵称
Pattern pattern = Pattern.compile("\\[回复\\].+\\[/回复\\]");
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
String temp = matcher.group();
String nick = temp.replace("[回复]", "")
.replace("[/回复]", "");
if (eva.nickname.equals(nick)) {
Reply reply = new Reply();
reply.username = user.username;
reply.nickname = user.nickname;
reply.evaluate_id = Integer.valueOf(evaId);
reply.time = System.currentTimeMillis();
reply.content = content.substring(temp.length()).trim();
replyService.add(reply);
req.getSession().setAttribute("lookMovie", movie.name);
resp.sendRedirect(req.getContextPath() + "/movie/detail");
} else {
evaluate(req, resp, movieName, movie, user);
}
} else {
evaluate(req, resp, movieName, movie, user);
}
} else {
evaluate(req, resp, movieName, movie, user);
}
} else {
evaluate(req, resp, movieName, movie, user);
}
}
}