您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
08-案例-查询所有(当jsp页面没有声明taglib时候JSTL的foreach标签不报错但无效)
发布时间:2024-12-03 22:50:36编辑:雪饮阅读()
-
首先这第一点,我是希望基于上篇中当前项目首页中有一个“查询所有”点击后进入品牌列表页面。
那么修改webapp/index.jsp如
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<head>
<meta charset="utf-8">
</head>
<body>
<a href="/threeTierArchitectureModule/ServletQueryAll">查询所有</a>
</body>
</html>
这里需要注意,并非是你仅仅修改meta里面设定为utf-8就可以的,还必须要
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
这个指令,该指令就类似之前在servlet中设置响应的内容类型及编码的。
因为这个jsp页面实际上也是在被请求的时候通过一个servlet进行响应过来的,虽然看起来是默认没有指向它的servlet,那么我的理解是tomcat应该有默认指向它的servlet的。
这里假定了/ServletQueryAll是我们的查询所有的servlet。
那么接下来需要实现brandMapper的抽象类的具体查询所有的方法,以及处理好数据哪些与驼峰命名不兼容的字段在mapper自动映射时候没有成功映射到POJO实体类的属性的ResultMap,则BrandMapper的实现如:
package com.mapper;
import com.pojo.Brand;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface BrandMapper {
@Select("select * from tb_brand")
@ResultMap("brandResultMap")
List<Brand> selectAll();
}
那么关于resultMap在BrandMapper.xml中的实现如:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.BrandMapper">
<resultMap id="brandResultMap" type="brand">
<result column="brand_name" property="brandName"></result>
<result column="company_name" property="companyName"></result>
</resultMap>
</mapper>
那么接下来我们要实现service层的数据查询,但再次之前我们可以借用我们之前封装好的一个util工具类,放置于com.util包下面,如
package com.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class SessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
//static静态代码块只会创建一次,可用于重复代码封装以及资源占用型代码的重用
static {
String resource="mybatis-config.xml";
InputStream inputStream= null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
public static String getParameter(HttpServletRequest req,String arg){
String argv=req.getParameter(arg);
byte[] bytes=argv.getBytes(StandardCharsets.ISO_8859_1);
argv=new String(bytes,StandardCharsets.UTF_8);
return argv;
}
}
那么接下来我的BrandService则可以实现如:
package com.service;
import com.mapper.BrandMapper;
import com.pojo.Brand;
import com.util.SessionFactoryUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;
public class BrandService {
//这里是可以封装的,因为这里暂时还没有关联到事务,只是单纯的一个factory
SqlSessionFactory sqlSessionFactory= SessionFactoryUtil.getSqlSessionFactory();
public List<Brand> selectAll(){
//这里不需要传递true参数,因为只是查询无需自动提交事务
SqlSession sqlSession=sqlSessionFactory.openSession();
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
List<Brand> brands=brandMapper.selectAll();
sqlSession.close();
return brands;
}
}
那么接下来我们实现servlet将品牌数据列表转发给brand.jsp
package com.web;
import com.pojo.Brand;
import com.service.BrandService;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;
@WebServlet("/ServletQueryAll")
public class ServletQueryAll extends HttpServlet {
BrandService brandService=new BrandService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Brand> brands=brandService.selectAll();
request.setAttribute("brands",brands);
request.getRequestDispatcher("/brand.jsp").forward(request,response);
}
}
那么brand.jsp的实现则如:
<%--
Created by IntelliJ IDEA.
User: 1
Date: 2024/12/2
Time: 15:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellspacing="0" width="800">
<tr>
<th>序号</th>
<th>索引</th>
<th>ID</th>
<th>品牌名称</th>
<th>企业名称</th>
<th>排序</th>
<th>品牌介绍</th>
<th>状态</th>
<th>操作</th>
</tr>
<c:forEach items="${brands}" var="brand" varStatus="status">
<tr>
<th>${status.count}</th>
<th>${status.index}</th>
<th>${brand.id}</th>
<th>${brand.brandName}</th>
<th>${brand.companyName}</th>
<th>${brand.ordered}</th>
<th>${brand.description}</th>
<th>
<c:if test="${brand.status == 1}">
启用
</c:if>
<c:if test="${brand.status == 0}">
禁用
</c:if>
</th>
<th>操作</th>
</tr>
</c:forEach>
</table>
</body>
</html>
这里需要注意的是
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
如果brand.jsp中没有声明这个taglib指令,则forEach循环不出内容,并且不报错。
关键字词:jsp,taglib,JSTL,foreach
相关文章
- 05-JSTL-if&foreach(解决jsp混写if与foreach循环嵌套
- 03-JSP缺点
- 02-JSP脚本(类php中的html与动态代码混写且jsp修改无
- 01-JSP概述&快速入门&原理(jsp-servlet的继承与实现流
- 12-删除功能(delete、foreach标签,collection,item,separ
- 19_JSTL_练习(实现foreach遍历表格并隔行换色)
- 18_JSTL_常用标签_foreach(普通foreach与容器foreach)
- 17_JSTL_常用标签_choose(类似于switch case)
- 16_JSTL_常用标签_if
- 06_JSP_内置对象(pageContext对象)