ServletContext
ServetContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。
一个web应用对应一个ServletContext实例,这个实例是应用部署启动后,servlet容器为应用创建的。ServletContext实例包含了所有servlet共享的资源信息。通过提供一组方法给servlet使用,用来和servlet容器通讯。
ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。

session默认的生存时间是1800秒。
有没有生存时间更长的对象来实现页面间或不同的Servlet间的数据共享呢?
在Servet AP操供了ServletContext接口来实现上述功能,运行在同一个容器中的Servlet使用ServletContext来共享存在于其中的信息和属性。
ServletContext接口中定义了用于处理上下文的方法
方法 | 说明 |
Object getAttribute(String name) | 根据name属性返回在上下文中绑定的对象,如果指定的属性不存在,则返回null |
void setAttribute(Stringname, Object object) | 把一个对象和属性名绑定在一起,并保存到Servlet上下文中。如果名字属性已经存在,则先把它从上下文中删除,并将名字同新属性值绑定在一起 |
void removeAttribute(String name) | 根据name属性从Servlet上下文中删除对象 |
Enumeration getAttributeNames() | 返回一个Enumeration对象,包含了所有存储在Servelt上下文中的属性名 |
上下文的作用
web容器在启动时,它会为每个web程序都创建一个对应的ServletContext对象,它代表当前的web应用。 事实上SpringMVC封装的ApplicationContext 以及Struts2封装的ApplicationContext里面都是保存着原本的ServletContext
作用:Web应用范围内存取共享数据;访问web应用的静态资源;Servlet对象之间通过ServletContext对象来实现通讯。
下文接口的方法
在Servlet中通过
final ServletContext application = request.getServletContext();获取上下文对象application
上下文的常用方法如下:
getInitParameter(String name) 获取name名称的初始化参数的值
getResourceAsStream(String path) 输入流的形式返回path对应的资源,path参数必须以“/”
getInitParameterNames() 获取所有初始化参数的名称,返回的结果是一个枚举值
getRequestDispatcher(String name) 根据转发的地址获取 RequestDispatcher对象
setAttribute() 设置属性值
getAttributeNames() 获取所有属性值名称
上下文参数
在web.xml中配置初始化参数:
<context-param>
<param-name>adminEmail</param-name>
<param-value>webmaster</param-value>
<context-param>元素是针对整个应用的,所以并不嵌套在某个<servlet>元素中,该元素是<web-app>元素的直接子元素。
从Servlet中访问初始化参数:
final ServletContext application=this.getServletContext();
application.getInitParameter("email");上下文属性
ServletContext application=this.getServletContext();
application.setAttribute("name","value");
application.getAttribute("name");
Enumberation p=application.getAttributeNames();作用域对象
2.1pageContext
pageContext对象:它的生命周期即page域,指存储在pageContext对象的数据只在当前页面有效,当发生页面跳转时,则在pageContext域的数据进行销毁。
2.2request
request对象主要用于处理客户端请求,同时request对象也是作用域对象,它的作用域范围是同一个请求。

