1.练习
①创建商品表:商品编号,名字,价格,日期,产地;
②使用servlet+dao查询数据显示到页面。
数据访问层dao:
public class GoodsDaoImpl implements IGoodsDao {
@Override
public List<Goods> selectAllGoods() {
String sql = "select goodsId,goodsName,price,proDate,proAdd from goods";
BaseDao.setPst(sql,null);
List<Map<String,Object>> rows = BaseDao.executeQuery();
List<Goods> allGoods = new ArrayList<>();
if(rows.size()>0){
for (Map map :rows) {
Goods goods = new Goods(
(Integer) map.get("goodsId"),
(String) map.get("goodsName"),
new BigDecimal(map.get("price").toString()).doubleValue(),
(Date)map.get("proDate"),
(String)map.get("proAdd")
);
allGoods.add(goods);
}
return allGoods;
}
return null;
}
}
servlet:
@WebServlet(urlPatterns = "/GoodsServlet")
public class GoodsServlet extends HttpServlet {
IGoodsService goodsService = new GoodsServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("goodsList",goodsService.Goodses());
req.getRequestDispatcher("/main.jsp").forward(req,resp);
}
JSP:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="">
<thead>
<tr>
<td>编号</td>
<td>品名</td>
<td>价格 </td>
<td>生产日期</td>
<td>生产地址</td>
</tr>
</thead>
<tbody>
<c:forEach items="${goodsList}" var="goods">
<tr>
<td>${goods.goodsId}</td>
<td>${goods.goodsName}</td>
<td>${goods.price}</td>
<td>${goods.proDate}</td>
<td>${goods.proAdd}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
2.JSP(简单了解使用)
在HTML中嵌入Java脚本语言,jsp相当于是一个特殊的servlet,但是普通的servlet虽然可以显示页面数据,完成css,js 的功能,但是编写代码过于麻烦。
2.1 JSP的执行过程
当客户端请求JSP页面时,JSP文件先转换成Servlet文件,再编译成class文件,最后执行返回给客户端(响应)。
当webapp放置在Tomcat容器下的时候,jsp生成的Java文件与编译好的class文件会被放置在Tomcat的work目录下,方便查看;idea的web项目不是直接将webapp放在Tomcat容器中,而是将生成的webapp与tomcat按照idea的"技术"形成连接,这样可以减少配置tomcat的时间。
2.2 JSP的组成
2.2.1 指令
作用:用于配置jsp页面,导入资源文件;
格式:<%@ 指令名称 属性名=属性值%>
①page 配置jsp页面
<!--导入jar包-->
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<!--设置页面的字符集编码 和mime 类型-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
②taglib 导入jsp标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
③include 页面包含,导入资源文件
<%@ include file="xxx.jsp"%>
2.2.2 注释
①html注释:
<!----> 只能注释html代码,java代码依旧会执行
②jsp注释:
<%-- --%> 所有都可以注释,无论java代码还是html内容
2.3 jsp九大内置对象
内置对象 | Servlet类型 | 作用 |
pageContext | PageContext | 页面上下文,页面的环境 |
page | 当前页面 | 作用域对象,当前jsp页面 |
request | HttpServletRequest | 作用域对象,一次请求(a.jsp-->servlet-- >forward-->b.jsp) |
session | HttpSession | 作用域对象,一次会话 |
application | ServletContext | 作用域对象:整个程序运行期间,数据可以共享;一般用来存储全局的系统配置 |
response | HttpServletResponse | 响应数据 |
config | ServletConfig | 获取配置信息 |
out | JspWriter;PrintWirter | 在页面上输出内容 |
exception | 异常信息 |
2.4 四大域对象
可以存储数据,每个域对象存储数据的范围不一样。
①pageContext(数据的作用域在当前页面)
②request(数据的作用域,在一次请求转发范围内有效。可以跨页面传递数据)
③session(数据的作用域在一次会话内,可以被多次请求共享)
④application(对应于整个网站应用程序,存储数据作用域是整个网站范围,可以被多个会话共享)
3. JSTL和EL
3.1 EL表达式 ${}
Expression Language:表达式语言,用于替换 <%=变量名%>
①EL表达式可以直接从四大域对象中取数据,不能获取不在域对象中的数据;
②jsp默认支持EL表达式,可以使用转义“\”忽略;
③从四大域对象相中获取对象类型的属性值实际上是调用相应的get方法,如${student.stuName} 实际上是调用student对象中的 getStuName()方法。
3.2 支持的运算符
算术运算
关系运算
逻辑运算
3.3 值的获取
值的获取只能从域对象中获取(四大域 pageContext ,request,session,application);
当不确定域对象的时候,如${键名},会按照域对象的范围从小到大去找。
四大域的范围是:pageContext < request < session < application
3.4 标准标签库 -JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能,JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签, SQL标签, 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别:
①核心标签
②格式化标签
③SQL 标签
④XML 标签
⑤JSTL 函数
3.4.1 使用步骤
①引入jar包
jstl-1.2.jar , standard.jar,c-1_0-rt.tld
②jsp页面上引入指令
servlet 3.0 tomcat9之前:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
servlet 4.0 tomcat9:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
3.4.2 if判断
没有else,如果想要else就再写一个< c:if>
(c 就是 引入中的 prefix 可以改)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--使用jstl测试分支-->
<%
int score = 12;
if(score>10){
out.print("优秀");
}else{
out.print("不优秀");
}
%>
<hr/>
<%
request.setAttribute("score",12);
%>
<c:if test="${score>10}">
优秀
</c:if>
<c:if test="${score<=10}">
不优秀
</c:if>
</body>
</html>
2.4.2 循环
<c:forEach var="i" begin="1" end="10" step="3" varStatus="s">
数字:${i} 数字次序:${s.count} <br/>
</c:forEach>
2.4.3 遍历集合
<c:forEach items="${stus}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.sex}</td>
</tr>
</c:forEach>