案例一,商品信息的显示的案例
一,需求
连接数据库 ,从数据库中获得商品的信息,并且显示到页面上.
二,技术分析
在jsp中使用Java代码,的第一大目的:获取域对象中的数据
1,EL表达式
1.1.El概述
Expression Language:表达式语言,jsp2.0之后内置在jsp里面
目的:为了使JSP写起来更加简单。(代替脚本 <% %>)
1.2.EL语法
${EL表达式 }
1.3.EL表达式的用途
1.获取数据. 获取的是域对象中存储的数据
2.EL执行运算(了解)
3.获得常用WEB开发的11个对象.(重要)
1.4.El获取域对象中的数据(最重要的作用)
1.4.1获取简单数据类型数据
语法:${pageScope|requestScope|sessionScope|applicationScope.属性名};
快捷写法:${属性名 }
1.4.2获取数组
语法:${数组属性名[index]};数组属性名就是存入域对象里面的key
1.4.3获取list
语法:${list属性名[index]};list属性名就是存入域对象里面的key
1.4.4获取Map
语法:${属性名.键},map属性名就是存入域对象里面的key
1.4.5 获取bean
语法:${bean的属性名(也就是存入的key值).javabean属性}
[ ] 和 . 方式的区别
只要是能用.的地方都可以使用 [ ]
带下标(数组,list)必须要用 [ ]
有特殊字符的要用 [ ]
-
获取的是四个域范围的值,存入四个域中
-
能获取到则获取,获取不到返回" "字符串 ,不是返回null
-
${属性名 }:依次从pageScope,requestScope|sessionScope|applicationScope中查找指定的属性
若找到,立即返回,且结束该次查找
若找不到返回""
特殊情况:
<%
request.setAttribute("aa.bb", "ccc");
Map map = new HashMap();
map.put("a.b", "c");
request.setAttribute("m", map);
%>
<!--获取不到 -->
${aa.bb }
<!--使用如下方式 -->
${requestScope["aa.bb"] }
<!--获取不到 -->
${m.a.b }
<!--使用如下方式 -->
${m["a.b"] }
1.4.EL执行运算(了解)
1.4.1算数运算
+ , - , * , /
-
+ 不能拼接字符串.
1.4.2逻辑运算(掌握)
< > = <= != ==
1.4.3关系运算
&& || !
1.4.4非空判断(重要)
empty,判断集合长度是否为0,判断一个对象是否为null, 判断一个字符串是否为""
not empty
语法: ${empyt 属性名};属性名 就是域对象里面的key值
<body>
<%
request.setAttribute("a", "1");
request.setAttribute("b", 2);
Product product = null;
Product product1 = new Product();
request.setAttribute("p", product);
request.setAttribute("p1", product1);
%>
${10+5 }//结果15
${a+b }//结果3,el里面+只能作加法,不能进行字符串拼接
${empty p}//true
${empty p1}//false
</body>
注意:
+ 只能做加法运算,不能拼接字符串
1.5.EL获取WEB开发的对象 11个
-
四个Scope(了解),可以使用便捷获取域对象中存放数据的方法代替
pageScope,requestScope,sessionScope,applicationScope
-
获取请求参数参数相关的 (重点掌握)
param.参数名 , 作用相当于request.getParameter() name=zs&age=18
paramValues,作用相当于request.getParameterValues(name)
-
获取请求头信息相关的(了解)
header
headerValues
-
全局初始化参数相关 (了解),相当于servletContext.getInitParameter()
initParam;
-
cookie (重点掌握)
获取的也是一个map集合
map<String cookie的名称,Cookie 对象>
Cookie c = new Cookie("lastTime","1231");
response.addCookie(c);
相当于将c放入了map中
map.put("lastTime",c);
获取值:
${cookie.lastTime.value}
-
pageContext:相当于jsp里面的pageContext对象. (重点掌握)
jsp里面: pageContext.getRequest(); //获得request对象
request.getContextPath(); //动态获得项目名
${pageContext.request.contextPath} // 在JSP页面动态获得项目名
${pageContext.request.contextPath}:在jsp页面中动态的获取项目路径
2,JSTL标签库
2.1.JSTL概述
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的
2.2.JSTL五大标签库
2.3使用步骤:
导入jar包
在页面上导入标签库,<%@taglib prefix="" uri=""%>
2.4.核心库 core
-
条件标签:if choose
if标签语法
<c:if test="el表达式${..}" [var="给之前的表达式的结果起个名字"] [scope="将结果保存在那个域中 默认pageContext"]> </c:if>
eg:
<%request.setAttribute("a", 3); %> <c:if test="${a>1}" var="i" scope="page"> a大于1 </c:if> <c:if test="${a<=1}"> a不大于1 </c:if> ${i }
choose标签:
eg:
<%
request.setAttribute("a", "前端");
%>
<c:choose>
<c:when test="${a == 'java' }">
java
</c:when>
<c:when test="${a == 'Android' }">
Android
</c:when>
<c:when test="${a == 'IOS' }">
IOS
</c:when>
<c:otherwise>
其它
</c:otherwise>
</c:choose>
-
foreach(重点)
普通的循环:
迭代器:
c:forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put("vs",一个对象);
这个对象记录着当前遍历的元素的一些信息:
index:返回索引。从0开始
count:返回计数。从1开始
last:是否是最后一个元素
first:是否是第一个元素
三,思路分析
1.拷贝jar包,工具类,准备好数据库表。
2.在index.jsp添加一个a标签,点击 跳转到ProductsServlet
3.写一个ProductsServlet,里面调用ProductService中的查找所有商品信息的方法
4.写一个ProductService,里面定义一个findAllProducts方法。在该方法中调用ProductDao中的方法去数据库中查询所有商品信息
5.写一个ProductDao类,里面定义一个方法,查找并返回所有商品信息
6.在ProductServlet中获取到商品集合,并将商品集合存放到session中,重定向到list.jsp来进行展示
7.写一个list.jsp文件,在list.jsp中使用EL表达式获取商品集合并且使用JSTL中的foreach标签遍历展示商品信息
四,代码实现
-
product_list.jsp
<center>
<h1>商品列表</h1>
<table border="1px" width="500px">
<tr>
<td>商品Id</td>
<td>商品名称</td>
<td>商品价格</td>
<td>商品描述</td>
</tr>
<c:forEach items="${li }" var="p">
<tr>
<td>${p.pid }</td>
<td>${p.pname }</td>
<td>${p.price }</td>
<td>${p.pdesc }</td>
</tr>
</c:forEach>
</table>
</center>
五,开发模式(MVC)
1.JSP的开发模式一(了解)
JSP + JavaBean
javaBean:实体类。特点:私有化的属性、公共的getter setter方法、无参的构造。
2.JSP的开发模式二
JSP + Servlet + JavaBean 称为MVC的开发模式.
MVC:开发模式、
M:model 模型 (javaBean:封装数据)
V:View 视图 (JSP:展示数据)
C:controller 控制器 (Servlet:处理逻辑代码,做为控制器)
3.三层思想:高内聚,低耦合
三层架构包名:
简单:
com.itheima.web.servlet
com.itheima.service
com.itheima.dao
com.itheima.domain/bean
com.itheima.utils
....
复杂: 复杂项目
com.itheima.项目名.模块名.web.servlet
com.it.项目名.模块名.service
com.it.项目名.模块名.dao
高内聚和低耦合
-
内聚性:模块内的各部分代码之间的关联性。
-
耦合性:各个模块之间的代码的关联性。
写项目目标
-
1.可插入性强。
-
2.可扩展性强。
-
3.健壮性
面向对象设计的六大基本原则
-
1.单一职责原则
-
2.开放封闭原则:对扩展开放,对修改封闭
-
3.依赖倒置原则:依赖抽象不依赖具体
-
4.接口隔离原则,"接口适配器模式"
-
5.里氏替换原则
-
6.迪米特法则:与一个类相关联的类要越少越好。也叫做最少知道原则。