方法 | 说明 |
void setAttribute(String name, Object value) | 把name属性储存到request对象 |
Object getAttribute(String name) | 返回name属性的值 |
void removeAttribute(String name) | 从request对象中移除name属性 |
String getParameter(String name) | 返回指定name的参数值 |
Enumeration getParameterNames() | 以枚举类型返回所有的参数名称 |
String []getParameterValues(String name) | 以字符数组类型返回所有指定name参数值 |
Map getParameterMap( ) | 以java.util.Map类型返回请求参数 |
2.3session
session对象用来存储有关用户会话的所有信息,它的作用域范围是同一个会话。
session对象常用方法:
void setAttribute(String key,object value):以键/值的方式,将一个对象的值存放到session中
session.setAttribute("name","admin");Object getAttribute(String key);根据名称去获取session中存放对象的值
string name =(string) session.getAttribute("name");2.4 application
application类似于系统的“全局变量”,用于实现用户之间的数据共享,它的作用域范围是在服务器一开始执行服务,到服务器关闭为止。
application对象实现了javax.servlet.ServletContext接口
application对象的常用方法:
void setAttribute(String key, Object value): 以键/值的方式,将一个对象的值存放到application中
void getAttribute(String key)通过键的方式,把对应的值取出来。
<%
//设置
pageContext,setAttribute("name1","zhangshan001");
request.setAttribute("name2"zhangshan001");
session.setAttribute("name3""zhangshan001");
applicationsetAttribute("name4""zhangshan001");
//取值
string namel=(string)pageContext.getAttribute("namel");
string name2=(String)request.getAttribute("name2”);
String name3=(string)session.getAttribute("name3”);
string name4=(string)application.getAttribute("name4");
%>
pageContext域:<%=name1 %><br/>
request域:<%=name2 %><br/>
session域:<%=name3 %><br/>
application域:<%=name4 %><br/>
3.作用域对象测试
package com.zhao.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class Test01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.pageContext
//2.request
request.setAttribute("name","request");
//3.session
HttpSession session=request.getSession();
session.setAttribute("name","session");
//4.application
ServletContext application = request.getServletContext();
application.setAttribute("name","application");
//重定向
}
}
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2023/2/23
Time: 11:05
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>作用域对象测试</title>
</head>
<body>
<%--
EL表达式获取作用域对象得顺序是:pageContext(当前页面)、request(请求问)、session(当前会话)、application(应用程序)
--%>
<h2>
pageContext只能当前页面定义数据,当前页面使用
request后端程序和页面有情关系,则数据可以共享
session是当前会话有效(同一个人使用同一个浏览器在任何页面都可以数据共享)
application是整个服务器有效,所有用户得请求可以数据共享
</h2>
${name}
</body>
</html>
主页信息
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: hcyns
Date: 2023/2/17
Time: 19:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--在页面导入jstl的核心类库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h2>欢迎来到主页!</h2>
<a href="addGoods.jsp">添加商品</a>
<table>
<thead>
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品说明</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${goodsList}" var="goods">
<tr>
<td>${goods.gid}</td>
<td>${goods.gname}</td>
<td>${goods.price}</td>
<td>${goods.mark}</td>
<td>
<a href="#">修改</a>
<a href="del?gid=${goods.gid}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
4.添加信息操作

<%--
Created by IntelliJ IDEA.
User: hcyns
Date: 2023/2/23
Time: 18:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>商品信息添加</title>
</head>
<body>
<h2>商品信息录入</h2>
<form action="addGoods" method="post">
商品名称:<input type="text" name="gname" value="" placeholder="商品名称"><br/>
商品价格:<input type="number" step="0.01" name="price" value="" placeholder="商品价格"><br/>
商品说明:<input type="text" name="mark" value="" placeholder="商品说明"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
package com.zhao.dao;
import com.zhao.bean.Goods;
import com.zhao.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class GoodsDao {
private Connection con=null;//数据库连接对象
private PreparedStatement pstm=null;//预处理对象
private ResultSet rs=null;//结果集对象
private int row=0;//增删改受影响的行数
public List<Goods> selectAll(){
List<Goods> goodsList=new ArrayList<>();
try {
con= JDBCUtil.getCon();
String sql="select * from t_goods";
pstm=con.prepareStatement(sql);
rs=pstm.executeQuery();
while (rs.next()){
//把当前数据行中的数据取出来,存储到Goods对象中
Goods goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
//把Goods对象存储到集合中
goodsList.add(goods);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(rs,pstm,con);
}
return goodsList;
}
public int add(Goods goods){
try {
con= JDBCUtil.getCon();
String sql="insert into t_goods(gname,price,mark) values(?,?,?)";
pstm=con.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
public int deleteById(int gid){
try {
con= JDBCUtil.getCon();
String sql="delete from t_goods where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
}
package com.zhao.servlet;
import com.zhao.bean.Goods;
import com.zhao.dao.GoodsDao;
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 java.io.IOException;
@WebServlet("/addGoods")
public class AddGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//设置请求的编码
resp.setCharacterEncoding("utf-8");//设置响应的编码
Goods goods=new Goods();
goods.setGname(req.getParameter("gname"));
goods.setPrice(Double.parseDouble(req.getParameter("price")));//获取字符串数字转换为double数据
goods.setMark(req.getParameter("mark"));
GoodsDao goodsDao=new GoodsDao();
int row=goodsDao.add(goods);
if(row>0){
req.getRequestDispatcher("selectAllGoods").forward(req,resp);
}else {
req.setAttribute("error_msg","添加商品信息失败!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
}
}
}
1.展示页面效果
登录账号

跳转到商品信息页面

然后点击添加商品

录入商品信息

然后点击提交,跳转到主页

控制台添加信息成功

5.删除信息操作
1.在主页点击删除跳转到servlet,后端根据id查询到该商品的信息;
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: hcyns
Date: 2023/2/17
Time: 19:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--在页面导入jstl的核心类库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h2>欢迎来到主页!</h2>
<a href="addGoods.jsp">添加商品</a>
<table>
<thead>
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品说明</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${goodsList}" var="goods">
<tr>
<td>${goods.gid}</td>
<td>${goods.gname}</td>
<td>${goods.price}</td>
<td>${goods.mark}</td>
<td>
<a href="#">修改</a>
<a href="del?gid=${goods.gid}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>package com.zhao.dao;
import com.zhao.bean.Goods;
import com.zhao.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class GoodsDao {
private Connection con=null;//数据库连接对象
private PreparedStatement pstm=null;//预处理对象
private ResultSet rs=null;//结果集对象
private int row=0;//增删改受影响的行数
public List<Goods> selectAll(){
List<Goods> goodsList=new ArrayList<>();
try {
con= JDBCUtil.getCon();
String sql="select * from t_goods";
pstm=con.prepareStatement(sql);
rs=pstm.executeQuery();
while (rs.next()){
//把当前数据行中的数据取出来,存储到Goods对象中
Goods goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
//把Goods对象存储到集合中
goodsList.add(goods);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(rs,pstm,con);
}
return goodsList;
}
public int add(Goods goods){
try {
con= JDBCUtil.getCon();
String sql="insert into t_goods(gname,price,mark) values(?,?,?)";
pstm=con.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
public int deleteById(int gid){
try {
con= JDBCUtil.getCon();
String sql="delete from t_goods where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
}
2.把商品信息添加到request作用域中请求转发到信息展示页面;
package com.zhao.servlet;
import com.zhao.dao.GoodsDao;
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 java.io.IOException;
@WebServlet("/del")
public class DelGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int gid=Integer.parseInt(req.getParameter("gid"));
//根据id执行数据库的删除
GoodsDao goodsDao=new GoodsDao();
int row=goodsDao.deleteById(gid);
if(row>0){
//请求转发,查询所有商品信息(刷新)
req.getRequestDispatcher("selectAllGoods").forward(req,resp);
}else {
req.setAttribute("error_msg","删除出现了问题!!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
}
}
}3.展示页面效果
原来的商品信息

现在的商品信心

数据库中的表删除成功

6.修改信息操作
修改逻辑:
1.点击修改跳转到servlet,后端根据id查询到该商品的信息;
2.把商品信息添加到request作用域中请求转发到信息展示页面;
3.用户根据需求修改表单中的字段,重新提交表单;
4.编写后端servlet获取用户最新修订的商品信息,执行数据库的修改操作;
5.重新请求查询所有商品,跳转到商品信息主页;
1.在主页点击修改跳转到servlet,后端根据id查询到该商品的信息;
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: hcyns
Date: 2023/2/17
Time: 19:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--在页面导入jstl的核心类库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h2>欢迎来到主页!</h2>
<a href="addGoods.jsp">添加商品</a>
<table>
<thead>
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品说明</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${goodsList}" var="goods">
<tr>
<td>${goods.gid}</td>
<td>${goods.gname}</td>
<td>${goods.price}</td>
<td>${goods.mark}</td>
<td>
<a href="findById?gid=${goods.gid}">修改</a>
<a href="del?gid=${goods.gid}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
2.把商品信息添加到request作用域中请求转发到信息展示页面;
package com.zhao.dao;
import com.zhao.bean.Goods;
import com.zhao.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class GoodsDao {
private Connection con=null;//数据库连接对象
private PreparedStatement pstm=null;//预处理对象
private ResultSet rs=null;//结果集对象
private int row=0;//增删改受影响的行数
public List<Goods> selectAll(){
List<Goods> goodsList=new ArrayList<>();
try {
con= JDBCUtil.getCon();
String sql="select * from t_goods";
pstm=con.prepareStatement(sql);
rs=pstm.executeQuery();
while (rs.next()){
//把当前数据行中的数据取出来,存储到Goods对象中
Goods goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
//把Goods对象存储到集合中
goodsList.add(goods);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(rs,pstm,con);
}
return goodsList;
}
public int add(Goods goods){
try {
con= JDBCUtil.getCon();
String sql="insert into t_goods(gname,price,mark) values(?,?,?)";
pstm=con.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
public int deleteById(int gid){
try {
con= JDBCUtil.getCon();
String sql="delete from t_goods where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
public Goods selectById(int gid) {
Goods goods=null;
try {
con= JDBCUtil.getCon();
String sql="select * from t_goods where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
rs=pstm.executeQuery();
if (rs.next()){
//把当前数据行中的数据取出来,存储到Goods对象中
goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return goods;
}
}
package com.zhao.servlet;
import com.zhao.bean.Goods;
import com.zhao.dao.GoodsDao;
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 java.io.IOException;
@WebServlet("/findById")
public class FindById extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int gid = Integer.parseInt(request.getParameter("gid"));
//根据gid查询商品信息
GoodsDao goodsDao=new GoodsDao();
Goods goods=goodsDao.selectById(gid);
if (goods!=null){
//查询商品信息成功,存入request域中,然后请求转发到页面展示数据
request.setAttribute("goods",goods);
request.getRequestDispatcher("showGoods.jsp").forward(request,response);
}else {
request.setAttribute("error_msg","修改出了异常!");
request.getRequestDispatcher("error.jsp").forward(request,response);
}
}
}
3.在商品信息中点击update跳转到serlvet,用户根据需求修改表单中的字段,重新提交表单;
<%--
Created by IntelliJ IDEA.
User: lenovo
Date: 2023/2/25
Time: 10:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>商品信心修改</title>
</head>
<body>
<h2>商品信息修改</h2>
<form action="update" method="post">
商品编号:<input type="text" name="gid" value="${goods.gid}" readonly="readonly" placeholder="商品编号"><br/>
商品名称:<input type="text" name="gname" value="${goods.gname}" placeholder="商品名称"><br/>
商品价格:<input type="number" step="0.01" name="price" value="${goods.price}" placeholder="商品价格"><br/>
商品说明:<input type="text" name="mark" value="${goods.mark}" placeholder="商品说明"><br/>
<input type="submit" value="修改">
</form>
</body>
</html>
package com.zhao.servlet;
import com.zhao.bean.Goods;
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 java.io.IOException;
@WebServlet("/update")
public class UpdateGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获取表单提交的数据,封装到goods对象中
Goods goods=new Goods();
goods.setGid(Integer.parseInt(request.getParameter("gid")));
goods.setGname(request.getParameter("gname"));
goods.setPrice(Double.parseDouble(request.getParameter("price")));
goods.setMark(request.getParameter("mark"));
System.out.println(goods);
//执行数据库JDBC的修改操作
}
}
4.编写后端servlet获取用户最新修订的商品信息,执行数据库的修改操作;
package com.zhao.dao;
import com.zhao.bean.Goods;
import com.zhao.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class GoodsDao {
private Connection con=null;//数据库连接对象
private PreparedStatement pstm=null;//预处理对象
private ResultSet rs=null;//结果集对象
private int row=0;//增删改受影响的行数
public List<Goods> selectAll(){
List<Goods> goodsList=new ArrayList<>();
try {
con= JDBCUtil.getCon();
String sql="select * from t_goods";
pstm=con.prepareStatement(sql);
rs=pstm.executeQuery();
while (rs.next()){
//把当前数据行中的数据取出来,存储到Goods对象中
Goods goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
//把Goods对象存储到集合中
goodsList.add(goods);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(rs,pstm,con);
}
return goodsList;
}
public int add(Goods goods){
try {
con= JDBCUtil.getCon();
String sql="insert into t_goods(gname,price,mark) values(?,?,?)";
pstm=con.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
public int deleteById(int gid){
try {
con= JDBCUtil.getCon();
String sql="delete from t_goods where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
public Goods selectById(int gid) {
Goods goods=null;
try {
con= JDBCUtil.getCon();
String sql="select * from t_goods where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
rs=pstm.executeQuery();
if (rs.next()){
//把当前数据行中的数据取出来,存储到Goods对象中
goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return goods;
}
public int update(Goods goods){
try {
con= JDBCUtil.getCon();
String sql="update t_goods set gname=?,price=?,mark=? where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
pstm.setObject(4,goods.getGid());
row=pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return row;
}
}
5.重新请求查询所有商品,跳转到商品信息主页;
package com.zhao.servlet;
import com.zhao.bean.Goods;
import com.zhao.dao.GoodsDao;
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 java.io.IOException;
@WebServlet("/update")
public class UpdateGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//获取表单提交的数据,封装到goods对象中
Goods goods=new Goods();
goods.setGid(Integer.parseInt(request.getParameter("gid")));
goods.setGname(request.getParameter("gname"));
goods.setPrice(Double.parseDouble(request.getParameter("price")));
goods.setMark(request.getParameter("mark"));
System.out.println(goods);
//执行数据库JDBC的修改操作
GoodsDao goodsDao=new GoodsDao();
int row = goodsDao.update(goods);
if (row>0){
request.getRequestDispatcher("selectAllGoods").forward(request,response);
}else {
request.setAttribute("error_msg","修改时出现了问题!!");
request.getRequestDispatcher("error.jsp").forward(request,response);
}
}
}
6.展示页面效果
点击去登录

点击登录

跳转到商品信息页面

然后点击id1修改,跳转到修改页面

然后点击修改,跳转到主页,查看修改信息是否成功


控制台修改成功

数据库修改成功

7.模糊查询操作
1.在主页定义搜索的表单页面请求seach地址
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: hcyns
Date: 2023/2/17
Time: 19:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--在页面导入jstl的核心类库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h2>欢迎来到主页!</h2>
<form action="seach" method="post">
<input type="text" name="keyword" value="">
<input type="submit" value="搜索">
</form>
<a href="addGoods.jsp">添加商品</a>
<table>
<thead>
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品说明</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${goodsList}" var="goods">
<tr>
<td>${goods.gid}</td>
<td>${goods.gname}</td>
<td>${goods.price}</td>
<td>${goods.mark}</td>
<td>
<a href="findById?gid=${goods.gid}">修改</a>
<a href="del?gid=${goods.gid}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
注意事项:

2.点击主页里的seach跳转到Seach类中,获取关键词并执行模糊查询
package com.zhao.servlet;
import com.zhao.bean.Goods;
import com.zhao.dao.GoodsDao;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
@WebServlet("/seach")
public class Seach extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String keyword = request.getParameter("keyword");
//执行jdbc的模糊查询
GoodsDao goodsDao=new GoodsDao();
List<Goods> goodsList=goodsDao.seach(keyword);
System.out.println(goodsList);
//把模糊查询到的商品信息集合存储到session中
HttpSession session=request.getSession();
session.setAttribute("goodsList",goodsList);
//跳转到主页进行信息显示
response.sendRedirect("zhuye.jsp");
}
}
注意事项:

3.在GoodsDao中定义一个seach方法
List<Goods> goodsList=new ArrayList<>();
public List<Goods> seach(String keyword){
try {
con= JDBCUtil.getCon();
String sql="select * from t_goods where gname like concat('%',?,'%')";//concat()函数表示字符串的拼接
pstm=con.prepareStatement(sql);
pstm.setObject(1,keyword);
rs=pstm.executeQuery();
while (rs.next()){
//把当前数据行中的数据取出来,存储到Goods对象中
Goods goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
//把Goods对象存储到集合中
goodsList.add(goods);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JDBCUtil.close(pstm,con);
}
return goodsList;
}4.展示页面效果
点击去登录

登录账号

在搜索框里搜索关键字,进行模糊查询

显示搜索后的页面,模糊查询成功!

数据库模糊查询成功
