本案例主要用于实现在页面展示所有商品的信息,但是不允许使用jsp脚本实现。
1.jsp
1.1 jsp的指令
jsp指令主要用于声明jsp页面的一些属性和动作。其格式为
jsp指令分为:
page:主要声明jsp页面的一些属性;
include:静态包含;
taglib:导入标签库
注意:一个页面中可以出现多个指令,指令可以放置在任何位置,一般都是放置在jsp页面最上面。
1.1.1 page指令
page指令重要属性主要有如下三种:
contentType:设置响应流的编码,及通知浏览器用什么编码打开,设置文件的mimetype;
pageEncoding:设置页面的编码;
import:导入所需要的包;
contentType和pageEncoding联系:
若两者均出现,则各自使用各自的编码;
若只出现一个,那么都是用该编码形式执行;
若君不出现,使用服务器默认的编码执行,其中,tomcay7使用的iso-8859-1.
1.1.2 include指令
include指令就是将其他页面或者servlet的内容包含进来,一起进行编译运行,生成一个java文件。
格式为
例如:
路径共有三种形式
1.相对路径
./或者什么都不写,表示当前路径;
../表示上一级路径
2.绝对路径
带协议和主机的绝对路径
不带协议和主机的绝对路径:/项目名/资源
3.内部路径
不带协议和主机的绝对路径去掉项目名。
内部路径用于请求转发、静态包含以及动态包含三种途径中。
1.1.3 taglib指令
格式为
导入标签之后,可采用如下格式
例如:
输出内容
1.2 jsp内置对象
jsp内置对象就是在jsp页面上可以直接使用的对象,共有九大内置对象。
out:输出,类型为JspWriter;
request:请求,类型为HttpServletRequest
response:响应,类型为HttpServletResponse
session:会话,类型为HttpSession
exception:,类型为Throwable
page:当前对象,类型为Servlet(this)
config:配置对象,类型为ServletConfig
application:上下文,类型为ServletContext
pageContext:当前页面上下文,类型为PageContext
1.3 jsp域对象
jsp共有四个域对象,其生命周期分别为
application:生命周期:整个项目
session:生命周期:一次会话
request:生命周期:一次请求
pageContext:生命周期:一个页面
上面的域对象根据生命周期的长短进行的排列。
1.4 pageContext作用
1.pageContext作为域对象,具有方法
xxxAttribute(String name):返回与页面范围中的名称关联的对象,如果对象不存在,返回Null
2.具备操作其他三个域对象的能力
xxxAttribute(String name,int scope):返回与指定范围中的名称关联的对象,如果对象不存在,返回null
scope共有四个取值范围
APPLICATION_SCOPE:
SESSION_SCOPE:
REQUEST_SCOPE:
PAGE_SCOPE:
3.获取其他的内置对象
方法为getXxx(),如:
getRequest():获取request的内置对象
4.便捷查找
findAttribute(Strin key):依次从pageContext,request,session和application四个域中,查找响应的属性,如查找到了返回值,就结束该次查找。若查找不到,返回null值。
1.5 jsp动作标签
常用的动作标签共有两种:
请求转发,相当于java中的request.getRequestDispatcher(..).forward(..);
动态包含,就是将被包含页面或者servlet的运行结果包含到当前页面中。
当要求在主页跳转到购物车页面时,采用如下代码就可实现该功能
当要求新建一个页面时,可以直接将所有页面共有的部分引入,如header.jsp文件和tail.jsp文件,代码为
2. el
el为jsp的内置表达式语言,从jsp2.0开始出现,用于替代(java的输出语句)。作用为:
1.获取域中的数据:
2.执行运算:
3.获取常见的web对象:
4.调用Java方法
格式为
${el表达式}
2.1 获取域中数据
2.1.1 获取简单数据
格式为:
${pageScope|requestScope|sessionScope|applicationScope.属性名}
如下所示:
request.setAttribute("rkey","rvalue");
session.setAttribute("skey","svalue");
application.setAttribute("akey","avalue");
%>
获取request中的数据:
老方法)
el方式:${requestScope.rkey}
获取session中的数据:
老方法)
el方式:${sessionScope.skey}
获取application中的数据:
老方法)
el方式:${applicationScope.akey}
当获取数据失败后,两者之间也存在差别,老方法会返回一个null值,el方法会返回一个空字符串。如下
老方法)
el方式:${applicationScope.aakey}
但是在实际操作中我们经常使用的格式为
${属性名},其底层实现依赖findAttribute(Strin key),依次从pageContext,request,session和application四个域中,查找响应的属性,如查找到了返回值,就结束该次查找。若查找不到,返回空字符串""。
如:
${rkey },${skey },${akey }.
但是当传入的数据具有特殊符号("."|"+"|"-")时,则需要使用scope获取。 传入数据
request.setAttribute("arr.age",18);
获取数据方式为
${requestScope["arr.age"] }
2.1.2 获取复杂数据
主要是指获取数组、list以及map中的数据。格式为
获取数组中的数据:
${域中的名称[index] }
获取list中的数据:
${域中的名称[index] }
获取map中的数据:
${域中的名称.键名 }
实例如下
//request中插入数组
request.setAttribute("arr", new String[]{"aa","bb","cc"});
//request中插入list数据
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
request.setAttribute("list",list);
//request中插入map数据
Map map = new HashMap();
map.put("username","tom");
map.put("age",18);
request.setAttribute("map",map);
%>
获取数组的数据"bb"
老方式:
el方式:${arr[1] }
获取list中的数据
老方式:
el方式:${list[1] }
el方式获取list的长度:${list.size() }
获取map中的数据
老方式:
el方式:${map.age }
2.1.3 javabean导航
2.1.3.1 javabean
javabean是语言编写的一个可重用的组件,狭义来说就是我们编写的一个普通的类,例如User Person等。
其规范有如下几种:
1.必须是一个公共的具体的类(使用public class 修饰的类);
2.必须提供私有的字段(如private String id,其中id称之为字段);
3.提供公共访问字段的方法,如get,set以及is方法,如public String getId()方法。其中,id就可以被称之为bean属性。
4.提供一个无参构造器;
5.一般实现序列化接口 serializable
2.1.3.2 javabean导航
所谓javabean导航就是获取jsp文件中bean属性. 格式为
${域中javabean名称.bean属性 }
假设User方法中存在sex,name,age和id等属性的get/set方法,现在我要在获取其中的id和name属性
User u = new User();
u.setId("001");
u.setName("tom");
u.setSex("male");
u.setAge(18);
//将u放入域中
request.setAttribute("user",u);
%>
获取域中javabean的id值
老方式:
el方式:${user.id }
获取域中javabean的name值
el:${user.name }
但是如果想要获取javabean中不存在的bean值就会报错,比如
${user.password }会出现出现,显示password不是bean值
2.2 执行运算
el可以实现四则远算、关系运算(>,>=...)、逻辑运算(&& ||...)以及三元运算。注意:
+:只能进行加法运算,字符串形式的数字可以进行加法运算;
empty:判断一个容易的长度是否为0(array,list,set,map),还可以判断一个对象是否为空。
${empty 域中的对象名称 }
返回值为boolean值
2.3 el的内置对象
2.3.1 cookie内置对象
创建cookie
Cookie c = new Cookie("username","tom");
通过${cookie}获取相当于
{Username=new Cookie("username","tom")}
相当于map的key是cookie的键,map的value是当前的cookie。
若想获取名称username的cookie的value值(获取tom)
${cookie.username.value}
采用的是javabean导航技术
java中Cookie的api
getName():获取cookie的键;
getValue():获取cookie的bean值
我们称name和value是cookie的bean属性。
因此,使用cookie内置对象的格式为
${cookie.给cookie起名字.value}
例如获取jsession的值
${cookie.JSESSIONID.value}
2.3.2 pageContext
pageContext获取的不是map集合,相当于jsp的pageContext内置对象,用于获取jsp页面中获取项目名。格式为
${pageContext.request.contextPath}
在jsp文件中可以将原来的内容
进行替换为
3.jsp注释
jsp注释有三种形式。
3.1 html注释
html注释样式为
注释的内容只在页面上看不到,在java和html源代码中都存在。
3.2 java注释
java注释样式为
1.//注释内容
2./*注释内容*/
3./**
*注释内容
**/
只在java代码中存在
3.3 jsp注释
jsp注释样式为
只在jsp页面中存在,翻译成java文件之后不再存在。
4.jstl
jstl称为jsp标准的标签库语言,用于替代java脚本。使用步骤为
1.导入jar包(jstl.jar和standard.jar);
2.在页面上导入标签库,格式为
4.1 jstl分类
现在常用的jstl有两种
core:核心类库;
fmt:格式化|国际化
4.2 core核心类库
core核心类库的jstl标签库为
常用的有两种
1.c:if 用于判断
2.c:forEach
4.2.1 c:if用法
满足的时候输出内容
例如
3大于4
3不大于4
4.2.2 c:forEach用法
4.2.2.1 普通遍历
${i}--${vs.count}--${vs.current}
其中
varStatus用于记录循环的状态,常用的属性有:
1.count:记录次数;
2.current:当前遍历的内容
java中从1到10进行输出的代码
for(int i=1; i<=10; i++) i
采用c:forEach方法为
${i}
可以在代码中增加循环状态变量
${i}--${vs.count}--${vs.current}
输出为
1-1-1
3-2-3
5-3-5
7-4-7
9-5-9
11-6-11
13-7-13
15-8-15
17-9-17
19-10-19
4.2.2.1 遍历容器
对于容器
//数组
List l = new ArrayList();
l.add(11);
l.add(22);
request.setAttribute("list",l);
//set
Set s = new HashSet();
s.add("11");
s.add("22");
request.setAttribute("set",s);
//map
Map m = new HashMap();
map.put("username","tom");
map.put("password","123");
map.put("age","18");
request.setAttribute("map",m);
对其中的数组进行遍历
${n}
输出为:11 22
对set进行遍历
${n}--${vs.count}
输出为:
11--1
22--2
对map进行遍历
${en.key}--${en.values}
输出为:
username--tom
password--123
age--18
5.展示所有商品的步骤分析
1.数据库和表
2.在index.jsp中添加一个链接
3.创建FindAllServlet
1)调用ProductService.findAll()返回一个集合List;
2)将list放入request域中(因为查询所有商品实现的是一次请求一次响应); 3)请求转发到product_list.jsp中;
4.ProductService.findAll()调用dao.findAll();
5.dao.findAll()使用beanListHandler();
6.在product_list.jsp展示所有商品
1)使用c:forEach方法; 2)使用javabean导航获取里面的数据。
6.代码实现
6.1数据库和表
在mysql创建数据库和响应表
create database day11;
use day11;
create table products(
id int primary key auto_increment,
pname varchar(20),
price double,
pdesc varchar(20)
);
insert into product values(null, '电视机', 3200,'液晶屏面大电视');
insert into product values(null, '韭菜盒子',3 ,'味重请小心食用');
insert into product values(null, '益达',10 ,'韭菜伴侣');
insert into product values(null, '十三香',12 ,'王守义十三香');
创建product_list.jsp文件
pageEncoding="UTF-8"%>
Insert title hereid | 商品名称 | 单价 | 描述 |
6.2 创建index.jsp文件
pageEncoding="UTF-8"%>
Insert title here6.3 创建FindAllServlet
package com.itcast.web.servlet;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.itcast.domain.Product;
import com.itcast.service.ProductService;
/**
* 展示所有商品
*/
public class FindAllServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.调用service返回List
List plist = null;
try {
plist = new ProductService().findAll();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2.将plist放入request域中
request.setAttribute("list", plist);
//3.请求转发
request.getRequestDispatcher("/product_list.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
6.4 调用dao层
package com.itcast.service;
import java.sql.SQLException;
import java.util.List;
import com.itcast.dao.ProductDao;
import com.itcast.domain.Product;
public class ProductService {
public List findAll() throws SQLException {
return new ProductDao().findAll();
// TODO Auto-generated method stub
}
}
6.5 创建ProductDao
package com.itcast.dao;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.itcast.domain.Product;
import com.itcast.utils.DataSourceUtils;
public class ProductDao {
public List findAll() throws SQLException {
//创建queryRunner
QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
//编写sql
String sql ="select * from product";
//执行sql
return qr.query(sql, new BeanListHandler<>(Product.class));
}
}
6.6 展示所有商品
pageEncoding="UTF-8"%>
Insert title hereid | 商品名称 | 单价 | 描述 |
${p.id } | ${p.pname } | ${p.price } | ${p.pdesc } |