欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Servlet+JSP+EL+JSTL来实现简易增删改查操作

程序员文章站 2022-03-12 21:29:03
使用Servlet+JSP+EL+JSTL来实现简易增删改查操作以一个基本的User类为例,来通过Serlvet+JSP+EL+JSTL来实现一个基本的增删改查。其中我在备注中记录了改BUG过程中遇到的一些知识点和难题,并且记录了相应的解决方案。请读者多注意注意相应的代码备注。JavaBean——User类对于JavaBean的作用就不细谈了,简要的讲就是定义了一个抽象类(之前C#的学习过程中,经常称他为枚举类型,但其实和枚举还是有很大的差别的。)并且在之后的方法中对该类进行增删改查操作。packa...

使用Servlet+JSP+EL+JSTL来实现简易增删改查操作

以一个基本的User类为例,来通过Serlvet+JSP+EL+JSTL来实现一个基本的增删改查。其中我在备注中记录了改BUG过程中遇到的一些知识点和难题,并且记录了相应的解决方案。请读者多注意注意相应的代码备注。

JavaBean——User类

对于JavaBean的作用就不细谈了,简要的讲就是定义了一个抽象类(之前C#的学习过程中,经常称他为枚举类型,但其实和枚举还是有很大的差别的。)并且在之后的方法中对该类进行增删改查操作。

package com.sumu.entity;

public class User {
    private Integer id;
    private String name;
    private Double score;

    public User(Integer id, String name, Double score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }
}

Servlet——UserServlet最初的状态

这次讲增删改查统一在了一个Servlet当中,但是在实际开发过程中这样明显是不对的。当然,一个小练习就无关紧要了。

package com.sumu.servlet;

import com.gyh.entity.User;

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;
import java.util.List;

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<User> users = new ArrayList<>();
        users.add(new User(1,"Allen",10.0));
        users.add(new User(2,"Jack",9.8));

        req.setAttribute("user",users);
        req.getRequestDispatcher("user.jsp").forward(req,resp);
    }
}

在这个Servlet当中,只是定义了一个最基本的初始化了两个User对象数据,并且添加进了List当中。这里用到了一些知识点:

  • HttpServlet的使用:Servlet有三层架构,这里用了最常用的HttpServlet的doGet方法。具体的知识点详见我的另一篇Blog:https://blog.csdn.net/sumu_Guyuhang/article/details/112305966
  • 关于request会话中的一些方法:这里会话使用的是request,使用了里面的setAttribute()方法和转发的方法,具体内容详见我的另一篇blog:https://blog.csdn.net/sumu_Guyuhang/article/details/112423137

实现增加操作

向我们现有的User类中增加一个新的用户信息。注意:由于这个基本操作中并不涉及数据库,因此初始的数据是写死的,并且生命周期是根据服务器来运作的,实际开发中并不适用,只是作为一个练习加大难度而已。

增加操作的页面——add.jsp

一个无脑form表单,没啥好说的。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>增加</title>
</head>
<body>
<form method="post" name="add" action="/user">
    编号:<input name="id" type="text" /><br/>
    姓名:<input name="name" type="text" /><br/>
    成绩:<input name="score" type="text" /><br/>
    <input type="submit" value="提交">
</form>

</body>
</html>

加上添加功能后的UserServlet

package com.sumu.servlet;

import com.sumu.entity.User;

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;
import java.util.List;

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    /*
    在doGet方法中和doPost方法中需要将users变量传递过去,
    所以在这里需要扩充作用域。
    将其定义为全局变量
     */
    private List<User> users = new ArrayList<>();
    /*由于在后续会出现重复调用doGet中的添加list的问题,
    所以在这里使用构造方法来进行初始化的定义,将List等操作放在这里进行
     */
    public UserServlet() {
        // users扩充作用域之后就可以直接在所有的方法中全局访问。
        users.add(new User(1,"Allen",10.0));
        users.add(new User(2,"Jack",9.8));

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setAttribute("user",users);
        req.getRequestDispatcher("user.jsp").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决中文乱码问题
        req.setCharacterEncoding("UTF-8");

        // 获取上面表单中的数据
        /*
        这里注意getParamter和getAttribute两者不要混淆
         */
        String id_str = req.getParameter("id");
        String name = req.getParameter("name");
        String score_str = req.getParameter("score");
        Integer id = Integer.parseInt(id_str);
        Double score = Double.parseDouble(score_str);

        // 将数据添加进表单当中
        users.add(new User(id,name,score));
        req.setAttribute("user",users);

    }
}

其实上面关于初始化数据重复的部分也可以通过静态代码块来进行更改

private static List<User> list = new ArrayList<>();

static {
    list.add(new User(1,"Allen",10.0));
	list.add(new User(2,"Jack",9.8));
}

实现删除操作

首先在User.jsp页面上进行一些修改

User.jsp修改后

</tr>
    <c:forEach items="${user}" var="user">
        <tr>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.score}</td>
            <a href="/user?method=delete&id=${user.id}">删除</a>
            <a>修改</a>
        </tr>
    </c:forEach>

UserServlet 逻辑修改后

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    /*
    在实现删除操作的时候,我们采用了通过url传递method来进行区分是什么操作
    那么我们就在doGet方法中使用switch控制来对这些逻辑进行区分。
     */
    String method = req.getParameter("method");
    if(method == null){
        method = "findAll";
    }
    switch (method) {
        case "delete":
            String idStr = req.getParameter("id");
            Integer id = Integer.parseInt(idStr);
            // 这里的删除功能无法实现,需要更换List集合为Map映射,此处就不做展示了
            // 重点在于上述的逻辑控制
            // PS:其实还是因为太懒了(害...)
            users.remove(id);
            break;
        case "findAll":
            req.setAttribute("user",users);
            req.getRequestDispatcher("user.jsp").forward(req,resp);
            break;
    }
}

这里其实并没有实现该功能。
主要的问题在于,如果想要通过一个Servlet来实现该删除操作的话,那么该如何区分两种操作呢?这里提供了一种解决办法,在url后面加上键值对来进行区分,在后端操作中取出该属性,并且通过switch-case判断来选择该进入那个逻辑选择中。


修改操作——之后更新。

最后总结:

  • 一般遇到重复初始化的问题,就可以通过重写构造方法来进行初始化。在Java基础中得知其实每个类在运行的时候编译器都会送一个构造方法,而我们也可以自己去重写一个构造方法。

  • 遇到变量跨方法无法传递的时候,通常的解决方案就是扩大变量的作用域,但是注意在实际开发过程中,一般我们在类中定义成员变量的时候都是需要将其的安全性设为私有,也就是private。

  • 在不同的操作需要进入同一个方法的时候,可以通过在url后面加上属性值来区分该操作。后端中只需要将该属性拿出来,然后通过判断逻辑来进行区分即可。

本文地址:https://blog.csdn.net/sumu_Guyuhang/article/details/112505178