Java进阶-JSP(十三)

一、案例一:展示所有商品信息

要实现的效果:
在这里插入图片描述

1.1、流程分析

在这里插入图片描述

1.2、代码实现

(1)结构:
在这里插入图片描述
(2)新建一个index.html如上所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="/servlet7/search">点击查询商品</a>
</body>
</html>

(3)sql导入:

create database product;
use product
CREATE TABLE product (
  pid VARCHAR(32) NOT NULL,
  pname VARCHAR(50) DEFAULT NULL,
  market_price DOUBLE DEFAULT NULL,
  shop_price DOUBLE DEFAULT NULL,
  pimage VARCHAR(200) DEFAULT NULL,
  pdate DATE DEFAULT NULL,
  is_hot INT(11) DEFAULT NULL,
  pdesc VARCHAR(255) DEFAULT NULL,
  pflag INT(11) DEFAULT NULL,
  cid VARCHAR(32) DEFAULT NULL,
  PRIMARY KEY (pid)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `product` VALUES ('1','小米 4c 标准版',1399,1299,'products/1/c_0001.jpg','2015-11-02',1,'小米 4c 标准版 全网通 白色 移动联通电信4G手机 双卡双待',0,'1'),('10','华为 Ascend Mate7',2699,2599,'products/1/c_0010.jpg','2015-11-02',1,'华为 Ascend Mate7 月光银 移动4G手机 双卡双待双通6英寸高清大屏,纤薄机身,智能超八核,按压式指纹识别!!选择下方“移动老用户4G飞享合约”,无需换号,还有话费每月返还!',0,'1'),('11','vivo X5Pro',2399,2298,'products/1/c_0014.jpg','2015-11-02',1,'移动联通双4G手机 3G运存版 极光白【购机送蓝牙耳机+蓝牙自拍杆】新升级3G运行内存·双2.5D弧面玻璃·眼球识别技术',0,'1'),('12','努比亚(nubia)My 布拉格',1899,1799,'products/1/c_0013.jpg','2015-11-02',0,'努比亚(nubia)My 布拉格 银白 移动联通4G手机 双卡双待【嗨11,下单立减100】金属机身,快速充电!布拉格相机全新体验!',0,'1'),('13','华为 麦芒4',2599,2499,'products/1/c_0012.jpg','2015-11-02',1,'华为 麦芒4 晨曦金 全网通版4G手机 双卡双待金属机身 2.5D弧面屏 指纹解锁 光学防抖',0,'1'),('14','vivo X5M',1899,1799,'products/1/c_0011.jpg','2015-11-02',0,'vivo X5M 移动4G手机 双卡双待 香槟金【购机送蓝牙耳机+蓝牙自拍杆】5.0英寸大屏显示·八核双卡双待·Hi-Fi移动KTV',0,'1'),('15','Apple iPhone 6 (A1586)',4399,4288,'products/1/c_0015.jpg','2015-11-02',1,'Apple iPhone 6 (A1586) 16GB 金色 移动联通电信4G手机长期省才是真的省!点击购机送费版,月月送话费,月月享优惠,畅享4G网络,就在联通4G!',0,'1'),('16','华为 HUAWEI Mate S 臻享版',4200,4087,'products/1/c_0016.jpg','2015-11-03',0,'华为 HUAWEI Mate S 臻享版 手机 极昼金 移动联通双4G(高配)满星评价即返30元话费啦;买就送电源+清水套+创意手机支架;优雅弧屏,mate7升级版',0,'1'),('17','索尼(SONY) E6533 Z3+',4099,3999,'products/1/c_0017.jpg','2015-11-02',0,'索尼(SONY) E6533 Z3+ 双卡双4G手机 防水防尘 涧湖绿索尼z3专业防水 2070万像素 移动联通双4G',0,'1'),('18','HTC One M9+',3599,3499,'products/1/c_0018.jpg','2015-11-02',0,'HTC One M9+(M9pw) 金银汇 移动联通双4G手机5.2英寸,8核CPU,指纹识别,UltraPixel超像素前置相机+2000万/200万后置双镜头相机!降价特卖,惊喜不断!',0,'1'),('19','HTC Desire 826d 32G 臻珠白',1599,1469,'products/1/c_0020.jpg','2015-11-02',1,'后置1300万+UltraPixel超像素前置摄像头+【双】前置扬声器+5.5英寸【1080p】大屏!',0,'1'),('2','中兴 AXON',2899,2699,'products/1/c_0002.jpg','2015-11-05',1,'中兴 AXON 天机 mini 压力屏版 B2015 华尔金 移动联通电信4G 双卡双待',0,'1'),('20','小米 红米2A 增强版 白色',649,549,'products/1/c_0019.jpg','2015-11-02',0,'新增至2GB 内存+16GB容量!4G双卡双待,联芯 4 核 1.5GHz 处理器!',0,'1'),('21','魅族 魅蓝note2 16GB 白色',1099,999,'products/1/c_0021.jpg','2015-11-02',0,'现货速抢,抢完即止!5.5英寸1080P分辨率屏幕,64位八核1.3GHz处理器,1300万像素摄像头,双色温双闪光灯!',0,'1'),('22','三星 Galaxy S5 (G9008W) 闪耀白',2099,1999,'products/1/c_0022.jpg','2015-11-02',1,'5.1英寸全高清炫丽屏,2.5GHz四核处理器,1600万像素',0,'1'),('23','sonim XP7700 4G手机',1799,1699,'products/1/c_0023.jpg','2015-11-09',1,'三防智能手机 移动/联通双4G 安全 黑黄色 双4G美国军工IP69 30天长待机 3米防水防摔 北斗',0,'1'),('24','努比亚(nubia)Z9精英版 金色',3988,3888,'products/1/c_0024.jpg','2015-11-02',1,'移动联通电信4G手机 双卡双待真正的无边框!金色尊贵版!4GB+64GB大内存!',0,'1'),('25','Apple iPhone 6 Plus (A1524) 16GB 金色',5188,4988,'products/1/c_0025.jpg','2015-11-02',0,'Apple iPhone 6 Plus (A1524) 16GB 金色 移动联通电信4G手机 硬货 硬实力',0,'1'),('26','Apple iPhone 6s (A1700) 64G 玫瑰金色',6388,6088,'products/1/c_0026.jpg','2015-11-02',0,'Apple iPhone 6 Plus (A1524) 16GB 金色 移动联通电信4G手机 硬货 硬实力',0,'1'),('27','三星 Galaxy Note5(N9200)32G版',5588,5388,'products/1/c_0027.jpg','2015-11-02',0,'旗舰机型!5.7英寸大屏,4+32G内存!不一样的SPen更优化的浮窗指令!赠无线充电板!',0,'1'),('28','三星 Galaxy S6 Edge+(G9280)32G版 铂光金',5999,5888,'products/1/c_0028.jpg','2015-11-02',0,'赠移动电源+自拍杆+三星OTG金属U盘+无线充电器+透明保护壳',0,'1'),('29','LG G4(H818)陶瓷白 国际版',3018,2978,'products/1/c_0029.jpg','2015-11-02',0,'李敏镐代言,F1.8大光圈1600万后置摄像头,5.5英寸2K屏,3G+32G内存,LG年度旗舰机!',0,'1'),('3','华为荣耀6',1599,1499,'products/1/c_0003.jpg','2015-11-02',0,'荣耀 6 (H60-L01) 3GB内存标准版 黑色 移动4G手机',0,'1'),('30','微软(Microsoft) Lumia 640 LTE DS (RM-1113)',1099,999,'products/1/c_0030.jpg','2015-11-02',0,'微软首款双网双卡双4G手机,5.0英寸高清大屏,双网双卡双4G!',0,'1'),('31','宏碁(acer)ATC705-N50 台式电脑',2399,2299,'products/1/c_0031.jpg','2015-11-02',0,'爆款直降,满千减百,品质宏碁,特惠来袭,何必苦等11.11,早买早便宜!',0,'2'),('32','Apple MacBook Air MJVE2CH/A 13.3英寸',6788,6688,'products/1/c_0032.jpg','2015-11-02',0,'宽屏笔记本电脑 128GB 闪存',0,'2'),('33','联想(ThinkPad) 轻薄系列E450C(20EH0001CD)',4399,4199,'products/1/c_0033.jpg','2015-11-02',0,'联想(ThinkPad) 轻薄系列E450C(20EH0001CD)14英寸笔记本电脑(i5-4210U 4G 500G 2G独显 Win8.1)',0,'2'),('34','联想(Lenovo)小新V3000经典版',4599,4499,'products/1/c_0034.jpg','2015-11-02',0,'14英寸超薄笔记本电脑(i7-5500U 4G 500G+8G SSHD 2G独显 全高清屏)黑色满1000減100,狂减!火力全开,横扫3天!',0,'2'),('35','华硕(ASUS)经典系列R557LI',3799,3699,'products/1/c_0035.jpg','2015-11-02',0,'15.6英寸笔记本电脑(i5-5200U 4G 7200转500G 2G独显 D刻 蓝牙 Win8.1 黑色)',0,'2'),('36','华硕(ASUS)X450J',4599,4399,'products/1/c_0036.jpg','2015-11-02',0,'14英寸笔记本电脑 (i5-4200H 4G 1TB GT940M 2G独显 蓝牙4.0 D刻 Win8.1 黑色)',0,'2'),('37','戴尔(DELL)灵越 飞匣3000系列',3399,3299,'products/1/c_0037.jpg','2015-11-03',0,' Ins14C-4528B 14英寸笔记本(i5-5200U 4G 500G GT820M 2G独显 Win8)黑',0,'2'),('38','惠普(HP)WASD 暗影精灵',5699,5499,'products/1/c_0038.jpg','2015-11-02',0,'15.6英寸游戏笔记本电脑(i5-6300HQ 4G 1TB+128G SSD GTX950M 4G独显 Win10)',0,'2'),('39','Apple 配备 Retina 显示屏的 MacBook',11299,10288,'products/1/c_0039.jpg','2015-11-02',0,'Pro MF840CH/A 13.3英寸宽屏笔记本电脑 256GB 闪存',0,'2'),('4','联想 P1',2199,1999,'products/1/c_0004.jpg','2015-11-02',0,'联想 P1 16G 伯爵金 移动联通4G手机充电5分钟,通话3小时!科技源于超越!品质源于沉淀!5000mAh大电池!高端商务佳配!',0,'1'),('40','机械革命(MECHREVO)MR X6S-M',6799,6599,'products/1/c_0040.jpg','2015-11-02',0,'15.6英寸游戏本(I7-4710MQ 8G 64GSSD+1T GTX960M 2G独显 IPS屏 WIN7)黑色',0,'2'),('41','神舟(HASEE) 战神K660D-i7D2',5699,5499,'products/1/c_0041.jpg','2015-11-02',0,'15.6英寸游戏本(i7-4710MQ 8G 1TB GTX960M 2G独显 1080P)黑色',0,'2'),('42','微星(MSI)GE62 2QC-264XCN',6199,5999,'products/1/c_0042.jpg','2015-11-02',0,'15.6英寸游戏笔记本电脑(i5-4210H 8G 1T GTX960MG DDR5 2G 背光键盘)黑色',0,'2'),('43','雷神(ThundeRobot)G150S',5699,5499,'products/1/c_0043.jpg','2015-11-02',0,'15.6英寸游戏本 ( i7-4710MQ 4G 500G GTX950M 2G独显 包无亮点全高清屏) 金',0,'2'),('44','惠普(HP)轻薄系列 HP',3199,3099,'products/1/c_0044.jpg','2015-11-02',0,'15-r239TX 15.6英寸笔记本电脑(i5-5200U 4G 500G GT820M 2G独显 win8.1)金属灰',0,'2'),('45','未来人类(Terrans Force)T5',10999,9899,'products/1/c_0045.jpg','2015-11-02',0,'15.6英寸游戏本(i7-5700HQ 16G 120G固态+1TB GTX970M 3G GDDR5独显)黑',0,'2'),('46','戴尔(DELL)Vostro 3800-R6308 台式电脑',3299,3199,'products/1/c_0046.jpg','2015-11-02',0,'(i3-4170 4G 500G DVD 三年上门服务 Win7)黑',0,'2'),('47','联想(Lenovo)H3050 台式电脑',5099,4899,'products/1/c_0047.jpg','2015-11-11',0,'(i5-4460 4G 500G GT720 1G独显 DVD 千兆网卡 Win10)23英寸',0,'2'),('48','Apple iPad mini 2 ME279CH/A',2088,1888,'products/1/c_0048.jpg','2015-11-02',0,'(配备 Retina 显示屏 7.9英寸 16G WLAN 机型 银色)',0,'2'),('49','小米(MI)7.9英寸平板',1399,1299,'products/1/c_0049.jpg','2015-11-02',0,'WIFI 64GB(NVIDIA Tegra K1 2.2GHz 2G 64G 2048*1536视网膜屏 800W)白色',0,'2'),('5','摩托罗拉 moto x(x+1)',1799,1699,'products/1/c_0005.jpg','2015-11-01',0,'摩托罗拉 moto x(x+1)(XT1085) 32GB 天然竹 全网通4G手机11月11天!MOTO X震撼特惠来袭!1699元!带你玩转黑科技!天然材质,原生流畅系统!',0,'1'),('50','Apple iPad Air 2 MGLW2CH/A',2399,2299,'products/1/c_0050.jpg','2015-11-12',0,'(9.7英寸 16G WLAN 机型 银色)',0,'2'),('6','魅族 MX5 16GB 银黑色',1899,1799,'products/1/c_0006.jpg','2015-11-02',0,'魅族 MX5 16GB 银黑色 移动联通双4G手机 双卡双待送原厂钢化膜+保护壳+耳机!5.5英寸大屏幕,3G运行内存,2070万+500万像素摄像头!长期省才是真的省!',0,'1'),('7','三星 Galaxy On7',1499,1398,'products/1/c_0007.jpg','2015-11-14',0,'三星 Galaxy On7(G6000)昂小七 金色 全网通4G手机 双卡双待新品火爆抢购中!京东尊享千元良机!5.5英寸高清大屏!1300+500W像素!评价赢30元话费券!',0,'1'),('8','NUU NU5',1288,1190,'products/1/c_0008.jpg','2015-11-02',0,'NUU NU5 16GB 移动联通双4G智能手机 双卡双待 晒单有礼 晨光金香港品牌 2.5D弧度前后钢化玻璃 随机附赠手机套+钢化贴膜 晒单送移动电源+蓝牙耳机',0,'1'),('9','乐视(Letv)乐1pro(X800)',2399,2299,'products/1/c_0009.jpg','2015-11-02',0,'乐视(Letv)乐1pro(X800)64GB 金色 移动联通4G手机 双卡双待乐视生态UI+5.5英寸2K屏+高通8核处理器+4GB运行内存+64GB存储+1300万摄像头!',0,'1');

(4)三层架构好,编写实体Product.java


package com.zql.pojo;

import java.io.Serializable;
import java.util.Date;

/**

* author:Daniel

* version:1.0

*/

public class Product implements Serializable{
	
	private String pid;
	private String pname;
	private double market_price;
	private double shop_price;
	private String pimage;
	private Date pdate;
	private int is_hot;
	private String pdesc;
	private int pflag;
	private String cid;
	public Product() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Product(String pid, String pname, double market_price, double shop_price, String pimage, Date pdate,
			int is_hot, String pdesc, int pflag, String cid) {
		super();
		this.pid = pid;
		this.pname = pname;
		this.market_price = market_price;
		this.shop_price = shop_price;
		this.pimage = pimage;
		this.pdate = pdate;
		this.is_hot = is_hot;
		this.pdesc = pdesc;
		this.pflag = pflag;
		this.cid = cid;
	}
	public String getPid() {
		return pid;
	}
	public void setPid(String pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public double getMarket_price() {
		return market_price;
	}
	public void setMarket_price(double market_price) {
		this.market_price = market_price;
	}
	public double getShop_price() {
		return shop_price;
	}
	public void setShop_price(double shop_price) {
		this.shop_price = shop_price;
	}
	public String getPimage() {
		return pimage;
	}
	public void setPimage(String pimage) {
		this.pimage = pimage;
	}
	public Date getPdate() {
		return pdate;
	}
	public void setPdate(Date pdate) {
		this.pdate = pdate;
	}
	public int getIs_hot() {
		return is_hot;
	}
	public void setIs_hot(int is_hot) {
		this.is_hot = is_hot;
	}
	public String getPdesc() {
		return pdesc;
	}
	public void setPdesc(String pdesc) {
		this.pdesc = pdesc;
	}
	public int getPflag() {
		return pflag;
	}
	public void setPflag(int pflag) {
		this.pflag = pflag;
	}
	public String getCid() {
		return cid;
	}
	public void setCid(String cid) {
		this.cid = cid;
	}
	@Override
	public String toString() {
		return "Product [pid=" + pid + ", pname=" + pname + ", market_price=" + market_price + ", shop_price="
				+ shop_price + ", pimage=" + pimage + ", pdate=" + pdate + ", is_hot=" + is_hot + ", pdesc=" + pdesc
				+ ", pflag=" + pflag + ", cid=" + cid + "]";
	}
	
}

ProductServlet.java

package com.zql.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zql.pojo.Product;
import com.zql.service.ProductService;


@WebServlet("/search")
public class ProductServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决乱码问题
		response.setContentType("text/html;charset=utf-8");
		
		//获取商品
		request.getParameter("");
		
		ProductService service = new ProductService();
		
		List<Product> pList = service.search();
		
		PrintWriter writer = response.getWriter();
		
		writer.write("<!DOCTYPE html>\r\n");
		writer.write("<html>\r\n");
		      writer.write("<head>\r\n");
		      writer.write("<meta charset=\"UTF-8\">\r\n");
		      writer.write("<title>Insert title here</title>\r\n");
		      writer.write("</head>\r\n");
		      writer.write("<body>\r\n");
		      writer.write("\t<table border=\"1\" width=\"100%\">\r\n");
		      writer.write("\t\t<tr>\r\n");
		      writer.write("\t\t\t<th>商品序号</th>\r\n");
		      writer.write("\t\t\t<th>商品名称</th>\r\n");
		      writer.write("\t\t\t<th>商品图片</th>\r\n");
		      writer.write("\t\t\t<th>商品价格</th>\r\n");
		      writer.write("\t\t\t<th>商品描述</th>\r\n");
		      writer.write("\t\t</tr>\r\n");

		
		for(int i = 0;i < pList.size();i++) {

			
			      writer.write("\t\t<tr>\r\n");
			      writer.write("\t\t\t<td>"+(i+1)+"</td>\r\n");
			      writer.write("\t\t\t<td>"+pList.get(i).getPname()+"</td>\r\n");
			      writer.write("\t\t\t<td><img src=\"/servlet7/"+pList.get(i).getPimage()+"\" width=\"100%\" height=\"100%\"/></td>\r\n");
			      writer.write("\t\t\t<td>"+pList.get(i).getShop_price()+"</td>\r\n");
			      writer.write("\t\t\t<td>"+pList.get(i).getPdesc()+"</td>\r\n");
			      writer.write("\t\t</tr>\r\n");

		}	
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

}

ProductService.java


package com.zql.service;

import java.util.List;

import com.zql.dao.ProductDao;
import com.zql.pojo.Product;

/**

* author:Daniel

* version:1.0

*/

public class ProductService {

	public List<Product> search() {
		
		ProductDao dao = new ProductDao();
		
		return dao.search();
		
	}

}

ProductDao.java


package com.zql.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.zql.pojo.Product;
import com.zql.utils.C3P0Utils;

/**

* author:Daniel

* version:1.0

*/

public class ProductDao {

	public List<Product> search() {
		try {
		
		QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
		
		String sql = "select * from product";
		
		List<Product> plist = qr.query(sql, new BeanListHandler<Product>(Product.class));
			
		return plist;
		
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
		
	}

}

(5) 启动tomcat,浏览器访问:http://localhost:8080/servlet7/index.html

显示如下:
在这里插入图片描述

1.3、JSP技术

作用:代替了servlet做响应体输出

1.3.1、JSP简述

JSP全名是Java Server Pages。Java服务器页面,它是建立在Servlet规范之上的动态网页开发技术。在JSP文件中,HTML代码与Java代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java代码用来实现网页中动态内容的显示。为了与传统HTML有所区别,JSP文件的扩展名为.jsp。

在这里插入图片描述

JSP = HTML + java

1.3.1.1 入门案例

在这里插入图片描述

HTML与JSP的区别:

HTML只能展示静态内容, 不能写java代码
JSP即可以展示静态内容,也可以展示动态内容(java代码)
JSP = HTML + Java

1.3.1.2 Jsp执行原理(了解)

在这里插入图片描述
匹配执行.JSP
在这里插入图片描述
HttpJspBase是Servlet的子类

JSP的本质就是一个 Servlet

1.3.2、JSP开发模板修改(了解)

改变了模板的编码:

在这里插入图片描述

1.3.3、JSP脚本

JSP脚本:在JSP源码上书写Java代码

<body>
	<%
		String str = "Daniel";
		out.print(str);
	%>
</body>

JSP脚本片段:

写法格式: <% java代码 %>
翻译后的位置: 在_jspService这个方法内

在这里插入图片描述
JSP声明片段:

写法格式: <%! %>
翻译后的位置: 在成员变量上

JSP脚本表达式:

写法格式: <%= %>
翻译后的位置: 在_jspService这个方法内
在这里插入图片描述

1.3.4、JSP注释

写法格式: <%-- 注释 --%>

1.3.5、JSP指令(重点)

1.3.5.1、指令简述

jsp中可能会写大量的java代码

JSP的指令,可以大大减少程序员书写Java代码的工作量。
程序员只需要设置简单的指令,翻译后的Java代码上,简单的指令会翻译成大段大段的Java代码来执行

指令格式:

<%@指令名称 属性名1=”属性值1” 属性名2=”属性值2” %>

指令名称:

Page指令
Include指令
Taglib指令

1.3.5.2、Page指令

来创建一个jsp文件, 会不会有这个page指令, 默认被创建的.

属性名称|取值or范围|描述

属性名称取值or范围 描述
pageEncoding当前页面指定页面编码格式
相当于:response.setCharacterEncoding(“UTF-8”)
contentType有效的文档类型 客户端浏览器根据该属性判断文档类型,例如:
HTML格式为text/html
纯文本格式为text/plain
JPG图像为image/jpeg
GIF图像为image/gif
Word文档为application/msword
类是于:
response.setContentType("text/html; charset=UTF-8");
errorPage某个JSP页面的相对路径指定一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。 errorPage指定页面的isErrorPage属性为true,且内置的exception对象为未捕捉的异常
当前页面出现异常,跳转到哪个页面展示
自动请求转发:服务器端路径
isErrorPagetrue / false 指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,可直接使用。默认情况下,isErrorPage的值为false
设置当前页面是否为标准错误页面
标准错误页面:可以获取并展示跳转而来页面的错误信息
isErrorPage设置为true以后,多出一个exception变量
exception变量封装了跳转而来页面的异常信息
import任何包名、类名指定在JSP页面翻译成的Servlet源文件中导入的包或类。import是唯一可以声明多次的page指令属性。一个import属性可以引用多个类,中间用英文逗号隔开。
languagejava指明解释该JSP文件时采用的语言,默认为Java
sessiontrue、false指明该JSP内是否内置Session对象,如果为true,则说明内置Session对象,可以直接使用,否则没有内置Session对象。 默认情况下,session属性的值为true。需要注意的是,JSP 引擎自动导入以下4个包:
java.lang.*
javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*

在这里插入图片描述
在这里插入图片描述

1.3.5.3、include指令

Java中: 重复性代码 提取或者是抽取为工具类
Jsp中: 重复性的代码 使用include指令来抽取

应用场景:
在这里插入图片描述
在这里插入图片描述

上图步骤总结:

(1)编写index/head.jsp
(2)编写index/foot.jsp
(3)编写index/index.jsp
(4)加入启动tomcat
(5)访问:http://localhost:8080/servlet7/index/index.jsp

1.3.5.4、taglib指令

专门负责引入其他标签库
在这里插入图片描述

1.3.6、JSP九大内置对象

1.3.6.1、九大内置对象简述

JSP会翻译成Java代码,作为Servlet执行。
每次必须会执行_jspService()
_jspService()内部定义了一些变量/常量,让程序员方便使用

名称类型 描述
outjavax.servlet.jsp.JspWriter用于页面输出
JSP输出字符流
requestjavax.servlet.http.HttpServletRequest 得到用户请求信息。
域对象,针对某次请求
responsejavax.servlet.http.HttpServletResponse服务器向客户端的回应信息
configjavax.servlet.ServletConfig 服务器配置,可以取得初始化参数
JSP配置信息的封装对象(一般不用)
sessionjavax.servlet.http.HttpSession用来保存用户的信息
域对象,针对某次会话N次请求
applicationjavax.servlet.ServletContext所有用户的共享信息
域对象,针对整个项目的所有请求, 在这它是最大的作用域
pagejava.lang.Object指当前页面转换后的Servlet类的实例
当前JSP对应的Servlet对象。
(一般不用)
pageContextjavax.servlet.jsp.PageContextJSP的页面容器
域对象,是JSP独有的。
普通Servlet是没有这个域对象
最小的域对象,
作用范围:是当前JSP页面
域对象,针对整个项目的所有请求, 在这它是最大的作用域
exceptionjava.lang.Throwable表示JSP页面所发生的异常,在错误页中才起作用
设置了isErrorPage=”true”才会出现。
封装了上一个页面的错误信息。 (一般不用)
1.3.6.2、pageContext对象

pageContext对象是JSP独有的,普通Servlet没有这个对象。

作用范围:

当前JSP页面

作用:

JSP最小的域对象

<body>
		<%
		//向pageContext中存储数据
		pageContext.setAttribute("name","Daniel");
		%>
		
		<%
		//从pageContext中获取数据
		String name = (String)pageContext.getAttribute("name");
		out.print(name);
		%>
</body>

显示如下:
在这里插入图片描述

1.3.6.3、out对象

Out对象 jsp中用户输出字符流对象
Response.getWrite() servlet输出字符流对象

1.3.7、JSP四大作用域总结(了解)

Servlet 三大作用域:

从小到大: request session ServletContext

JSP四大作用域:

从小到大: pageContext request session ServletContext

1.4、使用JSP优化案例代码

(1)其它代码都不变动,修改ProductServlet.java

添加部分(添加的同时要注掉之前的部分,可看完整代码)

//存储在域对象中
request.setAttribute("pList", pList);
//转发到jsp页面
request.getRequestDispatcher("/pList.jsp").forward(request, response);

完整代码:

package com.zql.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zql.pojo.Product;
import com.zql.service.ProductService;


@WebServlet("/search")
public class ProductServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决乱码问题
		response.setContentType("text/html;charset=utf-8");
		
		//获取商品
		request.getParameter("");
		
		ProductService service = new ProductService();
		
		List<Product> pList = service.search();
		
		//存储在域对象中
		request.setAttribute("pList", pList);
		//转发到jsp页面
		request.getRequestDispatcher("/pList.jsp").forward(request, response);
		
		/*
		 * PrintWriter writer = response.getWriter();
		 * 
		 * writer.write("<!DOCTYPE html>\r\n"); writer.write("<html>\r\n");
		 * writer.write("<head>\r\n"); writer.write("<meta charset=\"UTF-8\">\r\n");
		 * writer.write("<title>Insert title here</title>\r\n");
		 * writer.write("</head>\r\n"); writer.write("<body>\r\n");
		 * writer.write("\t<table border=\"1\" width=\"100%\">\r\n");
		 * writer.write("\t\t<tr>\r\n"); writer.write("\t\t\t<th>商品序号</th>\r\n");
		 * writer.write("\t\t\t<th>商品名称</th>\r\n");
		 * writer.write("\t\t\t<th>商品图片</th>\r\n");
		 * writer.write("\t\t\t<th>商品价格</th>\r\n");
		 * writer.write("\t\t\t<th>商品描述</th>\r\n"); writer.write("\t\t</tr>\r\n");
		 * 
		 * 
		 * for(int i = 0;i < pList.size();i++) {
		 * 
		 * 
		 * writer.write("\t\t<tr>\r\n"); writer.write("\t\t\t<td>"+(i+1)+"</td>\r\n");
		 * writer.write("\t\t\t<td>"+pList.get(i).getPname()+"</td>\r\n");
		 * writer.write("\t\t\t<td><img src=\"/servlet7/"+pList.get(i).getPimage()
		 * +"\" width=\"100%\" height=\"100%\"/></td>\r\n");
		 * writer.write("\t\t\t<td>"+pList.get(i).getShop_price()+"</td>\r\n");
		 * writer.write("\t\t\t<td>"+pList.get(i).getPdesc()+"</td>\r\n");
		 * writer.write("\t\t</tr>\r\n");
		 * 
		 * }
		 */	
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {	
	}
}

(2)在WebContent下面添加pList.jsp(记得导包import="java.util.*,com.zql.pojo.Product"

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,com.zql.pojo.Product"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table border="1" width="100%">
		<tr>
			<th>商品序号</th>
			<th>商品名称</th>
			<th>商品图片</th>
			<th>商品价格</th>
			<th>商品描述</th>
		</tr>

			<%
				List<Product> plist = (List<Product>)request.getAttribute("pList");
			
				for(int i = 0;i < plist.size();i++){
			%>
				
				<tr>
					<td><%=i+1%></td>
					<td><%=plist.get(i).getPname()%></td>
					<td><img src="/servlet7/<%=plist.get(i).getPimage()%>" width="100%" height="100%"/></td>
					<td><%=plist.get(i).getShop_price()%></td>
					<td><%=plist.get(i).getPdesc()%></td>
				</tr>
			<%
				}
			%>	
	</table>
</body>
</html>

(3)启动tomcat运行: http://localhost:8080/servlet7/search

在这里插入图片描述
遇到问题解决参考

二、案例二:展示所有商品信息(优化)

2.1、讲解:EL表达式(重点

2.1.1、EL简述

EL是Expression Language的缩写,它是一种简单的数据访问语言。
EL(Expression Language) 目的:为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

在这里插入图片描述

2.1.2、EL表达式使用

写法格式: ${el表达式 }

2.1.2.1、入门案例 简单使用EL表达式

在这里插入图片描述

2.1.2.2、数据的读取

目前学习的EL表达式不支持数据的保存/数据的存储操作。

EL表达式能做的就是读 相当于数据库中 select
EL表达式不能读取JSP中的变量;
EL表达式可以读取域对象中的键值对,需要写的键值对的名称;

String
在这里插入图片描述

String[]

在这里插入图片描述

List

在这里插入图片描述

Map

在这里插入图片描述

JavaBean
(1)先创建JavaBean(Person.java)


package com.zql.pojo;

import java.io.Serializable;

/**

* author:Daniel

* version:1.0

*/

public class Person implements Serializable{
	
	private int id;
	private String name;
	private String hobby;
	private String addr;
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person(int id, String name, String hobby, String addr) {
		super();
		this.id = id;
		this.name = name;
		this.hobby = hobby;
		this.addr = addr;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", hobby=" + hobby + ", addr=" + addr + "]";
	}
}

在这里插入图片描述

复合形式 List

在这里插入图片描述

上述全部代码(elel.jsp):

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,com.zql.pojo.Person"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
			<!-- String -->
			<%-- 
			<%
			String str = "Daniel";
			request.setAttribute("str", str);
			%>
			${str} --%>
			
			<!-- String[] -->
			
			<%-- <%
				String [] arr = {"Daniel","Wendy","Kendra"};
				request.setAttribute("arr", arr);
				
			%>
			${arr}<br/>
			${arr[1]} --%>
			
			<!-- List --> <!-- 记得导包哦 -->
			<%-- <%
			List list =  new ArrayList();
			
			list.add("name");
			list.add("age");
			list.add("hobby");
			list.add("addr");
			request.setAttribute("list",list);
			%>
			 ${list} --%>
			<!-- Map -->
			
			<%-- <%
			Map map =  new HashMap();
			map.put("name", "Daniel");
			map.put("age", 100);
			map.put("birthday", "521");
			map.put("hobby", "run");
			request.setAttribute("map", map);
			%>
			
			${map}<br/>
			${map.name} --%>
			
			<!-- JavaBean --><!-- 写了 Person记得导包呐 -->
			
			<%-- <%
				Person person = new Person(3,"Daniel","run","深圳");
			
				request.setAttribute("person",person);			
			%>
			${person }<br/>
			${person.addr } --%>
			
			<!-- 复合形式  List<JavaBean>  -->
			
			<%
				List list = new ArrayList();
				Person person1 = new Person(3,"Daniel","run","深圳");
				Person person2 = new Person(4,"Daniel","run","深圳");
				Person person3 = new Person(5,"GuoGuo","play","兰州");
				list.add(person1);
				list.add(person2);
				list.add(person3);
				
				request.setAttribute("list",list);
			%>
			${list }<br/>
			${list[2].name}
</body>
</html>
2.1.2.3、数据的运算 (域对象)

对常量进行运算: (不频繁)
对域对象数据进行运算: 频繁使用
运算完毕不会修改域对象数据

在这里插入图片描述

<%
int i = 1;
int j = 2;
String a = "1";
String b = "2";
request.setAttribute("i",i);
request.setAttribute("j",j);
request.setAttribute("a",a);
request.setAttribute("b",b);
%>
${i+j}<br/>
${a+b}<br/>
${i+a}<br/>
${a+j}
  • 没有拼接的功能,只能是数字相加

下面表格有空再了解哈 😐

在这里插入图片描述

2.1.2.4、数据的判断(域对象)

是否为空的判断
<%--
1.对象是否为null
2.字符串是否为"" 或者null
3.集合是否为0 或者null
–%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.zql.pojo.Person"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%
			/*1.对象是否为null   */
			Person person1 = new Person(2,"Daniel","run","深圳");
			Person person2 = new Person();
			Person person3 = null;
			
			request.setAttribute("person1", person1);
			request.setAttribute("person2", person2);
			request.setAttribute("person3", person3);
		%>
		
		${empty person1};<br/>
		${empty person2};<br/>
		${empty person3};
		
		${not empty person1};<br/>
		${not empty person2};<br/>
		${not empty person3};
</body>
</html>

在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.zql.pojo.Person"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%
			/*2.字符串是否为"" 或者null*/
			String a = "Daniel";
			String b = "";
			String c = null;
	
			
			request.setAttribute("a", a);
			request.setAttribute("b", b);
			request.setAttribute("c", c);
		%>
		
		${empty a};<br/>
		${empty b};<br/>
		${empty c};<br/>
		
		${not empty a};<br/>
		${not empty b};<br/>
		${not empty c};
</body>
</html>

在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
		<%
			/*3.集合是否为0 或者null */
			List list1 = new ArrayList();
			List list2 = new ArrayList();
			list2.add(11);
			List list3 = null;
			
			
			request.setAttribute("list1", list1);
			request.setAttribute("list2", list2);
			request.setAttribute("list3", list3);
		%>
		
		${empty list1};<br/>
		${empty list2};<br/>
		${empty list3};<br/>
		
		${not empty list1};<br/>
		${not empty list2};<br/>
		${not empty list3};
</body>
</html>

在这里插入图片描述

2.2、知识点:JSTL标签

2.2.1、JSTL标签的简述及导入

在这里插入图片描述

JSTL标签和EL表达式的作用是一样的,简化大量的JSP脚本。
JSTL作用原理和EL表达式一样的,翻译成大段的Java代码来使用。

标签库标签库的UTL前缀
Corehttp://java.sun.com/jsp/jstl/corec
I18Nhttp://java.sun.com/jsp/jstl/fmtfmt
SQLhttp://java.sun.com/jsp/jstl/sqlsql
XMLhttp://java.sun.com/jsp/jstl/xmlx
Functionshttp://java.sun.com/jsp/jstl/functionsfn

Core标签库中有很多标签。

使用JSTL标签。

导入JAR包,项目就可以使用JSTL标签

(1)导jar包

在这里插入图片描述

只能使用在JSP上,无法使用在HTML上。

JSP需要使用taglib指令导入对应标签库,某个JSP就可以使用JSTL标签

(2)导入包

可查看1.3.5.4、taglib指令 如下指令:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

(3) 编写入门案例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String str = "Daniel";
		request.setAttribute("str", str);
	%>
	${str}
</body>
</html>

在这里插入图片描述

2.2.2、<c:if>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String name = "Daniel";
		request.setAttribute("name", name);
	%>
	<c:if test="${not empty name }">
		我不是空的
	</c:if>
</body>
</html>

在这里插入图片描述

2.2.3、<c:forEach>

Items: 要遍历的集合 和EL表达式一起使用
Var: 存放在集合中每次遍历出的数据
VarStatus:遍历出来的状态(步长)
Count:索引从1开始
Index:索引从0开始

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		List list = new ArrayList();
		list.add("Daniel");
		list.add("Wendy");
		list.add("Kendra");
		list.add("Guoguo");
		request.setAttribute("list", list);
	%>
	<c:forEach items="${list}" var="s" varStatus="vs">
		${s} <!-- 遍历值  Daniel Wendy Kendra Guoguo  -->
		<%-- ${vs.count} --%> <!-- 索引从1开始   1 2 3 4--> 
		<%-- ${vs.index} --%><!-- 索引从0开始    0 1 2 3--> 
	</c:forEach>
</body>
</html>

2.3、案例代码优化

(1)导入JSTL 的jar包(前面有提到)
(2)将ProductServlet.java 中转发修改为:pList2.jsp
在这里插入图片描述
(3)编写pList2.jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<table border="1" width="100%">
		<tr>
			<th>商品序号</th>
			<th>商品名称</th>
			<th>商品图片</th>
			<th>商品价格</th>
			<th>商品描述</th>
		</tr>
		
		<c:if test="${not empty pList}">
			<c:forEach items="${pList}" var="vs" varStatus="ps">
				<tr>
					<td>${ps.count}</td>
					<td>${vs.pname}</td>
					<td><img src="/servlet7/${vs.pimage }" width="100%" height="100%"/></td>
					<td>${vs.shop_price }</td>
					<td>${vs.pdesc}</td>
				</tr>
			</c:forEach>
		</c:if>
	</table>
</body>
</html>

(4)运行: http://localhost:8080/servlet7/search

在这里插入图片描述

2.4、MVC设计模式

MVC简述及作用:

MVC是软件开发中经典的设计模式。

作用:

进行业务分离,更好地进行项目的维护。

控制器Controller:Servlet ,控制展示哪个JSP/对业务进行处理
视图View:JSP,进行数据的收集或展示
模型Model:JavaBean,进行数据的封装

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daniel521-Spark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值