目录
一,基于JSP实现,JSTL 和 EL 表达式操作
1,任务概述
2,任务过程
3,参考过程
3.1 环境配置
3.2 项目结构
3.3 编码过程(以添加商品为例,使用注解进行servlet配置,采用自顶向下的方法编写)
3.4 结果展示
3.5 小技巧
一,基于JSP实现,JSTL 和 EL 表达式操作
1,任务概述
随着互联网的发展,很多小企业的官网已经不局限于几个静态页面,小璞 的公司最近就接到了一个项目,要做一家公司的官网,官网会不定时更新公司 产品信息,并且潜在用户还可以注册账号成为公司的 VIP 用户,如何实现这些 产品信息的动态更新和展示?Html 已经远远不能满足这个要求,你能用所学知识处理这个问题吗?
简单来说就是实现用户注册、用户登录、产品信息添加、产品信息删除。。。(这描述太花哨了)
2,任务过程
- 1. 了解 JSP 页面九大内置对象
- 2. 了解 JSP 三大指令的含义
- 3. 导入 JSTL 标签库
- 4. EL 表达式显示信息
3,参考过程
3.1 环境配置
PS:IDEA不要用太新的版本,比如2020版本,改动较大,很多地方的设置都和之前版本不同,我经常用的是2018.3.6版本(安装包可以在最下方群文件里找到)。
1,修改IDEA编码配置
2,在web\WEB-INF下创建classes、lib(注意将lib文件夹的),并且修改相应配置(参考@ &再见萤火虫&【06-JavaWEB_环境搭建——五,idea配置tomcat】);
3,添加Tomcat配置
配置完成如下:
4,servlet中的类extends HttpServlet飘红?
看看External Libraries中有没有引入Tomcat的包
如果没有,可以在Project Structure/Modules/Dependencies中添加
3.2 项目结构
完整项目链接在这里https://github.com/GoodbyeFirefly/JavaEngineerCourse/tree/main/TaskCards/Chapter7/JSPTaskCard
src目录
web目录(参考的小伙伴别忘了检查下引入的jar包版本是否一致,否则可能报错,比如无法获得数据库连接等等)
3.3 编码过程(以添加商品为例,使用注解进行servlet配置,采用自顶向下的方法编写)
1,编写index.jsp、productList.jsp页面
用户登录后跳转到index.jsp页面,在该页面有一个超链接,点击超链接后向后台发送productList请求,后台接到请求后获取到产品列表信息,保存、通过转发跳转到productList.jsp页面;
productList.jsp可以展示产品数据,含有两个按钮实现产品的添加、删除(按钮添加a标签实现页面跳转);
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="/productList" >展示产品列表</a>
</body>
</html>
productList.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>产品列表</title>
</head>
<body>
<table border="1">
<tr>
<td>id</td>
<td>产品名称</td>
<td>产品价格</td>
<td>产品描述</td>
</tr>
<c:forEach var="product" items="${productList}">
<tr>
<td>${product.id}</td>
<td>${product.productName}</td>
<td>${product.price}</td>
<td>${product.description}</td>
</tr>
</c:forEach>
</table>
<button><a href="addProduct.jsp">添加产品</a></button>
<button><a href="delProduct.jsp">删除产品</a></button>
</body>
</html>
2,实现productListServlet
点击index.jsp中的a标签时,发送productList请求,通过注解将productList请求和productListServlet进行绑定;
添加private ProductService productService = new ProductServiceImpl();表示提供产品相关的服务(这时由于还没有实现相关的接口和实现类,会在编辑器窗口飘红,不要害怕,后面会解决它);
通过服务获取产品列表ArrayList list = productService.selectList();(类没有实现,所以这个方法也是不存在的,会飘红但是不要慌,后面会处理,这里就先记下了)
package com.xrh.servlet;
import com.xrh.bean.Product;
import com.xrh.service.ProductService;
import com.xrh.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.ArrayList;
@WebServlet("/productList")
public class ProductListServlet extends HttpServlet {
private ProductService productService = new ProductServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ArrayList<Product> list = productService.selectList();
req.setAttribute("productList", list);// 通过setAttribute实现数据保存
req.getRequestDispatcher("/productList.jsp").forward(req, resp);// 通过转发方式跳转页面,避免数据丢失
}
}
3,在service包中完成接口和对应的实现类
实现类中涉及到和数据库的交互,引入相应的dao类private ProductDao productDao = new ProductDaoImpl();(同样会飘红)
调用productDao.selectList();实现商品获取(当然还是飘红)
ProductService
package com.xrh.service;
import com.xrh.bean.Product;
import java.util.ArrayList;
public interface ProductService {
ArrayList<Product> selectList();
boolean addProduct(String productName, double price, String description);
boolean delProduct(int id);
}
ProductServiceImpl
package com.xrh.service.impl;
import com.xrh.bean.Product;
import com.xrh.dao.ProductDao;
import com.xrh.dao.impl.ProductDaoImpl;
import com.xrh.service.ProductService;
import java.util.ArrayList;
public class ProductServiceImpl implements ProductService {
private ProductDao productDao = new ProductDaoImpl();
@Override
public ArrayList<Product> selectList() {
return productDao.selectList();
}
@Override
public boolean addProduct(String productName, double price, String description) {
return productDao.addProduct(productName, price, description);
}
@Override
public boolean delProduct(int id) {
return productDao.delProduct(id);
}
}
4,在dao中完成对应的接口和实现类
完成对数据库的相关操作
ProductDao
package com.xrh.dao;
import com.xrh.bean.Product;
import java.util.ArrayList;
public interface ProductDao {
ArrayList<Product> selectList();
boolean addProduct(String productName, double price, String description);
boolean delProduct(int id);
}
ProductDaoImpl
package com.xrh.dao.impl;
import com.xrh.bean.Product;
import com.xrh.dao.ProductDao;
import com.xrh.util.DruidUtil;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
public class ProductDaoImpl implements ProductDao {
@Override
public ArrayList<Product> selectList() {
// Connection con = DruidUtil.getConnection();// DruidUtil中封装了此方法,这里不再需要
String sql = "select * from products";
ResultSet temp = null;
ArrayList<Product> result = new ArrayList<>();
try {
temp = DruidUtil.query(sql, null);
while (temp.next()) {
int id = temp.getInt("id");
String productName = temp.getString("productName");
double price = temp.getDouble("price");
String description = temp.getString("description");
result.add(new Product(id, productName, price, description));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DruidUtil.close();
}
return result;
}
@Override
public boolean addProduct(String productName, double price, String description) {
// Connection con = DruidUtil.getConnection();// DruidUtil中封装了此方法,这里不再需要
String sql = "insert products (productName, price, description) values(?, ?, ?)";
ArrayList<Object> params = new ArrayList<>(Arrays.asList(productName, price, description));
int result = 0;
try {
result = DruidUtil.update(sql, params);
} catch (Exception e) {
e.printStackTrace();
} finally {
DruidUtil.close();
}
return result == 0 ? false : true;
}
@Override
public boolean delProduct(int id) {
// Connection con = DruidUtil.getConnection();// DruidUtil中封装了此方法,这里不再需要
String sql = "delete from products where id=?";
ArrayList<Object> params = new ArrayList<>(Arrays.asList(id));
int result = 0;
try {
result = DruidUtil.update(sql, params);
} catch (Exception e) {
e.printStackTrace();
} finally {
DruidUtil.close();
}
return result == 0 ? false : true;
}
}
5,重复上面流程完成产品的添加功能(jsp=》servlet=》service=》dao)
产品添加的一种实现思路:通过产品列表下的按钮,跳转到产品添加的表单页面,填写完相关信息后提交即可上传到数据库,点击返回列表,就能返回到产品列表中观察到变化;
3.4 结果展示
低情商:不想搞前端
高情商:专注于后台功能实现
3.5 小技巧
如何自动生成数据库表对应的bean类?
package com.xrh.bean;
public class Users {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}