学完JavaWeb,在开始Spring全家桶之前,用Jsp这门技术,实践一下,简单运用,随意指点。
项目技术栈:Jsp+Servlet+Druid+Bootstrap+jQuery+JDBCTemple,分页模糊查询。
1. 登陆:
- 主要是验证码的后台生成,与用户点击验证码时进行“看不清换一张”功能。
/**
* 验证码接口
* 随机生成验证码 存到session 内
*
*/
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setHeader("expires", "0");
int width = 80;
int height = 30;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.setColor(Color.GRAY);
g.fillRect(0, 0, width, height);
String checkCode = getCheckCode();
request.getSession().setAttribute("CHECKCODE_SERVER", checkCode);
g.setColor(Color.YELLOW);
g.setFont(new Font("黑体", Font.BOLD, 24));
g.drawString(checkCode, 15, 25);
ImageIO.write(image, "PNG", response.getOutputStream());
}
/**
* 产生四位随机验证码字符串
* @return
*/
private String getCheckCode() {
String base = "0123456789ABCDEFGabcdefg";
int size = base.length();
Random r = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= 4; i++) {
int index = r.nextInt(size);
char c = base.charAt(index);
sb.append(c);
}
return sb.toString();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
- 登陆逻辑处理,后台页面重定向。
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String verifycode = request.getParameter("verifycode");
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER");
session.removeAttribute("CHECKCODE_SERVER");
if (!verifycode.equalsIgnoreCase(checkcode_server)) {
request.setAttribute("login_msg", "验证码错误!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
Map<String, String[]> map = request.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
UserServiceImp userServiceImp = new UserServiceImp();
User login = userServiceImp.login(user);
CargoServiceImp userService = new CargoServiceImp();
if (login != null) {
session.setAttribute("user", login);
response.sendRedirect(request.getContextPath() + "/findCargsByPageServlet");
} else {
request.setAttribute("login_msg", "用户名或密码错误!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
- 前端换一张,功能即Js更改图片的URL,为了防止浏览器缓存图片,即给每个图片加一个唯一标识,即每次不同的。即时间戳。
<script>
$(function () {
$("#img").click(function () {
this.src="${pageContext.request.contextPath}/checkCodeServlet?time="+new Date().getTime();
})
})
</script>
2.主界面展示,基于分页、模糊查询
- 主要从数据拿到的数据进行两次封装、第一次封装为货物的JavaBean,第二次封装为分页查询的PageBean。
- 对于不同的条件,进行模糊查询。返回PageBean。
/**
* 返回查询条件下 的总数量
* 当ID = 1 , 查询货物名称条件下的数量
* 当id = 2 查询货物序号下的数量
* 当id = 3 查询货物在小于一定量下的数量
* @param id
* @param cargoSelect
* @return
*/
@Override
public int selectCount(int id, String cargoSelect) {
StringBuffer sql = new StringBuffer("select count(*) from cargo where 1=1 ");
/**
* 基于原模板sql 进行封装
* StringBuffer 进行字符串拼接
* 自动拆箱 故可以直接返回Integer
*/
if (id == 1) {
sql.append(" and cargo_name like ");
sql.append("'%" + cargoSelect + "%'");
return template.queryForObject(sql.toString(), Integer.class);
} else if (id == 2) {
sql.append(" and cargo_id like ?");
cargoSelect = "*" + cargoSelect + "*";
return template.queryForObject(sql.toString(), Integer.class, cargoSelect);
} else if (id == 3) {
sql.append(" and cargo_amount < ?");
return template.queryForObject(sql.toString(), Integer.class, Integer.parseInt(cargoSelect));
} else {
return template.queryForObject(sql.toString(), Integer.class);
}
}
/**
* 在不同的模糊查询条件下
* 查询每个Page数量下Cargo对象
* 封装为List<Cagro>对象
* 返回
* @param start
* @param rows
* @param id
* @param cargoSelect
* @return
*/
@Override
public List<Cargo> selectLimit(int start, int rows, int id, String cargoSelect) {
StringBuffer sql = new StringBuffer("select * from cargo where 1=1 ");
if (id == 1) {
sql.append(" and cargo_name like ");
sql.append("'%" + cargoSelect + "%'");
sql.append(" limit ?,?");
return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), start, rows);
} else if (id == 2) {
sql.append(" and cargo_id like ");
sql.append("'%" + cargoSelect + "%'");
sql.append(" limit ?,?");
return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), start, rows);
} else if (id == 3) {
sql.append(" and cargo_amount < ? limit ?,?");
return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), Integer.parseInt(cargoSelect), start, rows);
} else {
sql.append(" limit ?,? ");
return template.query(sql.toString(), new BeanPropertyRowMapper<Cargo>(Cargo.class), start, rows);
}
}
3. 添加货物
- 利用BeanUtils进行数据封装,调用dao层进行数据访问。
/**
* 添加货物信息
*/
@WebServlet("/addCargoServlet")
public class AddCargoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String[]> parameterMap = request.getParameterMap();
Cargo cargo = new Cargo();
try {
BeanUtils.populate(cargo, parameterMap);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
CargoServiceImp cargoServiceImp = new CargoServiceImp();
cargoServiceImp.add(cargo);
response.sendRedirect(request.getContextPath() + "/findCargsByPageServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
4. 删除货物
- 即是获得前端传来的需删除的货物编号/货物编号数组,调用dao层进行处理。
@Override
public void deleteById(int id) {
String sql = "delete from cargo where cargo_id = ?";
template.update(sql, id);
}
- 这里是做一个全选的功能,即是在点击最上面的,实现全选功能。思路是,即当点击最上面的选择框时,后面的所有的选择框和上面的保持一致。
- 这里要注意的第一个点是,在jQuery中,操作固有属性用的时prop,操作自定义属性多用attr
- 如果这里用attr去操作checked属性得到的值将会是undefined
$(function () {
$("#firstCb").click(function () {
$("input[name='cid']").prop("checked",$("#firstCb").prop("checked"));
})
})
Jsp结束。