目录
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>编辑图书</title>
<%-- 静态包含 base标签、css样式、jQuery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
<style type="text/css">
h1 {
text-align: center;
margin-top: 200px;
}
h1 a {
color:red;
}
input {
text-align: center;
}
</style>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.gif" >
<span class="wel_word">编辑图书</span>
<%-- 静态包含 manager管理模块的菜单 --%>
<%@include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<form action="manager/bookServlet" method="post">
<input type="hidden" name="action" value="${empty requestScope.book ?"add":"update"}">
<%--
我们是根据id来修改的所以要加上这条,如果你没有这条,后台servlet程序就找不到id,
webUtil虽然是获取对象,但是他只是获取提交过去的对象,他就无法获取ID的值从而无法进行修改
你在book_manager.jsp修改里传过来的id是提交到book_edit.jsp页面而不是manager/bookServlet页面
所以有必要加这条
--%>
<input type="hidden" name="id" value="${param.id}">
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input name="name" type="text" value="${requestScope.book.name}"/></td>
<td><input name="price" type="text" value="${requestScope.book.price}"/></td>
<td><input name="author" type="text" value="${requestScope.book.author}"/></td>
<td><input name="sales" type="text" value="${requestScope.book.sales}"/></td>
<td><input name="stock" type="text" value="${requestScope.book.stock}"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
book_manager.jsp页面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="pojo.Book" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理</title>
<%-- 静态包含 base标签、css样式、jQuery文件 --%>
<%@ include file="/pages/common/head.jsp"%>
</head>
<script>
$(function (){
<%--确定删除提示框--%>
$("a.deleteClass").click(function (){
return confirm("你确定要删除["+$(this).parent().parent().find("td:first").text()+"]吗?");
})
})
</script>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.gif" >
<span class="wel_word">图书管理系统</span>
<%-- 静态包含 manager管理模块的菜单 --%>
<%@include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<c:forEach items="${requestScope.book}" var="book">
<tr>
<td>${book.name}</td>
<td>${book.price}</td>
<td>${book.author}</td>
<td>${book.sales}</td>
<td>${book.stock}</td>
<td><a href="manager/bookServlet?action=select&id=${book.id}">修改</a></td>
<td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${book.id}">删除</a></td>
</tr>
</c:forEach>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td><a href="pages/manager/book_edit.jsp">添加图书</a></td>
</tr>
</table>
</div>
<%--静态包含页脚内容--%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
添加图书和修改图书
增加图书
为什么要加manager/bookServlet?
通过地址区分是普通人还是管理员,赋予相应权限
<%-- 为什么要加action=list? 我们servlet程序用反射得到action值 通过这个值去调用对应方法 所以要加参数--%>
<%-- 前台是不需要登录就可以看的信息,地址为cilent/bookServlet?action=list--%>
<%-- 为什么加manager 而后台则可以修改价格等东西 manager/bookServlet?action=list--%>
<%-- 为什么要加action=list? 我们servlet程序用反射得到action值 通过这个值去调用对应方法 所以要加参数--%>
<%-- 前台是不需要登录就可以看的信息,地址为cilent/bookServlet?action=list--%>
<%-- 为什么加manager 而后台则可以修改价格等东西 manager/bookServlet?action=list--%>
<a href="manager/bookServlet?action=list">图书管理</a>
<a href="pages/order/order.jsp">订单管理</a>
<a href="index.jsp">返回商城</a>
关于参数
method=add 你设置这个参数的时候
它会保存到param这个(参数对象中,不知道叫啥) 可以通过${param.method}使用 . 的过程没有提示
baseservlet程序
下面是基础的servlet程序,下面的代码可能会运用广泛,避免重复写,所以写成一个类,当需要使用的时候继承它
package web;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
//优化baseServlet 在多个模块需要运用到这个代码的时候 可以不用重复写
public class BaseServlet extends HttpServlet {
//解决a标签提交过来的数据
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
doPost(req,resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String action = req.getParameter("action");
System.out.println(action);
try {
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
增,删,改,查图书的servlet
package web;
import pojo.Book;
import service.BookService;
import service.impl.BookServiceImpl;
import utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class BookServlet extends BaseServlet {
private BookService book = new BookServiceImpl();
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
Map<String, String[]> parameterMap = req.getParameterMap();
Book param = WebUtils.getParam(parameterMap, new Book());
book.addBook(param);
//这里如果用转发 则会有BUG 应该转发是一次请求,一直刷新页面会一直添加数据,所以要用重定向
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);
//重定向/表示到端口号 所以要加个工程名
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
System.out.println(id);
book.deleteBookyById(Integer.parseInt(id));
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, String[]> parameterMap = req.getParameterMap();
Book param = WebUtils.getParam(parameterMap, new Book());
book.updateBook(param);
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
}
//通过这个查询所有图书
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Book> books = book.queryAllBook();
req.setAttribute("book",books);
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
protected void select(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数图书编号
String id = req.getParameter("id");
//调用查询方法
Book book = this.book.queryBookById(Integer.parseInt(id));
//将查询得到的book对象设置到Request域中
req.setAttribute("book",book);
//请求转发到修改页面
req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
}
}
登录注册:
package web;
import pojo.User;
import service.UserServcive;
import service.impl.UserServiceImpl;
import utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
public class UserServlet extends BaseServlet {
private UserServcive user =new UserServiceImpl();
public void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
String username = req.getParameter("username");
String password = req.getParameter("password");
//一次性把所有请求的参数注入到javaBean对象中
Map<String, String[]> parameterMap = req.getParameterMap();
User user1 = WebUtils.getParam(parameterMap, new User());
if (user.login(user1)==null){
req.setAttribute("msg","用户不存在或密码错误");
req.setAttribute("username",username);
req.getRequestDispatcher("/pages/user/login.jsp").forward(req,resp);
}else{
System.out.println("登录成功");
req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req,resp);
}
}
public void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
String username = req.getParameter("username");
String password = req.getParameter("password");
String repasw =req.getParameter("repwd");
String email = req.getParameter("email");
String code = req.getParameter("code");
//一次性把所有请求的参数注入到javaBean对象中
Map<String, String[]> parameterMap = req.getParameterMap();
User user1 = WebUtils.getParam(parameterMap,new User());
System.out.println(user1);
if ("6n6np".equals(code)){
if (user.existUsername(username)){
req.setAttribute("msg","用户名已存在");
req.setAttribute("email",email);
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
}else{
if(repasw.equals(password)){
user.register(user1);
System.out.println("注册成功!!");
req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req,resp);
}else {
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
}
}
}else{
req.setAttribute("username",username);
req.setAttribute("password",password);
req.setAttribute("repwd ",repasw);
req.setAttribute("email",email);
req.setAttribute("msg","验证码错误");
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req,resp);
}
}
}
关于回显数据:
Servlet 程序端需要添加回显信息到 Request 域中
以书城登录为例子:
jsp 页面,需要输出回显信息
反射优化(if~~else if)
我们在实现业务的时候可能会有很多if,elseif这时候很麻烦
数据的封装和抽取 BeanUtils 的使用
BeanUtils 工具类,它可以一次性的把所有请求的参数注入到 JavaBean 中。
BeanUtils 工具类,经常用于把 Map 中的值注入到 JavaBean 中,或者是对象属性值的拷贝操作。 BeanUtils 它不是 Jdk 的类。而是第三方的工具类。所以需要导包。
1、导入需要的 jar 包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar
2、编写 WebUtils 工具类使用: WebUtils 工具类:
package utils; import org.apache.commons.beanutils.BeanUtils; import java.util.Map; public class WebUtils { //一次性把所有请求的参数注入到javaBean对象中 // 使用BeanUtils.populate(Object bean, Map properties)方法将前台jsp或者html页面的数据属性映射到bean中, // 也就相当于将数据封装到bean中。随后,我们就可以通过bean.getXxx()方法来获取相应属性的值了。 public static <T> T getParam(Map valua,T bean){ try { BeanUtils.populate(bean,valua); } catch (Exception e) { e.printStackTrace(); } return bean; } }