java 不用jsp_java学习(十一)不用jsp脚本实现所有商品的展示

本案例主要用于实现在页面展示所有商品的信息,但是不允许使用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 here
id商品名称单价描述

6.2 创建index.jsp文件

pageEncoding="UTF-8"%>

Insert title here

展示所有商品

6.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 here
id商品名称单价描述
${p.id }${p.pname }${p.price }${p.pdesc }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值