主要内容:
- 创建Servlet
- 配置Servlet
- Servlet的生命周期
- Servlet的应用案例:商品信息浏览及商品详情、历史访问记录展示。
详细记录:
1 创建Servlet
(1)自定义类继承HttpServlet,实现doGet、doPost方法
(2)利用模板定义Servlet
2 配置Servlet
举例:在web.xml中进行配置。
<servlet>
<servlet-name>QueryAllProduct</servlet-name>
<servlet-class>cn.sdut.servlet.product.QueryAllProduct</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>QueryAllProduct</servlet-name>
<url-pattern>/servlet/QueryAllProduct</url-pattern>
</servlet-mapping>
3 Servlet的生命周期
Init()方法和destroy()方法
4 Servlet的应用案例:商品信息浏览及商品详情、历史访问记录展示。
第一步 创建数据库shopping和表product
第二步 创建Web project——Shopping,增加数据库连接JAR包支持。将图片复制到项目中
第三步 在src下创建包cn.sdut.po,里面放置Product
第四步 在src下创建包cn.sdut.dao,里面放置BaseDao,ProductDao
第五步在src下创建包cn.sdut.servlet创建Servlet
第六步 创建页面
第七步 执行
具体代码为:
第一步 创建数据库shopping和表product
create table product
(
proid int PRIMARY key auto_increment, -- 商品编号
proname varchar(30) not null, -- 商品名称
proprice double not null, -- 商品价格
procount int not null, -- 商品数量
prosupplier varchar(50) , -- 供货商
propic varchar(30) -- 商品图片
);
-- 向product表中增加记录
insert into product(proname,proprice,procount,prosupplier,propic) values(’沃特篮球鞋’,230.2,100,’北京’,’001.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’安踏运动鞋’,300.7,100,’福州’,’002.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’耐克’,122.2,100,’上海’,’003.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’ADDIDAS’,45.24,100,’广州’,’004.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’李宁’,788.27,100,’深圳’,’005.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’小米2S’,1254.20,100,’天津’,’006.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’小米3’,1565.4,100,’济南’,’007.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’THINKPAD’,5853.89,100,’淄博’,’008.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’DELL’,4665.0,100,’青岛’,’009.jpg’);
insert into product(proname,proprice,procount,prosupplier,propic) values(’iPAD’,3368.3,100,’美国’,’010.jpg’);
第二步 创建Web project——Shopping,增加数据库连接JAR包支持。将图片复制到项目中
第三步 在src下创建包cn.sdut.po,里面放置Product
package cn.sdut.po;
public class Product {
private int proid;
private String proname;
private double proprice;
private int procount;
private String prosupplier;
private String propic;
public int getProid() {
return proid;
}
public void setProid(int proid) {
this.proid = proid;
}
public String getProname() {
return proname;
}
public void setProname(String proname) {
this.proname = proname;
}
public double getProprice() {
return proprice;
}
public void setProprice(double proprice) {
this.proprice = proprice;
}
public int getProcount() {
return procount;
}
public void setProcount(int procount) {
this.procount = procount;
}
public String getProsupplier() {
return prosupplier;
}
public void setProsupplier(String prosupplier) {
this.prosupplier = prosupplier;
}
public String getPropic() {
return propic;
}
public void setPropic(String propic) {
this.propic = propic;
}
@Override
public String toString() {
return "Product [proid=" + proid + ", proname=" + proname
+ ", proprice=" + proprice + ", procount=" + procount
+ ", prosupplier=" + prosupplier + ", propic=" + propic + "]";
}
}
第四步 在src下创建包cn.sdut.dao,里面放置BaseDao,ProductDao
BaseDao.java
package cn.sdut.dao;
import java.sql.*;
public class BaseDao {
Connection con;
PreparedStatement pst;
ResultSet rs;
public Connection getConn() {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager
.getConnection(
"jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=utf-8",
"root", "123321");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
public void closeAll() {
try {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ProductDao
package cn.sdut.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import cn.sdut.po.Product;
public class ProductDao extends BaseDao {
//锟矫碉拷锟斤拷锟斤拷锟斤拷品锟斤拷息
public List<Product> queryAllProducts()
{
List<Product> productList=new ArrayList<Product>();
con=getConn();
String sql="select * from product";
try {
pst=con.prepareStatement(sql);
rs=pst.executeQuery();
while(rs.next())
{
Product product=new Product();
product.setProid(rs.getInt("proid"));
product.setProname(rs.getString("proname"));
product.setProprice(rs.getDouble("proprice"));
product.setProcount(rs.getInt("procount"));
product.setProsupplier(rs.getString("prosupplier"));
product.setPropic(rs.getString("propic"));
productList.add(product);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
closeAll();
}
return productList;
}
public List<Product> queryProducts(String historyList)
{
String[] productIds=historyList.split(",");
List<Product> productList=new ArrayList<Product>();
int len=productIds.length;
for(int i=0;i<len;i++)
{
productList.add(queryProductById(Integer.parseInt(productIds[i])));
}
return productList;
}
//锟斤拷锟斤拷锟斤拷锟矫碉拷锟斤拷品锟斤拷息
public Product queryProductById(int id)
{
Product product=null;
con=getConn();
String sql="select * from product where proid=?";
try {
pst=con.prepareStatement(sql);
pst.setInt(1, id);
rs=pst.executeQuery();
if(rs.next())
{
product=new Product();
product.setProid(rs.getInt("proid"));
product.setProname(rs.getString("proname"));
product.setProprice(rs.getDouble("proprice"));
product.setProcount(rs.getInt("procount"));
product.setProsupplier(rs.getString("prosupplier"));
product.setPropic(rs.getString("propic"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
closeAll();
}
return product;
}
}
第五步在src下创建包cn.sdut.servlet.product创建Servlet——QueryAllProduct.java 和QueryProductById.java
QueryAllProduct.java
package cn.sdut.servlet.product;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.sdut.dao.ProductDao;
import cn.sdut.po.Product;
public class QueryAllProduct extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ProductDao productDao=new ProductDao();
List<Product> productList= productDao.queryAllProducts();
request.setAttribute("proList", productList);
request.getRequestDispatcher("/product/showAllProduct.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
QueryProductById.java
package cn.sdut.servlet.product;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.sdut.dao.ProductDao;
import cn.sdut.po.Product;
public class QueryProductById extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1 根据商品编号proid取出商品,放入request作用域
int id=Integer.parseInt(request.getParameter("productid"));
ProductDao productDao=new ProductDao();
Product product=productDao.queryProductById(id);
request.setAttribute("product", product);
//2 处理Cookie——历史访问记录
/*
* 读取Cookie中名称为histroy的数据
* 重新组织histroy: (1,2,3,4,5)的形式
* 若为空,表示未曾访问过,将现有的商品编号加入历史访问记录
* 若不为空,重新组织数据:将现有商品编号+“,”加在前面
* 如果该商品刚刚访问过,则不加入,保持原来的访问记录
* 重写Cookie的同时,根据histroy取得表中的记录,放入request作用域
* */
String historyList = null;
//从cookie中取出历史访问记录数据,形式为:1,2,3,4,5或null的形式
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (Cookie c : cookies) {
if (c.getName().equals("histroy")) {
historyList = c.getValue(); //得到历史记录
}
}
}
if (historyList == null) {
historyList = product.getProid()+"";
} else if (!historyList.startsWith(product.getProid() + "")) {
historyList = product.getProid() + "," + historyList;
}
//保留5条
String[] productIds=historyList.split(",");//以逗号为分隔符,分离历史记录
int len=productIds.length;
len=len>5?5:len;
StringBuffer buffer=new StringBuffer();
for(int i=0;i<len;i++)
{
buffer.append(productIds[i]).append(",");
}
//重写Cookie
response.addCookie(new Cookie("histroy", buffer.toString()));
//根据访问记录中的id从表中取出数据置于request作用域
ProductDao dao = new ProductDao();
List<Product> productList = dao.queryProducts(buffer.toString());
request.setAttribute("proList", productList);
//转向显示页面
request.getRequestDispatcher("/product/showProductDetails.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
第六步 创建页面
新建WebRoot/product路径,建立 showAllProduct.jsp 和showProductDetails.jsp。
showAllProduct.jsp
<%@page import="cn.sdut.po.Product"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP ’showAllProduct.jsp’ starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style>
div {
float: left;
margin: 10px;
width:180;
height:180;
}
div dd{
margin: 0px;
font-size:10pt;
}
div dd.dd_name {
color: blue;
}
div dd.dd_city {
color: #000;
}
</style>
</head>
<%
List<Product> productList = (List<Product>) request
.getAttribute("proList");
%>
<body>
<table>
<tr>
<td>
<%
for (Product product : productList) {
%>
<div>
<dl>
<dt>
<a href="servlet/QueryProductById?productid=<%=product.getProid()%>"><img src="images/<%=product.getPropic()%>" width="150"
height="120" /></a>
</dt>
<dd class="dd_name">
名称:
<%=product.getProname()%>
</dd>
<dd class="dd_city">
供应商:<%=product.getProsupplier()%>
价格:<%=product.getProprice()%>
</dd>
</dl>
</div> <%
}
%>
</td>
</tr>
</table>
</body>
</html>
showProductDetails.jsp
<%@page import="cn.sdut.dao.ProductDao"%>
<%@page import="cn.sdut.po.Product"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP ’productDetails.jsp’ starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style>
div {
float: left;
margin: 10px;
}
div dd {
margin: 0px;
font-size: 10pt;
}
div dd.dd_name {
color: blue;
}
div dd.dd_city {
color: #000;
}
</style>
</head>
<%
Product product = (Product) request.getAttribute("product");
List<Product> productList = (List<Product>) request
.getAttribute("proList");
%>
<body>
<h1>商品详情</h1>
<hr>
<table width="750" height="60">
<tr>
<td width="70%" valign="top">
<table>
<tr>
<td rowspan="4"><img width="160" height="120"
src="images/<%=product.getPropic()%>" /></td>
</tr>
<tr>
<td><b>商品名称:<%=product.getProname()%></b></td>
</tr>
<tr>
<td>生产商:<%=product.getProsupplier()%></td>
</tr>
<tr>
<td>价格:<%=product.getProprice()%> 库存数量:<%=product.getProcount()%></td>
</tr>
</table>
</td>
<td align="center">
<!-- 商品浏览记录 -->
<h3>商品浏览记录</h3>
<%
for (Product prod : productList) {
%>
<div>
<dl>
<dt>
<img
src="images/<%=prod.getPropic()%>" width="150" height="120" />
</dt>
<dd class="dd_name">
名称:
<%=prod.getProname()%>
</dd>
<dd class="dd_city">
供应商:<%=prod.getProsupplier()%>
价格:<%=prod.getProprice()%>
</dd>
</dl>
</div> <%
}
%>
</td>
</tr>
</table>
</body>
</html>
第七步 执行
http://localhost:8080/Shopping/servlet/QueryAllProduct
点击商品