signed

QiShunwang

“诚信为本、客户至上”

关于EL表达式的c:forEach标签和Session的关系

2021/6/8 23:52:37   来源:

今晚上机考试忘记了一个特别重要的点,session保存的值,是被c:forEah标签的items用来迭代遍历的

记录一个犯过的小错误:

写后端的时候,想要用EL表达式从数据库调出数据信息,其他部分都写的差不多了,但是数据就是出不来,检查了数据访问层(dao)、服务层(service)、servlet,也检查了前端,一直检查不出原因。最后终于发现是因为c:forEach标签的items值写错了,当时理解成了对数据库表的遍历,人傻了…

正确方法:

c:forEach标签的items值需要的是一个集合,用来迭代遍历,而从数据访问层到servlet层,数据信息都储存在session当中,所以需要把session当中存有数据信息的对象调用出来就好了。

代码演示:

数据访问层:截取部分

  public List<User> findUser() throws SQLException{
    	 QueryRunner queryRunner = new QueryRunner(C3p0Utils.getDataSource());
    	 String sql = "select * from user";
    	 //BeanHandler<T>,泛型,后跟一个(User.class)
    	 List<User> user = queryRunner.query(sql,new BeanListHandler<User>(User.class));
    	 return user;

服务层:截取部分

public List<User> findAll() throws SQLException{
		return userDao.findUser();
	}

servlet:

package cn.edu.xit.servlet;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

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 cn.edu.xit.domain.User;
import cn.edu.xit.service.UserService;

/**
 * 显示用户的所有信息 
 */
@WebServlet("/FindUserServlet")
public class FindUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FindUserServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		UserService userService = new UserService();
		try{
			List<User> user = userService.findAll();
			if(user!=null){
				request.getSession().setAttribute("user", user); /
				//这里的"user"就是被items调用的
				response.sendRedirect("list.jsp");
			}
		}catch(SQLException e){
			e.printStackTrace();
		}

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request,response);
	}

}

前端:截取部分

<tbody>
			    <c:forEach items="${user}" var="user1" > 
					<tr>
					<td>${user1.id}</td>
					<td>${user1.username}</td>
					<td>${user1.jobs}</td>
					<td>${user1.phone}</td>			
					<td><a href="DeleteServlet?id=${user1.id}" onclick="return confirm('确认删除')">删除</a>
					&nbsp;&nbsp;&nbsp;<a href="updateServlet?id=${user1.id}">修改</a>
					</td>
					</tr>
					</c:forEach>
			  </tbody>

这里的${user}就是调用session中的user,不是遍历数据库的表也不是遍历封装类。

并且如果开发查找功能的时候,写到servlet层,一般都需要session保存记录。

纠正前(${user}改成其他的值):

在这里插入图片描述

纠正后(items = “%{user}”):

在这里插入图片描述