天天看点

任务卡_06-JavaWEB_JSP【MVC框架】

目录

​​一,基于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编码配置

任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】

2,在web\WEB-INF下创建classes、lib(注意将lib文件夹的),并且修改相应配置(参考​​@ &再见萤火虫&【06-JavaWEB_环境搭建——五,idea配置tomcat】​​);

3,添加Tomcat配置

任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】

配置完成如下:

任务卡_06-JavaWEB_JSP【MVC框架】

4,servlet中的类extends HttpServlet飘红?

看看External Libraries中有没有引入Tomcat的包

任务卡_06-JavaWEB_JSP【MVC框架】

如果没有,可以在Project Structure/Modules/Dependencies中添加

任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】

3.2 项目结构

完整项目链接在这里​​https://github.com/GoodbyeFirefly/JavaEngineerCourse/tree/main/TaskCards/Chapter7/JSPTaskCard​​

src目录

任务卡_06-JavaWEB_JSP【MVC框架】

web目录(参考的小伙伴别忘了检查下引入的jar包版本是否一致,否则可能报错,比如无法获得数据库连接等等)

任务卡_06-JavaWEB_JSP【MVC框架】

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 结果展示

低情商:不想搞前端

高情商:专注于后台功能实现

任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】
任务卡_06-JavaWEB_JSP【MVC框架】

3.5 小技巧

如何自动生成数据库表对应的bean类?

任务卡_06-JavaWEB_JSP【MVC框架】
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;
  }

}