目录
1.创建一个项目中的src--main-java--com.csi.eshop 下有三个包:
2.main--webapp有:
Session消失的几种方式:客户端和服务器端
- 客户端
- 如果关闭浏览器,在重新打开的时候会导致产生一个新的cookie 同时就会产生一个新的sessionId对象,对于用户来讲,相当于一个新的用户。之前的session就消失了
- 关闭浏览器之前的session并没有消失,会保留在服务器中知道过期为止
- 服务器端
- session超时,一段时间之内没有和浏览器做交互的话,此刻的状态就是未交互状态,当时长超过默认的时间或者使用者自定义的时间的 会导致session消失
- 用户点击了注销按钮之后,此时的注销按钮调用了session.invalidate()方法,导致当前用户session 注销
- 服务器待机或者关闭服务资源, 或者是由于遇到严重错误的时候 也会导致session消失。
1.先编写domain
package com.csi.eshop.domain;import java.io.Serializable;public class ProductBrand implements Serializable {private Integer id;private String brand_name;private String brand_desc;private String brand_logo;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getBrand_name() {return brand_name;}public void setBrand_name(String brand_name) {this.brand_name = brand_name;}public String getBrand_desc() {return brand_desc;}public void setBrand_desc(String brand_desc) {this.brand_desc = brand_desc;}public String getBrand_logo() {return brand_logo;}public void setBrand_logo(String brand_logo) {this.brand_logo = brand_logo;}
}
2.编写dao 中的 接口
package com.csi.eshop.dao;import com.csi.eshop.domain.Product;
import com.csi.eshop.domain.ProductBrand;import java.sql.SQLException;
import java.util.List;public interface ProductBrandDao {List<ProductBrand> list() throws SQLException;List<Product> findId(int brand_id) throws SQLException;
}
2.1编写dao 中的 impl
package com.csi.eshop.dao.impl;import com.csi.eshop.dao.ProductBrandDao;
import com.csi.eshop.domain.Product;
import com.csi.eshop.domain.ProductBrand;
import com.csi.eshop.utils.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class ProductBrandDaoImpl extends JDBCUtils implements ProductBrandDao {@Overridepublic List<ProductBrand> list() throws SQLException {final String SQL = "SELECT * FROM easybuy_brand" ;Connection connection = this.getConnection() ;PreparedStatement ps = connection.prepareStatement(SQL);ResultSet rs = ps.executeQuery();List<ProductBrand> productBrands = new ArrayList<>() ;ProductBrand productBrand = null ;while (rs.next()){productBrand = new ProductBrand() ;productBrand.setId(rs.getInt("id"));productBrand.setBrand_name(rs.getString("brand_name"));productBrand.setBrand_desc(rs.getString("brand_desc"));productBrand.setBrand_logo(rs.getString("brand_logo"));productBrands.add(productBrand);}release(rs,ps,connection);return productBrands;}@Overridepublic List<Product> findId(int brand_id) throws SQLException {final String SQL = "SELECT * FROM easybuy_product where isDelete = 0 AND brand_id = ?" ;Connection connection = this.getConnection() ;PreparedStatement ps = connection.prepareStatement(SQL);ps.setInt(1,brand_id);ResultSet rs = ps.executeQuery();List<Product> products = new ArrayList<>() ;Product product = null ;while(rs.next()){product = new Product() ;product.setId(rs.getInt("id"));product.setName(rs.getString("name"));product.setDescription(rs.getString("description"));product.setPrice(rs.getDouble("price"));product.setStock(rs.getInt("stock"));products.add(product);}release(rs,ps,connection);return products;}
}
在dao中出现的错误:1.空指针异常:500
- 查询的SQL语句和对应的表要写正确
- if:是查询一个
- while:查询多个
3.编写service中的接口
package com.csi.eshop.service;import com.csi.eshop.domain.Product;
import com.csi.eshop.domain.ProductBrand;import java.util.List;public interface ProductBrandService {List<ProductBrand> list();List<Product> findId(int brand_id) ;}
3.1 编写service中的impl
package com.csi.eshop.service.impl;import com.csi.eshop.dao.ProductBrandDao;
import com.csi.eshop.dao.impl.ProductBrandDaoImpl;
import com.csi.eshop.domain.Product;
import com.csi.eshop.domain.ProductBrand;
import com.csi.eshop.service.ProductBrandService;import java.sql.SQLException;
import java.util.List;public class ProductBrandServiceImpl implements ProductBrandService {@Overridepublic List<ProductBrand> list() {ProductBrandDao productBrandDao = new ProductBrandDaoImpl() ;List<ProductBrand> list = null;try {list = productBrandDao.list();} catch (SQLException e) {e.printStackTrace();}return list;}@Overridepublic List<Product> findId(int brand_id) {ProductBrandDao productBrandDao = new ProductBrandDaoImpl() ;List<Product> brandid = null;try {brandid = productBrandDao.findId(brand_id);} catch (SQLException e) {e.printStackTrace();}return brandid;}}
4.可以在test包中进行测试:
package com.csi.easybuy.service;import com.csi.eshop.domain.Product;
import com.csi.eshop.domain.ProductBrand;
import com.csi.eshop.service.ProductBrandService;
import com.csi.eshop.service.ProductService;
import com.csi.eshop.service.impl.ProductBrandServiceImpl;
import com.csi.eshop.service.impl.ProductServiceImpl;
import org.junit.Before;
import org.junit.Test;import java.util.List;public class TestProductService {ProductService productService ;ProductBrandService productBrandService ;@Beforepublic void init() {productService = new ProductServiceImpl() ;productBrandService = new ProductBrandServiceImpl() ;}@Testpublic void testListCategory4Index(){System.out.println(productService.listByCategory4Index(548).size());}@Testpublic void testfindById() {Product product = productService.findById(742);System.out.println(product);}@Testpublic void testList(){List<ProductBrand> list = productBrandService.list();System.out.println(list.size());}@Testpublic void testfindId() {List<Product> id = productBrandService.findId(2) ;System.out.println(id.size());}}
在进行test测试的时候可以看到前面写的方法会不会报错等信息及时修改。
5.在webapp下的controller中编写业务逻辑
5.1产品的品牌列表查询
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%ProductBrandService productBrandService = new ProductBrandServiceImpl() ;List<ProductBrand> list = productBrandService.list();request.setAttribute("list",list);request.getRequestDispatcher("/Brand.jsp").forward(request,response);%>
5.2产品信息的详细查询:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%String id = request.getParameter("id") ;int brand_id = 0 ;//如果参数不是null的话,再转换成int类型if(id != null) {brand_id = Integer.valueOf(id) ;}ProductBrandService productBrandService =new ProductBrandServiceImpl() ;List<Product> product = productBrandService.findId(brand_id);request.setAttribute("product",product);request.getRequestDispatcher("/BrandList.jsp").forward(request,response);%>
6.在jsp页面中编辑 (brand.jsp)
将数据表中的商品的品牌列表的信息全部展现在界面中。包括商品的 LOGO、名称、描述、就可以了。在jsp页面中的将要显示的ul li 套用循环的步骤
步骤1
ProductBrandDao productBrandDao = new ProductBrandDaoImpl() ;步骤2 .创建一个List集合 然后进行非空判断
步骤三 就行foreach 循序将LI中的商品信息 循环出来
<%ProductBrandDao productBrandDao = new ProductBrandDaoImpl() ;List<ProductBrand> productBrands = (List<ProductBrand>) request.getAttribute("list");if (productBrands != null){for (ProductBrand productBrand : productBrands){%><li><div class="img"><a href="/controller/ProductInfoController.jsp>id=<%=productBrand.getId()%>"><%=productBrand.getId()%></a><img src="images/brand1.jpg" width="226" height="108" class = "open_xx"/></div><div class="name"><span><%=productBrand.getBrand_name()%></span>(20)</div></li><%}}%>
6.16.在jsp页面中编辑 (brandList.jsp)
点击商品品牌会看到商品的详细界面 将商品的详情全部罗列到一个新的页面
和展现商品的品牌信息 的过程大概一样。
<%ProductBrandDao productBrandDao = new ProductBrandDaoImpl() ;List<Product> products = (List<Product>) request.getAttribute("product");if (products != null){for (Product product : products){%><li><div class="img"><a href="#"><img src="images/per_1.jpg" width="210" height="185" /></a></div><div class="price"><font>¥<span><%=product.getPrice()%></span></font> 26R</div><div class="name"><a href="#"><%=product.getName()%></a></div><div class="carbg"><a href="#" class="ss">收藏</a><a href="#" class="j_car">加入购物车</a></div></li><%}}%>
7.在运行中需要连接数据库
8.工具类(JDBCUtils和MDK5加密方式)调用就行
package com.csi.eshop.utils;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.*;
import java.util.Properties;/*** JDBC资源管理工具类*/
public class JDBCUtils {private Properties properties ;{//构建对象properties = new Properties() ;try {//通过类加载器,找到classes目录,继而找到db.properties文件properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties"));} catch (IOException e) {e.printStackTrace();}}/*** 创建连接* java.sql.Connection*/protected Connection getConnection() throws SQLException {try {Class.forName(getValue("classname")) ;} catch (ClassNotFoundException e) {e.printStackTrace();}//2. 建立连接 http://www.sohu.comConnection connection = DriverManager.getConnection(getValue("url"),getValue("username"),getValue("password")) ;return connection ;}/*** 释放连接*/protected void release(Connection connection) {if(connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}protected void release(Statement statement) {if(statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}}protected void release(ResultSet rs) {if(rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 增删改实现关闭* @param ps* @param connection*/protected void release(PreparedStatement ps,Connection connection) {release(ps);release(connection);}/*** 查询关闭* @param rs* @param ps* @param connection*/protected void release(ResultSet rs, PreparedStatement ps, Connection connection) {release(rs);release(ps,connection);}/*** 从属性文件中,获取到key对应的value值* @param key* @return*/public String getValue(String key) {return properties.getProperty(key) ;}}
JDBC的有话连接数据库:
db--properties 是在resources下的配置信息
classname=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/easybuy
username=root
password=root
MDK的工具类:
package com.csi.eshop.utils;import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** MD5加密方式*/public class MD5Utils {public static String str2MD5(String str) {// str += "456wdq1d5612";byte[] digest = null ;try {MessageDigest md5 = MessageDigest.getInstance("md5");digest = md5.digest(str.getBytes("UTF-8"));} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}//16位表示转换为16进制数String md5Str = new BigInteger(1,digest).toString(16);return md5Str;}/* public static void main(String[] args) {System.out.println(str2MD5("123456"));}*/
}