一:准备工作
1:Idea编辑器(eclispe和myeclispe都可以,个人推荐使用idea),新建一个web项目
2:数据库mysql
3:需要提前了解的知识点
servlet
el和jstl表达式
项目的基本的框架实现(Javaweb经典的三层架构)
4:UUID自动生成id的工具
5:在idea中生成的包结构
二:数据库的设计和实现操作
需要在设计库中实现数据库的创建和数据表的填写
1.数据库和数据表的创建
2.向数据库中添加数据
3.数据库连接工具druid和dbutils
package cn.ujiuye.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* JDBC工具类 使用Durid连接池
*/
public class JDBCUtils {
private static DataSource ds ;
static {
try {
//1.加载配置文件
Properties pro = new Properties();
//使用ClassLoader加载配置文件,获取字节输入流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//2.初始化连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池对象
*/
public static DataSource getDataSource(){
return ds;
}
/**
* 获取连接Connection对象
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
三:常用工具类和架构解析
1:bootstrap是一个很强大的前端框架,集合了html,css,js的集合,让像我这样的前端菜鸡的新手能够也实现对美的页面的追求,有需要的去中文网去了解吧https://www.bootcss.com/
2:UUID是Java.utils包下提供的一个自动生成的一个工具类,能够自动生成不会重复的id,可以把它简单封装一下,后面直接调用,下面贴出封装源码
package cn.ujiuye.utils;
import java.util.UUID;
public class UUIDUtils {
public static String getPid() {
String str = UUID.randomUUID().toString().replace("-", "");
return str;
}
}
3.常用jar包分析,后期会使用到maven工程,就不用手动导入jar包了,不过作为基础还是希望大家能够用心对待基础
4.简单说一下三层架构
servlet和jsp主要是控制和显示,让用户能够直接看到现象
service 处理业务逻辑层,能够更好的实现其相关的业务逻辑的实现
dao 数据持久化层,主要用于和数据库进行交互,返回和传递数据
除此之外别忘了实体类Javabean的书写,本篇博客我更多的使用了接口的思想
四 简单实现一下增删改查
首先说下JavaBean的书写,尽可能的让其和数据库中的字段和前端传过来的的数据三者合一,这样才能尽可能的后期不会存在这个值那个值没有被赋值上,出现空值的现象,还有最好使用其包装类型,不会出现数据库中出现了空值而赋不上值的现象
package cn.ujiuye.domain;
import java.util.Date;
/**
* product
* javabean
*/
public class Product {
private String pid;
private String pname;
private double market_price;
private double shop_price;
private Date pdate;
private String pdesc;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public double getMarket_price() {
return market_price;
}
public void setMarket_price(double market_price) {
this.market_price = market_price;
}
public double getShop_price() {
return shop_price;
}
public void setShop_price(double shop_price) {
this.shop_price = shop_price;
}
public Date getPdate() {
return pdate;
}
public void setPdate(Date pdate) {
this.pdate = pdate;
}
public String getPdesc() {
return pdesc;
}
public void setPdesc(String pdesc) {
this.pdesc = pdesc;
}
@Override
public String toString() {
return "Product{" +
"pid='" + pid + '\'' +
", pname='" + pname + '\'' +
", market_price=" + market_price +
", shop_price=" + shop_price +
", pdate=" + pdate +
", pdesc='" + pdesc + '\'' +
'}';
}
}
增加的servlet
package cn.ujiuye.web.servlet;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
import cn.ujiuye.utils.UUIDUtils;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@WebServlet("/addProductServlet")
public class AddProductServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.设置编码格式
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
//2.封装数据
Map map = request.getParameterMap();
Product product = new Product();
try {
//先把当前时间按照格式转化成对应的字符串
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String currentTime = sdf.format(date);
System.out.println(currentTime);
//再把字符串转化为相对于的时间格式
Date time = sdf.parse(currentTime);
System.out.println(time);
//封装一下上架的时间
product.setPdate(time);
//使用UUID工具类,随机生成Pid,保证数据不重复
product.setPid(UUIDUtils.getPid());
BeanUtils.populate(product,map);
//3.处理业务逻辑
ProductService service = new ProductServiceImpl();
service.addProduct(product);
System.out.println(product);
} catch (Exception e) {
e.printStackTrace();
}
//4.重定向到登录页面
response.sendRedirect(request.getContextPath()+"/findAllProductServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
增加的时候要特别注意哪些数据不能够直接封装进入JavaBean中去,需要手动给传入进入,比如这个时间是使用UUID工具类生成的,故需要手动给传入进去,还有当前时间也是自动生成的,也需要手动给传入进入,才能够是生成了一个完成的对象,数据完整来实现操作
删除的servlet
package cn.ujiuye.web.servlet;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/delUserServlet")
public class DelUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从后台的数据获取相对于的id
String pid = request.getParameter("id");
System.out.println(pid);
//处理业务逻辑
ProductService service = new ProductServiceImpl();
service.deleteProduct(pid);
//对结果进行相应,不管删除不删除都重定向到findAllProductServlet
response.sendRedirect(request.getContextPath()+"/findAllProductServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
注意从前台获取你点击的事件的按钮,从而将其id给传入进来,从id来获取其数据的详细信息从而反馈过来
修改的servlet
package cn.ujiuye.web.servlet;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/updateProductServlet")
public class UpdateProductServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.封装数据
Map map = request.getParameterMap();
Product product = new Product();
try {
BeanUtils.populate(product,map);
} catch (Exception e) {
e.printStackTrace();
}
//2.处理业务逻辑
ProductService service = new ProductServiceImpl();
service.updateProduct(product);
//3.重定向到findAllProductservlet
response.sendRedirect(request.getContextPath()+"/findAllProductServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
注意修改的操作第一步需要实现数据的回显,然后将该对象传入到后台,从而达到修改的目的
package cn.ujiuye.web.servlet;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import cn.ujiuye.service.impl.ProductServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/findAllProductServlet")
public class FindAllProductServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//处理业务逻辑
ProductService service = new ProductServiceImpl();
List products = service.fandAll();
System.out.println(products);
//将域对象存起来,实现数据的传递
request.setAttribute("products",products);
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
无论是查询单个的信息还是查询所有的人的信息,都需要我们明确要查询的条件,传递什么参数,让其返回什么类型的数据,只有明确了这些细节问题,才能够让我们能够快速定位自己的需要,从而达到自己想要的效果
service层接口,引入接口的思想,更多的是想控制一下业务逻辑,不至于有很多很多的servlet,对自己的需求不太清楚
package cn.ujiuye.service;
import cn.ujiuye.domain.PageBean;
import cn.ujiuye.domain.Product;
import java.util.List;
/**
* 业务逻辑层接口层
*/
public interface ProductService {
/**
* 查询所有的商品信息
* @return
*/
List fandAll();
/**
* 添加商品
*/
void addProduct(Product product);
/**
* 根据id查询当前的商品信息
* @param id
* @return
*/
Product findProductById(String id);
/**
* 修改商品的信息
* @param product
*/
void updateProduct(Product product);
/**
* 删除商品信息
* @param pid
*/
void deleteProduct(String pid);
/**
* 删除多选中的商品信息
* @param pids
*/
void deleteSelectedProduct(String[] pids);
/**
* 分页查询
* @param currentPage
* @param rows
* @return
*/
PageBean findUserByPage(String currentPage, String rows);
}
package cn.ujiuye.service.impl;
/**
* 业务逻辑实现层
*/
import cn.ujiuye.dao.ProductDao;
import cn.ujiuye.dao.impl.ProductDaoImpl;
import cn.ujiuye.domain.PageBean;
import cn.ujiuye.domain.Product;
import cn.ujiuye.service.ProductService;
import java.util.List;
public class ProductServiceImpl implements ProductService {
private ProductDao dao = new ProductDaoImpl();
/**
* 查询所有的商品信息
* @return
*/
@Override
public List fandAll() {
return dao.findAllProduct();
}
/**
* 添加商品信息
*/
@Override
public void addProduct(Product product) {
dao.addProduct(product);
}
@Override
public Product findProductById(String id) {
return dao.findProductById(id);
}
@Override
public void updateProduct(Product product) {
dao.updateProduct(product);
}
@Override
public void deleteProduct(String pid) {
dao.delteProductById(pid);
}
@Override
public void deleteSelectedProduct(String[] pids) {
for (String pid : pids) {
dao.delteProductById(pid);
}
}
}
dao层实现数据的持久化操作,更多的是实现对数据的前后台交互,数据能够来回之间相互传递,这里我也引入了接口的概念,里面可能有点语句是关于关于分页的,我怕删除的不去,对各位有所影响
package cn.ujiuye.dao;
import cn.ujiuye.domain.Product;
import java.util.List;
/**
* 持久化接口
*/
public interface ProductDao {
/**
* 查询所有的商品的信息
* @return
*/
List findAllProduct();
/**
* 添加商品
* @param product
*/
void addProduct(Product product);
/**
* 查询当前的商品的信息
* @param id
* @return
*/
Product findProductById(String id);
void updateProduct(Product product);
void delteProductById(String pid);
/**
* 查询总的记录数的方法
* @return
*/
int findTotalCount();
/**
* 查询每页数据
* @param start
* @param rows
* @return
*/
List findByPage(int start, int rows);
}
package cn.ujiuye.dao.impl;
import cn.ujiuye.dao.ProductDao;
import cn.ujiuye.domain.Product;
import cn.ujiuye.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
/**
* 持久化dao接口的实现类
*/
public class ProductDaoImpl implements ProductDao {
//加载数据源
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 查询所有的商品的信息
* @return
*/
@Override
public List findAllProduct() {
//1.定义sql
String sql = "select * from product order by pdate desc";
return template.query(sql,new BeanPropertyRowMapper(Product.class));
}
/**
* 添加商品信息
* @param product
*/
@Override
public void addProduct(Product product) {
//1.定义sql
String sql = "insert into product values(?,?,?,?,?,?)";
//处理sql
template.update(sql,product.getPid(),product.getPname(),product.getMarket_price(),product.getShop_price(),product.getPdate(),product.getPdesc());
}
/**
* 查询当前的商品信息
* @param id
* @return
*/
@Override
public Product findProductById(String id) {
String sql = "select * from product where pid = ?";
return template.queryForObject(sql,new BeanPropertyRowMapper(Product.class),id);
}
/**
* 修改当前商品的信息
* @param product
*/
@Override
public void updateProduct(Product product) {
String sql = "update product set pname=?,market_price=?,shop_price=?,pdesc=? where pid=?";
template.update(sql,product.getPname(),product.getMarket_price(),product.getShop_price(),product.getPdesc(),product.getPid());
}
/**
* 根据id来删除对应的商品的信息
* @param pid
*/
@Override
public void delteProductById(String pid) {
String sql = "delete from product where pid = ?";
template.update(sql,pid);
}
}
持久化层对数据进行操作,我个人比较喜欢的druid连接池和spring操控JDBCtemplete对数据库进行操作,方便便捷,当然c3p0和dbutils也是一样的道理,看个人爱好
下面关于前端jsp页面,我就重点展示一下我的list.jsp页面,其他的都大概贴一下源码和运行结果
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
修改用户
修改商品信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
修改用户
修改商品信息
下面重点来讲一下list.jsp显示页面,实现数据的从域对象中获取出来,再在前台显示的效果
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
商品列表
商品信息列表
该功能是使用jstl和el表达式来实现其功能的,大家可以多看看,该用法真的很秒,本人很喜欢