一、案例一:展示所有商品信息
要实现的效果:
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对象为未捕捉的异常 当前页面出现异常,跳转到哪个页面展示 自动请求转发:服务器端路径 |
isErrorPage | true / false | 指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,可直接使用。默认情况下,isErrorPage的值为false 设置当前页面是否为标准错误页面 标准错误页面:可以获取并展示跳转而来页面的错误信息 isErrorPage设置为true以后,多出一个exception变量 exception变量封装了跳转而来页面的异常信息 |
import | 任何包名、类名 | 指定在JSP页面翻译成的Servlet源文件中导入的包或类。import是唯一可以声明多次的page指令属性。一个import属性可以引用多个类,中间用英文逗号隔开。 |
language | java | 指明解释该JSP文件时采用的语言,默认为Java |
session | true、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()内部定义了一些变量/常量,让程序员方便使用
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 JSP输出字符流 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息。 域对象,针对某次请求 |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 JSP配置信息的封装对象(一般不用) |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 域对象,针对某次会话N次请求 |
application | javax.servlet.ServletContext | 所有用户的共享信息 域对象,针对整个项目的所有请求, 在这它是最大的作用域 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 当前JSP对应的Servlet对象。 (一般不用) |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 域对象,是JSP独有的。 普通Servlet是没有这个域对象 最小的域对象, 作用范围:是当前JSP页面 域对象,针对整个项目的所有请求, 在这它是最大的作用域 |
exception | java.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 | 前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
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,进行数据的封装